Статья Автор: Деникина Н.В., Деникин А.В.

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

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

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

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

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

\[ 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?

Печать