Краткий курс машинного обучения, или Как создать нейронную сеть для решения задачи по скорингу > NetPeak - Независимость и осознанность
NetPeak Biz Tech    


Краткий курс машинного обучения, или Как создать нейронную сеть для решения задачи по скорингу

Краткий курс машинного обучения, или Как создать нейронную сеть для решения задачи по скорингу

< >

Чаще всего выражения «машинное обучение» и «нейронные сети» ассоциируются с распознаванием образов, речи и с генерацией человекоподобного текста. На самом же деле алгоритмы машинного обучения могут решать множество других задач, помогая бизнесу. В этой статье я расскажу, как создать нейросеть, которая способна решить реальную задачу по созданию скоринговой модели. Мы рассмотрим все этапы: от подготовки данных до создания модели и оценки ее качества. Оригинал текста — на Хабре.

В статье вы найдете ответы на такие вопросы:

  • как собрать и подготовить данные для построения модели;
  • что такое нейронная сеть и как она устроена;
  • как написать свою нейронную сеть с нуля;
  • как правильно обучить нейронную сеть на имеющихся данных;
  • как интерпретировать модель и ее результаты;
  • как корректно оценить качество модели.

Краткое оглавление:

  1. Сбор данных
  2. Препроцессинг
  3. Выбор модели
  4. Краткий курс искусственных нейронных сетей
  5. Обучение модели
  6. Интерпретация модели
  7. Результат

«Вопрос о том, может ли компьютер думать, не более интересен, чем вопрос о том, может ли субмарина плавать».

Эдсгер Вибе Дейкстра

Часто менеджерам по продажам приходится проводить презентации и рассказывать о продукте совершенно случайным людям — потенциальным клиентам. А бывает, что клиенты плохо понимают, что им вообще нужно. Такое общение не приносит ни удовольствия, ни прибыли. А самое неприятное то, что из-за ограничения по времени можно не успеть рассказать о чем-то действительно важном для клиента и в результате упустить сделку.

Я математик-программист в сервисе SEO-аналитики Serpstat. Однажды получил интересную задачу по улучшению уже существующей и работающей у нас скоринговой модели. Для ее решения надо было по новому оценить факторы, которые влияют на успех продаж.

Раньше скоринг считался на основе анкетирования наших клиентов, и каждый пункт, в зависимости от ответа на вопрос, вносил определенное количество очков в суммарный балл. Все эти баллы за разные вопросы расставлялись на основе статистических гипотез. Скоринговая модель использовалась, время шло, данные собирались и в один прекрасный день попали ко мне. Теперь, когда у меня появилась достаточная выборка, можно было смело строить гипотезы, используя алгоритмы машинного обучения.

Я расскажу, как мы построили свою скоринг-модель. Это кейс с реальными данными, со всеми трудностями и ограничениями, с которыми мы столкнулись в реальном бизнесе.

Мы подробно остановимся на всех этапах работы:

  • сбор данных
  • препроцессинг;
  • построение модели;
  • анализ качества и интерпретация модели.

Рассмотрим устройство, создание и обучение нейросети.

Сбор данных

Вначале нужно понять, какие вопросы будут представлять клиента (или просто объект) в будущей модели. Во-первых, нужно не упустить важные признаки, описывающие объект. Во-вторых, создать жесткие критерии для принятия решения о признаке.

Основываясь на опыте, я могу выделить три категории вопросов:

  1. Булевы (бикатегориальные), ответом на которые является «да» или «нет», 1 или 0. Например, ответ на вопрос: есть ли у клиента аккаунт?
  2. Категориальные, ответом на которые является фраза, представляющая конкретный класс. Обычно классов больше двух (мультикатегориальные), иначе вопрос можно свести к булевому. Например, цвет: красный, зеленый или синий.
  3. Количественные, на которые отвечают числами, хаpaктеризующими конкретную меру. Например, количество обращений в месяц: пятнадцать.

Зачем я так подробно останавливаюсь на этом? Обычно, когда рассматривают классическую задачу, решаемую с помощью алгоритмов машинного обучения, мы имеем дело только с числовыми данными. Например, распознавание черно-белых рукописных цифр с картинки 20 на 20 пикселей. В этом случае 400 чисел (описывающих яркость черно-белого пикселя) представляют один пример из выборки.

При построении модели нужно понимать, с какими типами вопросов алгоритм может иметь дело. Например, дерево принятия решения обучается на всех типах вопросов, а нейросеть принимает только числовые входные данные и обучается лишь на количественных признаках. Означает ли это, что мы должны отказаться от некоторых вопросов в угоду более совершенной модели? Вовсе нет, просто нужно правильно подготовить данные.

У данных должна быть следующая классическая структура: вектор признаков для каждого i-го клиента X(i) = {x(i)1, x(i)2, ..., x(i)n} и класс Y(i) — категория, показывающая, купил клиент или нет. Например: клиент(3) = {зеленый, горький, 4.14, да} — купил.

Основываясь на вышесказанном, попробуем представить формат данных с типами вопросов для дальнейшей подготовки модели:

класс:

(категория)

цвет:

(категория)

вкус:

(категория)

вес:

(число)

твердый:

(bool)

-

красный

кислый

4.23

да

-

зеленый

горький

3.15

нет

+

зеленый

горький

4.14

да

+

синий

сладкий

4.38

нет

-

зеленый

соленый

3.62

нет

Пример данных обучающей выборки до препроцессинга

Препроцессинг

После того как данные собраны, их необходимо подготовить. Этот этап называется препроцессинг. Основная задача препроцессинга — преображение данных в формат пригодный для обучения модели. Можно выделить три основных манипуляции над данными на этапе препроцессинга:

  1. Создание векторного прострaнcтва признаков, где будут находиться примеры обучающей выборки. По сути, это процесс приведения всех данных в числовую форму. Это избавляет нас от категорийных, булевых и прочих нечисловых типов.
  2. Нормализация данных. Процесс, при котором мы добиваемся, например, того, чтобы среднее значение каждого признака по всем данным было нулевым, а дисперсия — единичной. Классический пример нормализации данных: X = (X — μ)/σ. Функция нормализации:
    def normalize(X):
       return (X-X.mean())/X.std()
  3. Изменение размерности векторного прострaнcтва. Если векторное прострaнcтво признаков слишком велико (миллионы признаков) или мало (менее десятка), можно применить методы повышения или понижения размерности прострaнcтва.

Для повышения размерности можно использовать часть обучающей выборки как опopные точки, добавив в вектор признаков расстояние до этих точек. Этот метод часто приводит к тому, что в прострaнcтвах более высокой размерности множества становятся линейно разделяемыми, что упрощает задачу классификации.

Для понижения размерности чаще всего используют PCA. Основная задача метода главных компонент — поиск новых линейных комбинаций признаков, вдоль которых максимизируется дисперсия значений проекций элементов обучающей выборки.

Один из важнейших трюков в построении векторного прострaнcтва — метод представления в виде числа категориальных и булевых типов.

Встречайте: One-hot (унитарный код). Основная идея такой кодировки — представление категориального признака как вектора в векторном прострaнcтве размерностью, соответствующей количеству возможных категорий. При этом значение координаты этой категории берется за единицу, а все остальные координаты обнуляются. С булевыми значениями все совсем просто — они превращаются в единицы или нули.

