ゼロからAI理論を再構築する

ー 文系エンジニアがAIの内部構造をゼロから理解する記録 ー

学習という名の山下り:最適化と微分

前回、機械学習は「データ」「モデル」「損失関数」の3つでできているという話を書きました。ただ、この3つが揃っても、それだけではモデルは何も学びません。損失関数が「今の予測はこれだけズレている」と教えてくれても、パラメータをどう直せばいいかがわからなければ意味がない。

その「直し方」を担うのが最適化です。

損失の地形を下る

損失関数 \( L(f(x), y) \) を定義すると、モデルのパラメータ(たとえば重み \( w \))の値に応じて損失が上下する「地形」ができます。学習の目的は、この地形の一番低い点を見つけること。数式で書くとこうなります。

\[ w^* = \arg\min_{w} \hat{R}(w) \]

\( \hat{R}(w) \) は学習データ全体に対する平均損失(経験リスク)です。

ただし、現実のモデルは複雑なので、この最小値を一発で解析的に求めることはまずできません。代わりに使うのが勾配降下法(Gradient Descent)で、「今いる場所から少しずつ坂を下る」ことを繰り返す方法です。

勾配は「どっちに下るか」を教えてくれる

勾配 \( \nabla \hat{R}(w) \) は、損失が最も急に増える方向を指すベクトルです。なので、その逆方向にパラメータを動かせば損失は減ります。

\[ w_{t+1} = w_t - \eta \nabla \hat{R}(w_t) \]

\( \eta \)(学習率)は一歩の大きさです。大きすぎると谷を飛び越えるし、小さすぎると収束が遅い。実際にモデルを動かしてみると、この値の調整が想像以上に面倒で、学習率を少し変えただけで結果がまるで違うことも珍しくありません。

微分は「ちょっと動かしたらどうなるか」の計算

自分は文系出身なので、微分にはずっと苦手意識がありました。公式を暗記して計算するもの、くらいの認識だった。ただ、機械学習の文脈で捉え直すと、やっていることはシンプルです。「あるパラメータを少しだけ動かしたとき、損失がどれくらい変わるか」を計算しているだけ。

たとえば重み \( w_i \) を \( 0.001 \) 増やして損失が大きく減るなら、その方向にもっと動かすべきだとわかります。ほとんど変わらないなら、その重みは今の予測にあまり影響していないということです。パラメータが何百万あっても、一つ一つについてこの感度を求められるのが微分の便利なところです。

ニューラルネットワークのように層が深いモデルでは、合成関数の微分(連鎖律)を使って、出力側の誤差を入力側のパラメータまで遡って伝えます。これが誤差逆伝播法(Backpropagation)で、やっていること自体は連鎖律の繰り返し適用です。仕組みを知ると、そこまで魔法じみた話ではないことがわかります。

まとめ

前回の3要素に最適化を加えると、機械学習の流れが一通り見えてきます。データから学んで、仮説を修正して、損失を減らす。最適化はその修正を実際に計算で回す部分です。

AdamやRMSpropといった最適化手法は、どれも「いかに効率よく、局所解に引っかからずに坂を下るか」を工夫したものです。次回は、そのなかでも基本となる確率的勾配降下法(SGD)とミニバッチの仕組みについて書きます。


参考文献

機械学習の骨組み:データ、モデル、損失関数

機械学習のアルゴリズムはいくつもありますが、分解してみると構造は意外と同じです。「データ」「モデル」「損失関数」。この3つが揃えば、あとは組み合わせ方の違いでしかありません。

個々のアルゴリズムに入る前に、まずこの骨組みを押さえておくと、新しい手法に出会ったときに「結局どこをいじっているのか」が見えやすくなります。

データは世界の断片でしかない

機械学習で扱う「データ」は、数学的には \( d \) 次元空間上の点の集まりです。1つのデータ点はベクトル \( x \in \mathbb{R}^d \) で表されます。画像なら各ピクセルの値が並んだもの、表形式ならカラムごとの数値が並んだものです。

厄介なのは、手元のデータが全体像のごく一部でしかないことです。理論上、データは未知の確率分布 \( P(x, y) \) から生成されたサンプルに過ぎません。 \( x \) が入力(特徴量)、 \( y \) が当てたい正解ラベル。学習とは、限られたサンプルから元の分布 \( P \) がどんな形をしているかを推測する作業にあたります。

データは「世界そのもの」ではなく、世界を覗くための窓です。窓が小さければ見える範囲も限られる。データの量と質がモデルの性能に直結する理由はここにあります。

モデルは仮説の集合

モデルは、入力 \( x \) を受け取って予測値を返す関数の候補一式です。これを仮説空間 \( \mathcal{H} \) と呼びます。一番単純な例として線形モデルなら、以下のように書けます。

\[ \mathcal{H} = \{ f(x) = w^T x + b \mid w \in \mathbb{R}^d, b \in \mathbb{R} \} \]

重み \( w \) と切片 \( b \) の組み合わせだけで、すべての候補が決まります。

モデルを選ぶという行為は、「データの裏にある関係はだいたいこういう形だろう」と仮定を置くことです。線形モデルを選べば「直線的な関係がある」と仮定していることになりますし、ニューラルネットワークを選べば「もっと複雑な関係があるかもしれない」と構えていることになります。

ただし表現力を上げれば柔軟になる反面、計算コストやデータ量の要求も上がります。このトレードオフの落としどころが、設計者のセンスが出る部分です。

損失関数が学習の方向を決める

データとモデルがあっても、まだ学習は始まりません。予測がどれだけ外れているかを数値化する仕組みが要ります。損失関数 \( L(f(x), y) \) がその役割を担い、予測値 \( f(x) \) と正解 \( y \) のズレを計算します。

学習の目標は、この損失の期待値を最小にする関数 \( f \) を見つけることです。

\[ \min_{f \in \mathcal{H}} \mathbb{E}_{(x,y) \sim P} [L(f(x), y)] \]

ただし真の分布 \( P \) はわからないので、実際には手元の \( n \) 個のサンプルで近似します。

\[ \hat{R}(f) = \frac{1}{n} \sum_{i=1}^{n} L(f(x_i), y_i) \]

損失関数の選び方によって「何を間違いとみなすか」が変わります。二乗誤差を使えば大きなハズレに厳しくなり、交差エントロピーなら確率分布のズレに敏感になる。同じデータ、同じモデルでも、損失関数が違えば学習の方向は変わります。地味に見えて、実はかなり設計判断を問われる部分です。

まとめ

データを観測し、モデルで仮説を立て、損失関数で間違いを測って修正する。機械学習はこの繰り返しです。

新しい論文やライブラリに触れるとき、「データの扱い方を変えたのか」「モデル構造を変えたのか」「損失関数を工夫したのか」と分けて考えると、何が新しいのかが整理しやすくなります。次回は、この仕組みを実際に動かすエンジンにあたる「最適化」について書く予定です。


参考文献