2026-06-03機械学習, 深層学習, 勾配降下法, 損失関数, AI学習11 min read
機械学習 学習記録Part1
AIと対話しながら機械学習の基礎を学んだ記録。損失関数・勾配降下法・バックプロパゲーションまで、自分の直感から積み上げた。
目次
機械学習初学者なので0から学び始めてみる。
テキストを読んでも「なんとなくわかった気」になるだけで、すぐ忘れる。そこで試しにClaudeに聞いてみたら、答えを教えてくれるんじゃなくて、逆にこちらに質問してきた。気づいたら自分でほとんど全部導き出していた。
その対話の記録をそのまま残しておく。
機械学習の3分類
まず「機械学習って何?」というところから入った。
Claude: 「学習する」ってどういうことだと思いますか?人間が何かを学ぶとき、どんなパターンがあるか考えてみてください。
少し考えてみると、3つくらいに整理できた。
- 先生に「これが正解」と教えてもらいながら学ぶ
- 自分でデータをじっと眺めて、パターンに気づく
- 試しにやってみて、うまくいったら続ける・失敗したらやめる
Claude: その3つが、そのまま機械学習の3分類に対応しています。
- 教師あり学習 ― 正解ラベルありで学習。スパム判定・価格予測など
- 教師なし学習 ― 正解なしでパターンを自力発見。顧客分類・異常検知など
- 強化学習 ― 報酬を頼りに試行錯誤。ゲームAI・AlphaGoなど
3つの本質的な違いは「何を使って正しい方向を知るか」だ。
この記事では教師あり学習の中の回帰(連続値予測)、つまり「数値を予測する」タスクを中心に深掘りしていく。
まず用語の整理から
回帰を学ぶうえで最初に混乱したのが、同じ概念にやたら名前が多いことだった。
Claude: 「特徴量」「予測変数」「目的変数」「応答変数」…これらが混乱する原因は何だと思いますか?
よく見ると、分野によって呼び方が違うだけで、中身は同じ概念だった。
| 概念 | 機械学習での呼び方 | 統計学での呼び方 |
|---|---|---|
| モデルへの入力 | 特徴量 | 予測変数・説明変数 |
| 予測したい値 | 目的変数 | 応答変数・従属変数 |
たとえば家の価格を予測するなら、「面積・駅距離・築年数」が特徴量、「価格」が目的変数になる。この例を頭に置きながら読み進めると理解しやすい。
損失関数:「どれだけ外れているか」を数値にする
Claude: 家の価格予測モデルが「2,800万円」と予測したとして、実際が「3,200万円」だった。このズレをモデルはどうやって知ると思いますか?
自分: 引き算することでズレを知るよね。
Claude: 完璧です!では3件のデータがある場合、単純に足し合わせると何が問題になりますか?
データ ズレ 家A −400万 家B +500万 家C −500万
自分: ダメだと思う。+と−が混ざると相殺されて、実際はズレてるのに合計が0になってしまう。
Claude: まさにそこが問題の核心です。「負の数を正にする」方法って何がありますか?
自分: 二乗すればいいんじゃない?
Claude: 大正解!これが**MSE(平均二乗誤差)**です。では二乗することのデメリットは何だと思いますか?
自分: ズレが大きいデータの影響が、二乗のせいで極端に大きくなってしまう。
Claude: その通りです。外れ値が1件あるだけでモデル全体が引きずられてしまう。では「負の数を正にする」もう一つの方法は?
自分: 絶対値。
これがMAE(平均絶対誤差)。2つの使い分けはこんな感じ。
| MSE | MAE | |
|---|---|---|
| ズレの扱い | 二乗 | 絶対値 |
| 外れ値への感度 | 高い(影響を受けやすい) | 低い(外れ値に強い) |
| 向いている場面 | データが比較的きれいなとき | 外れ値が多いとき |
この「ズレを数値で表す関数」のことを損失関数と呼ぶ。名前は難しそうだけど、要は「モデルがどのくらい間違えているかを測る物差し」だ。
勾配降下法:ズレを減らすようにパラメータを動かす
損失がわかったとして、次は「じゃあどうやってモデルを改善するの?」という話になる。
Claude: モデルの「何を」補正すると思いますか?y = ax + bの式を思い浮かべてみてください。
自分: a, bじゃない?
Claude: 正解です!それをパラメータと呼びます。
パラメータを変えながら損失を最小にするのが目標だ。損失とパラメータの関係をグラフにするとU字カーブになる。谷底が「損失が最小の点」で、そこに向かってパラメータを少しずつ動かしていくのが勾配降下法。
「ボールが坂を転がって谷底へ向かう」イメージが一番わかりやすかった。
Claude: 「少しずつ」の量はどうやって決めると思いますか?
それを決めるのが学習率というパラメータ。
Claude: 学習率が大きすぎると何が起きそうですか?
自分: 振動するかな。谷底を飛び越えて行ったり来たりしそう。
Claude: まさに。では小さすぎると?
自分: 学習スピードが遅くなる。
| 学習率 | 何が起きるか |
|---|---|
| 大きすぎる | 振動・発散して収束しない |
| 小さすぎる | 収束は安全だが遅すぎる |
| 適切 | スムーズに谷底へたどり着く |
ちなみに「微分して0になる点を直接求めれば速いのでは?」という疑問も出てきたんだけど、
Claude: パラメータが100万個あったら方程式も100万個になります。計算量はどうなりますか?
自分: 膨大になって現実的じゃない……なるほど。
局所最小値問題とSGD
Claude: U字カーブの例は単純でしたが、複雑なモデルだとグラフの形はどうなりそうですか?
自分: 谷がいくつもあるような複雑な形になる?
Claude: そうです。ボールが最初にはまった浅い谷で止まってしまうとどうなりますか?
自分: 本当の最低点まで到達できない……これが局所最小値(ローカルミニマム)問題か。
Claude: 対策として「ランダム性を加える」という発想があります。浅い谷にはまったボールに「ランダムにブレた力」を加えると何が起きそうですか?
自分: ブレのおかげで壁を乗り越えられることがある、か。
これが確率的勾配降下法(SGD)。全データではなく、ランダムに選んだ少量データで勾配を計算することで、毎ステップにブレが生まれて浅い谷から抜け出せる。
Claude: でも「適切な大域最小値にたどり着けるの?」という疑問はありませんか?
自分: パラメータが100万個あれば、全方向が上り坂になる点はほぼ存在できないよね。どこか1方向には必ず抜け道がある。
なるほど、高次元だと局所最小値自体がそもそも生まれにくいのか。
実用上は全データと1件の中間、ミニバッチ(32〜256件ずつ)を使うのが主流。計算量とランダム性のバランスが良い。
バックプロパゲーション:100万個のパラメータを効率よく更新する
勾配降下法でパラメータを更新するとして、パラメータが100万個あったらどうやって全部の勾配を計算するの?という疑問が出てくる。
Claude: 「各パラメータを少し動かして→損失を計算して→戻す」を100万回繰り返すとしたらどうなりますか?
自分: 計算量が膨大になるよね。
Claude: 工場の生産ラインで不良品が出たとき、どの工程から調べますか?最初から全部?
自分: 完成品に近い工程から遡って調べる方が効率いいよね。
Claude: まさにそれが**バックプロパゲーション(誤差逆伝播法)**の発想です。
損失が出たら、後ろの層から順に「この層のせいでどのくらい損失が増えたか」を計算して前に伝えていく。各層の勾配を「再利用」しながら計算するので、1回の処理で全パラメータの勾配が求まる。
学習の1ステップをまとめると、
① ミニバッチを取り出す
② 順伝播 → 予測値を出す
③ 損失を計算する
④ 逆伝播 → 後ろから勾配を計算・伝播
⑤ 全パラメータを更新
↻ 繰り返す(パラメータは引き継がれ少しずつ賢くなる)
勾配消失問題とReLU
バックプロパゲーションにも弱点がある。
Claude: 逆伝播で層を通るたびに勾配の値はどうなると思いますか?
自分: 小さくなる?
Claude: そうです。よく使われるシグモイド関数は両端で傾きがほぼ0になります。勾配が0.1の層が4つ続くとどうなりますか?
自分: 0.1 × 0.1 × 0.1 × 0.1 = 0.0001になって、最初の層はほとんど更新されなくなる。
これが勾配消失問題。層が深いほど最初の方の層に勾配がほとんど届かなくなって、学習が止まってしまう。
解決したのがReLUという活性化関数。
x > 0 のとき → そのまま x(傾き = 1)
x ≤ 0 のとき → 0(傾き = 0)
正の領域では傾きが常に1なので、
1 × 1 × 1 × 1 = 1 で勾配が消えない。シンプルだけど強力。Claude: ただしReLUにも弱点があります。0以下では傾きが完全に0になる。どう解決できそうですか?
自分: 負の値のときも0にせず、0.01とか極小の傾きを残す。
それがLeaky ReLU。0以下でも
0.01xのほんわずかな傾きを残すことで、ニューロンが「完全に死ぬ」のを防ぐ。全体の流れを整理すると
損失関数(MSE・MAE)でズレを測る
↓
勾配降下法でパラメータを調整する
↓
SGD・ミニバッチで効率化&局所最小値対策
↓
バックプロパゲーションで全パラメータを一括更新
↓
ReLU・Leaky ReLUで勾配消失を防ぐ
どれも「こういう問題があって、こう解決した」というストーリーになっていて、個別に覚えるより流れで追うほうが断然頭に入ってくる。
振り返って
今回の対話でおもしろかったのは、Claudeがほとんど何も教えてくれなかったこと。
自分で導き出した主なもの:
- +−が相殺されるから引き算だけではダメだとわかる
- 二乗か絶対値で解決できると気づく
- 外れ値への影響の違いを自分で言語化する
- a, bがパラメータだと気づく
- 学習率が大きすぎると振動、小さすぎると遅くなるトレードオフ
- 局所最小値で止まってしまう問題の存在
- バックプロパゲーションは「後ろから調べる」発想
- 勾配消失の原因と、Leaky ReLUによる対策
答えを教えてもらうより、質問されながら自分で考える方が圧倒的に頭に残る。AIをうまく使うコツの一つかもしれない。
次は「なぜ層を重ねると表現力が上がるのか」と「CNN・RNN・Transformer」を学ぶ予定。
Thanks for reading.