Опубликован: 25.12.2006 | Доступ: свободный | Студентов: 1883 / 400 | Оценка: 4.43 / 4.13 | Длительность: 15:29:00
Специальности: Программист, Экономист
Лекция 3:

Обучение с учителем: Распознавание образов

Градиентное обучение многослойных персептронов

Градиентное обучение

Наиболее общим способом оптимизации нейросети является итерационная (постепенная) процедура подбора весов, называемая обучением, в данном случае - обучением с учителем, поскольку опирается на обучающую выборку примеров \{x^\alpha,y^\alpha\}, например - примеров правильной классификации.

Когда функционал ошибки задан, и задача сводится к его минимизации, можно предложить, например, следующую итерационную процедуру подбора весов: w^{x+1}=w^x-\eta^x\frac{\partial{E}}{\partial{w}} или, что то же самое:

w^{x+1}_{ij}=w^x_{ij}-\eta^x\frac{\partial{E}}{\partial{w_{ij}}}.

Здесь \eta^x\ll|w| - темп обучения на шаге \tau. Можно показать, что постепенно уменьшая темп обучения, например по закону \eta^x = 1/\tau, описанная выше процедура приводит к нахождению локального минимума ошибки.

Исторически наибольшую трудность на пути к эффективному правилу обучения многослойных персептронов вызвала процедура эффективного расчета градиента функции ошибки \frac{\partial{E}}{\partial{w}}. Дело в том, что ошибка сети определяется по ее выходам, т.е. непосредственно связаная лишь с выходным слоем весов. Вопрос состоял в том, как определить ошибку для нейронов на скрытых слоях, чтобы найти производные по соответствующим весам. Нужна была процедура передачи ошибки с выходного слоя к предшествующим слоям сети, в направлении обратном обработке входной информации. Поэтому такой метод, когда он был найден, получил название метода обратного распространения ошибки.

Метод обратного распространения ошибки

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

Так, например, базовый алгоритм был изложен в диссертации Пола Вербоса (Paul Werbos) 1974 года, но тогда не привлек к себе должного внимания. Рождение алгоритма back-propagation (обратного распространения ошибки) для широкой публики связано с работой группы PDP (Parallel Distributed Processing), освещенной в двухтомном труде 1986г. Именно там в статье Румельхарта, Хинтона и Уильямса была изложена теория обучения многослойного персептрона.

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

Фрэнк Розенблатт использовал в своем персептроне недифференцируемую ступенчатую функцию активации. Возможно, именно это помешало ему найти эфективный алгоритм обучения, хотя сам термин Back Propagation восходит к его попыткам обобщить свое правило обучения одного нейрона на многослойную сеть. Как знать, используй Розенблатт вместо ступенчатой функции активации - сигмоидную, может быть его судьба сложилась бы по-другому1Розенблатт трагически погиб, не перенеся тяжелую депрессию, вызванную прекращением финансирования и охлаждением научного собщества к персептронам после выхода в свет книги Минского и Пейперта.

Разберем этот ключевой для нейрокомпьютинга метод несколько подробнее. Обозначим входы n-го слоя нейронов x^{[n]}_j. Нейроны этого слоя вычисляют соответствующие линейные комбинации:

a^{[n]}_j=\sum_jw^{[n]}_{ij}x^{[n]}_j
и передают их на следующий слой, пропуская через нелинейную функцию активации (для простоты - одну и ту же, хотя это совсем необязательно):
x^{[n+1]}_j=f(a^{[n]}_i).
Для построения алгоритма обучения нам надо знать производную ошибки по каждому из весов сети:
\frac{\partial{E}}{\partial{w^{[n]}_{ij}}}=\frac{\partial{E}}{\partial{a^{[n]}_i}}\frac{\partial{a^{[n]}_i}}{\partial{w^{[n]}_{ij}}}\equiv\delta^{[n]}_ix^{[n]}_j.
Таким образом, вклад в общую ошибку каждого веса вычисляется локально, простым умножением невязки нейрона \delta^{[n]}_i на значение соответствующего входа. (Из-за этого, в случае когда веса изменяют по направлению скорейшего спуска \Delta{w_{ij}}\infty-\partial{E}/\partial{w_{ij}}=-\delta_ix_j, такое правило обучения называют дельта-правилом.)

Входы каждого слоя вычисляются последовательно от первого слоя к последнему во время прямого распространения сигнала:

x^{[n+1]}_i=f\left(\sum_jw^{[n]}_{ij}x^{[n]}_j \right)
, а невязки каждого слоя вычисляются во время обратного распространения ошибки от последнего слоя (где они определяются по выходам сети) к первому:
\delta^{[n]}_i=f'(a^{[n]}_i)(\sum_kw^{[n+1]}_{ki}\delta^{[n+1]}_k).
Последняя формула получена применением цепного правила к производной
\frac{\partial{E}}{\partial{a^{[n]}_i}}=\sum_k\frac{\partial{E}} {\partial{a^{[n+1]}_k}}\frac{\partial{a^{[n+1]}_k}}{\partial{x^{[n+1]}_i}}
\frac{\partial{x^{[n+1]}_i}}{\partial{a^{[n+1]}_i}}.
и означает, что чем сильнее учитывается активация данного нейрона на следующем слое, тем больше его ответственность за общую ошибку.

Эффективность алгоритма back-propagation

Важность изложенного выше алгоритма back-propagation в том, что он дает чрезвычайно эффективный способ нахождения градиента функции ошибки \frac{\partial{E}}{\partial{w}. Если обозначить общее число весов в сети как W, то необходимое для вычисления градиента число операций растет пропорционально W, т.е. этот алгоритм имеет сложность O(W). Напротив, прямое вычисление градиента по формуле

\frac{\partial{E}}{\partial{w^{[n]}_{ij}}}=\frac{E(w^{[n]}_{ij}+\varepsilon)-E(w^{[n]}_{ij})}{\varepsilon}
потребовала бы W прямых прогонов через сеть, требующих O(W) операций каждый. Таким образом "наивный" алгоритм имеет сложность O(W^2), что существенно хуже, чем у алгоритма back-propagation.