ニューラルネットワーク - 脳を模倣した学習機械

線形モデルでは解けないXOR問題から始まり、隠れ層・シグモイド関数・バックプロパゲーション・ 重み減衰・畳み込みネットワーク・ベイズアプローチまで、ニューラルネットワークの全体像を一気に解き明かします。

線形モデルの限界 - XORが解けない

これまで学んできた回帰、判別分析、ロジスティック回帰はすべて「線形」モデルだ。 入力の重み付き和で予測を作る。

しかし、実世界のデータが線形な境界で綺麗に分けられるとは限らない。 次のパターンを直線1本で分離できるだろうか?

XORパターンを直線では分離できないが曲線では分離できることを示すアニメーション
直線(赤)は必ず誤分類を生む。曲線境界(緑)なら完全分離できる。

これがXORパターンだ。どんな直線を引いても、必ず誤分類が生じてしまう。 では、どうすれば良いか?

答えは「入力の線形結合から非線形な特徴を作り出し、その特徴を使って予測する」という発想だ。 例えば、$X_1 + X_2$という特徴を作ると、クラスAは合計が偶数(0か2)、クラスBは合計が奇数(1)になる。 非線形な変換を挟めば、線形分離が可能になる。

これがニューラルネットワークの核心にある考え方だ。 以降のセクションで、この「非線形特徴の作り方」と「学習の仕方」を段階的に見ていく。

参考(PPR): 統計学では同様の発想として「投影追跡回帰(PPR)」が先に開発された:

$$f(X) = \sum_{m=1}^{M} g_m(\omega_m^T X)$$

$g_m$ は「入力を方向$\omega_m$ に射影した値だけに依存する関数」で、$M$ を大きくすれば任意の関数を近似できる。 ニューラルネットワークは、この $g_m$ をよりシンプルな形に特化させたものだ。

ニューラルネットワークのアーキテクチャ

ニューラルネットワークはXOR問題をどう解決するか? 答えは「中間層(隠れ層)に非線形変換を行うユニットを置く」ことだ。

ニューラルネットワークの3層構造と信号フローを示すアニメーション
信号が入力層(青)→隠れ層(黄)→出力層(緑)と順番に流れる。

ネットワークは3つの層で構成される:

1. 入力層(Input Layer)

特徴量 $X = (X_1, X_2, \ldots, X_p)$ をそのまま受け取る。$p$ 個のユニット。

2. 隠れ層(Hidden Layer)

$M$ 個のユニットが、入力の線形結合を「シグモイド関数」で変換する:

$$Z_m = \sigma(\alpha_{0m} + \alpha_m^T X), \quad m = 1, \ldots, M$$

「隠れ」と呼ばれる理由は、これらのユニットの値がデータに直接観測されないから。 入力データからも出力データからも見えない「内部表現」だ。

3. 出力層(Output Layer)

隠れ層の出力をさらに線形結合する:

$$T_k = \beta_{0k} + \beta_k^T Z, \quad k = 1, \ldots, K$$
$$f_k(X) = g_k(T)$$

ソフトマックス(多クラス分類用):全クラスの確率の和が1になるよう正規化する。

$$g_k(T) = \frac{e^{T_k}}{\sum_{l=1}^{K} e^{T_l}}$$

シグモイド関数 - 非線形性の源

ニューラルネットワークの非線形性はシグモイド関数から生まれる。 シグモイドは「0から1へと滑らかに変化するS字曲線」だ:

$$\sigma(v) = \frac{1}{1 + e^{-v}}$$
シグモイド関数のスケール変化を示すアニメーション(線形から急峻なステップ関数へ)
スケールが小さい(青)ほど線形に近く、大きい(黄)ほどステップ関数に近づく。

なぜシグモイドが必要か?もし活性化関数に恒等関数($\sigma(v) = v$)を使ったら何が起きるか? 隠れ層がいくつあっても、全体は線形変換の合成で線形に崩壊してしまう:

$$f(X) = W_2(W_1 X + b_1) + b_2 = (W_2 W_1)X + (W_2 b_1 + b_2)$$

シグモイドがあって初めて、「表現できる関数のクラス」が劇的に広がる。

スケールによる形状変化

バックプロパゲーションを可能にする微分の美しい性質

$$\sigma'(v) = \sigma(v)(1 - \sigma(v))$$

