с единственным признаком X1 • Синие — класс-1 (y=1), красные — класс-2 (y=0), • Фиолетовая линия — фрагмент сигмоиды, параметры подобраны алгоритмом логистической регрессии (градиентный спуск для единственного нейрона, активация — сигмоида) за 10 тыс. эпох • Бледные точки на сигмоиде — проекции объектов обучающей выборки на сигмоиду (их можно трактовать как предсказание класса) • Горизонтальная серая линия Φ=0.5 — порог активации сигмоиды • Для правильной классификации: бледные синие точки должны быть выше порога активации, светлые красные — ниже
синих, т. к. множество объектов обучающей выборки изначально линейно неразделимо • И не удивительно, ведь мы никаким образом не сможем расположить монотонную сигмоиду так, чтобы крайние красные точки оказались с одной, а средние синие в то же время — с другой стороны от точки пересечения порога активацией • (т.к. сигмоида пересекает порог только в одной точке)
• Верхний индекс (l) [эль маленькая] — номер слоя сети • Первый нижний индекс k — номер нейрона в текущем слое (начинаем с 1) • (иногда k будет сквозным индексом коэффициентов всей сети — смотрите контекст) • Второй нижний индекс j — номер входящей связи текущего нейрона; 0-й индекс (j=0) — для свободного члена (вес для входа от фиктивного единичного нейрона смещения)
нейронов текущего слоя (у нас полносвязная сеть) • и оно равно количеству нейронов на предыдущем слое (или количеству прямых входов для первого скрытого слоя) плюс один нейрон смещения (фиктивный нейрон) • На разных слоях эти значения (количество входящих связей) могут (и будут) отличаться • У нас уже отличаются: на первый скрытый слой один вход с единственным признаком одномерного объекта (плюс нейрон смещения); на единственный нейрон второго выходного слоя — два выхода от двух нейронов первого скрытого слоя (плюс нейрон смещения) • (для второго слоя нейрон смещения — уже настоящий нейрон)
на всех слоях • M — количество всех весовых коэффициентов на всех слоях • m(l) — количество весовых коэффициентов для каждого из нейронов на текущем [эль]-том слое (без нулевого) • a(i)(l) k — значение активации для i-го элемента на k-м нейроне l-го слоя • s(i)(l) k — взвешенная сумма для i-го элемента на k-м нейроне l-го слоя
и того же исходного объекта — это признаки некоторого производного 2-мерного объекта, • который попадает на вход единственного нейрона второго слоя. • Класс нового производного двумерного объекта — тот же самый, что и у исходного одномерного. • Только вместо одного исходного признака (одна координата) мы получили два производных признака (две координаты). • Значит теперь исходную выборку мы можем изобразить как разноцветные точки на плоскости. • И он (нейрон 2-го слоя) теперь их сможет разделить...
значения их выходов (линейные активации) выстраиваются на плоскости в линию • Нейрон на 2-м слое все так же не может отделить синие точки от красных (как и на 1-м слое) • Поэтому мы не можем строить глубокую сеть на линейных нейронах • Для того, чтобы превратить линейно неразделимые точки на первом слое в линейно разделимые точки на втором, нам нужна кривая (нелинейная) активация (в частности, отлично подходит сигмоида)
диагноз пациента) действительно определяется известными нам параметрами и что эта зависимость действует как некоторый вероятностный закон • Частное предположение-1: о форме этого неизвестного закона, в каком виде мы будем его искать, как выглядит функция, параметры которой мы будем под него подгонять • Частное предположение-2: насколько хороши выбранные параметры в рамках частного предположения-1, можно ли сделать еще более качественную подгонку
с минусом) — вычисляется на выходном нейроне • Но коэффициентов теперь больше • И структура функции усложнилась • Входные значения X теперь спрятаны глубже по уровням вложенности • Но все равно можно попробовать найти производную по каждому из параметров (посчитать градиент) • И использовать любимый градиентный спуск
[− y(i) ln(Φ(s(i)))−(1− y(i))ln(1−Φ(s(i)))] s(i)=s 1 (i)(2)=w 10 (2)+∑ k=1 m(2) (w 1k (2)a k (i)(1))=w 10 (2)+∑ k=1 m(2) (w 1k (2)Φ(∑ j=0 m(1) w kj (1) x j (i))) =w 10 (2)+w 11 (2)Φ(∑ j=0 m(1) w 1 j (1) x j (i))+w 12 (2)Φ(∑ j=0 m(1) w 2 j (1) x j (i)) =w 10 (2)+w 11 (2)Φ(w 10 (1)+w 11 (1) x 1 (i))+w 12 (2)Φ(w 20 (1)+w 21 (1) x 1 (i)) • Развернем для нашей сети из 2-х слоёв с одним нейроном на выходном слое и 2-мя нейронами на одном скрытом слое:
на всех слоях • m(l) — количество весовых коэффициентов для каждого из нейронов на текущем [эль]-том слое (без нулевого) • s(i) = s(i)(W) - взвешенная сумма входов единственного нейрона последнего (выходного) слоя для i-го элемента обучающей выборки (зависит от всех весовых коэффициентов модели) • s = s(W) — то же, что s(i) (если встречается без индекса, подразумевается текущий элемент или некий элемент не из обучающей выборки)
так, чтобы с ними можно было разделить производные (здесь производные — не в математическом смысле) объекты на 2-м • Мы будем надеяться, что путешествие к минимуму функции стоимости само приведет нас к таким параметрам модели
Скрытый слой: два нейрона по 2 коэффициента — 4 коэффициента • Плюс 3 коэффициента на входе выходного нейрона • Итого: всего 4+3=7 коэффициентов • Возьмем сетку 10 шагов на измерение • Диапазон поиска для всех коэффициентов: от -10 до 10 • Итого: 10^7 (10 000 000) комбинаций для перебора
i=1 n [ y(i)−σ(s(i))] ∂ ∂ w k s(i) ∂s(i)(W ) ∂ w k = ∂ ∂ w k [w 10 (2)+w 11 (2)Φ(w 10 (1)+w 11 (1) x 1 (i))+w 12 (2) Φ(w 20 (1)+w 21 (1) x 1 (i))] • Для нашей сети из 2-х слоёв с одним нейроном на выходном слое и 2-мя нейронами на одном скрытом слое нам теперь нужно найти:
• Определим правило шага: • Правило шага для k-го измерения: ∇ J (W )=( ∂ J (W ) ∂ w 1 ,..., ∂ J (W ) ∂w M ),W =(w 1 ,..., w M ) w:=w+Δ w ,Δ w=−η∇ J(W ) w k :=w k +Δ w k ,Δ w k =−η ∂J (W ) ∂w k
(W )= (∂J (W ) ∂w 10 (l) ,..., ∂J (W ) ∂w 1m(l) (l) ... ∂J (W ) ∂w k 0 (l) ,..., ∂J (W ) ∂w km(l) (l) ) • Здесь k — количество нейронов на текущем слое l [эль]
(W ) ∂w 10 (2) =η∑ i=1 n [ y(i)−σ(s(i))] Δ w 11 (2)=−η ∂J (W ) ∂w 11 (2) =η∑ i=1 n [ y(i)−σ(s(i))]σ(∑ j=0 m(1) w 1 j (1) x j (i)) Δ w 12 (2)=−η ∂J (W ) ∂w 12 (2) =η∑ i=1 n [ y(i)−σ(s(i))]σ(∑ j=0 m(1) w 2 j (1) x j (i))
алгоритм попроще • Должен быть алгоритм поуниверсальнее • Алгоритм, который позволит рассчитать частную производную по весовым коэффициентам на каждом слое • Для сетки с любым количеством слоев (производная функции потерь с любым уровнем вложенности) • Без необходимости выводить каждую формулу аналитически вручную
• Для нейронных сетей его называют алгоритм обратного распространения ошибки • Важный бонус: алгоритм можно представить в виде матричных операций • При использовании аппаратного ускорения обучения нейронных сетей с распараллеливанием операций в множество потоков матричное представление — наиважнейшая возможность • Библиотеки автоматического дифференцирования: Theano, TensorFlow • Аппаратные ускорители нейросеток — матричные вычислители плюс автоматическое дифференцирование (если сетку нужно еще и обучать)
одинаковый везде — это ошибка на выходном слое • Дальше она домножается на частные производные по весовым коэффициентам на каждом слое • Причем производные на более ранних слоях (ближе к входу) получаются из производных на более поздних (ближе к выходу) домножением на дополнительные конструкции • Получается, что мы как бы распространяем ошибку выходного слоя по сети в обратном направлении к 1-му слою
же, как для сети из 1 нейрона (спуск по сигмоиде) • Градиенты 1-го нейрона на 1-м слое выглядят любопытнее (очевидно, сказывается влияние 2-го нейрона на общую ошибку на выходе) • Видим продолжительные локальные минимумы (длинное плато наверху с нулевой производной) • И даже что-то, похожее на ямку на спуске (но производная все-таки не обнулилась, поэтому там не застрянем) • Оптимальный темп обучения для коэффициентов на слое 1 и слое 2 отличается на порядки. Скорее всего это скажется на сходимости алгоритма в целом и эту проблему придется как-то обходить Это только если не приводить исходные X в диапазон [0, 1]
сигмоидами (активации нейронов 1-го слоя) у нас нет никакого порога активации, • здесь нет никакого деления точек на классы (как было при обучении одного нейрона); • точка пересечения активации с Ф=0.5 или близость проекции точки на активации к линиям Ф=0 или Ф=1 нас не интересуют. • Здесь роль активаций — сгенерировать пару новых координат для объекта нелинейно из одной старой, чтобы отправить их на следующий слой. • Деление на классы происходит поверхностью активации на 2-м слое
несколько разрезов по выбранным парам измерений w • На каждом шаге будут меняться значения всех коэффициентов модели, • а текущий график будет показывать поверхность ошибки на выбранном диапазоне значений выбранной пары w • (при всех остальных параметрах для данного шага фиксированных)
(w1_10, w1_11) - нейрон-2: (w1_20, w1_21) • На 2-м слое один нейрон с 3-мя параметрами (для него одного полностью уже не можем построить функцию ошибки): - (w2_10, w2_11) — свободный коэффициент + 1-я активация - (w2_11, w1_12) — активации нейронов с предыдущего слоя
потом выбрались из локальной ямы • Это был явно не минимум, но градиент нас оттуда никак бы не вывел • Но постепенная смена окружающего ландшафта (за счет изменения других коэффициентов модели) подняла дно локальной ямы наверх к желобу • И шарик выкатился и покатился по желобу вниз
шагом меняется не только положение в пространстве, но и окружающий ландшафт. • Можно представить такую ситуацию в жизни, если вы идете по пустыне и между шагами проходит достаточно продолжительное время так, что ветер и гравитацию успевают изменить форму окружающих барханов. • Или плывете по волнам в океане • Как вариант: выкатывание мячика из одеяла подниманием за концы и встряхиванием одеяла
0.9 > 0.5 => ŷ=1 => объект x=(0.55) — класс y=1, т. е. это синий цвет (то, что внутри) => как и следовало ожидать s=s 1 (2)=w 10 (2)+w 11 (2) a 1 (1)+w 12 (2) a 2 (1)=4.38−9.79a 1 (1)−9.78 a 2 (1) =4.38−9.790.16−9.780.05=2.32 a 1 (2)= 1 1+e−2.32 =0.9
минимумом имеют разную конфигурацию весов • Они отличаются разной стратегией группировки объектов на 2-м слое (синие точки уходят в разные углы) • При этом они обе дают правильный результат
два), точнее, направлений спуска, которые удовлетворяют решению задачи, обеспечивая группировку объектов на последнем слое • В какой из них мы попадем — зависит от выбора начальных значений весов w • (если весовые коэффициенты выбираются случайно, то мы не знаем, в какую из ям мы поедем заранее) • (скорее всего таких направлений спуска четыре — по количеству углов, куда могут уползать синие точки) • (с другой стороны, без дополнительного исследования нельзя совсем исключать вариант, когда мы перескочим из одной ямы в другую в процессе обучения)
может не получиться спуститься) • На входе второго слоя значения и так получаются от 0 до 1 (спасибо сигмоиде) • Начальные коэффициенты w тоже лучше брать не очень большие (хотя, как видим, они могут вырасти далеко за пределы интервала -1, 1) • Можно попасть в локальный минимум, для этого используются разные приёмы (подбор коэффициента обучения, слагаемые регуляризации и т. п.) • Но в этот раз обошлось без «наворотов» • При этом на нейроне-1 наблюдали локальный минимум (классическая яма), но благодаря изменениям ландшафта на каждом шаге через некоторое количество шагов смогли из него выкатиться (в яму провели желоб и шарик покатился дальше вниз)
оптимального коэффициента обучения η • Стохастический спуск (обновлять веса для каждого элемента или группы элементов обучающей выборки, а не всей выборки сразу) • Масштабирование признаков: стандартизация, нормализация • Регуляризация (дополнительные слагаемые к функции ошибки) • И т.п.