Например, элемент выборки может быть или горьким, или сладким, или соленым, или кислым, или умами (мясным). Тогда One-Hot кодировка будет такой: горький = (1, 0, 0, 0 ,0), сладкий = (0, 1, 0, 0 ,0), соленый = (0, 0, 1, 0 ,0), кислый = (0, 0, 0, 1 ,0), умами = (0, 0, 0, 0, 1).

Теперь мы научились превращать категориальные признаки в обычные числовые вектора, это очень полезно. Проведя все манипуляции над данными, мы получим обучающую выборку, подходящую для любой модели. В нашем случае после применения унитарной кодировки и нормализации данные выглядят так:

class:

red:

green:

blue:

bitter:

sweet:

salti:

sour:

weight:

solid:

0

1

0

0

0

0

0

1

0.23

1

0

0

1

0

1

0

0

0

-0.85

0

1

0

1

0

1

0

0

0

0.14

1

1

0

0

1

0

1

0

0

0.38

0

0

0

1

0

0

0

1

0

-0.48

0

Пример данных обучающей выборки после препроцессинга

Можно сказать, что препроцессинг — это процесс отображения понятных нам данных в форме менее удобной для человека, но излюбленной машинами.

Формула скоринга чаще всего представляет из себя следующую линейную модель:

где: k — это номер вопроса в анкете, wk — коэффициент вклада ответа на этот k-й вопрос в суммарный скоринг, |w| — количество вопросов (или коэффициентов), xk — ответ на этот вопрос.

При этом вопросы могут быть любыми: булевыми (да или нет, 1 или 0), числовыми (например, рост = 175) или категориальными, но представленными в виде унитарной кодировки (зеленый из перечня: красный, зеленый или синий = [0, 1, 0]). При этом можно считать, что категориальные вопросы распадаются на столько булевых, сколько категорий присутствует в вариантах ответа (например: клиент красный? клиент зеленый? клиент синий?).

Выбор модели

На сегодняшний день существует множество алгоритмов машинного обучения, на основе которых можно построить скоринг модель: Decision Tree (дерево принятия решений), KNN (метод k-ближайших соседей), SVM (метод опopных векторов), NN (нейросеть). Выбор модели зависит от того, что мы от нее хотим. Первое — насколько решения, повлиявшие на результаты модели, должны быть понятными. Другими словами: насколько нам важна возможность интерпретировать структуру модели.

Зависимость гибкости алгоритма машинного обучения и интерпретируемости полученной модели

Не все модели легко построить, для некоторых требуются весьма специфические навыки и очень-очень мощное железо. Но самое важное — это внедрение построенной модели. Бывает так, что бизнес-процесс уже налажен и внедрение какой-то сложной модели попросту невозможно. Или же требуется именно линейная модель, в которой клиенты, отвечая на вопросы, получают положительные или отрицательные баллы в зависимости от варианта ответа. Иногда, напротив, требуется сложная модель, учитывающая очень неочевидные сочетания входных параметров, — чтобы находить взаимосвязи между ними. Итак, что же выбрать?

При выборе алгоритма машинного обучения мы остановились на нейронной сети. Почему? Во-первых, существует много крутых фреймворков, таких как TensorFlow, Theano. Они дают возможность глубоко и серьезно настраивать архитектуру и параметры обучения. Во-вторых, возможность менять устройство модели от однослойной нейронной сети до многослойной, которая обладает отличной способностью находить нелинейные зависимости. К тому же, обученную однослойную нейросеть легко превратить в классическую аддитивную скоринг-модель, складывающую баллы за ответы на разные вопросы анкетирования. Но об этом чуть позже.

Теперь немного теории. Если для вас такие вещи, как нейрон, функция активации, функция потери, градиентный спуск и метод обратного распространения ошибки — родные слова, можете смело это все пропускать. Если нет, добро пожаловать в краткий курс искусственных нейросетей.

Истории бизнеса и полезные фишки

Краткий курс искусственных нейронных сетей

Начнем с того, что искусственные нейронные сети (ИНС) — математические модели организации реальных биологических нейронных сетей (БНС). Но в отличие от математических моделей БНС, ИНС не требует точного описания всех химических и физических процессов. Например: описания «поджигания» потенциала действия (ПД), работы нейромедиаторов, ионных каналов, вторичных посредников, белков трaнcпортеров и так далее. От ИНС требуется лишь схожесть с работой реальных БНС на функциональном уровне.

Базовый элемент нейросети — нейрон. Попробуем составить самую простую функциональную математическую модель нейрона. Для этого опишем в общих чертах функционирование биологического нейрона.

Структуру биологического нейрона можно упростить до трех составляющих: дендриты, тело нейрона и аксон. Дендриты — это ветвящиеся отростки, собирающие информацию в нейрон. Это может быть внешняя информация с рецепторов (например, с колбочки сетчатки в случае цвета) или внутренняя информация, полученная от другого нейрона. Когда входящая информация активирует нейрон (его потенциал становится выше какого-то порога), рождается волна возбуждения (ПД). Она распространяется по мембране тела нейрона, а затем выбрасывая нейромедиатор через аксон передает сигнал другим нервным клеткам и тканям.

Основываясь на этой структуре, Уоррен Мак-Каллок и Уолтер Питтс в 1943 году предложили модель математического нейрона. В 1958 году Френк Розенблатт на основе нейрона Мак-Каллока-Питтса создал компьютерную программу, а затем и физическое устройство — перцептрон. С этого и началась история искусственных нейронных сетей.

Рассмотрим структурную модель нейрона, с которым мы будем иметь дело:

Модель математического нейрона Мак-Каллока-Питтса

1 — Х, входной вектор параметров. Вектор (столбец) чисел (биологическая степень активации разных рецепторов), пришедших на вход к нейрону.

2 — W, вектор весов (в общем случае — матрица весов), числовые значения, которые меняются в процессе обучения. Биологическое обучение на основе синаптической пластичности, когда нейрон учится правильно реагировать на сигналы с его рецепторов.

3 — сумматор, функциональный блок нейрона, который складывает все входные параметры, умноженные на соответствующий им вес.

4 — функция активации нейрона, зависимость значения выхода нейрона от значения пришедшего от сумматора.

5 — следующие нейроны, куда на один из множества их собственных входов подается значение с выхода данного нейрона. Этот слой может отсутствовать, если нейрон последний, терминальный.

Реализация математического нейрона:

import numpy as npdef neuron(x, w): z = np.dot(w, x) output = activation(z) return output

Затем из этих минимальных структурных единиц собирают классические искусственные нейронные сети.

В среде создателей нейронных сетей принята следующая терминология:

  • входной (рецепторный) слой — вектор параметров (признаков). Этот слой не состоит из нейронов. Можно сказать, что это цифровая информация, снятая рецепторами из «внешнего» мира. В нашем случае это информация о клиенте. Слой содержит столько элементов, сколько существует входных параметров (плюс bias-term нужный для сдвига порога активации) ;
  • ассоциативный (скрытый) слой — глубинная структура, способная к запоминанию примеров, нахождению сложных корреляций и нелинейных зависимостей, к построению абстpaкций и обобщений. В общем случае это даже не слой, а множество слоев между входными и выходными. Можно сказать, что каждый слой подготавливает новый (более высокоуровневый) вектор признаков для следующего слоя. Именно этот слой отвечает за появление в процессе обучения высокоуровневых абстpaкций. Структура содержит столько нейронов и слоев, сколько душе угодно, а может и вообще отсутствовать (в случае классификации линейно разделимых множеств).
  • выходной слой — это слой, каждый нейрон которого отвечает за конкретный класс. Выход этого слоя можно интерпретировать как функцию распределения вероятности принадлежности объекта разным классам. Слой содержит столько нейронов, сколько классов представлено в обучающей выборке. Если класса два, то можно использовать два выходных нейрона или ограничиться всего одним. В таком случае один нейрон по-прежнему отвечает только за один класс. Но если он выдает значения близкие к нулю, элемент выборки (по его логике) должен принадлежать другому классу.

