勾配 | 数学
数学の文脈における勾配
一般に数学では多変数関数 $f(x_1,..x_n)$ の各変数に対する偏微分をベクトルにまとめたものを勾配と呼びます。
\[\nabla f = \left( \frac{\partial f}{\partial x_1}, \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 を用いたパラメータの更新です。
単なる偏微分係数(例:$\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}\]連鎖律:全結合レイヤ
$\frac{\partial L}{\partial \boldsymbol{x}}$
$\boldsymbol{x} \in \mathbb{R}^n,\ \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,\ \boldsymbol{z} \in \mathbb{R}^m$ のベクトル値関数 $f$ が線形写像(アフィン写像)の場合、$(n, m)$ 行列 $W$ によって定義できます 。
\[\begin{aligned} z = xW \end{aligned}\]$x$ は $(1, n)$ ベクトル、$W$ は $(n, m)$ 行列なので $z$ は $(1, m)$ の行ベクトルです。
勾配 $\frac{\partial L}{\partial \boldsymbol{x}}$ をベクトルしてまとめて書くなら、ヤコビ行列を使って以下の式で定義されます。
\[\frac{\partial L}{\partial \boldsymbol{x}} = \frac{\partial L}{\partial \boldsymbol{z}} \frac{\partial \boldsymbol{z}}{\partial \boldsymbol{x}}\]$\dfrac{\partial \boldsymbol{z}}{\partial \boldsymbol{x}}$ は $(m,n)$ のヤコビ行列、$\dfrac{\partial L}{\partial \boldsymbol{z}}$ は $(1,m)$ の行ベクトルなので $\frac{\partial L}{\partial \boldsymbol{x}}$ は $(1, n)$ のベクトルになります。
$z = xW$ の場合、$\frac{\partial L}{\partial \boldsymbol{x}}$ は以下の式で定義されます。
\[\frac{\partial L}{\partial \boldsymbol{x}} = \frac{\partial L}{\partial \boldsymbol{z}} W^T\]補足:ヤコビ行列
$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$ を基準に見た偏微分
$\frac{\partial L}{\partial \boldsymbol{W}}$
$\boldsymbol{x} \in \mathbb{R}^n$($(1,n)$ 行ベクトル)、$W \in \mathbb{R}^{n \times m}$($(n,m)$ 行列)の線形変換 $\boldsymbol{z} = \boldsymbol{x}W \in \mathbb{R}^m$ において、損失 $L$ に対する重み $W$ の勾配 $\dfrac{\partial L}{\partial W}$ を考えます。
$\dfrac{\partial L}{\partial \boldsymbol{x}}$ のように局所微分(ヤコビ行列)を単体でベクトル積として表す方法とは異なり、$W$ は 2 階テンソル(行列)であるため、$\boldsymbol{z}$(ベクトル)の $W$ に対する局所微分 $\dfrac{\partial \boldsymbol{z}}{\partial W}$ は 3 階テンソル($m \times n \times m$)となります。
そのため、成分ごとに偏微分を計算し、それらを整理して行列形式へ再構成します。
成分ごとの導出
重み行列 $W$ の各成分 $w_{ij}$($x_i$ から $z_j$ への重み)に着目します。
$\boldsymbol{z} = \boldsymbol{x}W$ の第 $j$ 成分 $z_j$ は以下のように表されます。
\[z_j = \sum_{k=1}^n x_k w_{kj} = x_1 w_{1j} + \dots + x_i w_{ij} + \dots + x_n w_{nj}\]$w_{ij}$ が影響を与える出力は $z_j$ のみであるため($k \neq j$ のとき $\dfrac{\partial z_k}{\partial w_{ij}} = 0$)、局所微分は以下のようになります。
\[\frac{\partial z_j}{\partial w_{ij}} = x_i\]連鎖律を適用すると、損失 $L$ に対する $w_{ij}$ の偏微分は以下の通り求まります。
\[\frac{\partial L}{\partial w_{ij}} = \frac{\partial L}{\partial z_j} \frac{\partial z_j}{\partial w_{ij}} = x_i \frac{\partial L}{\partial z_j}\]行列形式(外積)
各成分 $(i, j)$ における偏微分 $x_i \dfrac{\partial L}{\partial z_j}$ をすべての $i = 1, \dots, n$ および $j = 1, \dots, m$ について並べると、これは $(n, 1)$ の列ベクトル $\boldsymbol{x}^T$ と $(1, m)$ の行ベクトル $\dfrac{\partial L}{\partial \boldsymbol{z}}$ の外積(行列積)になります。
\[\frac{\partial L}{\partial W} = \begin{pmatrix} x_1 \frac{\partial L}{\partial z_1} & x_1 \frac{\partial L}{\partial z_2} & \cdots & x_1 \frac{\partial L}{\partial z_m} \\ x_2 \frac{\partial L}{\partial z_1} & x_2 \frac{\partial L}{\partial z_2} & \cdots & x_2 \frac{\partial L}{\partial z_m} \\ \vdots & \vdots & \ddots & \vdots \\ x_n \frac{\partial L}{\partial z_1} & x_n \frac{\partial L}{\partial z_2} & \cdots & x_n \frac{\partial L}{\partial z_m} \end{pmatrix} = \begin{pmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{pmatrix} \begin{pmatrix} \frac{\partial L}{\partial z_1} & \frac{\partial L}{\partial z_2} & \cdots & \frac{\partial L}{\partial z_m} \end{pmatrix}\]したがって、行列形式では以下のシンプルな式で定義されます。
\[\frac{\partial L}{\partial W} = \boldsymbol{x}^T \frac{\partial L}{\partial \boldsymbol{z}}\]形状(Shape)を確認すると、$\boldsymbol{x}^T$ が $(n, 1)$、$\dfrac{\partial L}{\partial \boldsymbol{z}}$ が $(1, m)$ であるため、積の結果は $W$ と同じ $(n, m)$ 行列となります。
Deep Learning の例 1
定義
\[\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}) = \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)\]