からっぽのしょこ

読んだら書く!書いたら読む!同じ事は二度調べ(たく)ない

Softmax-with-Lossレイヤの逆伝播の導出【ゼロつく1のノート(数学)】

はじめに

 「機械学習・深層学習」初学者のための『ゼロから作るDeep Learning』の攻略ノートです。『ゼロつくシリーズ』学習の補助となるように適宜解説を加えています。本と一緒に読んでください。

 ニューラルネットワーク内部の計算について、数学的背景の解説や計算式の導出を行い、また実際の計算結果やグラフで確認していきます。

 この記事は、付録A「Softmax-with-Lossレイヤの計算グラフ」の内容です。ソフトマックス関数と交差エントロピー誤差を合わせたレイヤを微分します。

【元の記事】

www.anarchive-beta.com

【他の記事一覧】

www.anarchive-beta.com

【この記事の内容】

Softmax-with-Lossレイヤの逆伝播の導出

 ソフトマックス関数(Softmaxレイヤ)と交差エントロピー誤差(Cross Entropy Errorレイヤ)を合わせてSoftmax-with-Lossレイヤとして扱います。この節では、Softmax-with-Lossレイヤの微分(逆伝播)を導出します。ソフトマックス関数の逆伝播については「ソフトマックス関数の逆伝播の導出【ゼロつく1のノート(数学)】 - からっぽのしょこ」、交差エントロピー誤差の逆伝播については「交差エントロピー誤差の逆伝播の導出【ゼロつく1のノート(数学)】 - からっぽのしょこ」を参照してください。

・順伝播の確認

 Softmax-with-Lossレイヤの入力を$\mathbf{a} = (a_1, a_2, \cdots, a_K)$、出力を$L$とします。正規化されたスコア$\mathbf{y} = (y_1, y_2, \cdots, y_K)$は中間変数と言えます。

 ソフトマックス関数は、$\mathbf{a}$を入力、$\mathbf{y}$を出力として、次の式で定義されます。

$$ y_k = \frac{ \exp(a_k) }{ \sum_{k'=1}^K \exp(a_{k'}) } \tag{A.1} $$

 交差エントロピー誤差は、$\mathbf{y}$と教師ラベルを$\mathbf{t} = (t_1, t_2, \cdots, t_K)$を入力として、次の式で定義されます。

$$ L = - \sum_{k=1}^K t_k \log y_k \tag{A.2} $$

 ここで、$K$は分類するクラス数です。$\mathbf{t}$は、正解の項が1でそれ以外の項が0のone-hotベクトルです。

・逆伝播の導出

 逆伝播では、各入力$a_k$に関する出力$L$の微分$\frac{\partial L}{\partial a_k}$を求めます。

 Softmax-with-Lossレイヤは、ソフトマックス関数(Softmaxレイヤ)と交差エントロピー誤差(Cross Entropy Errorレイヤ)の合成関数と言えます。よって、$\frac{\partial L}{\partial a_k}$は、連鎖律(合成関数の微分)より、2つの関数(レイヤ)の微分の積で求められます。

$$ \frac{\partial L}{\partial a_k} = \frac{\partial L}{\partial L} \frac{\partial L}{\partial \mathbf{y}} \frac{\partial \mathbf{y}}{\partial a_k} $$

 ソフトマックス関数(A.1)から分かるように、$a_k$は$\mathbf{y}$の全ての項に影響しています。よって、$\frac{\partial L}{\partial y_k}$と$\frac{\partial y_k}{\partial a_k}$ではなく、$\frac{\partial L}{\partial \mathbf{y}}$と$\frac{\partial \mathbf{y}}{\partial a_k}$になります。
 また、$\frac{\partial L}{\partial L}$はCross Entropy Lossレイヤの逆伝播の入力です。$\frac{\partial L}{\partial L} = 1$なので計算には影響しませんが、実装時に登場するので明示しています。

 「交差エントロピー誤差の入力$\mathbf{y}$」に関する「交差エントロピー誤差の出力$L$」の勾配$\frac{\partial L}{\partial \mathbf{y}}$は、前節で求めました。

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{y}} &= \begin{pmatrix} \frac{\partial L}{\partial y_1} & \cdots & \frac{\partial L}{\partial y_k} & \cdots & \frac{\partial L}{\partial y_K} \end{pmatrix} \\ &= \begin{pmatrix} - \frac{t_1}{y_1} & \cdots & - \frac{t_k}{y_k} & \cdots & - \frac{t_K}{y_K} \end{pmatrix} \end{aligned} $$

 「ソフトマックス関数の各入力$a_k$」に関する「ソフトマックス関数の出力$\mathbf{y}$」の勾配$\frac{\partial \mathbf{y}}{\partial a_k}$は、前々節で求めました。

