Модуль: Обратное распространение


Один нейрон назад


Войдите на сайт, чтобы ответы сохранялись и баллы за тетрадь засчитывались.

Один нейрон назад

Как из одного пришедшего градиента получить градиенты всех параметров нейрона

Не запоминать формулу
Градиент каждого параметра получается из уже знакомого правила: пришедший градиент умножаем на локальную производную.

Рассмотрим один нейрон с двумя входами:

\[ z=w_1x_1+w_2x_2+b. \]

После линейной части применяем ReLU:

\[ a=\operatorname{ReLU}(z). \]

Для одного объекта функция потерь:

\[ L=(a-y)^2. \]

Во время forward вычисления идут в таком порядке:

\[ x_1,x_2,w_1,w_2,b \longrightarrow z \longrightarrow a \longrightarrow L. \]

Во время backward идём в обратную сторону. Наша цель — дойти от \(L\) до каждого параметра:

\[ w_1,\qquad w_2,\qquad b. \]

Шаг 1. Начинаем с функции потерь

Последняя операция:

\[ L=(a-y)^2. \]

Её производная по \(a\):

\[ \frac{\partial L}{\partial a} = 2(a-y). \]

Это первый градиент, который мы передаём назад. Он показывает, как небольшое изменение выхода нейрона \(a\) повлияет на loss.

Шаг 2. Проходим через ReLU

Перед линейной частью находится:

\[ a=\operatorname{ReLU}(z). \]

По цепному правилу:

\[ \frac{\partial L}{\partial z} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z}. \]

Из предыдущей темы мы уже знаем:

\[ \frac{\partial a}{\partial z} = \begin{cases} 1, & z>0,\\ 0, & z<0. \end{cases} \]

Поэтому, если во время forward получилось \(z>0\), градиент проходит через ReLU без изменения. Если \(z<0\), он обнуляется.

Шаг 3. Доходим до весов

Теперь мы дошли до линейной части:

\[ z=w_1x_1+w_2x_2+b. \]

Предположим, что градиент

\[ \frac{\partial L}{\partial z} \]

уже известен. Нужно передать его к каждому параметру.

Начнём с \(w_1\).

Если немного изменить только \(w_1\), то в выражении для \(z\) изменится слагаемое \(w_1x_1\).

Поэтому локальная производная:

\[ \frac{\partial z}{\partial w_1}=x_1. \]

По цепному правилу:

\[ \frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial w_1} = \frac{\partial L}{\partial z}\,x_1. \]

Точно так же для второго веса:

\[ \frac{\partial z}{\partial w_2}=x_2, \]

поэтому:

\[ \frac{\partial L}{\partial w_2} = \frac{\partial L}{\partial z}\,x_2. \]

Для смещения \(b\):

\[ \frac{\partial z}{\partial b}=1, \]

поэтому:

\[ \frac{\partial L}{\partial b} = \frac{\partial L}{\partial z}. \]

Важно:

это не три новые формулы, которые нужно заучить.

Во всех трёх случаях работает одно правило:

\[ \text{пришедший градиент} \;\cdot\; \text{локальная производная}. \]

Теперь весь нейрон в числах

Возьмём:

\[ x_1=2, \qquad x_2=-1, \qquad w_1=3, \qquad w_2=1, \qquad b=1, \qquad y=5. \]

Сначала выполним forward.

Линейная часть:

\[ z = 3\cdot2 + 1\cdot(-1) + 1 = 6. \]

Так как \(z>0\), ReLU пропускает значение:

\[ a=\operatorname{ReLU}(6)=6. \]

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

\[ L=(6-5)^2=1. \]

Forward закончен:

\[ z=6, \qquad a=6, \qquad L=1. \]

Теперь разворачиваемся и идём назад.

Backward: от loss до z

Начинаем с последней операции:

\[ L=(a-y)^2. \]

Получаем:

\[ \frac{\partial L}{\partial a} = 2(a-y) = 2(6-5) = 2. \]

Теперь проходим через ReLU.

Во время forward было \(z=6>0\), поэтому:

\[ \frac{\partial a}{\partial z}=1. \]

Следовательно:

\[ \frac{\partial L}{\partial z} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} = 2\cdot1 = 2. \]

До линейной части пришёл градиент \(2\).

Backward: от z до параметров

Для первого веса локальная производная равна \(x_1=2\):

\[ \frac{\partial L}{\partial w_1} = 2\cdot2 = 4. \]

Для второго веса локальная производная равна \(x_2=-1\):

\[ \frac{\partial L}{\partial w_2} = 2\cdot(-1) = -2. \]

Для смещения локальная производная равна 1:

\[ \frac{\partial L}{\partial b} = 2\cdot1 = 2. \]

Первый вес

\[ \frac{\partial L}{\partial w_1}=4 \]

Второй вес

\[ \frac{\partial L}{\partial w_2}=-2 \]

Смещение

\[ \frac{\partial L}{\partial b}=2 \]

Что мы получили

Backward закончился не одним числом, а градиентом для каждого обучаемого параметра нейрона:

\[ \frac{\partial L}{\partial w_1}=4, \qquad \frac{\partial L}{\partial w_2}=-2, \qquad \frac{\partial L}{\partial b}=2. \]

Эти числа ещё не изменили веса. Backward только вычислил, как каждый параметр влияет на loss.

Теперь их можно передать градиентному спуску.

Например, при скорости обучения

\[ \eta=0.01 \]

получим:

\[ w_1^{new} = 3-0.01\cdot4 = 2.96, \]

\[ w_2^{new} = 1-0.01\cdot(-2) = 1.02, \]

\[ b^{new} = 1-0.01\cdot2 = 0.98. \]

Весь процесс обучения одного нейрона:

Forward — считаем \(z\), \(a\) и \(L\).

Backward — идём от \(L\) назад и получаем градиенты параметров.

Step — используем эти градиенты, чтобы изменить \(w_1\), \(w_2\) и \(b\).


Проверь себя

Почему в производной функции потерь по w1 появляется x1?