Один нейрон назад
Как из одного пришедшего градиента получить градиенты всех параметров нейрона
Не запоминать формулу
Градиент каждого параметра получается из уже знакомого правила:
пришедший градиент умножаем на локальную производную.
Рассмотрим один нейрон с двумя входами:
\[
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\).