からっぽのしょこ

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

損失関数【ゼロつく1のノート(数学)】

はじめに

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

 NumPy関数を使って実装できてしまう計算について、数学的背景を1つずつ確認していきます。

 この記事は、主に4.2節「損失関数」を補足するための内容になります。損失関数として用いられる2乗和誤差と交差エントロピー誤差について説明します。

【関連する記事】

www.anarchive-beta.com

【他の記事一覧】

www.anarchive-beta.com

【この記事の内容】

・2乗和誤差

 2乗和誤差では、最終層にソフトマックス関数を用いたニューラルネットワークの出力$\boldsymbol{\mathrm{y}} = (y_1, y_2, \cdots, y_{10})$とone-hot表現の教師データ$\boldsymbol{\mathrm{t}} = (t_1, t_2, \cdots, t_{10})$の各要素の差に注目します。ただしここでは、要素数を10として説明します。2乗和誤差の計算式は次の式です。

$$ E = \frac{1}{2} \sum_{k=1}^{10} ( y_k - t_k )^2 \tag{4.1} $$

 $y_k - t_k$は、ニューラルネットワークの出力$\boldsymbol{\mathrm{y}}$と教師データ$\boldsymbol{\mathrm{t}}$のある要素の差を表します。そして$\sum_{k=1}^{10} (y_k - t_k)^2$は、全ての要素の差を2乗してから和をとることを意味します。その総和に$\frac{1}{2}$を掛けたものが2乗和誤差となります。

 具体的な値を使って確認していきましょう。$\boldsymbol{\mathrm{y}},\ \boldsymbol{\mathrm{t}}$をそれぞれ次の値とします。

$$ \begin{aligned} \boldsymbol{\mathrm{y}} &= \begin{pmatrix} 0.1 & 0.05 & 0.6 & 0 & 0.05 & 0.1 & 0 & 0.1 & 0 & 0 \end{pmatrix} \\ \boldsymbol{\mathrm{t}} &= \begin{pmatrix} 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{pmatrix} \end{aligned} $$

 ソフトマックス関数の出力は、各要素が0から1の値をとり、全ての要素を合計すると1になるのでした。(ちなみにこれを数式で表すと、$0 \leq y_k \leq 1,\ \sum_{k=1}^{10} y_k = 1$となります。)これは手書き文字がどの数字であるかの確率と解釈できるのでした。
 またone-hot表現の教師データは、正解ラベルが1でそれ以外の要素は0をとります。(これは$t_k \in \{0, 1\},\ \sum_{k=1}^{10} t_k = 1$と書きます。ちなみにこちらも$t_1$から$t_{10}$まで足すと1になりますね。)これも正解ラベルが100%でそれ以外が0%であることを示していると捉えると、確率のように扱うことができます。
 つまり出力の理想形は、正解の要素が1(100%)でそれ以外の要素が0(0%)の状態です。とすると、教師データ(理想)とのズレを誤差と言えますね。

 このことを踏まえて、2乗和誤差(4.1)の数式の意図を1つずつ確認していきます。

 まずは各要素の差$y_k - t_k$を実際に計算すると次のようになります。

$$ \begin{aligned} \boldsymbol{\mathrm{y}} - \boldsymbol{\mathrm{t}} &= \begin{pmatrix} 0.1 - 0 & 0.05 - 0 & 0.6 - 1 & 0 - 0 & 0.05 - 0 & 0.1 - 0 & 0 - 0 & 0.1 - 0 & 0 - 0 & 0 - 0 \end{pmatrix} \\ &= \begin{pmatrix} 0.1 & 0.05 & - 0.4 & 0 & 0.05 & 0.1 & 0 & 0.1 & 0 & 0 \end{pmatrix} \end{aligned} $$

 これは各要素の誤差と言えますね。では全体の誤差をみるために、各要素の誤差の和をとろうと言いたいところですが、このまま足すと、正の値と負の値が相殺されてしまいます。正解ラベルは-1から0の値、それ以外は0から1の値になります。

 そこで各要素を2乗してから計算することにします。(分散の考え方と同じですね。)

$$ \begin{aligned} \sum_{k=1}^{10} (y_k - t_k)^2 &= 0.1^2 + 0.05^2 + (-0.4)^2 + 0^2 + 0.05^2 + 0.1^2 + 0^2 + 0.1^2 + 0^2 + 0^2 \\ &= 0.01 + 0.0025 + 0.16 + 0 + 0.0025 + 0.01 + 0 + 0.01 + 0 + 0 \\ &= 0.195 \end{aligned} $$

 これに$\frac{1}{2}$を掛けた値が2乗和誤差$E$となります。

