数学の文脈における勾配

一般に数学では多変数関数 $f(x_1, x_2, \dots, x_n)$ の各変数に対する偏微分をベクトルにまとめたものを勾配と呼びます。

\[\nabla f = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \ldots, \frac{\partial f}{\partial x_n} \right)\]

Deep Learning の文脈における勾配

損失 $L$ に対する各パラメータの偏微分を指します。

\[\frac{\partial L}{\partial W}, \quad \frac{\partial L}{\partial b}, \quad \ldots\]

連鎖律を使って $L$ から逆向きに辿った結果が「勾配」です。

Deep Learning は $L$ が基準

目的がパラメータを更新して $L$ を小さくすることなので $L$ に対する偏微分だけが意味を持ちます。
以下は SGD を用いたパラメータの更新です。

\[W \leftarrow W - \eta \frac{\partial L}{\partial W}\]

単なる偏微分係数(例:$\frac{\partial x}{\partial f}$ )は途中計算で勾配とは呼ばないのが一般的です。

数学と Deep Learning の勾配

文脈 勾配 の意味
数学 多変数関数の偏微分をベクトルにまとめたもの( $\nabla f$ )
Deep Learning 損失 $L$ に対する連鎖律の結果( $\frac{\partial L}{\partial W}$ など)

連鎖律:1 変数関数

$L(x) = g(f(x))$ の $L$ に対する $x$ の( Deep Learning の文脈における)勾配は以下の式で定義されます。

\[\begin{aligned} L = g(z),\ z = f(x) \ \Rightarrow \quad \frac{dL}{dx} = \frac{dg}{dz}\frac{dz}{dx} \end{aligned}\]

連鎖律:$g(f(x))$ f:ベクトル値関数、 g:多変数関数

$\boldsymbol{x} \in \mathbb{R}^n, x_i,\ \boldsymbol{z} \in \mathbb{R}^m$ のとき $L$ に対する $\boldsymbol{x}$ の( Deep Learning の文脈における)勾配は以下の式で定義されます。

\[\begin{aligned} \boldsymbol{z} = f(\boldsymbol{x}) \quad f: \mathbb{R}^n \to \mathbb{R}^m \\ L = g(\boldsymbol{z}) \quad g: \mathbb{R}^m \to \mathbb{R} \\ \frac{\partial L}{\partial x_i} = \sum_{j=1}^m \frac{\partial g}{\partial z_j}\frac{\partial z_j}{\partial x_i} \quad (i = 1, \dots, n) \end{aligned}\]

$x_i$ が $z_1, \dots, z_m$ という複数の経路を通って $L$ に影響を与えるため、その全経路の寄与を足し合せます。
$i$ 自体は和を取る添字ではなく、どの成分について求めているかを指定するインデックスです。

$\boldsymbol{x} \in \mathbb{R}^n, x_i,\ \boldsymbol{z} \in \mathbb{R}^m$ のベクトル値関数 $f$ が線形写像(アフィン写像)の場合、$(m, n)$ 行列 $W$ によって以下の式で定義します。

\[z = Wx\]

ベクトルとしてまとめて書くなら、ヤコビ行列を使って以下の式で定義されます。

\[\frac{\partial L}{\partial \boldsymbol{x}} = \left(\frac{\partial \boldsymbol{z}}{\partial \boldsymbol{x}}\right)^T \frac{\partial L}{\partial \boldsymbol{z}}\]

$\dfrac{\partial \boldsymbol{z}}{\partial \boldsymbol{x}}$ は $(m,n)$ のヤコビ行列、$\dfrac{\partial L}{\partial \boldsymbol{z}}$ は $(m,1)$ の列ベクトルなので $\frac{\partial L}{\partial \boldsymbol{x}}$ は $(n, 1)$ のベクトルになります。

$z: \mathbb{R}^n \to \mathbb{R}^m$ のベクトル値関数のすべての偏微分をまとめた行列をヤコビ行列と呼びます。

\[J = \frac{\partial \boldsymbol{z}}{\partial \boldsymbol{x}} = \begin{pmatrix} \dfrac{\partial z_1}{\partial x_1} & \cdots & \dfrac{\partial z_1}{\partial x_n} \\ \vdots & \ddots & \vdots \\ \dfrac{\partial z_m}{\partial x_1} & \cdots & \dfrac{\partial z_m}{\partial x_n} \end{pmatrix} \quad (m,n) \text{ の行列}\]
  • 行 $j$: 出力 $z_j$ を基準に見た偏微分
  • 列 $i$: 入力 $x_i$ を基準に見た偏微分

