Processing math: 2%

Нейронные сети: 4. Обучение


Введение

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


Нейрон

Напомним, что нейрон с n входами характеризуется n+1 параметром: вектором нормали к разделяющей гиперплоскости \boldsymbol{\omega}=\{\omega_1,...,\omega_n\} и её сдвигом \omega_0. Расстояние d от вектора входа \mathbf{x} к гиперплоскости равно: d=\omega_0+\omega_1x_1+...+\omega_nx_n = \omega_0+\boldsymbol{\omega}\mathbf{x} = \sum^{n}_{i=0}\,\omega_ix_i. Для сокращения выражений, удобно вводить фиктивный вход x_0=1, всегда равный единице. На выходе нейрона y расстояние d нормируется на диапазон [0...1]: y ~=~ y(\omega,\,\mathbf{x}) ~=~ S(d) ~=~ S\Bigr(\sum^n_{i=0} \omega_i x_i \Bigr),~~~~~~~~~~~S(d) = \frac{1}{1+e^{-d}} Производную сигмоидной функции можно выразить через значение выхода нейрона: \begin{equation}\label{df_sigmoid} S'(d) = \frac{e^{-d}}{(1+e^{-d})^2}=S(d)\,\bigr(1-S(d)\bigr) = y\,(1-y). \end{equation} Если y\sim 0 или y\sim 1 производная S'(d) очень мала (горизонтальные участки сигмоиды). Максимальное значение 1/4 производной (наибольшая чувствительность нейрона) достигается при при y=1/2 или d=0.

Однослойная сеть

Пусть на вход нейрона подаётся вектор \mathbf{x}, в результате чего на выходе получется значение y. И пусть на самом деле значению \mathbf{x} должен соответствовать выход Y. Определим ошибку "работы нейрона", как среднеквадратичное отклонение желаемого выхода от фактического: E^2 = \bigr(Y-y(\omega,\,\mathbf{x})\bigr)^2. Задача обучения нейрона состоит в минимизации этой ошибки. Вычислим градиент ошибки. Он направлен в сторону её максимального роста (в обратном направлении ошибка убывает): \frac{\partial E^2}{\partial \omega_i} ~=~ \frac{\partial E^2}{\partial y}\cdot\frac{\partial y}{\partial d}\cdot \frac{\partial d}{\partial \omega_i} ~=~ -2\,(Y-y)\cdot y\,(1-y)\cdot x_i, где учтена производная сигмоидной функции (\ref{df_sigmoid}). Таким образом, вектор нормали \boldsymbol{\omega} и смещение необходимо сдвинуть против градиента на величины: \begin{equation} \Delta\boldsymbol{\omega} = 2\,\gamma\,(Y-y)\,y\,(1-y)\,\mathbf{x},~~~~~~~~~~~~~~~~\Delta\omega_0 = 2\,\gamma\,(Y-y)\,y\,(1-y), \end{equation} где абсолютную величину сдвига (шаг) задаёт параметр \gamma.

Геометрический смысл этих формул прост. Пусть Y=1, а нейрон выдаёт y \ll 1. Тогда вектор нормали (и плоскость) повернётся в сторону примера \mathbf{x}, а \omega_0 увеличится, т.е. плоскость сдвинется в противоположную от входа сторону. Когда Y=0, а y \sim 1, множитель Y-y становится отрицательным и всё произойдёт с точностью до наоборот.

На самом деле, множители y\cdot(1-y) вредят обучению. Например, пусть y\sim 0, а необходимо иметь Y=1. В этом случае сдвиг \omega_i должен быть существенным, а этого не происходит. Без изменения направления градиента, можно использовать другие формулы: \Delta\boldsymbol{\omega} = \gamma\,f(Y-y)\,\mathbf{x},~~~~~~~~~~~~~~~~\Delta\omega_0 = \gamma\,f(Y-y), где f(z) - гладкая, нечётная функция, имеющая малые значения при z\sim 0 (когда Y\approx y) и большие по модулю при z\neq 0. Вместо линейной зависимости, можно, например, выбрать (Y-y)^3.


Усреднение градиента

