中学生でもわかる機械学習の基礎【第5回】〜ニューラルネットワーク最適化〜
中学生でもわかる機械学習の基礎【第5回】
ニューラルネットワーク最適化
こんにちは!機械学習の学習を進めている皆さん、お疲れ様です。
これまで「ニューラルネットワークとは何か」「どうやって予測するのか」を学んできましたね。でも、ここで大事な質問が出てきます:
「じゃあ、ニューラルネットワークの中にある『重み』ってどうやって決めるの?」
これまでは「重みがすでに決まっている」という前提で学んでいました。でも実は、この重みを決めるプロセスがあります。それが**「最適化」(さいてきか)**です。
この記事では、複雑な数学を使わずに、ニューラルネットワークがどうやって学ぶのかを理解します。
第1章:ゴール地点を探す冒険
ケース1:迷った登山者の話
想像してください。あなたは山頂を目指す登山者です。でも、今は濃い霧の中にいて、周りが見えません。
山頂 🏔️
^^
^^^^
^^^^^^
^^^^^^^^ ← ここだ!見えないけど...
^^^^^^^^^^
^^^^^^^^^^
あなたができることは何でしょう?
- 足元を確認する
- 「ここから上り坂か、下り坂か」を判断する
- 上り坂の方へ歩いていく
- また足元を確認する
- これを繰り返す
つまり、山頂がどこにあるか見えなくても、「今いる場所から上へ進む」をくり返せば、いつかは山頂に着くということです。
ニューラルネットワークも同じ
ニューラルネットワークの重みも、同じような方法で決まります。
最初:重みはテキトー
↓
「現在の重みで、どれくらい間違っているか」を計算
↓
「少し上手くなる方向」を見つける
↓
重みを調整
↓
繰り返し!
この「最初から始めて、何度も繰り返して、だんだんよくなっていく」プロセスが**「最適化」**です。
第2章:「間違い具合」を測る
学校のテストで考えてみましょう
あなたが数学のテストを受けました。
- 問題1:正解 ✓
- 問題2:正解 ✓
- 問題3:間違い ✗
- 問題4:正解 ✓
先生は「4問中3問正解だから、75点です」と言いますね。
でも機械学習では、もう少し詳しく測ります。
問題1の答え「5」
正解「5」
差:0(完璧!)
問題2の答え「12」
正解「12」
差:0(完璧!)
問題3の答え「8」
正解「10」
差:2(ちょっと外れた)
問題4の答え「15」
正解「15」
差:0(完璧!)
全部の差を合わせると:0 + 0 + 2 + 0 = 2
この「2」が「どれくらい間違っているか」の目安
「損失」(ロス)という考え方
この「差の合計」のことを、機械学習では**「損失」(そんしつ)**と呼びます。
記号では L(Loss の L)と書きます。
L = 間違い具合の合計
L が小さい → よく予測できている ✓
L が大きい → 予測がはずれている ✗
なぜこんなことするの?
機械学習の目的は「予測を当てる」ことです。そのためには「今の予測がどれくらいはずれているか」を数字で知る必要があります。その数字が「損失」です。
犬の体型分析で考えてみましょう
前回の記事で「犬の体型を予測する」例をやりましたね。
ある犬について:
入力(入れるもの):
体重:15kg 身長:50cm 年齢:3歳
ニューラルネットワークの予測:
「この犬は、太り気味です」 → 数字では「0.6」
実際の答え(獣医さんが診断):
「太り気味です」 → 数字では「0.7」
損失の計算:
差 = |0.6 - 0.7| = 0.1
L = 0.1
これが小さいほど、予測が当たっているということです。
第3章:方向を探す(勾配?なんですか?)
ピザ屋の売上で考えよう
あなたがピザ屋を経営しています。重要な決定があります。
「明日のピザの値段、いくらに設定しようか?」
値段 500円 → 売上:5,000円
値段 600円 → 売上:5,500円 ← 少し上がった!
値段 700円 → 売上:5,300円 ← あれ、下がった
では、600円から 700円に上がるときは
上がるのか?下がるのか?
このとき「売上がどっち方向に進むのか」を知りたいですね。
値段 600円で売上 5,500円
値段 610円で売上 5,480円
「値段が上がると、売上は下がる」
つまり、売上を増やしたいなら「値段を下げるべき」
ニューラルネットワークでも同じ
ニューラルネットワークの重みも「どっち方向に変えると、損失が減るか」を知りたいのです。
現在の重み:w = 0.5
このときの損失:L = 0.8
重みを少し増やす:w = 0.6
損失がどうなる?→ L = 0.75 になった
(損失が 0.8 から 0.75 に減った!少し上手くなった)
重みを少し減らす:w = 0.4
損失がどうなる?→ L = 0.85 になった
(損失が 0.8 から 0.85 に増えた。悪くなった)
結論:
「重みを増やす方向」→ 損失が減る ✓
「その方向に進もう」
「勾配」という言葉の意味
勾配(こうばい)という難しい言葉が出てきます。でも、意味は簡単です。
勾配 = 「今いるところから、どっち方向に進むと
目標に近づくか」
記号の説明
勾配を表す記号は ∇(ナブラ)または ∂L/∂w(デルエルデルダブリュー)と書きます。
∂ は「少し変わったら」という意味です。
L は「損失」、w は「重み」です。
つまり:
∂L/∂w = 「重みが少し変わったら、
損失がどれくらい変わるか」
なぜこんなことするの?
目の前に山があって、山頂へ向かいたいのに、霧がかかっていて見えない状況を思い出してください。そのとき、足元の傾きから「ここは上り坂か、下り坂か」を判断しますよね。
それが「勾配を見つける」ということです。
第4章:実際に進んでみる(勾配降下法)
「下り坂を探して、下る」の繰り返し
今、ニューラルネットワークの重みが決まっていない状態です。
Step 1:初めの重みをテキトーに決める
w = 2.0(テキトーな値)
Step 2:このときの損失を計算
L = 5.0(かなり大きい。悪い)
Step 3:「どっち方向に進むと損失が減るか」を調べる
勾配を計算すると:
「w を少し小さくする方向へ進むといいよ」
Step 4:その方向へ、少しだけ進む
w = 2.0 → 1.8(少し減らした)
Step 5:また損失を計算
L = 4.2(さっきより小さくなった!)
Step 6:またやる
w = 1.8 → 1.6
L = 3.5
何度も繰り返す...
w = 2.0 → L = 5.0
w = 1.8 → L = 4.2
w = 1.6 → L = 3.5
w = 1.4 → L = 2.9
w = 1.2 → L = 2.4
w = 1.0 → L = 2.0
w = 0.8 → L = 1.7
w = 0.6 → L = 1.5
w = 0.4 → L = 1.4 ← だんだん損失が減ってきた!
w = 0.2 → L = 1.35
w = 0.1 → L = 1.34
w = 0.05 → L = 1.34
最後のほう、減り方が小さくなってきました。これが**「最適な重みに近づいている」**という合図です。
ゲームキャラで例えてみましょう
RPGゲームのキャラクターをコントロールしている状況を想像してください。
ゴール(最適な重み)🎁
^^
^^^^
^^^^^^ ← キャラがここにいる
^^^^^^^^^
^^^^^^^^^ ← 霧の中
キャラ「ゴールがどこかわからない...」
そんなときのAI:
「足元が下り坂だから、その方向に1歩進もう」
1歩進む
↓
「また足元を確認して...」
また下り坂
↓
「その方向に1歩」
何度も繰り返す
↓
やがてゴールに到着!
この方法の名前
この「勾配を見つけて、その方向に進む」を繰り返す方法を、**「勾配降下法」(こうばいこうかほう)**と言います。
英語では Gradient Descent(グラディエント・ディセント)です。
Gradient = 勾配(どっち方向に進むか)
Descent = 降下(下り坂に向かって進む)
なぜこんなことするの?
ニューラルネットワークの重みを完璧に決める数学的な式はないんです(複雑すぎるから)。だから「少しずつ調整していく」という方法を使うんです。
これは、フットボールの試合で「完璧なシュートを打つ」のではなく、「ボールを少しずつシュート方向に動かしていく」ようなものです。
第5章:実際の流れを見てみよう
ピザの値段設定の例(完全版)
ピザ屋の経営者として、最適な値段を見つけるプロセスを見てみましょう。
目的:売上を最大にする値段を見つける
売上 = 顧客数 × 1枚あたりの利益
顧客数と値段は関係がある
- 値段が安い → 客が多く来る
- 値段が高い → 客が少なくなる
損失 = 最大売上 - 現在の売上
損失が小さい = 良い経営
初期状態
試行1:値段 1000円
売上:2,000円(むしろ客がいない...)
損失:大きい
勾配を見つける
「値段を100円下げたら、売上がどう変わるか見てみよう」
値段 900円 → 売上 3,500円
値段 1000円 → 売上 2,000円
差 = 3,500 - 2,000 = 1,500
勾配 = 「値段を下げると、売上が増える」
少し下げてみる
試行2:値段 900円
売上:3,500円(さっきより良い!)
損失:小さくなった
また勾配を見つける
値段 800円 → 売上 4,200円
値段 900円 → 売上 3,500円
「さらに下げるといい」
また下げる
試行3:値段 800円
売上:4,200円(さらに良い!)
損失:さらに小さい
こうやって何度も何度も繰り返して、最適な値段を見つけるんです。
試行1:1000円 → 損失大
試行2:900円 → 損失中
試行3:800円 → 損失小
試行4:700円 → 損失中(あれ?上がった)
試行5:750円 → 損失小(ここが最適!)
複数の重みがある場合
実は、ニューラルネットワークの重みは1個ではなく、たくさんあります。
重み1:w₁ = 0.3
重み2:w₂ = -0.5
重み3:w₃ = 0.8
重み4:w₄ = 1.2
...
このすべての重みについて、同時に「勾配を見つけて、調整する」をやります。
w₁の勾配 → w₁を調整
w₂の勾配 → w₂を調整
w₃の勾配 → w₃を調整
w₄の勾配 → w₄を調整
すべての重みを少しずつ調整 → 1回の反復(はんぷく)完了
1回目の反復後:
w₁ = 0.25, w₂ = -0.48, w₃ = 0.85, w₄ = 1.15
損失 = 2.3
2回目の反復後:
w₁ = 0.22, w₂ = -0.46, w₃ = 0.87, w₄ = 1.10
損失 = 2.1
3回目の反復後:
w₁ = 0.20, w₂ = -0.45, w₃ = 0.88, w₄ = 1.06
損失 = 1.9
...何度も繰り返す...
最終的に、損失が小さくなり続ける限界に到達します。そこが最適な重みです。
第6章:大事なポイント(つまずきやすいところ)
ポイント1:「完璧な重み」は存在しない
完璧な重み = 損失が 0 になる重み
でも実際には...
損失は 1.2 とか 0.8 とかで止まります。
それは OK!
なぜ? ニューラルネットワークは確率的なもので、100%の予測はできないんです(天気予報だって完璧じゃありませんよね)。
ポイント2:進む量の決め方が大事
進む量が大きすぎたら
w = 1.0 → w = -0.5
ジャンプし過ぎて、最適な値を飛び越す
進む量が小さすぎたら
w = 1.0 → w = 0.99 → w = 0.98 → ...
いつまでたっても進まない
この「進む量」を「学習率」(がくしゅうりつ)と呼びます。
英語では Learning Rate です。記号では α(アルファ)と書きます。
学習率が大きい → 速く進むけど、行き過ぎる可能性
学習率が小さい → 遅いけど、安全
バランスが大事!
ポイント3:何回繰り返すか?
繰り返す回数 = エポック(Epoch)
1エポック = すべての訓練データを1回見ること
100エポック = 訓練データを100回見ること
多いほどいい?いいえ。
1エポック後: L = 5.0
10エポック後: L = 2.0
50エポック後: L = 0.5 ← 良い!
100エポック後:L = 0.50 ← ほぼ変わらない
200エポック後:L = 0.51 ← あれ?悪くなった?
これを「過学習」(かがくしゅう)と言います。
なぜ悪くなるの?
何度も何度も同じデータで学ぶと、そのデータに特別に合わせた重みになってしまいます。すると、新しいデータに対しては予測が外れます。
学校での模擬試験に特化した勉強をしすぎると、
実際の試験では点数が下がることがあるのと同じ。
第7章:野菜の値段表で、全体を理解しよう
野菜の値段から、売上の利益を予測
野菜屋さんのデータ:
ニンジン:100円 → 売上:12,000円
キャベツ:80円 → 売上:15,000円
トマト: 150円 → 売上:8,000円
最適な値段はどれでしょう?
目標:売上を最大にする
試行1(初期状態):
ニンジン120円、キャベツ100円、トマト170円
合計売上:25,000円
損失を計算:
L = 理想的な最大売上 - 現在の売上
= 40,000 - 25,000 = 15,000
勾配を見つける:
「ニンジンの値段を 10円 下げたら、売上が増える」
「キャベツも下げると良さそう」
「トマトは逆に上げた方がいい」
調整する:
ニンジン120円 → 115円
キャベツ100円 → 95円
トマト170円 → 165円
試行2:
合計売上:28,000円
損失:L = 40,000 - 28,000 = 12,000(減った!)
またやる:
ニンジン115円 → 110円
キャベツ95円 → 92円
トマト165円 → 163円
試行3:
合計売上:30,500円
損失:L = 40,000 - 30,500 = 9,500(さらに減った!)
...何度も何度も...
試行50:
ニンジン105円、キャベツ85円、トマト140円
合計売上:38,500円
損失:L = 40,000 - 38,500 = 1,500(かなり小さい!)
ほぼ最適な値段に達した!
第8章:まとめと次へ
ニューラルネットワーク学習の流れ(最終版)
【初期化】
重みをテキトーに決める
↓
【反復開始】
↓
現在の重みで「損失」を計算
↓
「どっち方向に進むと損失が減るか」を見つける(勾配)
↓
その方向に、決められた量だけ進む(学習率 × 勾配)
↓
重みが更新される
↓
【反復終了?】
↓
繰り返す or 終わる
↓
【完成】
最適な重みが決定される
用語チェック
| 用語 | 意味 | 記号 |
|---|---|---|
| 損失 | 予測がどれくらい外れているか | L |
| 勾配 | どっち方向に進むといいか | ∇ または ∂L/∂w |
| 勾配降下法 | 勾配を見つけて進むを繰り返す方法 | - |
| 学習率 | 1回に進む量 | α |
| エポック | 全データを何回見るか | - |
| 過学習 | データに特化しすぎて、新しいデータに弱くなる | - |
なぜ重みの最適化が必要なのか?(もう一度)
もし重みを勝手に決めたら:
予測が外れまくり ✗
勾配降下法で最適化したら:
予測がまあまあ当たる ✓
でも完璧ではない(損失は 0 ではない):
これが現実。だから、データを集めたり、
モデルを工夫したり、永遠に改善し続けるんです。
最後に
ニューラルネットワークの重みを決めるプロセスは、実は私たちが何か新しいことを学ぶときのプロセスと似ています。
「何かに挑戦する」
↓
「失敗して、『今の方法の何が悪いか』を見つける」
↓
「改善する」
↓
「何度も繰り返す」
↓
「だんだん上手くなる」
ニューラルネットワークも、同じことをしているんです。
最後まで読んでいただき、ありがとうございました。質問や感想は、コメント欄でお待ちしています!
Discussion