Классическая топология нейросети, со входным (рецепторным), выходным, принимающим решение о классе, и ассоциативным (скрытым) слоем

Благодаря наличию скрытых ассоциативных слоев искусственная нейронная сеть способна строить гипотезы, основанные на нахождении сложных зависимостей.

Например, для сверточных нейросетей, распознающих изображения, на входной слой будут подаваться значения яркости пикселей изображения, а выходной слой будет содержать нейроны, отвечающие за конкретные классы (человек, машина, дерево, дом).

В процессе обучения в близких к «рецепторам» скрытых слоях начнут «сами собой» появляться (специализироваться) нейроны, возбуждающиеся от прямых линий, разного угла наклона, затем реагирующие на углы, квадраты, окружности, примитивные паттерны: чередующиеся полоски, геометрические сетчатые орнаменты. Ближе к выходным слоям — нейроны, реагирующие, например, на глаз, колесо, нос, крыло, лист, лицо.

Образование иерархических ассоциаций в процессе обучения сверточной нейронной сети

Проводя биологическую аналогию, хочется сослаться на слова замечательного нейрофизиолога Вячеслава Альбертовича Дубынина, касающиеся речевой модели:

«Наш мозг способен создавать, генерировать такие слова, которые обобщают слова более низкого уровня. Скажем, зайчик, мячик, кубики, кукла ― игрушки; игрушки, одежда, мебель ― это предметы; а предметы, дома, люди ― это объекты окружающей среды. И так еще немного, и мы дойдем до абстpaктных философских понятий, математических, физических. То есть речевое обобщение ― это очень важное свойство нашей ассоциативной теменной коры, и оно, вдобавок, многоуровневое и позволяет речевую модель внешнего мира формировать, как целостность.

В какой-то момент оказывается, что нервные импульсы способны очень активно двигаться по этой речевой модели, и это движение мы и называем гордым словом “мышление”».

Много теории? Но есть и хорошая новость — в самом простом случае вся нейросеть может быть представлена одним единственным нейроном! При этом даже один нейрон хорошо справляется с задачей. Особенно, когда дело касается распознавания класса объекта в прострaнcтве, в котором объекты этих классов являются линейно сепарабельными (отделимыми).

Добиться линейной сепарабельности можно, повысив размерность прострaнcтва. Но иногда проще добавить в нейросеть пару скрытых слоев и не требовать от выборки линейной сепарабельности.

Линейно разделимые множества и линейно неразделимые множества

Давайте опишем все это формально. На входе нейрона у нас есть вектор параметров. В нашем случае это результаты анкетирования клиента, представленные в числовой форме X(i) = {x(i)1, x(i)2, ..., x(i)n}. При этом каждому клиенту сопоставлен Y(i) — класс, хаpaктеризующий успешность лида (1 или 0).

Нейросеть, по сути, должна найти оптимальную разделяющую гиперповерхность в векторном прострaнcтве, размерность которого соответствует количеству признаков. Обучение нейронной сети в этом случае — нахождение таких значений (коэффициентов) матрицы весов W, при которых нейрон, отвечающий за класс, будет выдавать значения, близкие к единице в тех случаях, если клиент купит, и значения близкие к нулю, если нет:

Как видно из формулы, результат работы нейрона — это функция активации от суммы произведения входных параметров на искомые в процессе обучения коэффициенты. Разберемся, что же такое функция активации.

Так как на вход нейросети могут поступать любые действительные значения, и коэффициенты матрицы весов тоже могут быть какими угодно, то и результатом суммы их произведений может быть любое вещественное число от минус до плюс бесконечности.

У каждого элемента обучающей выборки есть значение класса относительно этого нейрона (ноль или один). Желательно получить от нейрона значение в этом же диапазоне (от нуля до единицы) и принять решение о классе, в зависимости от того, к чему это значение ближе. Еще лучше интерпретировать это значение как вероятность того, что элемент относится к этому классу.

Значит нам нужна такая монотонная гладкая функция, которая будет отображать элементы из множества вещественных чисел в область от нуля до единицы. Для этой роли отлично подходит так называемая сигмоида:

График логистической кривой, одной из классических представительниц класса сигмоид

Функция активации:

def activation(z): return 1/(1+np.exp(-z))

Кстати, в реальных биологических нейронах такая непрерывная функция активации не реализовалась. В наших с вами клетках существует потенциал покоя, который составляет в среднем -70mV.

Если на нейрон подается информация, активированный рецептор открывает сопряженные с ним ионные каналы, что приводит к повышению или понижению потенциала в клетке. Можно провести аналогию между силой реакции на активацию рецептора и полученным в процессе обучения одним коэффициентом матрицы весов. Как только потенциал достигает значения в -50mV, возникает полезное действие и волна возбуждения доходит по аксону до пресинаптического окончания, выбрасывая нейромедиатор в межсинаптическую среду. То есть реальная биологическая активация — ступенчатая, а не гладкая: нейрон либо активировался, либо нет.

Это показывает, насколько мы математически свободны в построении наших моделей. Взяв у природы основной принцип распределенного вычисления и обучения, мы способны построить вычислительный граф, состоящий из элементов, обладающих любыми желаемыми свойствами.

В описанном в статье примере мы желаем получать от нейрона континуальные, а не дискретные значения. Хотя в общем случае функция активации может быть и другой.

Важно: «Обучение нейросети (синаптическое обучение) должно свестись к оптимальному подбору коэффициентов матрицы весов с целью минимизации допускаемой ошибки».

В случае однослойной нейросети эти коэффициенты можно интерпретировать как вклад параметров элемента в вероятность принадлежности к конкретному классу.

Результат работы нейросети принято называть гипотезой (hypothesis). Обозначают гипотезу с помощью h(X), показывая зависимость от входных признаков (параметров) объекта.

Мы хотим, чтобы гипотезы нейросети как можно лучше соответствовали действительности (реальным классам объектов). Собственно, здесь и рождается основная идея обучения на опыте.

Теперь нам потребуется мера, описывающая качество нейросети. Этот функционал обычно называют «функцией потерь» (англ. loss function), его обозначают через J(W), показывая его зависимость от коэффициентов матрицы весов. Чем функционал меньше, тем реже наша нейросеть ошибается и тем это лучше. Именно к минимизации этого функционала и сводится обучение.

В зависимости от коэффициентов матрицы весов у нейросети может быть разная точность. Процесс обучения — это движение по гиперповерхности функционала потери, целью которого является минимизация этого функционала:

Процесс обучения как градиентный спуск к локальному минимуму функционала потери

Обычно коэффициенты матрицы весов инициализируются случайным образом. В процессе обучения коэффициенты меняются. На графике показаны два разных итерационных пути обучения как изменение коэффициентов w1 и w2 матрицы весов нейросети, проинициализированных в соседстве.

Как обучить нейросеть? Для этого существует множество вариантов, но я расскажу о двух: эволюционный (генетический) алгоритм и метод градиентного спуска. Оба этих метода используются.