$$ \begin{aligned} \frac{1}{2} \sum_{k=1}^{10} (y_k - t_k)^2 &= \frac{1}{2} * 0.195 \\ &= 0.0975 = E \end{aligned} $$

 これで2乗和誤差$E$が計算できました。ちなみに、教師データの通りに出力されたとき最小値$E = 0$となり、正解以外の要素の1つを1で(正解も含めた)それ以外を0としたとき、最大値$E = 1$となります(2で割らなければ最大値が$E = 2$となって何だかきまりが悪いですね)。

 以上で、2乗和誤差(4.1)の意図するところは掴めました!【4.2:損失関数【ゼロつく1のノート(実装)】 - からっぽのしょこ】に戻って実装しましょう。

・交差エントロピー誤差

 2乗和誤差では全ての要素に注目しましたが、交差エントロピー誤差では正解ラベルにのみ注目します。出力と教師データについては同様です。こちらも要素数を10として進めます。交差エントロピー誤差は次の式で計算できます。

$$ E = - \sum_{k=1}^{10} t_k \log y_k \tag{4.2} $$

 $\log y_k$は、ソフトマックス関数の出力$\boldsymbol{\mathrm{y}}$のある要素の自然対数です。そこに教師データ$\boldsymbol{\mathrm{t}}$の対応する要素を掛けた値が$t_k \log y_k$です。つまり$\sum_{k=1}^{10} t_k \log y_k$は、対数をとった出力と教師データの各要素の積を全て足した値です。この値は(出力の各要素は0から1の値をとるので、その自然対数は0以下の値になります。よってその総和も)常に0以下の値となるため、$-1$を掛けて符号を反転させることで、交差エントロピー誤差$E$は常に0以上の値になります。(あるいは、$\log y_k$が常に負の値となるのでこの時点で符号を反転させ$- \log y_k$とし、$t_k$との積の和をとった後で、$-1$は定数なので$\sum_k$の外に出したとも言えます。)
 ところで、全ての要素を使っているのに、なぜ正解ラベルにのみ注目すると言えるのでしょう?

 具体的な値を使って確認していきましょう。$\boldsymbol{\mathrm{y}},\ \boldsymbol{\mathrm{t}}$には先ほどと同じ値を使います。

$$ \begin{aligned} \boldsymbol{\mathrm{y}} &= \begin{pmatrix} 0.1 & 0.05 & 0.6 & 0 & 0.05 & 0.1 & 0 & 0.1 & 0 & 0 \end{pmatrix} \\ \boldsymbol{\mathrm{t}} &= \begin{pmatrix} 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{pmatrix} \end{aligned} $$

 この値を使って交差エントロピー誤差(4.2)の計算を行いますが、2つ注意点があります。1つ目は、行列の計算ではなく対応する要素ごとに掛け算を行います。もう1つは、($a^x = 0$を満たす$x$は存在しないため)$\log 0$は計算できません。実装時には各要素に誤差レベルの小さい値を加えることで対応しますが、ここでは計算過程の分かりやすさのため$\log 0$のまま進めます。

$$ \begin{aligned} \sum_{k=1}^{10} t_k \log y_k &= (0 * \log 0.1) + (0 * \log 0.05) + (1 * \log 0.6) + (0 * \log 0) + (0 * \log 0.05) \\ &\qquad + (0 * \log 0.1) + (0 * \log 0) + (0 * \log 0.1) + (0 * \log 0) + (0 * \log 0) \\ &= 0 + 0 + \log 0.6 + 0 + 0 + 0 + 0 + 0 + 0 + 0 \\ &= \log 0.6 \\ &= -0.51083 \end{aligned} $$

 教師データを掛けて全てを足すことで、正解ラベルの要素の計算結果だけが反映されていますね。この計算結果の符号を反転させた値が交差エントロピー誤差$E$となります。

$$ -\sum_{k=1}^{10} t_k \log y_k = 0.51083 = E $$

 これで交差エントロピー誤差$E$が計算できました。$\log 1 = 0$なので、こちらも教師データの通りに出力されたとき最小値$E = 0$となり、正解ラベルを0と予測したとき$E = \log 0$となります。

 以上で、交差エントロピー誤差(4.2)の意図するところは掴めました!【4.2:損失関数【ゼロつく1のノート(実装)】 - からっぽのしょこ】に戻って実装しましょう。