Deep Learning の例 1

ここまでは $x$ を列ベクトルとして扱い、$z = Wx$ の形式で説明してきました。

以降の Deep Learning の例では、実装(PyTorch の nn.Linear など)でよく使われる慣習に合わせ、$x$ を行ベクトルとして扱い、$z = xW$ の形式を用います。これに伴い $W$ の shape は $(n,m)$ となります。数式としての意味は同じですが、行・列の向きが入れ替わる点に注意してください。

定義

\[\mathbf{x} = (x_1, x_2)\] \[W = \begin{pmatrix} w_{11} & w_{12} & w_{13} \\ w_{21} & w_{22} & w_{23} \end{pmatrix}\] \[\mathbf{z} = (z_1, z_2, z_3) = \mathbf{x} W\] \[L = A(\mathbf{z})\]

成分ごとに書くと、

\[z_1 = x_1 w_{11} + x_2 w_{21}\] \[z_2 = x_1 w_{12} + x_2 w_{22}\] \[z_3 = x_1 w_{13} + x_2 w_{23}\]

連鎖律($z$ に関する勾配)

\[\frac{\partial L}{\partial \mathbf{z}} = \left( \frac{\partial L}{\partial z_1},\, \frac{\partial L}{\partial z_2},\, \frac{\partial L}{\partial z_3} \right)\]

連鎖律($x$ に関する勾配)

\[\frac{\partial L}{\partial x_i} = \sum_{j=1}^{3} \frac{\partial L}{\partial z_j} \, w_{ij} \qquad (i = 1,2,\; j = 1,2,3)\]

行列形式

\[\left( \frac{\partial L}{\partial x_1},\, \frac{\partial L}{\partial x_2} \right) = \left( \frac{\partial L}{\partial z_1},\, \frac{\partial L}{\partial z_2},\, \frac{\partial L}{\partial z_3} \right) W^{T}\]

ここで、

\[W^{T} = \begin{pmatrix} w_{11} & w_{21} \\ w_{12} & w_{22} \\ w_{13} & w_{23} \end{pmatrix}\]

すなわち、

\[\frac{\partial L}{\partial \mathbf{x}} = \frac{\partial L}{\partial \mathbf{z}} \, W^{T}\]

Deep Learning の例 2

Deep Learning の勾配は損失 $L$ (スカラー)対する連鎖律として求めます。
行列積(全結合レイヤ)の勾配として $L =g(\boldsymbol{z}) = |\boldsymbol{z}|^2 = \sum_j z_j^2$(二乗和)、$f(\boldsymbol{x}W)$ を考えます(二乗和はあくまでも簡単な例にするためのサンプルです)。

\[L = g(\boldsymbol{z}) = \sum_{j=1}^M z_j^2, \qquad \boldsymbol{z} = \boldsymbol{x}W\]

$\boldsymbol{x}$: shape $(1,2)$、$W$: shape $(2,2)$ として、具体的に

\[\boldsymbol{x} = (1,\ 2), \qquad W = \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix}\]

順伝播

\[\boldsymbol{z} = \boldsymbol{x}W = (1\cdot1+2\cdot3,\ \ 1\cdot2+2\cdot4) = (7,\ 10)\] \[L = 7^2+10^2 = 49+100 = 149\]

逆伝播(連鎖律)

Step 1:g の局所勾配

$g(\boldsymbol{z})=\sum_j z_j^2$ なので

\[\frac{\partial L}{\partial z_j} = 2z_j \quad \Rightarrow \quad \frac{\partial L}{\partial \boldsymbol{z}} = (2\cdot7,\ 2\cdot10) = (14,\ 20)\]

Step 2:全結合レイヤの逆伝播

\[\frac{\partial L}{\partial W} = \boldsymbol{x}^T\cdot\frac{\partial L}{\partial \boldsymbol{z}} = \begin{pmatrix}1\\2\end{pmatrix}\cdot(14,\ 20) = \begin{pmatrix} 14 & 20 \\ 28 & 40 \end{pmatrix}\] \[\frac{\partial L}{\partial \boldsymbol{x}} = \frac{\partial L}{\partial \boldsymbol{z}}\cdot W^T = (14,\ 20)\cdot\begin{pmatrix}1 & 3\\2 & 4\end{pmatrix} = (14\cdot1+20\cdot2,\ \ 14\cdot3+20\cdot4) = (54,\ 122)\]