$$ \frac{\partial \mathbf{y}}{\partial a_k} = \begin{pmatrix} \frac{\partial y_1}{\partial a_k} \\ \vdots \\ \frac{\partial y_k}{\partial a_k} \\ \vdots \\ \frac{\partial y_K}{\partial a_k} \end{pmatrix} = \begin{pmatrix} - y_1 y_k \\ \vdots \\ y_k (1 - y_k) \\ \vdots \\ - y_K y_k \end{pmatrix} $$

 それぞれ連鎖律の式に代入して内積を計算します。(この総和は、「$/$」ノードから$K$個の「$\times$」ノードに分岐していることに対応しているんだと思います。)

$$ \begin{aligned} \frac{\partial L}{\partial a_k} &= \begin{pmatrix} - \frac{t_1}{y_1} & \cdots & - \frac{t_k}{y_k} & \cdots & - \frac{t_K}{y_K} \end{pmatrix} \begin{pmatrix} - y_1 y_k \\ \vdots \\ y_k (1 - y_k) \\ \vdots \\ - y_K y_k \end{pmatrix} \\ &= - \frac{t_1}{y_1} (- y_1 y_k) + \cdots - \frac{t_k}{y_k} y_k (1 - y_k) + \cdots - \frac{t_K}{y_K} (- y_K y_k) \end{aligned} $$

 括弧を展開すると、$- t_k$と$t_1 y_k$から$t_K y_k$の和になるので、式を整理します。

$$ \begin{aligned} \frac{\partial L}{\partial a_k} &= t_1 y_k + \cdots + (- t_k) + t_k y_k + \cdots + t_K y_k \\ &= - t_k + y_k (t_1 + t_2 + \cdots + t_K) \\ &= - t_k + y_k \sum_{k'=1}^K t_{k'} \end{aligned} $$

 $t_1$から$t_K$の和は1なので消えます。

$$ \frac{\partial L}{\partial a_k} = y_k - t_k $$

 $k$番目の入力$a_k$に関する微分$\frac{\partial L}{\partial a_k}$が求まりました。

 他の項も同様に求められるので、入力$\mathbf{a}$に関する出力$L$の勾配$\frac{\partial L}{\partial \mathbf{a}}$は

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{a}} &= \begin{pmatrix} \frac{\partial L}{\partial a_1} & \frac{\partial L}{\partial a_2} & \cdots & \frac{\partial L}{\partial a_K} \end{pmatrix} \\ &= \begin{pmatrix} y_1 - t_1 & y_2 - t_1 & \cdots & y_K - t_K \end{pmatrix} \end{aligned} $$

となります。

 パラメータの学習に利用する勾配が、順伝播の出力$\mathbf{y}$と教師データ$\mathbf{t}$の差というシンプルな形にで求められることが分かりました。これは、計算効率が良いだけでなく、中間変数を保存する必要がなくメモリ効率も良いことを意味します。このように学習効率が良い損失関数として交差エントロピー誤差が設計されました。

バッチ版Softmax-with-Lossレイヤの逆伝播の導出

 前節は、1つのデータを扱う場合でした。この節では、複数データに対するSoftmax-with-Lossレイヤの微分(逆伝播)を導出します。

・順伝播の確認

 Softmax-with-Lossレイヤの入力を$\mathbf{A} = (a_{1,1}, \cdots, a_{N,K})$、出力を$L$とします。正規化されたスコア$\mathbf{Y} = (y_{1,1}, \cdots, y_{N,K})$は中間変数と言えます。

 ソフトマックス関数は、$\mathbf{a}_n = (a_{n,1}, a_{n,2}, \cdots, a_{n,K})$を入力、$\mathbf{y}_n = (y_{n,1}, y_{n,2}, \cdots, y_{n,K}$を出力として、次の式で定義されます。

$$ y_{n,k} = \frac{ \exp(a_{n,k}) }{ \sum_{k'=1}^K \exp(a_{n,k'}) } $$

 交差エントロピー誤差は、$\mathbf{Y}$と教師ラベルを$\mathbf{T} = (t_{1,1}, \cdots, t_{N,K})$を入力として、次の式で定義されます。