Эволюционные алгоритмы — это направление в искусственном интеллекте, которое основывается на моделировании естественного отбора. Этот метод обучения очень прост в понимании и с него лучше начинать новичкам. Сейчас он используется в основном для тренировки глубинных слоев нейросети.

Метод градиентного спуска и обратного распространения ошибки — более сложный, но зато один из самых эффективных и популярных методов обучения.

Эволюционное обучение

В рамках этого метода оперируем терминологией:

  • коэффициенты матрицы весов — геном;
  • один коэффициент — ген;
  • «перевернутая вниз головой» функция потерь — ландшафт приспособленности (здесь мы уже ищем локальный максимум, но это всего лишь условность).

Этот метод и вправду очень простой. После того как мы выбрали топологию (устройство) нейросети, необходимо сделать следующее:

  1. Проинициализировать геном (матрицу весов) случайным образом в диапазоне от -1 до 1. Повторить это несколько раз, тем самым создав начальную популяцию разных, но случайных нейросетей. Размер популяции обозначим через P — population or parents.

    Cлучайная инициализация коэффициентов матрицы весов:

    import randomdef generate_population(p, w_size): population = [] for i in range(p): model = [] for j in range(w_size + 1): # +1 for b (bias term) model.append(2 * random.random() - 1) # random initialization from -1 to 1 for b and w population.append(model) return np.array(population)
  2. Создать нескольких потомков. Например, три-четыре клона каждого родителя, внеся небольшие изменения (мутации) в их геном. Например: переназначить случайным образом половину весов или добавить случайным образом к половине весов случайные значения в диапазоне от -0.1 до 0.1.

    Реализация мутагенеза:

    def mutation(genom, t=0.5, m=0.1): mutant = [] for gen in genom: if random.random() <= t: gen += m*(2*random.random() -1) mutant.append(gen) return mutant
  3. Оценить приспособленность каждого потомка на основе того, как он справляется с примерами из обучающей выборки (в самом простом варианте — процент верно угаданных классов, в идеале — перевернутая функция потерь). Отсортировать потомков по их приспособленности.

    Простейшая оценка приспособленности:

    def accuracy(X, Y, model): A = 0 m = len(Y) for i, y in enumerate(Y): A += (1/m)*(y*(1 if neuron(X[i], model) >= 0.5 else 0)+(1-y)*(0 if neuron(X[i], model) >= 0.5 else 1)) return A
  4. «Оставить в живых» только P самых приспособленных и вернуться к пункту 2, повторяя этот цикл несколько раз. Например, сто раз или пока точность не станет 80%.

    Реализация отбора:

    def selection(offspring, population): offspring.sort() population = [kid[1] for kid in offspring[:len(population)]] return population

Реализация эволюционного алгоритма:

def evolution(population, X_in, Y, number_of_generations, children): for i in range(number_of_generations): X = [[1]+[v.tolist()] for v in X_in] offspring = [] for genom in population: for j in range(children): child = mutation(genom) child_loss = 1 - accuracy(X_in, Y, child) # or child_loss = binary_crossentropy(X, Y, child) is better offspring.append([child_loss, child]) population = selection(offspring, population) return population

Нейроэволюцию можно улучшить. Например, можно ввести дополнительные гены-параметры: τ — темп мутагенеза и μ — сила мутагенеза. Теперь аддитивные мутации в матрицу весов нейронов будут вноситься с вероятностью τ, добавляя каждому параметру случайное число в выбранном диапазоне (например от -0.1 до 0.1), умноженное на μ. Эти гены тоже будут подвержены изменчивости.

В идеале отбор должен контролировать силу и темп мутагенеза на разных этапах эволюции, увеличивая эти параметры до тех пор, пока скачком можно выбраться из локального максимума ландшафта приспособленности, либо уменьшая их, чтобы медленно и без резких скачков двигаться к глобальному максимуму. Также можно добавить в модель кроссинговер. Теперь потомки будут образовываться путем скрещивания, получив случайным образом по половине генов от двух случайных родителей.

В этой схеме тоже необходимо оставить внесение случайных мутаций в геном.

Уместна цитата из книги Александра Маркова и Елены Наймарк:

«Вредные мутации — это движение вниз по склону, полезные — путь наверх. Мутации нейтральные, не влияющие на приспособленность, соответствуют движению вдоль горизонталей — линий одинаковой высоты. Отбpaковывая вредные мутации, естественный отбор мешает эволюционирующей последовательности двигаться вниз по ландшафту приспособленности. Поддерживая мутации полезные, отбор пытается загнать последовательность как можно выше».

Градиентный спуск и метод обратного распространения ошибки

Если следующий материал окажется трудным для понимания, вернитесь к нему позже. К тому же множество библиотек машинного обучения дают возможность с легкостью реализовать обучение этим методом, не вдаваясь в подробности.

Когда мы извлекаем корень с помощью калькулятора, нас обычно мало интересует, как он это делает. Мы прекрасно знаем, что мы хотим получить, а сам счет отдаем машине. Но для тех, кому интересен этот метод, мы рассмотрим его вкратце.

Начнем с того, что один выходной нейрон в нашей модели отвечает только за один класс. Если это объект того класса, за который отвечает нейрон, мы желаем видеть единицу на его выходе, в противном случае — ноль. В реальном же предсказании класса, как мы уже знаем, искусственный нейрон активируется в открытом диапазоне между нулем и единицей, при этом значение может быть сколь угодно близким к этим двум асимптотам.

Значит, чем точнее мы угадываем класс, тем меньше абсолютная разница между реальным классом и активацией нейрона, отвечающего за этот класс.

Попробуем создать функцию потери, которая бы возвращала числовое значение штрафа. Такое, чтобы оно было маленьким в том случае, когда нейросеть выдает значения, близкие к значению класса, и очень большим в том случае, в котором нейросеть выдает значения, приводящие к неправильному определению класса:

Графики функции штрафов как функции от выхода нейрона:

1 — в том случае, если объект принадлежит этому классу (ожидаем единицу).

2 — в том случае, если объект не принадлежит этому классу (ожидаем ноль).

Теперь осталось записать функцию потери в виде выражения. Еще раз напомню, что Y для каждого i-го элемента обучающей выборки размером m всегда принимает значения либо ноль, либо один, так что в выражении всегда останется только один из двух члeнов.

Те, кто знаком с теорией информации, узнают в этом выражении перекрестную энтропию (cross entropy). C точки зрения теории информации, обучением является минимизация перекрестной энтропии между реальным классами и гипотезами модели.

Функция потери:

def binary_crossentropy(X, Y, model): # loss function J = 0 m = len(Y) for i, y in enumerate(Y): J += -(1/m)*(y*np.log(neuron(X[i], model))+(1.-y)*np.log(1.-neuron(X[i], model))) return J

Проинициализировав коэффициенты матрицы весов случайным образом, мы хотим внести в них изменения, которые сделают нашу модель лучше, иначе говоря — уменьшат потерю. Если будет известно, насколько влияют веса на функцию потерь, станет понятно, как их нужно изменить.

Нам поможет частная производная — градиент. Именно она показывает, как функция зависит от ее аргументов. На сколько (сверхмалых) величин нужно изменить аргумент, чтобы функция изменилась на одну (сверхмалую) величину. Значит, мы можем переинициализировать матрицу весов:

