Когда путей несколько
Что происходит, когда одно значение участвует сразу в нескольких вычислениях
Развилка графа
По каждому пути влияние считается отдельно. В точке, где пути сходятся, их вклады складываются.
В нейронной сети одно и то же значение может участвовать сразу в нескольких вычислениях.
Рассмотрим простой пример:
\[ a=2x, \qquad b=x^2, \qquad L=a+b. \]
Здесь \(x\) влияет на функцию потерь \(L\) сразу двумя путями:
Верхний путь: через a
Сначала рассмотрим только путь
\[ x\rightarrow a\rightarrow L. \]
Так как
\[ L=a+b, \]
то при изменении только \(a\) величина \(L\) изменяется ровно на столько же:
\[ \frac{\partial L}{\partial a}=1. \]
Для операции
\[ a=2x \]
локальная производная равна:
\[ \frac{\partial a}{\partial x}=2. \]
По цепному правилу вклад верхнего пути:
\[ \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial x} = 1\cdot2 = 2. \]
Нижний путь: через b
Теперь отдельно рассмотрим путь
\[ x\rightarrow b\rightarrow L. \]
Так как
\[ L=a+b, \]
то:
\[ \frac{\partial L}{\partial b}=1. \]
Для
\[ b=x^2 \]
локальная производная:
\[ \frac{\partial b}{\partial x}=2x. \]
Поэтому вклад нижнего пути:
\[ \frac{\partial L}{\partial b} \cdot \frac{\partial b}{\partial x} = 1\cdot2x = 2x. \]
Почему вклады складываются
Изменение \(x\) одновременно меняет и \(a\), и \(b\).
Значит, функция потерь \(L\) изменяется сразу из-за двух причин. Нельзя выбрать только один из путей: оба воздействия происходят одновременно.
Поэтому полный градиент по \(x\) равен сумме вкладов:
\[ \frac{\partial L}{\partial x} = \frac{\partial L}{\partial a} \frac{\partial a}{\partial x} + \frac{\partial L}{\partial b} \frac{\partial b}{\partial x}. \]
Подставляем найденные выражения:
\[ \frac{\partial L}{\partial x} = 2+2x. \]
Например, при
\[ x=3 \]
верхний путь даёт:
\[ 2, \]
а нижний:
\[ 2x=6. \]
Поэтому:
\[ \frac{\partial L}{\partial x} = 2+6 = 8. \]
Если от одной величины к функции потерь ведёт несколько путей, вклад каждого пути считаем отдельно, а затем складываем.
Два правила, которые нужно различать
Теперь у нас есть два разных случая.
Вдоль одного последовательного пути — умножаем:
\[ \frac{\partial L}{\partial x} = \frac{\partial L}{\partial b} \cdot \frac{\partial b}{\partial a} \cdot \frac{\partial a}{\partial x}. \]
Если путей несколько — складываем их вклады:
\[ \frac{\partial L}{\partial x} = \text{вклад первого пути} + \text{вклад второго пути}. \]
В больших нейронных сетях таких развилок очень много. Одно значение может использоваться несколькими следующими операциями, поэтому во время backward градиенты, пришедшие по разным путям, должны накапливаться.