самому дьяволу!
Вскоре Джеффри столкнулся с трудностями, связанными с машинами Больцмана. Поэтому он в дальнейшем сосредоточился на идее Дэйва Рамелхарта 1982 г. об обратном распространении, которую ему и удалось воплотить в жизнь. Это случилось весной 1985 г., сразу же после Лез-Уш. Вскоре я встретился с Джеффри в Париже, где он поделился со мной своими результатами. Я уже начал менять свою программу HLM, чтобы учесть обратное распространение, но у меня не было времени протестировать ее, пока Джеффри не закончил свою работу. Поэтому в сентябре 1985 г. он опубликовал технический отчет с Рамелхартом и Уильямсом, а затем вставил его как главу в книгу, опубликованную в 1986 г.[54]
Там он процитировал и мою статью о методе HLM. Он – Великий Маниту, я – маленькое перышко! Я упустил возможность предоставить ему новую версию, но все равно был счастлив.
Грааль… и немного математики
Обратное распространение градиента, о которым мы говорим, является эффективным методом вычисления градиента функции стоимости, то есть направления наибольшего наклона в сетях, состоящих из нескольких слоев нейронов. Принцип его состоит в том, чтобы распространять сигнал в сети в обратном направлении, но вместо распространения целей, как в HLM, мы распространяем градиенты, то есть частные производные.
Чтобы объяснить это, необходимо рассматривать линейные и нелинейные функции по отдельности.
Математическое понятие, на котором основано обратное распространение, есть не что иное, как правило вывода сложных функций. Как известно из школьной программы, сложная функция – это применение одной функции к выходу другой функции. К x применяется сначала функция f, а затем – к ее выходу – функция h. Почему это важно? Поскольку два последовательных слоя, линейный и нелинейный, можно рассматривать как применение двух функций, например, f для первой и h для второй. Если есть несколько слоев, будут и несколько вложений функций. В результате уравнения упрощаются. Вот в чем прелесть математики!
Рис. 5.5. Обратное распространение градиента через передаточную функцию
Производная стоимости по отношению к входу передаточной функции равна производной стоимости по отношению к выходу передаточной функции, умноженной на производную передаточной функции: dc_ds = dc_dz * hʼ(s).
Представьте себе сложную сеть из нескольких слоев, природа которых нам неизвестна (рис. 5.5). На выходе этой сети стоимость измеряет разницу между выходом сети и желаемым выходом. Рассмотрим конкретную единицу в этой сети. Она вычисляет взвешенную сумму своих входов и передает эту сумму s через передаточную функцию h и выдает выход z = h(s). Если бы мы знали производную функции стоимости по отношению к выходу передаточной функции dc_dz (то есть отношение dc/dz между изменением dc стоимости c в результате изменения dz к z), то это означало бы, что если z изменится на незначительную величину dz, стоимость c изменится на незначительную величину dc = dz * dc_dz.
Какова будет производная c по отношению к s, которую мы обозначим как dc_ds?
Если мы изменим s на незначительную величину ds, выходной сигнал передаточной функции изменится на незначительную величину dz = ds * hʼ(s), где hʼ(s) – производная h в точке s. Значит, стоимость изменится на сумму dc = ds * hʼ(s) * dc_dz. Другими словами:
dc_ds = hʼ (s) * dc_dz.
Рис. 5.6. Обратное распространение градиента через взвешенную сумму
Производная стоимости по отношению к выходу z единицы представляет собой сумму производных стоимости по отношению к последующим единицам, взвешенных по весам, соединяющим рассматриваемую единицу с этими последующими единицами:
dc_dz = w[0] * dc_ds[0] + w[1] * dc_ds[1] + w[2] * dc_ds[2]
Итак, если мы знаем производную c по отношению к z, мы можем вычислить производную c по отношению к s, умножив на производную h в точке s. Таким образом мы возвращаем градиенты через передаточную функцию.
Теперь разберемся с обратным распространением через взвешенную сумму. Рассмотрим выход единицы z, который направляется к нескольким нижестоящим единицам для вычисления взвешенных сумм. Этот выходной сигнал z направляется к нижестоящим единицам с помощью весов w[0], w[1], w[2], которые используются для вычисления взвешенных сумм s[0], s[1], s[2], как показано на рисунке 5.6.
Предположим, мы знаем производные c по отношению к нижележащим единицам dc_ds[0], dc_ds[1], dc_ds[2]
Если мы изменим z на незначительную величину, взвешенная сумма s[0] изменится на w[0] * dz.
Следовательно, стоимость изменится на dz * w[0] * dc_ds[0].
Но изменение dz также вызовет две цепочки изменений.
Первая, где s[1] изменяется на значение w[1] * dz, что само по себе вызывает изменение стоимости значения dz * w[1] * dc_ds[1].
Вторая, где s[2] изменяется на значение w[2] * dz, вызывая изменение стоимости dz * w[2] * dc_ds[2].
В итоге стоимость будет изменена на сумму всех этих помех:
dc = dz * w[0] * dc_ds[0] + dz * w[1] * dc_ds[1] + dz * w[2] * dc_ds[2]
Это – способ доказать, что производная dc/dz равна:
dc_dz = w[0] * dc_ds[0] + w[1] * dc_ds[1] + w[2] * dc_ds[2]
Это и есть формула обратного распространения градиента через линейный слой (вычисление взвешенных сумм).
Чтобы рассчитать производную стоимости по отношению к входу слоя, берутся производные стоимости по отношению к выходам слоя и вычисляется сумма, взвешенная по весам, связывающим вход с этими выходами. Другими словами, мы рассчитываем взвешенные суммы с использованием весов в обратном порядке, как и в случае с HLM.
Таким образом, для обратного распространения производных через слой передаточных функций и слои, вычисляющие взвешенные суммы, используются две формулы.
1. Cлой передаточных функций:
a) распространение с прямой связью
z[i] = h(s[i]);
b) обратное распространение
dc_ds[i] = hʼ(s[i]) * dc_dz[i].
2. Cлой взвешенных сумм:
a) распространение с прямой связью
b) обратное распространение:
Нам остается теперь вычислить производные стоимости по сравнению с весами. Когда мы изменяем вес w[i, j] на незначительную величину dw[i, j], взвешенная сумма, в которую он вносится, изменится на
dw[i, j] * z[j]
Стоимость изменится на
dc = dw[i, j] * z[j] * dc_ds[i].
Следовательно, градиент стоимости относительно веса w[i, j] будет равен:
dc_dw[i, j] = z[j] * dc_ds[i]
Мы располагаем тремя формулами обратного распространения градиента в классических многослойных нейронных сетях!
Используя производную стоимости по отношению к весам, мы можем