社畜エンジニア発掘戦線

駆けだしAIエンジニア

活性化関数とクロスエントロピーの微分

おつかれさまです。

活性化関数や損失関数の微分についてメモしておきます。

〜活性化関数〜
ニューラルネットワークにおいて、線形変換をした後に適用する非線形関数もしくは恒等関数のこと。

よく使っている「シグモイド関数」が活性化関数ですね。

〜損失関数〜
ニューラルネットワークにおいて、出力(y)と正解(t)がどれだけ離れているのかを表す「損失量」を与える関数。

二乗和誤差関数」、「クロスエントロピー」がこの損失関数にあたります。

今回は活性化関数に「シグモイド関数」、「ソフトマックス関数」、損失関数に「クロスエントロピー」を用いたときの微分の計算についてまとめてみたいと思います。
f:id:sutokun:20190218180627j:plain


まず、簡単なニューラルネットワークのモデルを下図のように設計します。今回の計算を分かりやすくするために入力(x)と出力(y)の間にaという中継変数を置きました。このaは単に入力とパラメータの線形結合を表す変数です。Eが損失関数、σは活性化関数を表しています。
f:id:sutokun:20190207094629j:plain
誤差逆伝搬法(バックプロパゲーション)では損失関数のパラメータ微分を行います。そして、計算が行えるように「連鎖律」というテクニックを用いて微分式を展開します。パラメータはwとbがありますが、とりあえずwで微分しましょう。中間変数aを入れたので連鎖律は三段構造になります。

{\displaystyle
\frac{\partial E}{\partial w}\ = \frac{\partial a}{\partial w}\ \frac{\partial y}{\partial a}\ \frac{\partial E}{\partial y}\
}

活性化関数σにシグモイド関数を使う

では、この3つの微分をひとつずつ見ていきましょう。まず、ひとつ目の微分は線形結合wx+bを微分するだけなので簡単ですね。

{\displaystyle
\frac{\partial a}{\partial w}\ = \frac{\partial }{\partial w}\ (xw+b) = x
}

次の微分にはシグモイド関数を用いているので、その微分はσ(1-σ)で書けましたね。

{\displaystyle
\frac{\partial y}{\partial a}\ = \frac{\partial }{\partial a}\ \sigma(a) = \sigma(a) (1-\sigma(a)) = y(1-y)
}

最後に、クロスエントロピー微分ですが、今回は入力xはたくさんの値を含んでいるわけではないので、シグマはいりません。

{\displaystyle
E =\ -\sum_{i} \Bigl( t_{i} \log y_{i} +(1-t_{i}) \log (1-y_{i}) \Bigr) \rightarrow E = - ( t \log y +(1-t) \log (1-y) )
}

なので、その微分式は下記のようになります。

{\displaystyle
\frac{\partial E}{\partial y}\ = \frac{\partial }{\partial y}\ \Bigl( - ( t \log y +(1-t) \log (1-y) ) \Bigr) = -\frac{t}{y} + \frac{1 - t}{1 - y} 
}

ではもとの式に代入してみます。ただし、aのw微分の式はそのままにしておきます。

{\displaystyle
\frac{\partial E}{\partial w}\ = \frac{\partial a}{\partial w}\ \frac{\partial y}{\partial a}\ \frac{\partial E}{\partial y}\ = \frac{\partial a}{\partial w}\ \cdot y(1-y)\cdot \Bigl(-\frac{t}{y} + \frac{1 - t}{1 - y}  \Bigr) = \frac{\partial a}{\partial w}\ \cdot (y-t)
}

この(y-t)をδと置きます。「なぜイキナリ新しい変数で置くねん」ってところはありますが、まずは置いてみます。

{\displaystyle
 \frac{\partial y}{\partial a}\ \frac{\partial E}{\partial y}\ =y(1-y)\cdot \Bigl(-\frac{t}{y} + \frac{1 - t}{1 - y}  \Bigr) = (y-t) = \delta
}

このδの意味ですが、「シグモイド関数×クロスエントロピー」の組み合わせで現れる微分結合式です。この結果を知っていれば、どれだけニューロンの数が増えても「中間変数aのパラメータw微分」だけ計算してあげればすぐに微分式が出せます。

つまり、

{\displaystyle
\frac{\partial E}{\partial w}\ = \frac{\partial a}{\partial w}\ \delta =  \frac{\partial }{\partial w}\ (wx+b) \cdot \delta = x \cdot (y-t)
}

おースッキリしました。バイアスbで微分するときも同じです。

{\displaystyle
\frac{\partial E}{\partial b}\ = \frac{\partial a}{\partial b}\ \delta =  \frac{\partial }{\partial b}\ (wx+b) \cdot \delta = 1 \cdot (y-t)
}

これはかなり計算が早くなりそうです。と言っても、出力層の計算なので隠れ層が何層もある場合はどれだけ効果が出るのか分かりませんが。

活性化関数σにソフトマックス関数を使う

分類問題によく出てくるソフトマックス関数は下記の式で表される関数です。

{\displaystyle
 y_{i} = \frac{e^{a_{i}}}{\sum_{j} e^{a_{j}}}\ 
}

ソフトマックス関数についてはここの問題でやや詳しめに書いています↓
③線形分類問題(2クラス分類:ワン・ホット エンコーダ) - 社畜エンジニア発掘戦線


こちらの関数も上記と同様に「クロスエントロピー」との結合微分式を求めたい、のですがめっちゃややこい。詳しい計算過程についてこちらのページに素晴らしく詳細に書かれていたので参照して下さい(あっ、コイツ逃げたぞ!とか言わないで…)。
qiita.com

とにかく(計算ができたとして)、微分結合式の結果はこのようになります。
※分類問題でソフトマックス関数を使う時は出力と正解ラベルが行列になることが多いので大文字で表記しています

{\displaystyle
 \frac{\partial Y}{\partial A}\ \frac{\partial E}{\partial Y}\ =
} (省略) {\displaystyle
= Y-T
}

なんと、シグモイド関数と同じ結果となりました。つまり、ソフトマックス関数も損失関数にクロスエントロピーを使うならばΔ(大文字)はY-Tと表現できます。

{\displaystyle
\frac{\partial E}{\partial W}\ = \frac{\partial A}{\partial W}\ \Delta =  \frac{\partial }{\partial W}\ (W \cdot X + B) \cdot \Delta = X \cdot (Y-T)
}

{\displaystyle
\frac{\partial E}{\partial B}\ = \frac{\partial A}{\partial B}\ \Delta =  \frac{\partial }{\partial B}\ (W \cdot X + B) \cdot \Delta = 1 \cdot (Y-T)
}

これはシグモイド関数とソフトマックス関数、この2つの関数が深く関係していることに由来します。

まとめ

今回行った微分計算のイメージとしてはこんな感じ(分かりにくいけど)。
f:id:sutokun:20190218175934j:plain
活性化関数とクロスエントロピー微分計算について少し詳しく(他のページに譲ったりして)見てみました。問題を解く上でこのδ(Δ)を使うこともあるかもしれないのでこの計算を参照してもらえばと思います。



元の記事
PYTHONISTA3を使って機械学習(ディープラーニング) - 社畜エンジニア発掘戦線

Twitter
世界の社畜 (@sekai_syachiku) | Twitter