KATUBLO
2019年02月15日

【DeepLearning】勾配降下法の式を導出&原理を理解する

ゴール

勾配降下法の式を導出する

 

シグモイド関数

シグモイド関数を使うと出力をほぼ確率に近い形式で扱うことができます。これはどういうことかというパーセプトロンの出力は「1」と「0」の2つしかありませんが、0.5という出力が欲しいときパーセプトロンの式だとこれを表すことができません。これを可能にしたのがシグモイド関数と呼ばれる関数です。

 

$$
\delta ( x ) = \frac { 1 } { 1 + e ^ { – x } }
$$

 

参考文献:「wikipedia」

 

図からわかる通り、出力は0~1の間に収まっており、この性質を利用して確率のように扱うことができるのです。

 

 

シグモイド関数を微分する

次にシグモイド関数を微分してみる。

 

$$
\begin{aligned} \delta ( x ) ^ { \prime } & = \left\{ \left( 1 + e ^ { – x } \right) ^ { – 1 } \right\} ^ { \prime } \\ & = – 1 \cdot \left( 1 + e ^ { – x } \right) ^ { – 2 } \cdot \left( – e ^ { – x } \right) \\ & = e ^ { – x } \cdot \frac { 1 } { \left( 1 + e ^ { x } \right) ^ { 2 } } \\ & = \frac { e ^ { – x } } { 1 + e ^ { – x } } \cdot \delta ( x ) \\ & = e ^ { – x } \delta \left( x \right)^{2} \end{aligned}
$$

 

シグモイド関数を以下のように変形する

$$
1 + e ^ { – x } = \frac { 1 } { \delta ( x ) }
$$

$$
e ^ { – x } = \frac { 1 } { \delta ( x ) } – 1
$$

この式を代入すると

$$
\begin{aligned} & = \delta ( x ) – \delta \left( x ^ { 2 } \right) \\ & = \delta ( x ) ( 1 – \delta ( x ) ) \end{aligned}
$$

となり、まとめると以下の式になる。

$$
\delta ( x )^{\prime} = \delta ( x ) ( 1 – \delta ( x ))
$$

シグモイド関数の微分はシグモイド関数自体を用いて表すことができる。

 

尤度関数を定義する

こちらもパーセプトロンの原理を用いて、解説していく。

 

[1]ニューロンが発火する確率を以下の式で定義する。

$$
P ( C = 1 | x ) = \delta \left(w ^ { T} x + b \right)
$$

 

[2]ニューロンが発火しない確率を以下の式で定義する

$$
P ( c = 0 | x ) = 1 – P ( c = 1 | x )
$$

 

[1][2]で定義した式を1つにまとめる。そのためにまず

$$
y =\delta \left( w ^ { \top } x + b \right)
$$

とすると以下の1つの式にまとめることができる。

 

$$
P ( c = t | x ) = y ^ { t } ( 1 – y ) ^ { 1 – t } ( t \in ( 0,1 \} )
$$

 

ここでN個の入力データ[math]x _ { n } ( n = 1,2,3 \cdots N ) [/math]が存在し、それに対応する出力データ[math]t_n[/math]があるとき尤度関数は以下のように定義される。

 

$$L ( w , b ) = \prod _ { n = 1 } ^ { N } P \left( c = t _ { n } | x _ { n } \right)$$

$$
L ( w , b ) = \prod _ { n = 1 } ^ { N } y_{n}^{t_n} \left( 1 – y _ { n } \right) ^ { 1 – t _n }
$$

 

尤度関数はw、bを求めることを目的として定義された関数である。

 

損失関数を定義する

尤度関数は見ての通り積を足し合わせて計算する方法である。これはCPUの計算量が多く、メモリ不足になりかねない。よって以下のように損失関数を定義することで計算量を簡略化させる。

 

$$
E ( w , b ) = – \log L ( w , b )
$$

 

$$ E ( w , b ) = – \log {\prod _ { n = 1 } ^ { N } y_{n}^{t_n} \left( 1 – y _ { n } \right) ^ { 1 – t _n }}$$

$$
= – \left\{ \log y _ { 1 } ^ { t _ { 1 } } \left( 1 – y _ { 1 } \right) ^ { 1 – t _ { 1 } } + \log y _ { 2 } ^ { t _ { 2 } } \left( 1 – y _ { 2 } \right) ^ { 1 – t _ { 2 } } +\right. \cdots + \log  y _ { n } ^ { \operatorname { t_n } } \left( 1 – y _ { n } \right) ^ { 1 – t_n } \}
$$

$$
= – \sum _ { n = 1 } ^ { N } \log y _ { n } ^ { t _ { n } } \left( 1 – y _ { n} \right) ^ { 1 – t _ { n } }
$$

$$
= – \sum _ { n = 1 } ^ { N } \log  y  ^ { t _ { n } } + \log \left( 1 – y _ { n } \right) ^ { 1 – t_n }
$$

