1層と2層のニューラルネットワークで誤差逆伝播法を詳しく説明してみる
こちらの記事で説明した誤差逆伝播法をもう少し現実的なフィードフォワード型のニューラルネットワークに適用して解説してみます。
1層のニューラルネットワーク
まず1つの層からなる単純なニューラルネットワークで誤差逆伝播法を考えます。
フィードフォワード処理
まずは、順方向の処理を解説します。
水色の箱は変数で、入力によって値が変ります。緑色の箱は操作で、変換や関数を意味します。
まず、入力$${\bm{x}}$$は一般にベクトルを想定しています。
$$
\bm{x} = \begin{bmatrix}
x_{1} \\
x_{2} \\
\vdots \\
x_{n}
\end{bmatrix}
$$
この1層のニューラルネットワークでは、出力をスカラーとします。よって、線形変換の重み行列$${W}$$は$${1 \times n}$$になります。
$$
W = \begin{bmatrix}
w_1 & w_2 & \cdots & w_n
\end{bmatrix}
$$
また、バイアス$${b}$$はスカラーです。よって、重み行列$${W}$$とバイアス$${b}$$による$${\bm{x}}$$の線形変換は以下のように表現できます。
$$
\begin{aligned}
z &= W \bm{x} + b \\
&= w_1 x_1 + w_2 x_2 + \cdots + w_n x_n + b
\end{aligned}
$$
さらに、活性化関数$${\sigma}$$(sigmoid、tanhなど)によって$${z}$$を非線形変換したのが出力$${y}$$です。
$$
y = \sigma(z)
$$
最後に、損失関数$${L}$$にモデルの出力値$${y}$$と正解値$${y^*}$$を与えて計算した損失値が$${L(y, y^*)}$$になります。
$$
y, y^* \ \xRightarrow{L}\ L(y, y^*)
$$
この損失関数$${L}$$の計算内容は、誤差の種類によって異なります。例えば、二乗誤差や交差エントロピーを計算する場合がありますが、ここでは損失関数$L$がスカラーであることだけが重要です。損失関数の具体的な中身は、勾配計算には影響しません。
バックプロパゲーション
損失から誤差逆伝播を行います。
まず、損失$${L(y, y^*)}$$を予測$${y}$$で偏微分します。これが$${\frac{\partial L(y, y^*)}{\partial y}}$$です。
次に、$${y = \sigma(z)}$$を$${z}$$で微分したのが、$${\dfrac{\mathrm{d}y}{\mathrm{d}z} = \dfrac{\mathrm{d}\sigma(z)}{\mathrm{d}z} = \sigma'}$$です。この活性化は要素ごとに適用され、一変数関数なので、その微分を常微分として表記しています。
さらに、$${z}$$を各重みパラメータ$${w_i}$$とバイアス$${b}$$に関して偏微分します。
$$
\begin{aligned}
\frac{\partial z}{\partial w_i} &= \frac{\partial (W \bm{x} + b)}{\partial w_i} = x_{j} \quad (\, i = 1, \ldots, n\,)\\[4ex]
\frac{\partial z}{\partial b} &= \frac{\partial (W \bm{x} + b)}{\partial b} = 1
\end{aligned}
$$
以上より、損失関数$${L}$$をパラメータ$${w_i}$$と$${b}$$に関して偏微分することができます。
$$
\begin{aligned}
\frac{\partial L}{\partial w_i} &= \frac{\partial L}{\partial y} \cdot \frac{\mathrm{d} y}{\mathrm{d} z} \cdot \frac{\partial z}{\partial w_i} = \frac{\partial L}{\partial y} \cdot \sigma'\cdot x_i \\[3ex]
\frac{\partial L}{\partial b} &= \frac{\partial L}{\partial y} \cdot \frac{\mathrm{d} y}{\mathrm{d} z} \cdot \ \frac{\partial z}{\partial b}\ = \frac{\partial L}{\partial y} \cdot \sigma'
\end{aligned}
$$
これらの偏微分をベクトルとしてまとめたものが勾配(gradient)です。
$$
\nabla L = \begin{bmatrix}
\\[-6pt]
\dfrac{\partial L}{\partial w_1} \\[3ex]
\dfrac{\partial L}{\partial w_2} \\[12pt]
\vdots \\[10pt]
\dfrac{\partial L}{\partial w_n} \\[3ex]
\dfrac{\partial L}{\partial b} \\[11pt]
\end{bmatrix}
$$
丸括弧で次のようにもコンパクトに表記することも多いです。同じ意味です。
$$
\nabla L = \left(\frac{\partial L}{\partial w_1}, \frac{\partial L}{\partial w_2}, \cdots, \frac{\partial L}{\partial w_n}, \frac{\partial L}{\partial b}\right)
$$
まとめ
誤差逆伝播では以下の処理を行います。
フィードフォワード処理:順方向に計算を進め、途中の結果を保存する。
バックプロパゲーション:逆方向に偏微分を連鎖させ損失の勾配を計算する。
フィードフォワード処理時に値を保存するので場合によっては多くのメモリを消費しますが、微分の連鎖律を利用できるため逆伝播の計算は非常に効率的です。
2層のニューラルネットワーク
次に2層のニューラルネットワークにおける誤差逆伝播を考えます。
フィードフォワード処理
このニューラルネットワークには線形層が2つあり、その間に途中の状態(隠れ状態$${\bm{h}}$$)が計算されています。
なお、隠れ状態$${\bm{h}}$$を出力するまでを第1層とし、第2層は隠れ状態$${\bm{h}}$$を入力として$${y}$$を出力するまでとします。上付きの番号$${^{(1)}}$$と$${^{(2)}}$$は、それぞれ第1層と第2層を意味します。
第1層の線形変換の重み行列$${W^{(1)}}$$は$${m \times n}$$で、バイアス$${\bm{b}^{(1)}}$$は$${m}$$個の要素を持つベクトルとします。
$$
W^{(1)} = \begin{bmatrix}
w^{(1)}_{11} & w^{(1)}_{12} & \cdots & w^{(1)}_{1n} \\[2ex]
w^{(1)}_{21} & w^{(1)}_{22} & \cdots & w^{(1)}_{2n} \\
\vdots & \vdots & \ddots & \vdots \\[1ex]
w^{(1)}_{m1} & w^{(1)}_{m2} & \cdots & w^{(1)}_{mn}
\end{bmatrix}, \quad \bm{b}^{(1)} = \begin{bmatrix}
b^{(1)}_1 \\[2ex]
b^{(1)}_2 \\
\vdots \\[1ex]
b^{(1)}_m \\
\end{bmatrix}
$$
よって、線形変換$${\bm{z}^{(1)} = W^{(1)} \bm{x} + \bm{b}^{(1)}}$$は以下になります。
$$
\begin{aligned}
\bm{z}^{(1)} &= \begin{bmatrix}
z^{(1)}_1 \\[2ex]
z^{(1)}_2 \\
\vdots \\[1ex]
z^{(1)}_m \\[1ex]
\end{bmatrix}
= \begin{bmatrix}
\\[-8pt]
w^{(1)}_{11} x_{1} + w^{(1)}_{12} x_{2} + \cdots + w^{(1)}_{1n} x_{n} \ + b^{(1)}_{1} \\[2ex]
w^{(1)}_{21} x_{1} + w^{(1)}_{22} x_{2} + \cdots + w^{(1)}_{2n} x_{n} \ + b^{(1)}_{2} \\
\vdots \\[1ex]
w^{(1)}_{m1} x_{1} + w^{(1)}_{m2} x_{2} + \cdots + w^{(1)}_{mn} x_{n} + b^{(1)}_{m} \\[5pt]
\end{bmatrix}
\end{aligned}
$$
これに活性化関数$${\sigma^{(1)}}$$を適用したものが、隠れ状態$${\bm{h} = \sigma^{(1)}(\bm{z}^{(1)})}$$です。活性化関数はベクトルの要素ごとに適用されるので、隠れ状態$${\bm{h}}$$は$${m}$$個の要素を持つベクトルになります。
$$
\begin{aligned}
\bm{h} &= \begin{bmatrix}
\\[-7pt]
h_{1} \\[1ex]
h_{2} \\[1ex]
\vdots \\[1ex]
h_{m} \\[1ex]
\end{bmatrix}
= \begin{bmatrix}
\\[-9pt]
\sigma^{(1)}(z^{(1)}_1) \\[1ex]
\sigma^{(1)}(z^{(1)}_2) \\[1ex]
\vdots \\[1ex]
\sigma^{(1)}(z^{(1)}_m) \\[1ex]
\end{bmatrix}
\end{aligned}
$$
第2層の線形変換の重み行列$${W^{(2)}}$$は$${1 \times m}$$で、バイアス$${b^{(2)}}$$はスカラーとします。
$$
W^{(2)} = \begin{bmatrix}
w^{(2)}_1 & w^{(2)}_2 & \cdots & w^{(2)}_m
\end{bmatrix}
$$
よって、線形変換$${z^{(2)} = W^{(2)} \bm{h} + b^{(2)}}$$は以下になります。
$$
\begin{aligned}
z^{(2)} &= w^{(2)}_1 h_{1} + w^{(2)}_2 h_{2} + \cdots + w^{(2)}_m h_{m} \ + b^{(2)}
\end{aligned}
$$
結果として、$${z^{(2)}}$$はスカラーになっています。この$${z^{(2)}}$$に活性化関数$${\sigma^{(2)}}$$を適用したのが、このニューラルネットワーク全体の出力$${y}$$になります。
$$
y = \sigma^{(2)}(z^{(2)})
$$
そして、損失は$${L(y, y^*)}$$です。
バックプロパゲーション
損失から誤差逆伝播を行います。まずは、第2層の各パラメータによる損失$${L}$$の偏微分を考えます。
隠れ状態$${\bm{h}}$$を中間層への入力と考えると、第2層の計算は「1層のニューラルネットワーク」と同じ処理になります。よって、第2層の各パラメータによる損失$${L}$$の偏微分は以下になります。
$$
\begin{aligned}
\frac{\partial L}{\partial w^{(2)}_j} &= \frac{\partial L}{\partial y} \cdot \frac{\mathrm{d} y}{\mathrm{d} z^{(2)}} \cdot \frac{\partial z^{(2)}}{\partial w^{(2)}_j} = \frac{\partial L}{\partial y} \cdot \sigma^{(2)'} \cdot h_j \\[5ex]
\frac{\partial L}{\partial b^{(2)}} &= \frac{\partial L}{\partial y} \cdot \frac{\mathrm{d} y}{\mathrm{d} z^{(2)}} \cdot \frac{\partial z^{(2)}}{\partial b^{(2)}}
\ \ \, = \frac{\partial L}{\partial y} \cdot \sigma^{(2)'}
\end{aligned}
$$
次に、第一層の各パラメータによる損失$${L}$$の偏微分を考えます。$${\frac{\partial L}{\partial y} \cdot \frac{\mathrm{d} y}{\mathrm{d} z^{(2)}}}$$に関しては上記ですでに考慮されているので、残りの偏微分を計算します。
第2層の線形変換の結果$${z^{(2)} = W^{(2)}\bm{h} + b^{(2)}}$$から偏微分を連鎖させます。
$${z^{(2)}}$$はスカラーであり、これを$${\bm{h}}$$の各成分で偏微分します。
$$
\frac{\partial z^{(2)}}{\partial \bm{h}} = \begin{bmatrix}
\ \dfrac{\partial z^{(2)}}{\partial h_{1}} &
\dfrac{\partial z^{(2)}}{\partial h_{2}} &
\cdots &
\dfrac{\partial z^{(2)}}{\partial h_{m}}
\ \end{bmatrix} = \begin{bmatrix}
\ w^{(2)}_1 &
w^{(2)}_2 &
\cdots &
w^{(2)}_m
\ \end{bmatrix} = W^{(2)}
$$
なお、ベクトルによる微分についてはこちらでも解説しています。
次に、隠れ状態$${\bm{h} = \sigma^{(1)}(\bm{z}^{(1)})}$$の偏微分を計算します。
なお、$${\bm{h}}$$はベクトルであり、これをベクトル$${\bm{z}^{(1)}}$$の各要素で偏微分するのでヤコビ行列(各成分が$${\dfrac{\partial h_i}{\partial z^{(1)}_j}}$$)となります。
$$
\begin{aligned}
\frac{\partial \bm{h}}{\partial \bm{z}^{(1)}} &= \begin{bmatrix}
\\[-7pt]
\dfrac{\partial h_1}{\partial z^{(1)}_1} & \qquad \dfrac{\partial h_1}{\partial z^{(1)}_2} & \quad\cdots & \quad\dfrac{\partial h_1}{\partial z^{(1)}_m} \quad\\[3ex]
\dfrac{\partial h_2}{\partial z^{(1)}_1} & \qquad \dfrac{\partial h_2}{\partial z^{(1)}_2} & \quad\cdots & \quad\dfrac{\partial h_2}{\partial z^{(1)}_m} \quad\\[2ex]
\vdots & \qquad \vdots & \quad\ddots & \quad\vdots \quad\\[2ex]
\dfrac{\partial h_m}{\partial z^{(1)}_1} & \qquad \dfrac{\partial h_m}{\partial z^{(1)}_2} & \quad\cdots & \quad\dfrac{\partial h_m}{\partial z^{(1)}_m} \quad \\[3ex]
\end{bmatrix}\\
\\[-10pt]
& = \begin{bmatrix}
\\[-5pt]
\sigma^{(1)'}(z^{(1)}_1) & 0 & \cdots & 0 \\[4ex]
0 & \sigma^{(1)'}(z^{(1)}_2) & \cdots & 0\\[3ex]
\vdots & \vdots & \ddots & \vdots \\[3ex]
0 & 0 & \cdots & \sigma^{(1)'}(z^{(1)}_m) \\[1ex]
\end{bmatrix}
\end{aligned}
$$
対角線上以外の要素が0になっているのは、$${h_i = \sigma_h(z_i)}$$が一変数の関数で他の要素に依存しないからです。
次は、第1層の線形変換$${\bm{z}^{(1)} = W^{(1)}\bm{x}+\bm{b}^{(1)}}$$の偏微分を計算します。
$${\bm{z}^{(1)}}$$はベクトルであり、これを各パラメータで偏微分します。
重み行列の成分$${w^{(1)}_{ij}}$$での偏微分では、$${\mathbf{z}^{(1)}}$$の$${i}$$行目以外は0になります。また、$${w_{ij}}$$は$${x_{j}}$$の係数なので$${x_{j}}$$だけが残ります。
$$
\frac{\partial \bm{z}^{(1)}}{\partial w_{ij}} = \begin{bmatrix}
\\[-8pt]
\dfrac{\partial z^{(1)}_1}{\partial w_{ij}} \\[3ex]
\dfrac{\partial z^{(1)}_2}{\partial w_{ij}} \\[3ex]
\vdots \\[1ex]
\dfrac{\partial z^{(1)}_i}{\partial w_{ij}} \\[12pt]
\vdots \\[1ex]
\dfrac{\partial z^{(1)}_m}{\partial w_{ij}} \\[12pt]
\end{bmatrix} = \begin{bmatrix}
\\
0 \\[25pt]
0 \\[10pt]
\vdots \\[10pt]
x_{j} \\[15pt]
\vdots \\[15pt]
0 \\[10pt]
\end{bmatrix}
$$
同様に、ベクトル$${\bm{z}^{(1)}}$$をバイアスの成分$${b^{(1)}_i}$$で偏微分します。
$$
\frac{\partial \bm{z}^{(1)}}{\partial b_i} = \begin{bmatrix}
\\[-8pt]
\dfrac{\partial z^{(1)}_1}{\partial b_i} \\[3ex]
\dfrac{\partial z^{(1)}_2}{\partial b_i} \\[3ex]
\vdots \\[1ex]
\dfrac{\partial z^{(1)}_i}{\partial b_i} \\[3ex]
\vdots \\[1ex]
\dfrac{\partial z^{(1)}_m}{\partial b_i} \\[12pt]
\end{bmatrix} = \begin{bmatrix}
\\
0 \\[16pt]
0 \\[12pt]
\vdots \\[10pt]
1 \ \\[17pt]
\vdots \\[10pt]
0 \\[11pt]
\end{bmatrix}
$$
以上より、第一層の各パラメータによる損失$${L}$$の偏微分は以下になります。
$$
\begin{aligned}
\frac{\partial L}{\partial w_{ij}} &= \frac{\partial L}{\partial y} \cdot \frac{\mathrm{d} y}{\mathrm{d} z^{(2)}} \cdot \frac{\partial z^{(2)}}{\partial \bm{h}} \cdot \frac{\partial \bm{h}}{\partial \bm{z}^{(1)}} \cdot \frac{\partial \bm{z}^{(1)}}{\partial w_{ij}} \\[5ex]
\frac{\partial L}{\partial b_i} &= \frac{\partial L}{\partial y} \cdot \frac{\mathrm{d} y}{\mathrm{d} z^{(2)}} \cdot \frac{\partial z^{(2)}}{\partial \bm{h}} \cdot \frac{\partial \bm{h}}{\partial \bm{z}^{(1)}} \cdot \frac{\partial \bm{z}^{(1)}}{\partial b_{i}}
\end{aligned}
$$
なお、最後3つの偏微分の連鎖の最終形はともに$${(1 \times m)\cdot (m \times m) \cdot (m \times 1)}$$なのでスカラーとなることがわかります。
また、2つの層のすべてのパラメータに関する偏微分をまとめるとニューラルネットワーク全体の勾配になります。
まとめ
2層のニューラルネットワークでも、誤差逆伝播の処理は1層の場合と同じアプローチの繰り返しで行えることが確認できました。具体的な微分や偏微分の計算内容は、関係するベクトルや行列の形状によって異なりますが、全体としては微分の連鎖律に基づいて勾配を計算している点は同じです。
したがって、もっと層を追加しても同様のアプローチで誤差逆伝播を適用できると理解できます。
関連記事
この記事が気に入ったらチップで応援してみませんか?