Минимизируемая поверхность с кучей вмятинок будет приводить к "дёрганью" градиента. Чтобы уменьшить такой эффект, прежде чем изменять параметры нейрона \omega_i=\{\omega_0,\boldsymbol{\omega}\}, приращения \Delta\omega_i усредняются по нескольким примерам. Такую "пачку" объектов называют bunch. В банче могут быть, как примеры различных классов, так и одного. В последнем случае скорость передвижения вдоль градиента необходимо существенно уменьшить.

Ещё один способ сглаживания градиента - это скользящее среднее. Получив очередное значение \Delta\omega_i(t), вычисляется \overline{\Delta\omega_i}(t) = \beta\cdot\overline{\Delta\omega_i}(t-1)+(1-\beta)\cdot\Delta\omega_i(t). Если параметр \beta=0, то усреднения нет. При \beta\to 1 происходит сильное усреднение. Параметры нейрона меняются по формулам: \omega_i(t+1) = \omega_i(t) - \gamma\cdot\overline{\Delta\omega_i}(t).


Контроль уверенности нейрона

В ряде случаев необходимо контролировать уверенность нейрона так, чтобы длина его вектора нормали \boldsymbol{\omega} росла медленнее, чем ориентация и положение плоскости. Для этого воспользуемся методом множителей Лагранжа, введя дополнительные параметры \lambda и N: E^2 =\bigr(Y-y(\omega,\,\mathbf{x})\bigr)^2 + \lambda\,\bigr(\boldsymbol{\omega}^2-N\bigr). Вычислим градиент по всем параметрам: \frac{\partial E^2}{\partial \omega_i} = -2\,(Y-y)\,y\,(1-y)\,x_i + 2\lambda\,\omega_i, ~~~~~~~~~ \frac{\partial E^2}{\partial \lambda} = \boldsymbol{\omega}^2-N,~~~~~~~~~\frac{\partial E^2}{\partial N} = -\lambda. Соответственно, в процессе обучения происходит подправка всех параметров по формулам: \begin{array}{lcl} \omega_i(t+1)&=&\omega_i(t) - \gamma_1\cdot(-2\,(Y-y)\,y\,(1-y)\,x_i + 2\lambda\,\omega_i),\\[2mm] \lambda(t+1) &=& \lambda(t) - \gamma_2\cdot(\omega^2_1+...+\omega^2_n-N),\\[2mm] N(t+1) &=& N(t) + \gamma_3\cdot\lambda(t). \end{array} Естественно, для каждого нейрона множитель Лагранжа \lambda и целевая норма n должны быть свои (но одни и те же для всех весов нейрона \omega_i)

Двухслойная сеть

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

Выход сети имеет вид: y = S\Bigr(\sum^n_{i=0} \omega^{(2)}_{i}\cdot S\Bigr(\sum^{n_I}_{j=0}\omega^{(1)}_{ij}\,x_j\Bigr)\,\Bigr) = S\Bigr( \omega^{(2)}_{0} + \omega^{(2)}_{1}\, S\Bigr(\sum^{n_I}_{j=0}\omega^{(1)}_{1j}\,x_j\Bigr)+...+\omega^{(2)}_{n}\, S\Bigr(\sum^{n_I}_{j=0}\omega^{(1)}_{nj}\,x_j\Bigr)\,\Bigr), где n - число нейронов в скрытом слое, а n_I - число входов сети. Вычислим производную ошибки E^2=(Y-y)^2 по весам выходного нейрона: \frac{\partial E^2}{\partial \omega^{(2)}_i } = -2\,(Y-y)~y\,(1-y)~ y^{(1)}_i, где y^{(1)}_i - текущий выход i-того нейрона скрытого слоя и y^{(1)}_0=1. Аналогично для производной по весам скрытого слоя: \frac{\partial E^2}{\partial \omega^{(1)}_{ij} } ~=~ -2\,(Y-y)\,y\,(1-y)\,\omega^{(2)}_i\,y^{(1)}_i\,\bigr(1-y^{(1)}_i\bigr)\,x_j ~=~ \frac{\partial E^2}{\partial \omega^{(2)}_i }\,\omega^{(2)}_i\,\bigr(1-y^{(1)}_i\bigr)\,x_j.


Обратное распространение ошибки

