らんだむな記憶

blogというものを体験してみようか!的なー

Sum ノードの勾配

ゼロつく 2 p.29 を掘り下げる。

関数 $f: \R^n \to \R^1$

\begin{align*}
f(x) = f(x_1, \cdots, x_n)
\end{align*}

を考える。更に $g: \R^1 \to \R^1$ がある時、合成 $g \circ f$ について

\begin{align*}
(g \circ f)(x) = g(f(x_1, \cdots, x_n))
\end{align*}

と書ける。これを $x_j$ について $x = a$ で偏微分すると

\begin{align*}
\frac{\del (g \circ f)}{\del x_j} = \frac{d g}{d y}\Bigg|_{y=f(a)} \frac{\del f}{\del x_j}\Bigg|_{x=a}
\tag{1}
\end{align*}

となる。$f$ として具体的に

\begin{align*}
f(x) = x_1 + \cdots + x_n
\end{align*}

のケースを考えることにする。$g$ は一般には複数の関数の積 $g_\ell \circ \cdots \circ g_1$ を考えても良い。
簡単のため、$\alpha = \frac{d g}{d y}\Big|_{y=f(a)}$ と置くと、$\frac{\del f}{\del x_j} = 1$ であるので、(1) 式の計算結果は

\begin{align*}
\frac{\del (g \circ f)}{\del x_j} = \alpha,\quad 1 \leq j \leq n
\end{align*}

となる。よってすべての $j$ について表示すると

\begin{align*}
\left( \frac{\del (g \circ f)}{\del x_1}(a), \cdots, \frac{\del (g \circ f)}{\del x_n}(a) \right) = (\alpha, \cdots, \alpha)
\end{align*}

となる。これが Sumbackward の実装であり、次元 $n$ まで上位の導関数の値を複製することになる。

前回の分と併せて、ゼロつく 2 p.337 の

要点だけ述べれば、「Repeat の逆伝播は Sum」、「Sum の逆伝播は Repeat」になります。

の背景はこういったところだが、あまり “公式” 的に暗記すると後でわけが分からなくなりそうに感じた。