Повторять этот шаг нужно итеративно. По сути, это и есть постепенный градиентный спуск маленькими шажками, размером с α (этот параметр еще называют темпом обучения), в локальный минимум функционала потери. Другими словами, в каждой точке, задаваемой нынешними значениями W, мы узнаем направление, в котором функционал потери изменяется самым быстрым образом, и динамика обучения напоминает шарик, постепенно скатывающийся в локальный минимум.

Градиентный спуск:

def gradient_descent(model, X_in, Y, number_of_iteratons=500, learning_rate=0.1): X = [[1]+[v.tolist()] for v in X_in] m = len(Y) for it in range(number_of_iteratons): new_model = [] for j, w in enumerate(model): error = 0 for i, x in enumerate(X): error += (1/m) * (neuron(X[i], model) - Y[i]) * X[i][j] w_new = w - learning_rate * error new_model.append(w_new) model = new_model model_loss = binary_crossentropy(X, Y, model) return model

Метод обратного распространения ошибки (backpropagation) продолжает эту цепочку рассуждений на случай многослойной нейронной сети. Благодаря ему можно обучать глубинные слои на основе градиентного спуска. Обучение происходит шаг за шагом от последнего слоя к первому. Думаю, этой информации вполне хватит, чтобы понять суть метода.

Пример обучения нейросети

Предположим, мы хотим узнать вероятность покупки клиента на основе всего одного параметра — его возраста. Мы хотим создать нейрон, который будет возбуждаться в тех случаях, когда вероятность покупки составляет более 50%.

Обучающая выборка купивших и не купивших

У нейрона существует один рецептор, связанный с возрастом клиента. Кроме того, мы добавляем один bias члeн, который будет отвечать за сдвиг (или за смещение). Например, хоть эти множества и линейно неразделимы, но примерная граница, иначе выражаясь, наилучшая разделяющая гиперповерхность (в одномерном случае — точка), между ними располагается в возрасте 42 лет.

Нейросеть должна давать значения вероятности покупки меньше 0,5 при возрасте до 42 лет и больше 0,5 для более взрослых клиентов.

Если вспомнить функцию активации, она возвращает значения больше 0,5 для положительных аргументов и меньше 0,5 для отрицательных. Значит, нужна возможность сдвигать эту функцию активации на какое-то пороговое значение.

При этом мы ожидаем такую скорость перелома функции активации, которая бы лучше всего соответствовала обучающей выборке. От коэффициентов матрицы весов будет зависеть степень возбуждения каждого нейрона как функция от вектора признаков x, и, соответственно, вероятность принадлежности элемента с таким вектором признаков к этому классу.

Ожидаемая реакция нейрона на возраст клиента с разной степенью «уверенности» в результате, регулируемой коэффициентом при аргументе

Теперь запишем это математически и поймем, зачем нам нужен еще один bias-term в матрице весов. Чтобы сместить функцию f(x) вправо, например, на 42, мы должны вычесть 42 из ее аргумента f(x-42). При этом мы хотим получить слабый перегиб функции, умножив аргумент, например, на 0,25 и получить следующую функцию f(0.25(x-24)).

Раскрывая скобки, получим:

В нашем случае искомый коэффициент матрицы весов w = 0.25, а сдвиг b = -10.5. Но мы можем считать, что b это нулевой коэффициент матрицы весов (w0=b) в том случае, если для любого примера нулевым признаком всегда будет единица (x0=1). Тогда, например пятнадцатый «векторизированный» клиент с возрастом в 45 лет, представленный как x(15) = {x(15)0, x(15)1} = [1, 30], мог бы купить с вероятностью 68%.

Все эти коэффициенты даже в таком простом примере тяжело прикинуть «на глаз». Поэтому, собственно, мы и доверяем поиск этих параметров алгоритмам машинного обучения.

Например, мы ищем два коэффициента матрицы весов (w0=b и w1):

Эволюционное обучение на данных без нормировки

Проинициализировав коэффициенты матрицы весов случайным образом и использовав эволюционный алгоритм, мы получили обученную нейросеть после смены ста поколений. Чтобы получить нужный результат обучения быстрее и без таких резких скачков, необходимо нормировать данные перед обучением.

Эволюционное обучение на нормированных данных

Точнее всего сpaбатывает метод градиентного спуска. При использовании этого метода данные всегда должны быть нормированы.

В отличие от эволюционного алгоритма метод градиентного спуска не испытывает скачков, связанных с «мутациями», а постепенно двигается к оптимуму. Но минус в том, что этот алгоритм может застрять в локальном минимуме и уже не выйти из него, или градиент может пpaктически «исчезнуть» и обучение прекратится.

Обучение на основе метода градиентного спуска

Если множества классов купивших и не купивших линейно разделимы, нейрон будет более «уверен» в своих решениях и изменение степени его активации будет иметь более выражено переломом на границе этих множеств.

Обучение на линейно разделимых множествах

Классическую нейросеть можно представить в виде вычислительного графа, содержащего:

  • входные вершины x;
  • вершины, являющиеся нейронами со значениями их выхода a;
  • вершины, отвечающие за bias b;
  • ребра, умножающие значения выхода предыдущего слоя на соответствующие им коэффициенты матрицы весов w;
  • гипотезу hw,b(x) — результат выхода последнего слоя:

Вычислительный граф классической искусственной нейросети

Рассмотрим пару примеров онлайн-песочницы библиотеки TensorFlow. Во всех примерах необходимо разделить два класса, объекты которых располагаются на плоскости. Входной слой имеет два «рецептора», значения которых соответствуют координатам объекта по осям абсцисс и ординат (плюс один bias, в анимации bias не изображен).

Для обучения на линейно разделимых множествах достаточно иметь всего один выходной нейрон, скрытый (ассоциативный) слой отсутствует. Обучение происходит на основе метода обратного распространения ошибки.

Один выходной нейрон находит разделяющую прямую

Попробуем усложнить задачу и разделить множества, элементы первого из которых имеют только положительные или только отрицательные значения по обеим координатам, а элементы второго имеют одно положительное и одно отрицательное значение их координат.

В этом примере уже не обойтись одной разделяющей прямой, потребуется наличие скрытого слоя. Попробуем начать с самого минимума и добавить два нейрона в скрытый слой.

Два ассоциативных нейрона и две разделяющие прямые

Как мы видим, два нейрона в скрытом слое справляются с этой задачей, хоть и не лучшим образом. Обратите внимание, как в процессе обучения происходит специализация (дифференциация) нейронов. Теперь создадим скрытый слой, состоящий из четырех нейронов.

Четыре ассоциативных нейрона и четыре разделяющие прямые

Нейросеть хорошо справилась с этой задачей. Обратите внимание на то, как происходит обучение. Сначала нейросеть нашла самое простое решение — разделяющий коридор. Затем произошла переспециализация нейронов. Теперь каждый скрытый (ассоциативный) нейрон отвечает за свой узкий сегмент.

Попробуем решить достаточно сложную задачу — разделение элементов двух множеств, лежащих в разных спиральных рукавах.

Многослойная нейросеть с топологией «бутылочное горлышко»

Для решения сложной задачи необходимо множество скрытых слоев. С задачей хорошо справляется нейросеть с топологией «бутылочное горлышко», в которой количество нейронов уменьшается от первого скрытого слоя к последнему. Обратите внимание на то, какие сложные паттерны возникают при специализации ассоциативных нейронов. В случае глубоких нейронных сетей лучше использовать ReLU (rectified linear unit) функцию активации для скрытых нейронов и обычную логистическую активацию (в идеале softmax-активацию) для последнего слоя.

