北のシュガポン

北海道大学の工学部生。電気・情報・ロボット・エネルギー専攻。 札幌で一人暮らし満喫中。 お菓子作り、プログラミング、機械学習と色々なことに手を出している暇人。

北大生がつぶやく大学生活や勉強や趣味のブログ。毎日21:00更新予定。

1ミリも知らなくてもわかる機械学習② 勾配降下法

こんばんは。シュガポンです。

 

パソコンや数学の知識がなくても分かる!をコンセプトに始まりました本シリーズ。

今回は前回の続きで、どのようにしてコンピュータに線形回帰を行わせるかをご紹介します。前回の線形回帰と組み合わせれば、簡単な機械学習の仕組みがこれでわかることになりますね。

前回の記事はこちら。↓

www.north-sugarpong.com

 

 

 

 

おさらい

さて、まずは軽く前回のおさらいを。

データ群

前回は、土地の広さと値段という2つのパラメータをもったデータについて、「データの傾向を大体表す直線(曲線)」を求める、という問題を取り扱いました。

そのために、実際のデータからの誤差がより少ない線を選ぶ、という話をしたと思います。ちょうどこんな感じに。

回帰直線

 

このような線をどう選ぶかは、「実際の各データとの誤差の合計が一番少ない」という指標を用いました。これを最小二乗法と言います。

 

 

勾配降下法について

機械学習ではこれをコンピュータに解かせるのですが、ではどのようにコンピュータにこのような線を探させればいいのでしょうか?

その答えの1つが、タイトルにある「勾配降下法」と呼ばれる手法です。

 

ここで、少しだけ数学的な話をさせてください。

グラフ上に直線を引くためには、2つの情報が必要です。

すなわち、「直線の高さ」と「直線の傾き」です。y=ax+bってやつです。「高さ」をもっと正確に言うならば「x=0におけるyの値」=「y切片」です。ここではx=横軸、y=縦軸とします。

この2つが決定すると、グラフ上に直線を引くことができます。

 

ところで、先ほど言った「実際の各データとの誤差の合計」は当然ながら直線ごとに違いますよね。これをこの話と絡めると、「直線の高さや傾きを変えることで、誤差の合計もその都度変わる」ということです。

つまり、誤差の合計は直線の高さと傾きに依存している、ということです。ここがまずポイント。

(数学的に言うならば、誤差の合計をJ、直線をy=ax+bとすると、J=J(a,b)、つまりJが傾きaとy切片bの関数である、ということです)

 

ここで、簡単のために、今は直線の高さは一定であるとします。

つまり、直線の傾きだけ徐々に変えていき、その中で誤差の合計が最小になるような直線を見つけていく、という状況です。

 

ここで、突然ですが、次のグラフを見てください。

誤差-傾きグラフ

これは、横軸に直線の傾き、縦軸に誤差の合計をとったグラフです。右に行くほど傾きは右上がりに、上に行くほど誤差は大きくなっていきます。

この放物線は、両者の関係を示しています。見てみると、赤点の部分で誤差が最小になっていることがわかります。ここが目指すべき場所です。

もちろん、実際にはどこに最小値があるかはわかっていません。その状態からどのようにこの赤点の場所を探し出すのでしょうか。

 

では、実際に誤差を最小にする傾きを求める手順を見ていきましょう。

まず、適当な傾きの直線を引いてみます。

f:id:karakusa456:20170623201655p:plain

 

この直線の傾きを、先ほどの放物線のグラフに反映させてみましょう。こんな感じで。

勾配降下1

黄丸が今私たちがいる場所です。まだ誤差は最小にはなってませんね。

 

ここで、こういうことを考えます。

「今いる場所からどちらに行けばより低い場所に行けるか?」

 

この答えは明白で、「右に行く」です。

これをもっと正確に言うならば、「低い側に傾いている方向に行く」ということです。

黄丸の点の近くは、右下がりの坂になっていますね。つまり、右側に行けばより低い方向に行けるはずです。

実際に移動してみましょう。

勾配降下2

 

ここで、私たちは右に移動しましたので、直線の傾きはより右上がりになります(このグラフは右に行くほど右上がりになる、というグラフでした)。こんな感じ。

直線へ反映

先ほどの直線と比べて、直線とデータの距離が近くなってますね。これは誤差がより小さくなったことにほかなりません。

 

先ほどの放物線のグラフを見ると、まだ最小値には達していません。その証拠に、

勾配降下3

この黄丸の点からまだ低いほうに下れますよね。

ということで、どんどん下っていきましょう。

 

最下点最下点までやってきました。

ここまでくると、これ以上は下れませんね。最下点の周辺を見ると、どちらに行っても誤差の合計を小さくすることはできません。すなわち、ここが最小値であるということができるでしょう。

 

この傾きの変化を直線に反映させてみます。

傾きの最適化

どんどん実際のデータに直線が近づいていっていますね。そして、最終的にたどり着いた直線がおおよそ誤差を最小にしているということができるでしょう。

 

このように、「どちらの方向に行けば最下点にたどり着けるか」という考え方を「勾配降下法」といいます。ネーミングそのままで、傾いている方向に下っていく、というただそれだけの話です。

やっていることは非常に単純ですが、これが機械学習の線形回帰(より一般的には回帰問題)で行われていることなのです。

 

これをコンピュータに実装するのは割と簡単です。

先ほどの放物線のグラフにおいて、今いる場所の周りの傾きをまず求めます。そうすると、どちらに動けばより誤差を小さくできるかがわかりますね。

そして、誤差を小さくする方向に「少しだけ」動きます。そして、動いた先の場所においてまた周りの傾きを求め、どちらに動くか決めて・・・、という繰り返しになります。

 

なぜ「少しだけ」動くかというと、こういうことです。

行き過ぎ

右に動けばいいからと言ってあまりに動きすぎると、最下点を通り過ぎてむしろ誤差が広がってしまう恐れがあるのです。

なので、少しずつ動くのが勾配降下法においては基本となっています。

当然、あまりに動きが小さすぎるとそれはそれで時間がかかりすぎるので、その辺をうまく設定してあげるのが難しいところです。ここばっかりは試行錯誤をするしかありません。人間の仕事ですね。

 

 

勾配降下法の注意点

また、勾配降下法には注意点があります。

それは、「求めた最下点が本当に最小値とは限らない」ということです。

例えば、こんな曲線で誤差と傾きの関係が表されるとしたら?

くぼみが2つある曲線

 

この場合、始める場所によって求まる最下点が異なってきます。

赤丸:本当の最小値 黄丸:局所解

先ほど紹介した方法だと、どうしても窪地になっているところで移動がストップしてしまうので、このような現象が起こります。本当の最小値は赤丸のはずですが、黄丸の場所にはまってしまうという危険性があるのです。

これを防ぐ方法はいくつかありますが、ここでは割愛。気になる方は「モーメント法」などで検索してみましょう。

 

いずれにせよ、このような方法で回帰問題は解いていくことができる、ということです。

 

今回はここまで。

次回は少しお休みして、最近の機械学習、とりわけディープラーニングについて軽くご紹介したいと思います。