Andrew先生の分かりやすすぎるMachine Learning パート② (ともし)

どうも、おしとやか関西人のともしです〜パート1の続きです!

コスト関数が分かったとして、じゃあどうやってコストの最小値を見つけ出すんや?という問いに答えていきたいと思います〜

コストの最小値を見つけ出す2つの方法

1. 最急降下法(Gradient Descent)
2. 正規方程式(Normal Equation)

今回は1の最急降下法についてお話ししていきたいと思います!

微分のおさらい

この最急降下法では微分の考え方を用います。微分についてサクッとおさらいしてみます。

画像2

画像4

について考えます。

画像3

微分するとこうなります。
これはどういうことかというと、グラフの各点における傾きを表しています。

例えば
・x = 0の時、2x = 0 なので、
f(x)のグラフはx = 0の時(つまり点(0, 0)の時)、接線の傾きは「0」です。

同様に
・x = 0.5の時、 2x = 1なので、
f(x)のグラフはx = 0.5の時(つまり点(0.5, 0.25)の時)、接線の傾きは「1」です。

グラフ上のある点(p, q)の接線の傾きは、
グラフの方程式を微分したものにおいて、xにpを代入して得られる値になります。

そしてこの仕組みは、「出力yに対して変数がxの1つのみである2次元のグラフ」だけでなく、今回のような「出力Jに対して変数がθ0, θ1の2つ存在する3次元のグラフ」や、高次元においても成り立ちます。

最急降下法

ゴール: 下のコストのグラフから、コストが最小となるような(つまりグラフの最下点における)θ0, θ1の値

最急降下法のイメージは、「山のある地点から、とにかく下を目指して歩いていく」という状態です。

画像6

さて、微分の前提知識を頭に最急降下法について考えます。
まず初めにランダムなθ0, θ1を選びます。それが、図の赤い部分にある左端のバツだったとします。この時、先程のお話のように微分を行うことで、この点における接線の傾きの値が得られます。つまり、山の傾きですね。この値/傾きは、微分の仕組み上、θo(もしくはθ1)がほんの少しだけ「増えた」時(つまりあなたが前に進んだ時)にどのくらいJが動くか(どのくらい上に行くのか下に行くのか)、という意味なので、微分値が正であれば、前に進むとJは増えるぞ(山を登ることになるぞ)ということです。前に進めば、θ(その地点の座標)は大きくなります。こうして山を下るための一歩一歩を数式にしたのが、以下になります。

画像5

今回はθ0とθ1のふたつなので、この計算をj = 0, 1それぞれの場合で計算します。この値がある値に収束すればそこで終了です。

端的に言えば、θjに「上の式の-αから右端まで」の変化を加えて、θjを更新しています。山の例で言うと、地点θjから、「上の式の-αから右端まで」分だけ進んで、自分の現在地θjを更新するということです。ちなみにその変化は、J方向の高さの変化ではなく、水平方向の変化であることに注意です。

変化分のうち、αの右の塊は、コスト関数J(θ0, θ1)を微分したものです。つまり、(θ0, θ1)地点における、目の前の山の傾きです。正であればあなたは登る向きに立っていて、負であれば下る向きに立っています。我々は最下点を目指しているので下りたいわけです。

αは、learning rate(学習率)です。要は、あなたの一歩の幅で、正の値です。

よって微分値が正であれば、現在地θjから下に進むために後ろに進まないといけない、つまりθを減らさないといけないので、-がαの前に付き、逆に微分値が負であれば、そのまま前に下ればよいのでθjを増やすためには、やっぱり-が必要です(微分値が負なのでθjを増やすためには相殺しないといけない)。

画像6

コスト関数

先程の坂を下る公式に、前回のコスト関数の公式をぶちこむと

画像8

こちらが得られます。若干異なるのは、もちろん微分のせいです。これをコーディングすれば、簡単な機械学習が完成となります。

補足: 学習率αについて

αは一歩の大きさだと述べました。そのαは我々人間が任意に設定することができます。

(i) αが小さすぎる時

画像9

一歩一歩が非常に小さいので、解を得るまでに非常に時間がかかってしまいます。

(ii) αが大きすぎる時

画像10

αが大きすぎると谷を這い上がるような形で、下から上にどんどん登ってしまい、収束するどころか発散してしまいます。

このようにαは大きすぎても小さすぎてもダメで、うまい具合のαを選ぶことが重要となります。

この記事が気に入ったらサポートをしてみませんか?