На этом, я думаю, можно закончить наш сверхкраткий курс искусственных нейронных сетей, и попробовать применить наши знания на пpaктике. Советую построить свою модель на уже готовой библиотеке, которые сейчас есть для любого языка программирования, а также постепенно углубллять свои теоретические знания в этом направлении.

Обучение модели

Когда у нас есть и обучающая выборка, и теоретические знания, можем начинать обучение нашей модели. Однако проблема заключается в том, что часто элементы множеств представлены в неравных пропорциях. Купивших может быть 5%, а некупивших — 95%. Как в таком случае производить обучение? Ведь можно добиться 95% достоверности, утверждая, что никто не купит.

Наверное, метрика точности в таком случае должна быть иной, да и обучать нужно тоже разумно, чтобы нейросеть не сделала такого же очевидно неверного вывода. Для этого я предлагаю «кормить» нейросеть обучающими примерами, содержащими равное количество элементов разных классов.

Например, если у нас всего 20,000 примеров и из них 1,000 купивших, можно случайным образом выбрать из каждой группы по 500 примеров и использовать их для обучения. И повторять эту операцию раз за разом. Это немного усложняет реализацию процесса обучения, но зато помогает получить грамотную модель.

Выбрав модель и алгоритм обучения, желательно разделить выборку на части: провести обучение на обучающей выборке, составляющей 70% от всей, и пожертвовать 30% на тестовую выборку, которая потребуется для анализа качества полученной модели.

Оценка качества модели

Подготовив модель, необходимо адекватно оценить ее качество. Для этого введем следующие понятия:

  • TP (True Positive) — истинноположительный. Классификатор решил, что клиент купит, и он купил.
  • FP (False Positive) — ложноположительный. Классификатор решил, что клиент купит, но он не купил. Это так называемая ошибка первого рода. Она не так страшна, как ошибка второго рода, особенно в тех случаях, когда классификатор — тест на какое-нибудь заболевание.
  • FN (False Negative) — ложноотрицательный. Классификатор решил, что клиент не купит, а он мог купить (или уже купил). Это так называемая ошибка второго рода. Обычно при создании модели желательно минимизировать ошибку второго рода, даже увеличив тем самым ошибку первого рода.
  • TN (True Negative) — истинноотрицательный. Классификатор решил, что клиент не купит, и он не купил.

Кроме прямой оценки достоверности в процентах, существуют такие метрики, как точность (precision) и полнота (recall), основанные на вышеприведенных результатах бинарной классификации.

Сравнение результатов классификации разных моделей

Как мы видим, в нейросети в три раза меньше ошибок второго рода, по сравнению со старой скоринг-моделью, и это очень неплохо. Ведь когда мы упускаем потенциальных клиентов, мы теряем потенциальную прибыль.

Давайте теперь на основе имеющихся данных выведем метрики качества наших моделей.

Метрика достоверности

Самая простая метрика — это метрика достоверности (accuracy). Но эта метрика не должна быть единственной метрикой модели, как мы уже поняли. Особенно в тех случаях, когда существует перекос в выборке, то есть представители разных классов встречаются с разной вероятностью.

Точность и полнота

Точность (precision) показывает отношение верно угаданных объектов класса ко всем объектам, которые мы определили как объекты класса.

Например, мы решили, что купит 115 человек, а из них реально купило 37. Следовательно, точность составляет 0,33. Полнота (recall) показывает отношение верно угаданных объектов класса ко всем представителям этого класса. Например, среди нами угаданных реально купило 37, а всего купивших было 43. Значит наша полнота составляет 0,88.

Таблица ошибок или confusion matrix

F-мера

F-мера (F1 score) — это среднее гармонической точности и полноты. Она помогает сравнить модели, используя одну числовую меру.

Используя все эти метрики, проведем оценку наших моделей.

Оценка качества моделей на основе разных статистических метрик

Как видно на диаграмме, самый большой перекос в качестве моделей именно в метрике полноты. Нейронная сеть угадывает 88% потенциальных клиентов, упуская только 12%. Старая же скоринг-модель упускала 36% процентов потенциальных клиентов, пропуская к менеджерам лишь 64%.

Собственно по этой причине лучше доверить подборку коэффициентов значимости разных ответов, влияющих на скоринг, нейросети. Машина способна удерживать в памяти всю выборку, находить в ней закономерности и строить модель, обладающую хорошей предсказательной способностью.

Интерпретация модели

Когда у нас есть готовая модель, мы можем использовать ее, ожидая той точности, которую нам дал анализ ее качества. Если есть возможность внедрить сложную (многослойную) модель в свой процесс, хорошо, но если нет, можно получить привычную скоринг-модель из однослойной нейросети. Именно для этого мы так подробно ознакомились с устройством нейросетей — чтобы смело заглянуть ей под капот.

Сравним формулу линейной скоринг модели и функцию работы одного нейрона (или однослойной нейросети):

Видим, что выражение, являющееся аргументом функции активации, идентично линейной формуле скоринга. Значит, «вытащив» значения матрицы весов из однослойной нейросети, мы можем воспользоваться ими как коэффициентами скоринг-модели. Только теперь эти коэффициенты аккуратно подобраны алгоритмом на основе большого количества данных.

Теперь сравним результаты линейного скоринга на основе коэффициентов до и после внедрения нейросети. Вспомним, что логистическая функция активации дает значение (с точки зрения нейросети — вероятность принадлежности к классу купивших) большее 0,5 при положительном значении аргумента (скоринга на основе матрицы весов). Мы умножили значения нейронного скоринга на 100, чтобы масштабировать баллы, и прибавили 500, как пороговое значение. У старого скоринга проходной порог подбирался вручную и составлял 170. Все это просто линейные манипуляции, никак не влияющие на саму модель.

Распределение купивших (красных) и не купивших (синих) клиентов в рамках старой скоринг модели

Как видно из распределения, клиенты слишком сильно размазаны по всему диапазону значений скоринга. Полнота (доля предсказанных моделью из всего числа купивших клиентов) составляет 64%.

Распределение купивших (красных) и не купивших (синих) клиентов в рамках нейронной скоринг-модели

Нейросеть справилась с задачей разделения купивших и не купивших пользователей лучше старой модели. Не купившие (в основном) получили значения ниже порогового, купившие — выше. Полнота (доля предсказанных моделью из всего числа купивших клиентов) составляет 88%.

Результат

Решая задачу, мы хотели уделить как можно больше времени тем, кто купит самый дорогой тариф Serpstat. Мало того, мы захотели создать такую скоринг-модель, в которой клиенты, покупающие самый дешевый тариф, не набирали бы проходной балл.

На этот раз для обучении нейронной сети мы разделили выборку на класс купивших на определенную сумму и выше, и на класс купивших на меньшую сумму или вообще не купивших.

Распределение купивших (красных) и не купивших (синих) клиентов в рамках финальной нейронной скоринг-модели

При прочих, пpaктически равных показателях точности, нейронная сеть смогла добиться большей полноты и охватить 87% купивших дорогие тарифные планы.

Для сравнения: старый скоринг справился только с 77%. Значит, в будущем мы сможем покрыть еще 10% весомых и потенциальных клиентов. При этом процент купивших дорогие тарифы из прошедших скоринг пpaктически одинаков: 23% и 24% для нейросети и старой модели соответственно. При этом видно, что значение скоринга хорошо коррелирует с суммой покупки.

Сравнение качества старой и новой скоринг-модели

Если у вас остались вопросы, пожелания или замечания, давайте обсудим в комментариях.

