勾配降下法とは、AIが学習するための基本的なアルゴリズムです。
その考え方とサンプルプログラムを紹介します。
本記事はこんな方におすすめです。
本記事の内容
- AIの学習アルゴリズム
- 勾配効果について
- VBAで実装
AIの学習アルゴリズム
AIのアルゴリズムを考えるとき、以下のステップを踏みます
- データに合いそうなAIモデル式(線形回帰式など)を考える
- AIモデルの予測価格 と 実際の価格 の差を表すロスの式(二乗誤差など)を考える
- ロスが一番小さくなる(AIの予測精度がよくなる)ように回帰式のw0,w1を調整する
ロスを小さくする考え方を最適化アルゴリズムといい、その基本的なものが勾配降下法
AIというのは大げさですが、AIはこの考えを発展させていったものです。
勾配降下法の概念
まず、loss値はw1とw0を変化させることで変わるので、lossの式をJ(w0,w1)とした時、
勾配降下法の式は、以下で表されます。
この式で、どのようにlossが最小になっていくかというと、
下記図の緑色の箇所は、w1がある値の時の傾きを表しています。
w1の位置によって、プラスかマイナスの値になります。
プラスであれば、w1を小さくして、lossを減らそうとします。
逆に、マイナスであれば、w1を大きくして、lossを減らそうとします。
こうやって、lossを減らそうとコンピュータがw1を調整してくれます。
同時に、精度もUPします。
この時、w1を少しずつ変化させるのか、大きく変化させるのかを調整する役割なのが「α」で「学習率(Learning Rate)」と呼ばれるものです、これは画像AIなどを作るときにも必ず出てきて調整する必要があります。
学習率は大きすぎても、小さすぎてもダメです。
どれくらいがいいのか?経験と勘と総当たりで良さそうなところを決めます。
勾配降下法のプログラム VBA
こんな感じで、サンプルデータに回帰式がフィットするようにします。
データは家の面積、価格としたいところですが、1-30の数字に、適当にノイズを足した、m=30個分のデータ。
アルゴリズム
lossの式を詳細に記載するとm個のデータがあり、1〜m個全ての2乗誤差を足し合わせます。
1/2mの定数が付いていますが、計算都合上ついています。lossを小さくするという点では、1/2mを掛けようが、100000000を掛けようが影響はありません。
この式を変形(微分)したものが下の式になります。
プログラムでは、下の式を使います。
VBAプログラム抜粋
x,yに値がm個入っている場合、勾配降下法のサンプルプログラムです。
lrにしているのが、αの学習率です。
Dim w0 As Double
Dim w1 As Double
Dim lr As Double
Randomize
w0 = Rnd 'w0 の初期値はランダム
w1 = Rnd 'w1 の初期値はランダム
lr = 0.0001 ' 学習率
'学習回数
For i = 0 To 1000 - 1
Dim dw0 As Double
Dim dw1 As Double
Dim dx As Double
dw0 = 0
dw1 = 0
dx = 0
loss = 0
'データ数分繰り返す
For j = 0 To m - 1
Dim yhat As Double
yhat = w0 + w1 * x(j)
dx = yhat - y(j)
'ロスの計算
loss = loss + Math.Sqr(dx * dx)
'J(w0,w1) の偏微分結果
dw0 = dw0 + dx
dw1 = dw1 + dx * x(j)
Next
'w0,w1 の更新
loss = loss / m
dw0 = dw0 / m
dw1 = dw1 / m
w0 = w0 - lr * dw0
w1 = w1 - lr * dw1
Next
画像AIの場合
DeepLearningで画像AIを検討した場合、AIのモデルは基本的に、誰かが考えたものを持ってきます。あとは、いくつかある最適化アルゴリズムを学習率などを調整しながら、AIの精度Upを目指します。
最適化アルゴリズムは自分でコードを書くことはなく、使いたいものを選んで1行コードに足すだけです。このときは、学習率を調整する必要があるので、この最適化アルゴリズムの考え方は知っておくと良いです。
最後に
この計算は大抵は自分でコードを書くことはせず、主に概念を理解するためです。
AIの学習過程の基礎的なところですので、うる覚えでもよいので、覚えておくことをお勧めします。
将来、画像AIを作ったときに学習率を調整すると良いことがわかって、より精度のよいAIが作れます。