$$ L = - \frac{1}{N} \sum_{n=1}^N \sum_{k=1}^K t_{n,k} \log y_{n,k} $$

 ここで、$N$はバッチサイズ(1試行当たりのデータ数)、$K$は分類するクラス数です。$\mathbf{t}_n$は、正解の項が1でそれ以外の項が0のone-hotベクトルです。$L$は、1データ当たりの平均交差エントロピー誤差と言えるのでした。

・逆伝播の導出

 逆伝播では、各入力$a_{n,k}$に関する出力$L$の微分$\frac{\partial L}{\partial a_{n,k}}$を求めます。

 Softmax-with-Lossレイヤは、ソフトマックス関数(Softmaxレイヤ)と交差エントロピー誤差(Cross Entropy Errorレイヤ)の合成関数と言えます。よって、$\frac{\partial L}{\partial a_{n,k}}$は、連鎖律(合成関数の微分)より、2つの関数(レイヤ)の微分の積で求められます。

$$ \frac{\partial L}{\partial a_{n,k}} = \frac{\partial L}{\partial L} \frac{\partial L}{\partial \mathbf{y}_n} \frac{\partial \mathbf{y}_n}{\partial a_{n,k}} $$

 ソフトマックス関数から分かるように、$a_{n,k}$は$\mathbf{y}_n$の全ての項に影響しています。よって、$\frac{\partial L}{\partial y_{n,k}}$と$\frac{\partial y_{n,k}}{\partial a_{n,k}}$ではなく、$\frac{\partial L}{\partial \mathbf{y}_n}$と$\frac{\partial \mathbf{y}_n}{\partial a_{n,k}}$になります。
 また、$\frac{\partial L}{\partial L}$はCross Entropy Lossレイヤの逆伝播の入力です。$\frac{\partial L}{\partial L} = 1$なので計算には影響しませんが、実装時に登場するので明示しています。

 「交差エントロピー誤差の入力$\mathbf{y}_n$」に関する「交差エントロピー誤差の出力$L$」の勾配$\frac{\partial L}{\partial \mathbf{y}_n}$は、前節で求めました。

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{y}_n} &= \begin{pmatrix} \frac{\partial L}{\partial y_{n,1}} & \cdots & \frac{\partial L}{\partial y_{n,k}} & \cdots & \frac{\partial L}{\partial y_{n,K}} \end{pmatrix} \\ &= \begin{pmatrix} - \frac{1}{N} \frac{t_{n,1}}{y_{n,1}} & \cdots & - \frac{1}{N} \frac{t_{n,k}}{y_{n,k}} & \cdots & - \frac{1}{N} \frac{t_{n,K}}{y_{n,K}} \end{pmatrix} \end{aligned} $$

 「ソフトマックス関数の各入力$a_{n,k}$」に関する「ソフトマックス関数の出力$\mathbf{y}_n$」の勾配$\frac{\partial \mathbf{y}_n}{\partial a_{n,k}}$は、前々節で求めました。

$$ \frac{\partial \mathbf{y}_n}{\partial a_{n,k}} = \begin{pmatrix} \frac{\partial y_{n,1}}{\partial a_{n,k}} \\ \vdots \\ \frac{\partial y_{n,k}}{\partial a_{n,k}} \\ \vdots \\ \frac{\partial y_{n,K}}{\partial a_{n,k}} \end{pmatrix} = \begin{pmatrix} - y_{n,1} y_{n,k} \\ \vdots \\ y_{n,k} (1 - y_{n,k}) \\ \vdots \\ - y_{n,K} y_{n,k} \end{pmatrix} $$

 それぞれ連鎖律の式に代入して内積を計算します。