Этот текст обновлен. Первая версия вышла 11.12.2017.



Комментарии:

Лучшие программы для исправления орфографических ошибок

Лучшие программы для исправления орфографических ошибок Исправление ошибок в тексте возможно с помощью онлайн-инструментов и стационарных программ...

26 04 2024 0:50:12

Как открыть магазин на Etsy

Как открыть магазин на Etsy Магазин вязанных вещей хенд мейд. Как за два месяца увеличить посещаемость в 20 раз....

25 04 2024 1:42:22

Как сделать платежи в соцсетях удобными для клиента и продавца

Как сделать платежи в соцсетях удобными для клиента и продавца Оплата покупок в Facebook и Instagram через платежные ссылки...

24 04 2024 22:26:15

11 функций Google Таблиц в помощь SEO-специалистам

11 функций Google Таблиц в помощь SEO-специалистам Нужно разбить ячейку или составить график? Если вы знаете функции, таблицы гугл могут пpaктически заменить отдельные сервисы или дополнения...

23 04 2024 4:50:24

Сколько стоил клик в Google Ads и Facebook в Украине в четвёртом квартале 2018 года

Сколько стоил клик в Google Ads и Facebook в Украине в четвёртом квартале 2018 года Исследование по 38,5 миллионам кликов в 22 тематиках в 391 городе страны....

22 04 2024 19:11:32

Как сделать покупателя более платежеспособным и нарастить объемы продаж в eCommerce

Как сделать покупателя более платежеспособным и нарастить объемы продаж в eCommerce Большинство покупателей предпочитают безналичный расчет, желают иметь разные варианты оплаты. Как их наличие или отсутствие влияет на средний чек?...

21 04 2024 3:50:14

Как грамотно работать с Директ Коммaндер

Как грамотно работать с Директ Коммaндер Директ Коммaндер от Яндекса позволяет легко работать с большими кампаниями...

20 04 2024 16:37:11

Кейс: как провести анализ конкурентов с помощью SimilarWeb

Кейс: как провести анализ конкурентов с помощью SimilarWeb Определение, исследование и проверка конкурентов в Similarweb — первый шаг перед запуском и масштабированием проекта...

19 04 2024 8:13:58

Email моей мечты, или Как настроить корпоративную почту

Email моей мечты, или Как настроить корпоративную почту Можно открыть корпоративную почту с использованием собственного сервера для принятия/отправки и с использованием стороннего сервиса от яндекс или гугл...

18 04 2024 18:35:13

Динамический ремаркетинг в myTarget: подробный мануал и кейс

Динамический ремаркетинг в myTarget: подробный мануал и кейс Как настроить динамический ремаркетинг в myTarget и эффективно ли работают такие объявления — делимся собственным опытом....

17 04 2024 7:47:52

От разработки сайта до ROMI 1070% за два года — кейс Dressa

От разработки сайта до ROMI 1070% за два года — кейс Dressa Что бывает, когда работа над продвижением сайта начинается до его выхода в паблик....

16 04 2024 8:53:48

Как добавить время работы в объявления Google Ads

Как добавить время работы в объявления Google Ads Google внедрил новую возможность выделить объявление — автоматическое добавление часов работы. Давайте разберемся, как добавить эту полезную информацию в расширения объявлений...

15 04 2024 2:17:19

Сколько стоил клик в Google Ads в Казахстане в третьем квартале 2020 года — исследование Netpeak

Сколько стоил клик в Google Ads в Казахстане в третьем квартале 2020 года — исследование Netpeak Данные, приведенные в исследовании, могут помочь в составлении медиапланов по продвижению в интернете....

14 04 2024 17:46:19

Поведенческая экономика и три принципа мотивации человека

Поведенческая экономика и три принципа мотивации человека Как правильно мотивировать и демотивировать себя — теория и кейсы. Как бросить курить, начать бегать и наконец-то приступить к изучению английского. Читать!...

13 04 2024 15:25:16

Сармантай Касенов, «1С-Битрикс»: «Наши продукты повышают уровень компетентности казахстанских предпринимателей»

Сармантай Касенов, «1С-Битрикс»: «Наши продукты повышают уровень компетентности казахстанских предпринимателей» Директор «1С-Битрикс» в Казахстане Сармантай Касенов о кейсах, развитии и образовательной миссии компании...

12 04 2024 5:19:32

Что такое PageRank страницы сайта и как его узнать

Что такое PageRank страницы сайта и как его узнать Алгоритм ссылочного ранжирования, который показывает ее значимость, в частности, для поисковиков. Важность показателя PageRank оспаривают, но до сих пор считают. Читать!...

11 04 2024 5:27:10

Бизнес в Китае: история и реалии мирового лидера Tencent

Бизнес в Китае: история и реалии мирового лидера Tencent Tencent — китайская компания, мировой лидер в сфере игр. Все о создании компании, доходах, прибыли, инвестициях. Особенности ведения бизнеса в Китае — в пересказе статьи Паки Маккормик. Читать дальше!...

10 04 2024 2:40:51

Сколько стоил клик Яндекс.Директ и Google Ads в Казахстане в четвертом квартале 2017 года

Сколько стоил клик Яндекс.Директ и Google Ads в Казахстане в четвертом квартале 2017 года Почти 3 миллиона клика в 24 тематиках в 15 городах Казахстана. Читайте новое исследование нашего аналитика....

09 04 2024 5:45:42

Посиделки в офисе. Детские игры, чтобы разнообразить рабочие будни

Посиделки в офисе. Детские игры, чтобы разнообразить рабочие будни По следам «Игры в кальмара». Небольшая подборка ностальгических комaндных игр, которые могут прижиться в вашем офисе....

08 04 2024 12:31:37

Как рекламировать недвижимость и анализировать статистику рекламных кампаний — кейсы Netpeak и Ringostat

Как рекламировать недвижимость и анализировать статистику рекламных кампаний — кейсы Netpeak и Ringostat Подборка для застройщиков, маркетологов и менеджеров по продажам...

07 04 2024 6:23:32

Дэн Ариэли про пятничную усталость от правильных решений

Дэн Ариэли про пятничную усталость от правильных решений Вместо легкой пятничной темы, представляю вольный перевод статьи автора книги «Позитивная иррациональность»....

06 04 2024 23:16:23

Корпоративный университет — что это и как его используют в компаниях

Корпоративный университет — что это и как его используют в компаниях ПриватБанк, АТБ и ДТЭК — эти бренды уже создали свои образовательные центры. Узнайте больше о том, как компании обучают своих сотрудников у нас и за рубежом. Читать дальше!...

05 04 2024 10:34:47

Канонический URL: как повысить рейтинг одинакового контента

Канонический URL: как повысить рейтинг одинакового контента Атрибут rel="canonical" помогает бороться с дублированием контента и обезопасить сайт от дублирования и копирования...

04 04 2024 4:21:57

Как стать партнером Netpeak Alliance

Как стать партнером Netpeak Alliance Новая партнерская программа Netpeak agency. Как получить теплого лида, стабильный пассивный доход, разместить свой логотип и ссылку на сайт на сайте Netpeak и другие бонусы партнерской программы. Узнать больше!...

03 04 2024 23:58:57

Продвижение мобильного приложения — шпаргалка для строителей воронок продаж

Продвижение мобильного приложения — шпаргалка для строителей воронок продаж С помощью этой шпаргалки вы легко распределите акценты и начнете последовательно внедрять маркетинговую стратегию по продвижению мобильного приложения...