$$
= – \sum _ { n = 1 } ^ { N } t _ { n } \log y _ { n } + \left( 1 – t _ { n } \right) \log \left( 1 – y _ { n } \right)
$$

 

最後の式は「交差エントロピー誤差関数」とも呼ばれる。また誤差関数は誤差を表す関数であり、この関数を最小化することが最適なパラメータをもとめることと同値である。

 

勾配降下法を求める

ここまできてやっとこの記事の本題、「勾配降下法」を定義する。まず式だが以下のように定義される。

 

$$
w ^ { ( k + 1 ) } = w ^ { ( k ) } – \eta \frac { \partial E ( w , b ) } { \partial w }
$$

$$
b ^ { ( k+ 1 ) } = b ^ { ( k ) } – \eta \frac { \partial E ( w , b ) } { \partial b }
$$

 

パラメータ最適化のため、

交差エントロピー誤差関数をw、bで偏微分してそれぞれが0の値になるものを求める。となるとw、bの値を少しずつ

変化させて、パラメータを更新する必要がある。この時用いられる手法が「勾配降下法」と呼ばれるものである。

 

偏微分の部分の式を最適化

では偏微分の部分をプログラムで計算しやすい形に変形してみよう。

 

 

$$
E _ { n } = – \left\{ t _ { n } \log _ { n } y + \left( 1 – t _ { n } \right)\right. \log ( 1 – y_n ) \}
$$

 

$$
E ( w , b ) = – \sum _ { n = 1 } ^ { N } E _ { n }
$$

 

$$
\frac { \partial E ( w , b ) } { \partial w } = – \sum _ { n = 1 } ^ { N } \frac { \partial E _ { n } } { \partial y _ { n } } \cdot \frac { \partial y _ { k } } { \partial w }
$$

誤差関数の偏微分は以下のように変形できる。

$$\frac { \partial E _ { n } } { \partial y _ { n } } = \left( \frac { t_n } { y _ { n } } – \frac { 1 – t _n } { 1 – t _ { n } } \right) $$

$$
= – \sum _ { n = 1 } ^ { N } \left( \frac { t_n } { y _ { n } } – \frac { 1 – t _n } { 1 – t _ { n } } \right) \frac { \partial y_n } { \partial w }
$$

 

yの偏微分は以下のように求めれれる。

$$
y _ { n } = \delta  \left( w ^ { T} x _ { n } + b \right)
$$

$$
\frac { \partial y } { \partial \omega } = \delta (w ^ { T} x _ { n } + b ) \left( 1 – \delta ( w ^ { T} x _ { n } + b ) \right)
$$

$$
= \operatorname { y_n } ( 1 – y_n ) x _ { n }
$$

 

 

$$
= – \sum _ { n = 1 } ^ { N } \left( \frac { \operatorname { t_n } } { y_ n } – \frac { 1 – \operatorname { t_n } } { 1 – y_n } \right) y_n ( 1 – y_n ) x _ { n }
$$

$$
= – \sum _ { n = 1 } ^ { N } t_n ( 1 -y_n ) x _ { n } – \left( 1 – t _ { n } \right) y_n  x _ { n }
$$

$$
= – \sum _ { n = 1 } ^ { N } x _ { n }(( { t_n ( 1 – y_n ) – ( 1 – t_n ) y_n} )
$$

$$
= – \sum _ { n = 1 } ^ { N } x _ { n } \left( t _ { n } – y _ { n } \right)
$$

というように誤差関数の偏微分は積の和の集合で求められる。bの偏微分も同様にしてもとめることができ、この式を勾配降下法の偏微分の箇所に当てはめると以下のような式で表すことができる。

 

$$
\boldsymbol { w } ^ { ( k + 1 ) } = \boldsymbol { w } ^ { ( k ) } + \eta \sum _ { n = 1 } ^ { N } \left( t _ { n } – y _ { n } \right) \boldsymbol { x } _ { n }
$$

 

$$
b ^ { ( k + 1 ) } = b ^ { ( k ) } + \eta \sum _ { n = 1 } ^ { N } \left( t _ { n } – y _ { n } \right)
$$

 

勾配降下法の話に付随して確率的勾配降下法という考えがある。これは次回の記事で紹介します。

 

 

 

最後まで読んで頂き
ありがとうございました。
SNS等でのシェアが頂ければ幸いです。

プロフィール

@KATUO

現在都内私立大学に通う大学3年生。大学では電気電子工学を専攻。大学2年の夏頃に、プログラマーの長期インターン募集の広告が目に止まり、独学でプログラミングの学習をスタート。この時期からプログラミングにどハマりし、現在までに「AIスタートアップ」「Webマーケティング会社」でエンジニアとしての業務に没頭してきた。

過去の投稿