$$ \begin{aligned} \frac{\partial L}{\partial a_{n,k}} &= \begin{pmatrix} - \frac{1}{N} \frac{t_{n,1}}{y_{n,1}} & \cdots & - \frac{1}{N} \frac{t_{n,k}}{y_{n,k}} & \cdots & - \frac{1}{N} \frac{t_{n,K}}{y_{n,K}} \end{pmatrix} \begin{pmatrix} - y_{n,1} y_{n,k} \\ \vdots \\ y_{n,k} (1 - y_{n,k}) \\ \vdots \\ - y_{n,K} y_{n,k} \end{pmatrix} \\ &= - \frac{1}{N} \frac{t_{n,1}}{y_{n,1}} (- y_{n,1} y_{n,k}) + \cdots - \frac{1}{N} \frac{t_{n,k}}{y_{n,k}} y_{n,k} (1 - y_{n,k}) + \cdots - \frac{1}{N} \frac{t_{n,K}}{y_{n,K}} (- y_{n,K} y_{n,k}) \end{aligned} $$

 括弧を展開すると、$- \frac{1}{N} t_{n,k}$と$\frac{1}{N} t_{n,1} y_{n,k}$から$\frac{1}{N} t_{n,K} y_{n,k}$の和になるので、式を整理します。

$$ \begin{aligned} \frac{\partial L}{\partial a_{n,k}} &= \frac{1}{N} \Bigl\{ t_{n,1} y_{n,k} + \cdots + (- t_{n,k}) + t_{n,k} y_{n,k} + \cdots + t_{n,K} y_{n,k} \Bigr\} \\ &= \frac{1}{N} \Bigl\{ - t_{n,k} + y_{n,k} (t_{n,1} + t_{n,2} + \cdots + t_{n,K}) \Bigr\} \\ &= \frac{1}{N} \left( - t_{n,k} + y_{n,k} \sum_{k'=1}^K t_{n,k'} \right) \end{aligned} $$

 $t_{n,1}$から$t_{n,K}$の和は1なので消えます。

$$ \frac{\partial L}{\partial a_{n,k}} = \frac{1}{N} (y_{n,k} - t_{n,k}) $$

 $n$番目のデータの$k$番目の入力$a_{n,k}$に関する微分$\frac{\partial L}{\partial a_{n,k}}$が求まりました。

 他の項も同様に求められるので、入力$\mathbf{A}$に関する出力$L$の勾配$\frac{\partial L}{\partial \mathbf{A}}$は

$$ \begin{aligned} \frac{\partial L}{\partial \mathbf{A}} &= \begin{pmatrix} \frac{\partial L}{\partial a_{1, 1}} & \cdots & \frac{\partial L}{\partial a_{1,K}} \\ \vdots & \ddots & \vdots \\ \frac{\partial L}{\partial a_{N,1}} & \cdots & \frac{\partial L}{\partial a_{N,K}} \end{pmatrix} \\ &= \begin{pmatrix} \frac{1}{N} (y_{1, 1} - t_{1, 1}) & \cdots & \frac{1}{N} (y_{1,K} - t_{1,K}) \\ \vdots & \ddots & \vdots \\ \frac{1}{N} (y_{N,1} - t_{N,1}) & \cdots & \frac{1}{N} (y_{N,K} - t_{N,K}) \end{pmatrix} \end{aligned} $$

となります。

本での導出の確認

 この資料では、SoftmaxレイヤとCross Entropy Errorレイヤを個別に逆伝播を求めました。そのため、Softmax-with-Lossレイヤとして逆伝播を求める本の内容と異なります。そこでここでは、図A-5に関して簡単に確認します。図A-5を参考に、分子と分母の経路の計算を確認します。

・共通の計算

 まずは、分母分子両方の経路に影響する計算を確認しておきます。

・「$+$」ノードの順伝播

 式がゴチャゴチャしないように、$\exp(a_1)$から$\exp(a_K)$の和を$S$を使って表すことにします。

$$ \begin{aligned} S &= \sum_{k=1}^K \exp(a_k) \\ &= \exp(a_1) + \exp(a_2) + \cdots + \exp(a_K) \end{aligned} $$


・「$\times$」ノードの逆伝播:その1

 「Cross Entropy Error」レイヤから$- \frac{t_k}{y_k}$が入力します。
 $y_k = \frac{\exp(a_k)}{S}$なので、両辺の逆数をとると

$$ \frac{1}{y_k} = \frac{S}{\exp(a_k)} $$

です。

・「$/$」ノードの順伝播

 入力で1を割ります(逆数をとります)。この計算を$f(x)$を使って

$$ f(S) = \frac{1}{S} $$

で表すことにします。

・「$/$」ノードの逆伝播:その1

 入力$S$に関する出力$f(S)$の微分$\frac{\partial f(S)}{\partial S}$を求めます。ただし、逆数は$-1$乗で表せるので、$f(S) = \frac{1}{S} = S^{-1}$で置き換えて計算します。

