デジタル・デザイン・ラボラトリーな日々

アラフィフプログラマーが数学と物理を基礎からやり直す。https://qiita.com/yaju

ディープラーニング(深層学習)を理解してみる(勾配降下法)

はじめに

機械学習をやる上では「勾配降下法」を理解しておきたい。
「勾配降下法」で検索すると自分が書いた記事が見つかります。 yaju3d.hatenablog.jp

資料を元に書いた記事なので当時はよく理解していたわけではないですが、今、読み返すとふむふむと言ったところです。今回はもっと深く追求していきます。

機械学習は最適解を求めるのが目的です。
上記記事の八百屋の件でも、条件が当てはまる最小の値をひたすら繰り返し計算すれば求めることが出来るのですが、これを出来るだけ少ない計算で最小値を見つけるようにしたい。ここで「勾配降下法」を使うことになるわけです。

解けない連立方程式

どうせなので八百屋の問題を使います。

例題 1

リンゴ1個とミカン3個を買うと190円、リンゴ3個とミカン1個を買うと330円するようです。
リンゴ2個とミカン4個を買うといくらになるでしょうか? f:id:Yaju3D:20160417225841p:plain

今回は数式で表してみます。次の連立方程式となります。

\displaystyle \begin{cases}
 a + 3b &=& 190 \\ 
3a +  b &=& 330 \\
\end{cases}

加減法で計算します。

\displaystyle \begin{eqnarray}
   3a + 9b &=& 570 \\ 
-) 3a +  b &=& 330 \\
\\
         8b &=& 240 \\ 
      b &=& 30 
\end{eqnarray}
\displaystyle \begin{eqnarray}
a + 3b &=& 190 \\  
a + 3\times30 &=& 190 \\
a &=& 190-90 \\
a &=& 100
\end{eqnarray}


a=100b=30 と分かりましたので、値を入れると答えが 320 と求まります。

f:id:Yaju3D:20160417230109p:plain f:id:Yaju3D:20160417230118p:plain

例題 2

例題 1 に対し、更にリンゴ5個とミカン7個を買うと660円を追加した場合
リンゴ2個とミカン4個を買うといくらになるでしょうか?
f:id:Yaju3D:20160417230234p:plain

先程と同様に連立方程式を書いてみます。

\displaystyle \begin{cases}
 a + 3b &=& 190 \\ 
3a +  b &=& 330 \\
5a + 7b &=& 660
\end{cases}


先程の答えの a=100b=30 を入れても答えが 100\times5 + 30\times7 = 500 + 210 = 710となり答えの 660にはなりません。

f:id:Yaju3D:20160417230455p:plain

中学校で勉強する連立方程式は、未知数(パラメータの数)が2個であれば、方程式の数も2本でなければなりません。例題 2は、方程式の数が多すぎるということになります。 とは言え、実際の世の中の現象は、このようにデータがバラバラなケースのほうが多いですよね。
そこで出来るだけ近い値である近似値を求めることにするわけです。

近似値を求める

今回、近似値を求めるのには最小2乗法を使います。

最小二乗法とは、モデル関数を f(x) とするとき、

\displaystyle \sum_{i=1}^n\{y_i-f(x)\}^2

が最小となるような f(x) を求めることである。 sci-pursuit.com

下図に合わせて、最小二乗法の式を変更してみます。

x_i がリンゴの個数、y_i がミカンの個数、z_i が合計値とする。

a がリンゴの価格、b がミカンの価格の最小値を求める。

\displaystyle \frac{1}{3}\sum_{i=1}^n\{(ax_i + by_i)-z_i\}^2

最後に平均しているので3で割っていますが、最小値を求める上で平均ではなく合計したままでも、最小二乗法の公式通りに2で割っても最終的に求まる結果は変わらないです。

f:id:Yaju3D:20160417230639p:plain
条件が当てはまる最小の値をひたすら繰り返し計算する。
f:id:Yaju3D:20160417230656p:plain f:id:Yaju3D:20160417230833p:plain

たくさん計算した結果、最小の値として、a=90b=30 が求まりました。

f:id:Yaju3D:20171029162934p:plain

少ない計算で最小値を求める

最小二乗法では1回の計算で(一発で)パラメータを求める方式です。データを追加する度に再度計算し直すことになります。少ないデータ量の時はいいですが、データ量が膨大になるとシステムの対応が難しくなってきます。

もし、データを追加するたびにパラメータを更新していく方式ができるなら、変化点だけの少ない計算で最小値を求めることができるようになります。
f:id:Yaju3D:20160417230848p:plain
それが、「勾配降下法」という方法となります。

続きは後日書きます。