02 04 2024 11:48:42

10 видов инноваций

10 видов инноваций Примеры инновационных проектов. Нескучная рецензия на интересную книгу....

01 04 2024 18:18:25

Как настроить таргетинг для рекламы в Instagram и Facebook

Как настроить таргетинг для рекламы в Instagram и Facebook Запускаем первую таргетированную рекламу. Мы составили инструкцию для начинающих таргетолов, а также для SMM-специалистов, которым регулярно нужно рекламировать товары и услуги. Читайте подробнее!...

31 03 2024 21:54:48

Вакцинация от Covid-19 в Украине: как организовать для сотрудников офиса

Вакцинация от Covid-19 в Украине: как организовать для сотрудников офиса Оставить заявку на горячей линии МОЗ — это только вершина айсберга. Необходимо провести опрос среди сотрудников компании. И не один. А ещё подготовить несколько помещений для вакцинации и отдыха. Узнать больше!...

30 03 2024 16:10:23

Что такое триггер в маркетинге

Что такое триггер в маркетинге Триггер — способ ненавязчивого воздействия на потенциального клиента путем использования психологических приемов в текстах, заголовках и остальном контенте...

28 03 2024 7:24:43

Алгоритмы соцсетей — зло. Так считает экс-президент Facebook и вот почему

Алгоритмы соцсетей — зло. Так считает экс-президент Facebook и вот почему Создатели алгоритмов соцсетей используют слабые места человеческого мозга. Случайно или намеренно, но они это делают. Как нам с этим жить?...

27 03 2024 14:26:28

Как восстановить трафик на важные страницы интернет-магазина с помощью Web Archive

Как восстановить трафик на важные страницы интернет-магазина с помощью Web Archive Часто трафик проседает из-за удаления важных страниц или изменения URL-адресов. Анализ данных веб-архива позволит сохранить или восстановить посещаемость...

26 03 2024 14:19:58

Какие посты заходят и почему торг уместен — итоги продвижения телеграм-канала «Артём Бородатюк» за 2021 год

Какие посты заходят и почему торг уместен — итоги продвижения телеграм-канала «Артём Бородатюк» за 2021 год Делимся итогами продвижения телеграм-канала «Артём Бородатюк» за 2021 год...

25 03 2024 9:30:13

Как объединять данные при создании отчета в Data Studio

Как объединять данные при создании отчета в Data Studio В статье коротко о способах объединения данных из разных источников для создания отчётов...

24 03 2024 21:48:13

Page Authority & Domain Authority

Page Authority & Domain Authority Что же такое эти authority и чем они лучше и полезнее, к примеру, чем Page Rank?...

23 03 2024 16:34:35

Facebook Like или Share?

Facebook Like или Share? Facebook buttons. Пора поделиться самым волнующим вопросом 2011-го года...

22 03 2024 23:40:53

Как мы сделали инструмент веб-аналитики для сайта Ecommerce

Как мы сделали инструмент веб-аналитики для сайта Ecommerce Зачем амбициозным онлайн-проектам индивидуальные инструменты веб-аналитики....

21 03 2024 11:39:20

Как настроить рекламу в Facebook Messenger, Instagram Direct и даже WhatsApp

Как настроить рекламу в Facebook Messenger, Instagram Direct и даже WhatsApp Что нужно знать перед запуском рекламы в мессенджерах....

20 03 2024 1:31:16

«Озарение. Сила мгновенных решений» Малкольма Гладуэлла

«Озарение. Сила мгновенных решений» Малкольма Гладуэлла Много интересных фактов о работе мозга и новейших исследованиях социологии и психологии....

19 03 2024 0:21:22

Как я набрал первую тысячу подписчиков в Telegram-канале — обзор платных и бесплатных методов

Как я набрал первую тысячу подписчиков в Telegram-канале — обзор платных и бесплатных методов Раскрутить телеграм-канал с нуля до тысячи — реально. Раскрываем пошаговый алгоритм и даем рекомендации для SMM-специалистов....

18 03 2024 10:14:55

Трендовые инструменты в диджитал-маркетинге и рекламе — новое исследование Gartner

Трендовые инструменты в диджитал-маркетинге и рекламе — новое исследование Gartner В 2019 году в цикл зрелости вошли 28 технологий и инструментов...

17 03 2024 4:45:35

Как быстро почистить трэш-площадки в контекстно-медийной сети Google

Как быстро почистить трэш-площадки в контекстно-медийной сети Google Если хотите, чтобы кампании в контекстно-медийной сети работали эффективно, следует очистить площадки и ввести это в привычку...

16 03 2024 22:35:11

Контекстная реклама для SaaS-продукта: как легко измерять в бизнес-показателях эффективность контекстной рекламы

Как правильно рассчитать окупаемость рекламных кампаний SaaS-продуктов, получить по ним четкую аналитику, и что делать дальше....

15 03 2024 2:52:13

MEGOGO, Google, Фокстрот и AIR Brands — как бренды создают эффективный видеоконтент

MEGOGO, Google, Фокстрот и AIR Brands — как бренды создают эффективный видеоконтент Бренды поделились инсайтами на ДиВи Конф — фишки от MEGOGO, Google, TikTok, Banda, McCann, I am IDEA, AIR Brands, Rocket и Фокстрот...

14 03 2024 11:24:27

Как с помощью Google Earth собрать контакты для email-рассылок и холодных звонков

Как с помощью Google Earth собрать контакты для email-рассылок и холодных звонков Проверенный способ для сбора базы данных. Метод, с помощью которого можно извлечь контактные данные, а именно: название точки, телефон, адрес, сайт., а потом высылать своё КП, промокоды для акции, сообщить о выходе товара, сделать спецпредложение...

13 03 2024 13:55:55

Почему трудоголики — не герои: ломаем стереотипы с «Rework»

Почему трудоголики — не герои: ломаем стереотипы с «Rework» «Rework» — одна из самых любимых книг нетпиковцев....

12 03 2024 4:30:15

17 полезных кейсов от спикеров 8P

17 полезных кейсов от спикеров 8P Нашим решением было трaнcлировать хотя бы часть опыта спикеров 8P, составив дайджест лучших, на их взгляд, кейсов, о которых они узнали за этот год....

11 03 2024 6:24:43

Как сэкономить время специалиста при работе с крупным проектом — на примере OLX

Как сэкономить время специалиста при работе с крупным проектом — на примере OLX Убираем человеческий фактор при сборе отчетов по контекстной рекламе...

10 03 2024 5:33:38

Прием антисептика внутрь, парень-микрофончик и открыть рот за $9: реклама в соцсетях в феврале 2021

Примеры странной, классной и непонятной рекламы в соцсетях из моей ленты за февраль 2021 года...

09 03 2024 0:16:35

CEO of Ringostat Александр Максименюк: кому и зачем нужен Call Tracking

CEO of Ringostat Александр Максименюк: кому и зачем нужен Call Tracking 79% владельцев смартфонов, если верить Google, используют их для покупок или заказов услуг. Это более двух миллиардов человек. Ничего удивительного, что даже Google запустил собственный сервис Call Tracking. Кому и зачем жизненно важно отслеживать звонки...

08 03 2024 20:50:38

Еще:
понять и запомнить -1 :: понять и запомнить -2 :: понять и запомнить -3 :: понять и запомнить -4 :: понять и запомнить -5 :: понять и запомнить -6 :: понять и запомнить -7 ::