$$ \begin{aligned} \frac{\partial S^{-1}}{\partial S} &= - 1 * S^{-1-1} \\ &= - S^{-2} \\ &= - \frac{1}{S^2} \end{aligned} $$

 微分の公式に当てはめて計算できます。

・分子側の計算

 次に、分子に関する経路の計算を確認します。

・「$\times$」ノードの逆伝播:その2

 $- \frac{t_k}{y_k}$と$\frac{1}{S}$を掛けます。

$$ - \frac{t_k}{y_k} \frac{1}{S} = - t_k \frac{S}{\exp(a_k)} \frac{1}{S} = - \frac{t_k}{\exp(a_k)} $$

 $\frac{1}{y_k}$を置き換えて整理した$- \frac{t_k}{\exp(a_k)}$が「$\exp$」ノードに入力します。

・「$\exp$」ノードの逆伝播:その1

 $- \frac{t_k}{\exp(a_k)}$と$\exp(a_k)$を掛けます。$\exp(a_k)$が打ち消されて、$- t_k$となります。

・分母側の計算

 続いて、分母に関する経路の計算を確認します。

・「$\times$」ノードの逆伝播:その3

 $- \frac{t_k}{y_k}$と$\exp(a_k)$を掛けます。

$$ - \frac{t_k}{y_k} \exp(a_k) = - t_k \frac{S}{\exp(a_k)} \exp(a_k) = - t_k S $$

 $\frac{1}{y_k}$を置き換えて整理した$- t_k S$が「$/$」ノードに入力します。

・「$/$」ノードの逆伝播:その2

 $- t_k S$と$- \frac{1}{S^2}$を掛けます。

$$ - t_k S \left( - \frac{1}{S^2} \right) = \frac{t_k}{S} $$


・「$/$」ノードの逆伝播:その3

 「$/$」ノードの順伝播の出力$\frac{1}{S}$は、$K$個の「$\times$」ノードに分岐して入力しました。逆伝播では、$K$個の「$\times$」ノードからそれぞれ$\frac{t_1}{S}, \cdots, \frac{t_K}{S}$が出力され、「$/$」ノードに入力します。
 この$K$個の要素を足し合わせる必要があります。

$$ \frac{t_1}{S} + \frac{t_2}{S} + \cdots, \frac{t_K}{S} = \frac{1}{S} \Bigl( t_1 + t_2 + \cdots + t_K \Bigr) = \frac{1}{S} $$

 one-hotベクトルである$\mathbf{t} = (t_1, \cdots, t_K)$の総和は1なので、$\frac{1}{S}$が残ります。

・「$\exp$」ノードの逆伝播:その2

 $\frac{1}{S}$と$\exp(a_k)$を掛けます。$y_k = \frac{\exp(a_k)}{S}$となります。

・「$\exp$」ノードの逆伝播:その3

 「$\exp$」ノードも分岐ノードなので、2つの逆伝播の入力$- t_k$と$y_k$を足す必要があります。

 以上で、Softmax-with-Lossレイヤの$k$番目の出力

$$ \frac{\partial L}{\partial a_k} = y_k - t_k $$

が得られました。

参考文献

  • 斎藤康毅『ゼロから作るDeep Learning』オライリー・ジャパン,2016年.

おわりに

 割とすんなり導出できたので良かったです。あとここまできてやっと誤差逆伝播法という言葉の意味を理解しました!なるほど誤差を逆伝播することが目的だったのか。テキトーに読んでるから何度も何度も書き直すはめに、、

  • 2021.09.06:加筆修正しました。その際に記事を分割しました。

 サクっと導出できたのは覚えています。ノードが進むと式がキレイになっていって気持ち良かったです。
 しかし、1年経って記事を読み返してみると何が言いたいのかさっぱり伝わらなかったので、大幅に構成を変更しました。ソフトマックス関数と交差エントロピー誤差の逆伝播を個別に行うことにして、記事も分割しました。個人的には分かりやすくなったと思うのですが、結果として本の導出過程と変わってしまいました。
 これでは攻略ノートにならんかもと思い、簡易的に本に沿った内容の解説も付け足しました。どっちの方が分かりやすいんですかね?どっちも載せたらいいよねということで本に沿った方も丁寧に書いてもいいのですが、とりあえず先を進めます。

【関連する記事】

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com