・ミニバッチ学習版の交差エントロピー誤差

 上の例は、1つの画像データにおける出力と教師データとの誤差をみるものでした。次は複数の画像データにおける交差エントロピー誤差を確認します。

 1度に$N$枚分の画像データを扱う(バッチサイズが$N$)の場合の交差エントロピー誤差の計算式は次のようになります。ただし各画像に対する要素数は0から9の10とします。

$$ E = - \frac{1}{N} \sum_{n=1}^N \sum_{k=1}^{10} t_{n,k} \log y_{n,k} \tag{4.3} $$

 この中のある要素$y_{n,k},\ t_{n,k}$について、出力の自然対数と教師データを掛ける点は同じです。それを全ての要素で足して、データ数で割った値がミニバッチ版の交差エントロピー誤差になります。

 ニューラルネットワークの出力$\boldsymbol{\mathrm{Y}}$と教師データ$\boldsymbol{\mathrm{T}}$はそれぞれ次のような形状です(行列になるので太字の大文字で表現します)。

$$ \boldsymbol{\mathrm{Y}} = \begin{pmatrix} y_{1,1} & y_{1,2} & \cdots & y_{1,10} \\ y_{2,1} & y_{2,2} & \cdots & y_{2,10} \\ \vdots & \vdots & \ddots & \vdots \\ y_{N,1} & y_{N,2} & \cdots & y_{N,10} \end{pmatrix} ,\ \boldsymbol{\mathrm{T}} = \begin{pmatrix} t_{1,1} & t_{1,2} & \cdots & t_{1,10} \\ t_{2,1} & t_{2,2} & \cdots & t_{2,10} \\ \vdots & \vdots & \ddots & \vdots \\ t_{N,1} & t_{N,2} & \cdots & y_{N,10} \end{pmatrix} $$

 行列の積ではなく2つの行列の同じ位置の要素ごとの積を求めるので、行数と列数の両方が同じでなければ計算できません。

 式(4.3)について$n = 1$にのみ注目すると

$$ \sum_{k=1}^{10} t_{1,k} \log y_{1,k} = t_{1,1} \log y_{1,1} + t_{1,2} \log y_{1,2} + \cdots + t_{1,10} \log y_{1,10} $$

式(4.2)と同じことだと分かります。これをデータ数分求めて和をとり、データ数で割ります。

 例えばバッチサイズが5で、それぞれの正解ラベルが$(2, 1, 3, 1, 4)$だったとき

$$ \begin{aligned} \sum_{n=1}^5 \sum_{k=1}^{10} t_{n,k} \log y_{n,k} &= (0 * \log y_{1,1}) + (1 * \log y_{1,2}) + \cdots + (0 * y_{1,10}) \\ &\quad + (1 * \log y_{2,1}) + (0 * \log y_{2,2}) + \cdots + (0 * \log y_{2,10}) \\ &\quad + (0 * \log y_{3,1}) + (0 * \log y_{3,2}) + (1 * \log y_{3,3}) + \cdots + (0 * \log y_{3,10}) \\ &\quad + (1 * \log y_{4,1}) + (0 * \log y_{4,2}) + \cdots +( 0 * \log y_{4,10}) \\ &\quad + (0 * \log y_{5,1}) + \cdots + (1 * \log y_{5,4}) + \cdots + (0 * \log y_{5,10}) \\ &= \log y_{1,2} + \log y_{2,1} + \log y_{3,3} + \log y_{4,1} + \log y_{5,4} \end{aligned} $$

 one-hot表現の教師データと掛けて全体の和をとることで、正解ラベルの要素のみを取り出すことができました。

 ただしこの計算結果を使うとすると、データ数が増えるのに応じて値も大きくなります。それだと、データ数が学習の良し悪しを比較できません。そこでデータ数$N$で割り、1データ当たりの値を交差エントロピー誤差$E$とします。

 これで式(4.3)の計算を確認できました。実装は【4.2:損失関数【ゼロつく1のノート(実装)】 - からっぽのしょこ】で行います。

参考文献

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

おわりに

 4章の内容の勉強会資料が書き終わりました!10日くらいかかりましたかね。また暫く続けてブログ記事化していきます。

 その勉強会は6月の頭から始まるはずだったのですが、まだ本格的には始まっていません。それどころか4章分を書いている間に、かなり規模縮小しそうで(そもそもが数人だけど)すごーくモチベーションが下がっております。でも既に全体の半分以上を書いてしまっているので、最後まで質を下げることなくやりきるつもりです。頑張ります。よろしくお願いします。

 何がどうなろうとそも自分の勉強ですしね。早く2巻やりたーーい。

【元の記事】

www.anarchive-beta.com