AIの学習は「山下り」!?勾配降下法で正解への最短ルートを探せ

こんにちは。ゆうせいです。

前回は、AIのテスト採点係である「損失関数」について学びました。

AIがどれくらい間違っているか、その誤差を「スコア」として算出する方法でしたね。

でも、ちょっと待ってください。

「あなたのスコアは30点です。間違いだらけです」と言われたとして、それだけで次から100点が取れるようになるでしょうか。

普通は無理ですよね。「どこをどう直せばいいのか」という具体的なアドバイスがないと、改善のしようがありません。

そこで登場するのが、今回のテーマである「勾配降下法(こうばいこうかほう)」です。

これこそが、AIに「改善の方向」を教えてくれる羅針盤であり、学習プロセスの心臓部とも言える技術です。

名前は少し難しいですが、やっていることは「真っ暗闇の中で山を下る」のと同じことなんです。

一体どういうことなのか、想像力を働かせて一緒に見ていきましょう。

勾配降下法ってなに?

一言で言うと、勾配降下法とは「損失関数の値が小さくなるように、少しずつパラメータを修正していく方法」のことです。

真っ暗闇の山下り

イメージしてください。

あなたは今、夜の深い山奥にいます。明かりは一切ありません。

あなたの目的は、この山の中で「一番低い場所(谷底)」まで降りることです。

なぜなら、そこが「損失(誤差)がゼロ」の地点、つまりAIが最も賢くなるゴールだからです。

でも、周りは真っ暗で見えません。どうやって低い場所を探しますか。

おそらく、自分の足元の「傾斜(勾配)」を確かめるはずです。

  1. 足元の地面を探って、どっちに傾いているか確認する。
  2. 「こっちが下り坂だ」と分かったら、そっちへ一歩踏み出す。
  3. 進んだ先で、また足元の傾きを確認する。
  4. これをひたすら繰り返す。

こうすれば、いつかは一番低い場所にたどり着けそうですよね。

これが勾配降下法の仕組みそのものなのです。

仕組みを詳しく解説

では、これを数学の世界に置き換えてみましょう。

1. 勾配(傾き)を計算する

まず、現在のパラメータ(今の居場所)において、損失関数のグラフがどのくらい傾いているかを計算します。

これを数学用語で「微分(びぶん)」と言います。

傾きが急なら「ゴールはまだ遠いぞ」と分かりますし、傾きが平らになってきたら「谷底に近づいたな」と分かります。

2. 逆方向に進む

ここがポイントです。

普通のグラフでは、傾きがプラス(右上がり)のときは、右に行くと高くなってしまいますよね。

私たちは「低く」したいので、傾きの逆方向(マイナス方向)へ進まなければなりません。

傾きがプラスなら、マイナス方向へ。

傾きがマイナスなら、プラス方向へ。

常に「下り坂」を選んでパラメータを更新していくのです。

3. 学習率(歩幅)の重要性

このとき、「一歩の大きさ」をどれくらいにするかが非常に重要になります。

これを専門用語で「学習率(Learning Rate)」と呼びます。

  • 歩幅が大きすぎる場合(学習率が高い)一気に谷底へ行こうとして大ジャンプすると、谷底を通り過ぎて、向こう側の山へ登ってしまうかもしれません。いつまでたっても谷底に着かず、行ったり来たりを繰り返してしまいます(発散)。
  • 歩幅が小さすぎる場合(学習率が低い)アリのような歩幅で進めば、確実に谷底へ近づけます。でも、ゴールに着くまでにとてつもない時間がかかってしまいます。日が暮れてしまいますね(学習が終わらない)。

適切な「歩幅」を設定することが、エンジニアの腕の見せ所なのです。

なぜ機械学習で重要なのか

勾配降下法は、いわばAIの「修行メニュー」です。

AIの中には何千、何万というパラメータ(調整つまみ)があります。

これら全てを、人間が手作業で「これは右に回して、あれは左に回して...」と調整するのは不可能です。

勾配降下法を使えば、数学の力を使って「全てのつまみを、どっちにどれくらい回せば誤差が減るか」を自動で計算し、勝手に調整してくれます。

今のAIブームがあるのは、この自動調整機能のおかげと言っても過言ではありません。

メリットとデメリット

非常に強力な勾配降下法ですが、万能ではありません。

メリット

どんなに複雑な関数であっても(微分さえできれば)、ひたすら「坂を下る」という単純なルールを繰り返すだけで、正解に近い値を見つけ出せることです。コンピュータにとって非常に扱いやすいアルゴリズムです。

デメリット

最大の弱点は、「局所解(きょくしょかい)」という罠にハマることです。

山には、一番低い谷底(最小値)以外にも、小さな窪み(極小値)がたくさんあります。

勾配降下法は「とにかく下る」ことしか考えないので、途中の小さな窪みにスポッとハマってしまうと、「ここが谷底だ!」と勘違いして、そこから動けなくなってしまうのです。

本当のゴールはもっと深いところにあるのに、です。

これを防ぐために、最近ではいろいろな改良版のアルゴリズムが開発されています。

Pythonで確認してみよう

では、シンプルな2次関数 y = x^2 の最小値( x = 0 )を、勾配降下法で探すプログラムを書いてみましょう。

スタート地点は x = 3 とします。

# スタート地点(初期パラメータ)
x = 3.0
# 学習率(歩幅)
lr = 0.1

print(f"スタート: x = {x:.4f}")

# 5回だけ山を下ってみる
for i in range(5):
    # 1. 傾きを計算する(y = x^2 の微分は 2x)
    gradient = 2 * x
    
    # 2. 傾きの逆方向へ進む(xを更新する)
    # 新しいx = 今のx - (学習率 × 傾き)
    x = x - lr * gradient
    
    print(f"{i+1}歩目: x = {x:.4f}")

# 出力結果
# スタート: x = 3.0000
# 1歩目: x = 2.4000
# 2歩目: x = 1.9200
# 3歩目: x = 1.5360
# 4歩目: x = 1.2288
# 5歩目: x = 0.9830

見てください。最初は 3 だったのが、ループを回すたびに 2.41.9 ... と徐々に 0 に近づいていますね!

これが学習が進んでいる状態です。

まとめ

いかがでしたか。

勾配降下法とは、「傾き」を手がかりにして、誤差が最小になるゴール地点まで、暗闇の中を一歩ずつ下っていく手法でした。

「学習率(歩幅)」の調整がカギを握るという点も、なんとなく人生や勉強に似ていて面白いですよね。焦って大股で歩いても上手くいかないし、慎重すぎても進まないのです。

さて、これで「1つのパラメータ」を調整する方法はわかりました。

でも、実際のニューラルネットワークには、層が何重にもなっていて、パラメータが複雑に絡み合っています。

出口付近のズレを、どうやって入り口付近のパラメータまで伝えて修正すればいいのでしょうか。

次回は、その難問を解決する「誤差逆伝播法(ごさぎゃくでんぱほう)」について解説します。

名前は最強に強そうですが、やっていることは「責任のなすりつけ合い」です(笑)。

機械学習の核心部分ですので、ぜひ楽しみにしていてください。

分からなくなったら、いつでも立ち止まって質問してくださいね。一緒に頂上...ではなく、谷底を目指しましょう!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。