シグモイドの微分は「シグモイド自体の関数」で書ける! これはフォワードパスで計算した $\sigma(v)$ の値を再利用できることを意味し、 バックプロパゲーション(次のセクション)の効率的な計算を可能にする鍵となる。

バックプロパゲーション - 誤差を逆向きに伝える

ニューラルネットワークの「学習」とは、全パラメータ$\theta = \{\alpha_{0m}, \alpha_m, \beta_{0k}, \beta_k\}$を調整して誤差を最小化することだ。

損失関数(最小化したい目標):

勾配降下法で更新する:

$$\theta^{(r+1)} = \theta^{(r)} - \gamma_r \frac{\partial R}{\partial \theta}$$
バックプロパゲーションの前向きパスと後ろ向きパスを示すアニメーション
青い信号が前向き(左→右)、オレンジの残差が後ろ向き(右→左)に伝播する。

問題は、ネットワークが「合成関数の合成」であるため、微分計算が複雑に見えることだ。バックプロパゲーションの核心は「連鎖律(chain rule)を賢く使う」こと:

出力層の残差(誤差)を $\delta_{ki}$ と定義する (単純な例:$\delta_{ki} = -2(y_{ik} - f_k(x_i))$

出力層パラメータの勾配: 「出力層の残差 × 隠れ層の出力値」という自然な形になる。

$$\frac{\partial R_i}{\partial \beta_{km}} = \delta_{ki} \cdot z_{mi}$$

隠れ層パラメータの勾配

$$s_{mi} = \sigma'(\alpha_m^T x_i) \sum_k \beta_{km} \delta_{ki}$$
$$\frac{\partial R_i}{\partial \alpha_{mf}} = s_{mi} \cdot x_{if}$$

$s_{mi}$ は何か? 出力層の残差 $\delta_{ki}$ を重み$\beta_{km}$ で「逆向きに」集めたもの、 つまり「隠れ層への逆伝播された残差」だ。 これが「バック(逆)プロパゲーション(伝播)」の名前の由来。

2パスのアルゴリズム

  1. 前向きパス(Forward Pass): 入力 $x$ から順番に計算 → 予測値 $f_k(x_i)$
  2. 後ろ向きパス(Backward Pass): 出力から逆順に残差を計算 → $\delta_{ki}$$s_{mi}$ → 勾配

重要なポイントは、後ろ向きパスが前向きパスで計算した値(特に$z_{mi}$$\sigma(v)$)を再利用できること。 これが計算効率の秘密だ。

過学習との戦い - 重み減衰と訓練の実践

ニューラルネットワークには「過学習」という根深い問題がある。 隠れユニット数が多いほど表現力は高いが、訓練データに過度に適合してしまう。

重み減衰の効果を示す左右比較アニメーション(過学習 vs 正則化)
左(λ=0)は複雑な境界で過学習、右(λ=0.1)は滑らかな境界で適切な汎化。

3つの対策

① 早期停止(Early Stopping)

訓練中、バリデーション誤差が増加し始めたら学習を止める。 訓練誤差はまだ下がっているのに止める、という逆説的な方法だが、 過学習前のモデルが汎化性能が高い。

重み減衰(Weight Decay)

損失関数に正則化項を追加する(Ridge回帰と同じ発想!):

$$R(\theta) + \lambda \left(\sum_{km} \beta_{km}^2 + \sum_{mf} \alpha_{mf}^2\right)$$

$\lambda$ を大きくすると重みが0に引き寄せられ、シンプルなモデルになる。 実装は簡単で、勾配更新時に $2\beta_{km}$$2\alpha_{mf}$ を加えるだけだ。

③ 重み消去(Weight Elimination)

より積極的な正則化で、小さい重みをとくに強く0に引き戻す:

$$J(\theta) = \sum_{km} \frac{\beta_{km}^2}{1 + \beta_{km}^2} + \sum_{mf} \frac{\alpha_{mf}^2}{1 + \alpha_{mf}^2}$$

訓練の実践的なコツ

コツ理由
重みをランダムな小さな値で初期化ゼロだと対称性が壊れず学習が進まない
入力を平均0・標準偏差1に標準化スケールの違いが最終結果に大きく影響する
隠れユニットは多めに設定少なすぎると表現力不足。正則化で制御する
複数の初期値で試すR(θ) は非凸で局所最小解が多い

多重最小解の問題: 誤差関数 $R(\theta)$ は非凸(山が複数ある地形)だ。 最終解が初期値に依存する。対策として、異なる初期値から複数のネットワークを訓練し、予測を平均する(バギング)ことが有効だ。 重みを平均するのではなく予測を平均する点が重要(非線形モデルなので重みの平均は意味が違う)。

構造を設計する - 畳み込みネットワークへ

ニューラルネットワークの威力を実感できる代表例が「手書き数字認識」だ。 16×16ピクセルのグレースケール画像(256次元の入力)から0〜9の数字を分類する。

単純なフルコネクト(全結合)ネットワークから始めて、ドメイン知識を構造に組み込むことで劇的に精度が改善する様子を見よう。

5種類のネットワーク比較

ネットワーク構造重み数テスト正解率
Net-1隠れ層なし(線形)2,57080.0%
Net-21層全結合3,21487.0%
Net-32層・局所結合のみ1,22688.5%
Net-42層・局所結合+重み共有1,13294.0%
Net-52層・2段階の重み共有1,06098.4%
畳み込みのスライディングウィンドウが入力グリッドを走査する様子
同じ3×3フィルタ(重みを共有)が画像の各位置をスライドしながら特徴を検出する。

鍵は「重み共有(Weight Sharing)」: Net-4とNet-5が採用する重み共有こそが劇的な改善の源だ。

手書き文字の縦線・横線・曲線などの特徴は、画像のどこにあっても同じ形をしている。 ならば、同じ特徴を検出する重みを画像の全位置で共有すれば良い!

これが畳み込みニューラルネットワーク(CNN)の核心だ。 3×3の「フィルタ」が画像を左上から右下へとスライドしながら、同じ重みで各位置の特徴を検出する。 結果として、重み数はNet-2より少ない(1,060 vs 3,214)にもかかわらず精度が大幅に向上している。

これは「帰納バイアス(inductive bias)」の効果だ。 「画像の特徴は位置不変だ」という事前知識をネットワーク構造に組み込むことで、 学習効率が格段に上がる。

不確実性を扱う - ベイズアプローチ

構造設計でネットワークを賢くしたが、もう一つの問題が残っている。 「最も良い単一のパラメータ」を探すのではなく、「不確実性ごと扱う」という発想に転換できないか?

これがベイズニューラルネットワークの考え方だ。

従来のアプローチ(最尤推定): 「最も良いパラメータ $\theta^*$」を一つ選び、そのモデルだけで予測する。

ベイズアプローチ: パラメータ $\theta$ に「事前分布$\Pr(\theta)$」を設定し、データを見た後の「事後分布」を使って予測する:

$$\Pr(\theta | X_{tr}, y_{tr}) = \frac{\Pr(\theta) \Pr(y_{tr} | X_{tr}, \theta)}{\int \Pr(\theta) \Pr(y_{tr} | X_{tr}, \theta) d\theta}$$

予測は「全てのパラメータについての期待値」:

$$\hat{f}(X_{new}) = \int f(X_{new}; \theta) \Pr(\theta | X_{tr}, y_{tr}) d\theta$$

「単一の最適解」ではなく「良い解の集合の平均」をとる。局所最小解の問題を自然に緩和できる。

MCMCサンプルが蓄積して平均境界が浮かび上がる様子を示すアニメーション
多数の薄い曲線(MCMCサンプル)が蓄積し、最終的に安定した赤い平均曲線が現れる。

実装(MCMC): 積分は解析的に計算できないため、マルコフ連鎖モンテカルロ(MCMC)でパラメータをサンプリングし、 数百個のモデルの予測を平均する。

NIPS 2003チャレンジでの実証

手法平均ランク計算時間
ベイズニューラルネット1.5384分
ランダムフォレスト2.71.9分
ブースティング木3.43.0分
バギングニューラルネット3.63.5分

精度は最高だが計算コストが圧倒的に高い(200倍以上)。 実用上はランダムフォレストやブースティングで十分なことも多い。

本質的な理由: ベイズ法が有効なのは「正式な確率的推論」としてではなく、 「確率の高いモデル空間を効率的にサンプリングし、良いモデルの集合の予測を平均する」 という点にある。