Пусть \omega^\alpha_{ij} - вес входа i-того нейрона в слое \alpha, который получает сигнал от j-того нейрона предыдущего слоя \alpha-1. От весов \omega^\alpha_{ij} непосредственно зависит выход нейрона y^{\alpha}_i. Поэтому производная ошибки по весам (как сложная функция) имеет вид: \frac{\partial E^2}{\partial \omega^\alpha_{ij}} ~=~ \frac{\partial E^2}{\partial y^\alpha_i}\,\frac{\partial y^\alpha_i}{\partial \omega^\alpha_{ij}} ~=~ \Bigr[\frac{\partial E^2}{\partial y^\alpha_i}\,S'(d^{\alpha}_i)\Bigr]~\, y^{\alpha-1}_j = \chi^\alpha_i\,~ y^{\alpha-1}_j. При этом i=1\,...\,n_\alpha и j=0\,...\,n_{\alpha-1}. Вычислим производную ошибки E по y^\alpha_i. От выхода y^\alpha_i непосредственно зависят выходы всех нейронов следующего слоя y^{\alpha+1}_i. Поэтому при взятии производной необходимо поставить сумму: \frac{\partial E^2}{\partial y^{\alpha}_i} ~=~ \sum^{n_{\alpha+1}}_{j=1} \frac{\partial E^2}{\partial y^{\alpha+1}_j} \frac{\partial y^{\alpha+1}_j}{\partial y^\alpha_i} ~=~ \sum^{n_{\alpha+1}}_{j=1} \Bigr[\frac{\partial E^2}{\partial y^{\alpha+1}_j} S'(d^{\alpha+1}_j)\Bigr]\,\omega^{\alpha+1}_{ji}. Умножим левую и правую части на S'(d^\alpha_i)=y^{\alpha}_i\,(1-y^{\alpha}_i). Это даёт рекуррентную формулу для определения коэффициентов \chi^\alpha_i: \begin{equation}\label{err_chi_rec} \chi^\alpha_i =y^{\alpha}_i\,(1-y^{\alpha}_i)\,\sum^{n_{\alpha+1}}_{j=1} \chi^{\alpha+1}_j\,\omega^{\alpha+1}_{ji}. \end{equation} Таким образом, алгоритм ообратного распространения ошибки имеет вид:

  • Подаём на вход пример \mathbf{x} и при прямом распространении вычисляем выходы всех нейронов y^{\alpha}_i.
  • Для нейронов последнего слоя A вычисляем производные ошибок: \chi^A_i ~=~ \frac{\partial E^2}{\partial y^{A}_i}\,S'(d^A_i)~=~2\,(Y_i-y^{A}_i)\,y^{A}_i\,(1-y^{A}_i).
  • С их помощью, по рекуррентным формулам (\ref{err_chi_rec}) получаем коэффициенты \chi^\alpha_i для всех нейронов сети.
  • Затем подправляем веса: \Delta \omega^{\alpha}_{ji} = -\gamma\,\chi^\alpha_i\,y^{\alpha-1}_j.


Информация

Ошибки I и II рода
• Пусть, существует «основной класс»
• Обычно, это класс, при обнаружении которого, предпринимается какое-либо действие;
• Например, при постановке диагноза основным классом будет «болен», а вторичным классом «здоров».
• Ошибка первого рода равна вероятности принять основной класс за вторичный
• Вероятность «промаха», когда искомый объект будет пропущен
• Ошибка второго рода равна вероятности принять вторичный класс за основной
• Вероятность «ложной тревоги», когда за искомый объект будет принят «фон»

ROC – Receiver Operating Characteristic curve
• Кривая, отражающая зависимость чувствительности и ошибки второго рода по сранению с монеткой
• Площадь под графиком – AUC дает некоторый объективный показатель качества классификатора

Бутстраппинг (Bootstrapping)
• Выбираем отрицательные примеры случайным образом
• Обучаем классификатор
• Применяем к данным
• Добавляем ложные обнаружение к выборке
• Повторяем
• Смысл:
• Соберем ограниченную, но представительную выборку «не-обьектов»
• Заставим классификатор сконцентрироваться на сложных отрицательных (hard negative) примерах

Нейронные сети: 2. Разделяющие поверхности <
> Дaлi буде