機械学習の「確率的勾配降下法」を直感で理解!新人エンジニアが最初に押さえるべき基本
こんにちは。ゆうせいです。
新人エンジニアのみなさん、機械学習の勉強は順調ですか?
ライブラリを使えばなんとなく動くけれど、裏側のロジックとなると急に難しく感じてしまうこと、ありますよね。特に「確率的勾配降下法」なんていう漢字だらけの用語が出てくると、思わずブラウザを閉じたくなる気持ち、よくわかります。
でも、この概念は機械学習モデルがどのように賢くなっていくのか、その「学習」の根幹を支えるとても大切な仕組みなんです。ここを理解しておくと、パラメータの調整やトラブルシューティングの勘所がグッと良くなりますよ!
今回は、数式による厳密な証明は一旦置いておいて、イメージで直感的に理解できるように解説していきます。
実はこの手法、「真っ暗闇の山を下りる」ことに例えると、驚くほどシンプルなんです。
一緒にその仕組みを紐解いていきましょう!
機械学習における「学習」のゴールとは
まず、具体的な手法の話に入る前に、そもそも機械学習は何を目指しているのかを整理しておきましょう。
機械学習のモデルは、最初は何も知らない赤ちゃんのような状態です。そこにたくさんのデータ(問題と正解のセット)を与えて、少しずつ賢くしていきます。
このとき、モデルが出した「予測」と、本当の「正解」とのズレのことを「誤差」と呼びます。
学習のゴールは、この「誤差」をできるだけゼロに近づけることです。
誤差を関数として表したものを「目的関数」や「損失関数」と呼びますが、要するにこの関数の値が最小になるようなパラメータ(重みやバイアス)を見つけ出したいわけです。
山下りで理解する「勾配降下法」
ここで、イメージの出番です。
「誤差の大きさ」を「山の高さ」だと想像してみてください。
誤差が大きい状態は山頂付近、誤差が小さい理想的な状態は谷底(一番低い場所)です。
私たちは今、目隠しをした状態で山のどこかに立っています。ゴールは一番低い谷底に行くことですが、周りの景色は見えません。
では、どうすれば谷底にたどり着けるでしょうか?
正解は、「足元の傾斜を確認して、下っている方向へ一歩進む」ことです。
これを何度も繰り返せば、いつかは一番低い場所にたどり着けるはずですよね。
このように、傾斜(勾配)に従って低い方へパラメータを更新していく方法を「勾配降下法」と呼びます。
「確率的」であることの意味
さて、ここからが本題です。
ただの勾配降下法ではなく、なぜ「確率的」勾配降下法(SGD:Stochastic Gradient Descent)と呼ばれる手法が使われるのでしょうか。
それは、通常の方法(バッチ勾配降下法)には「計算に時間がかかりすぎる」という弱点があるからです。
通常の勾配降下法では、一歩進む方向を決めるために、手持ちの「全てのデータ」を確認して平均をとります。
「データ1番によるとこっち、データ2番によるとあっち……よし、100万個のデータを総合すると、正解の方向はこっちだ」と計算するのです。これでは、一歩進むだけで日が暮れてしまいますよね。
そこで登場するのが「確率的勾配降下法」です。
この方法では、全データの中からランダムに(確率的に)選んだ「たった1つのデータ」だけを見て進む方向を決めます。
「データ10番君がこっちと言うから、とりあえずこっちに進もう!」
次のステップでは「データ58番君がこっちと言うから、そっちへ!」
というように、毎回ランダムなデータ1つを信じて進んでいくのです。
SGDのメリットとデメリット
「そんな適当なやり方で大丈夫なの?」と不安になりますよね。
確かに、1つのデータだけを頼りにするので、ノイズ(外れ値)に騙されて間違った方向に進んでしまうこともあります。
しかし、回数を重ねていけば、ジグザグと寄り道をしながらも、最終的にはちゃんと谷底の近くまでたどり着けることが数学的にわかっているのです。
メリット
- 計算がとにかく速い毎回1つのデータしか計算しないので、パラメータの更新頻度を劇的に上げることができます。
- 巨大なデータを扱えるメモリに全てのデータを載せる必要がないので、ビッグデータを扱う現代のAI開発に適しています。
- 局所的な落とし穴(局所解)に強い進む方向が毎回ランダムにブレるおかげで、小さなくぼみにハマっても、勢いで飛び出せることがあります。
デメリット
- 進み方が不安定最短ルートで谷底へ向かわず、あっちへフラフラ、こっちへフラフラしながら進むため、収束したかどうかの判断が難しい場合があります。
重要なパラメータ「学習率」
この山下りにおいて、もう一つエンジニアが調整しなければならない重要な要素があります。
それは「一歩の歩幅」です。これを専門用語で「学習率」と呼び、数式では (イータ)などで表されます。
更新の式を単純化すると、以下のようになります。
新しい位置 現在の位置 学習率 傾斜
この「学習率」の設定は非常に繊細です。
- 学習率が大きすぎる場合一歩が大きすぎて、谷底を通り越して反対側の斜面に登ってしまうかもしれません。最悪の場合、どこまでも値が発散して学習が失敗します。
- 学習率が小さすぎる場合慎重すぎて、谷底に着くまでに途方もない時間がかかります。また、変な窪みにハマって抜け出せなくなるリスクも高まります。
エンジニアの腕の見せ所は、この学習率を適切に設定することにあると言っても過言ではありません。
まとめ
いかがでしたか?
漢字ばかりで難しそうな「確率的勾配降下法」も、蓋を開けてみれば「ランダムに選んだデータを使って、少しずつ山を下る方法」というシンプルなアイデアでした。
ポイントをまとめましょう。
- 機械学習の目的は、誤差(山の高さ)を最小にすること。
- 通常の勾配降下法は全データを見るので正確だが遅い。
- 確率的勾配降下法(SGD)はランダムに1つのデータを見るので速い。
- ジグザグに進むが、結果的には正解に近づくことができる。
- 一歩の大きさ(学習率)の設定が成功の鍵を握る。
今後の学習の指針として、まずは今回のSGDをベースにしつつ、これをさらに改良した手法である「ミニバッチ学習」や、現在主流の最適化手法である「Adam(アダム)」について調べてみてください。
「SGDの弱点をどうやって克服したんだろう?」という視点で見てみると、進化の過程が面白く理解できるはずですよ。
もし手元にPython環境があるなら、Scikit-learnやPyTorchなどのライブラリを使って、学習率(learning rate)をわざと大きくしたり小さくしたりして、結果がどう変わるか実験してみませんか?
手を動かすことが、理解への一番の近道です!
それでは、また次の記事でお会いしましょう。
セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。