11.10 計算量の話 — ニューラルネットを動かすコストはどう決まるのか

ニューラルネットワークは「強力だが重い」。その重さの正体はたった一行の公式に隠れている。 O(NpML) ——4つの記号が掛け算で並ぶだけ。なぜ「ちょっと大きく」したつもりが 「桁違いに重い」になるのか、そして計算量とは別の落とし穴とは何か。一緒に見ていこう。

たった一行の公式 — O(NpML) の正体

どのくらいの計算が必要なのか——それを知らずに大きなネットワークを動かすと、 思いがけず何時間も待つことになる。ニューラルネットを学習するのに必要な計算は、 おおよそ次のオーダーで表される。

$$\text{計算量} \;=\; O(N \cdot p \cdot M \cdot L)$$

たった4つの記号が掛け算で並ぶだけ。けれどここに、なぜ「データが10倍になれば 学習も10倍重くなる」のか、なぜ「層を厚くするとコストが跳ね上がる」のか、 その理由が全部入っている。

N, p, M, L の4記号が順番に登場し O(NpML) が完成するアニメーション
4つの要素が掛け算で繋がり、計算量の公式が完成する

それぞれが何を意味するか、ひとつずつ確かめよう。

ここで重要なのは、4つすべてが掛け算で並んでいるということ。 たとえばデータを2倍にすれば、計算量は2倍。特徴量も2倍にすれば、合わせて4倍。 隠れユニットも2倍なら8倍。エポックも2倍にすれば16倍。 「ちょっとずつ大きく」したつもりが、気づくと指数的に重くなっている。

これは線形回帰のような「データ数 $N$ にしか依存しない」 アルゴリズムとは決定的に違う性質だ。ニューラルネットの計算コストは、 複数の軸が同時にスケールするので、注意しないとあっという間に手に負えなくなる。

1ステップの中身 — 順方向と逆方向

公式の中で最初に増えるのは $N \cdot p \cdot M$ の部分。 これは「ネットワークを1回だけ動かすコスト」だ。

ニューラルネットの1ステップは、必ず順方向と逆方向の2つから成る。

ネットワーク上で青いパルスが順方向に流れ、赤いパルスが逆方向に戻るアニメーション
青いパルスが順方向(入力→出力)、赤いパルスが逆方向(出力→入力)に流れる

順方向(Forward pass)

入力 $x$$p$ 個の数字)から、 隠れ層($M$ 個のユニット)を経て出力までを計算する。 ここで使う「重み」は、入力ノードと隠れノードを結ぶ線1本ごとに1つ用意されている。

入力が $p$ 個、隠れユニットが $M$ 個なら、 結ぶ線の本数はちょうど $p \times M$。 だから1サンプルを通すたびに $p \times M$ 回の掛け算が必要になる。

逆方向(Backward pass)

出力の誤差(予測と正解のズレ)を、各重みをどれくらい動かせばよいかという情報 ——これをバックプロパゲーションと呼ぶ——へと変換し、 ネットワークを出口から入口へ逆向きに伝えていく。

「勾配」とは、坂の傾きのように「どっち方向にどれだけ動かすべきか」を指す数値だ。 計算の中身は順方向と対称で、同じ $p \times M$ 本の線をなぞるだけなので、 コストも $p \times M$ オーダー。

$$\text{順方向} + \text{逆方向} \;\approx\; 2 \cdot p \cdot M$$

そして、これを $N$ 個のサンプルすべてに対して行う。 だから1エポックあたり

$$\text{1エポックのコスト} \;=\; O(N \cdot p \cdot M)$$

これは「データ1件あたり、入力 × 隠れユニットの行列演算を2回(往復)行う」と読み下せる。 ここに学習を $L$ 回繰り返せばよい、 というだけのことが、最初の公式 $O(NpML)$ の意味だ。

4本の軸が同時に伸びると何が起こるか

線形回帰なら、データ数を2倍にすればコストも2倍。それだけだ。 ところがニューラルネットでは、コストを決める軸が4つもある。

ここに「線形依存の罠」がある。 それぞれの軸は線形にしか効かない。けれど4つが同時に少しずつ大きくなると、 掛け算の結果は爆発的に膨らむ。

4本の棒グラフが順番に2倍に伸びるにつれて、右の立方体が指数的に膨張するアニメーション
各軸を2倍にするだけで、総コストは 2×2×2×2=16 倍になる
2倍5倍10倍
1軸のみ拡大×2×5×10
4軸同時に拡大×16×625×10,000
$$\underbrace{2}_{N} \times \underbrace{2}_{p} \times \underbrace{2}_{M} \times \underbrace{2}_{L} \;=\; 16$$

これは「ちょっとデータを増やして、特徴量も増やして、ネットワークも少し大きくして、 学習も丁寧に長く回そう」と無邪気にやると、最後に10,000倍重い計算が待っている、という現実だ。

逆に言えば、計算量を削るにはどの軸を削るかを意識することが大切になる。

ニューラルネットの「重さ」と戦うとは、これら4つの軸のどれを削り、 どれを残すかを決める作業に他ならない。

「重さ」だけじゃない — 入力スケーリングの落とし穴

ここまでは「いかに計算量が爆発するか」を見てきた。 では計算量を抑えるために、データを軽くし、ネットワークを小さくすればよいのか。

——その前にもうひとつ、ESL 11.10 が真っ先に釘を刺している落とし穴がある。 それは計算量とは別の次元の問題、すなわち入力スケーリングへの敏感さだ。 雑に前処理をすると、$O(NpML)$ の式の中の$L$ がいくら大きくなっても、 ネットワークはそもそも学習できない。

左のスケーリングなし損失曲線は激しく振動し、右のスケーリング済み損失曲線は滑らかに収束するアニメーション
左:未スケーリング(振動・収束しない) 右:スケーリング済み(滑らかに下降)

なぜスケールの違いが問題になるのか

たとえば、ある入力特徴量が 0〜1 の範囲、 別の特徴量が 0〜10000 の範囲だったとする。 両者の重みは同じ最適化アルゴリズムで更新される。 だが勾配の大きさは桁違いに違う。

すると小さい範囲の特徴量はほとんど無視され、大きい範囲の特徴量だけが学習を支配してしまう。 結果として、

という事態に陥る。だから ESL は教える:「ソフトウェアは慎重に選び、慎重にテストせよ」と。

解決策:標準化

最もシンプルで強力な前処理は、すべての特徴量を「平均0、分散1」に揃えることだ。

$$x_{\text{scaled}} \;=\; \frac{x - \mu}{\sigma}$$

ここで $\mu$ は平均、$\sigma$ は標準偏差。 この正規化によって、すべての特徴量が同じスケールに揃い、 勾配の大きさも揃う。

これは現代の深層学習でも変わらない真実だ。バッチ正規化、 レイヤー正規化、入力の標準化——すべてはこの「スケールの違い」に対処するための工夫だと言える。

計算量 $O(NpML)$ という冷たい公式の裏には、こうした実装上の温かい注意点が隠れている。 それを忘れたとき、ネットワークは沈黙し、何時間動かしても損失は下がらないのだ。

まとめ

ニューラルネットの学習コストは、たった一行の公式で記述できる。

$$O(N \cdot p \cdot M \cdot L)$$

この掛け算の中には、なぜ大規模学習にGPUが必要なのか、なぜ前処理を怠ると 学習が崩壊するのか、なぜ「ちょっと大きく」したつもりが「桁違いに重い」になるのか、 その答えがすべて入っている。

線形回帰のような「単純なモデル」と違って、ニューラルネットは計算量を決める軸が4つもある。それぞれは線形にしか効かない。 だがそれらが同時に伸びると、コストは指数的に膨れ上がる。

そして公式の外側には、入力スケーリングのような「実装の作法」がいる。 式は美しくとも、現実は荒い。

11章はここで終わる。次の章では、まったく違うアプローチで複雑な決定境界を引く手法 ——サポートベクターマシン(SVM)へと進む。 「ニューラルネットは関数を曲げて当てはめ、SVMはマージンを最大化する」。 同じ非線形分類の問題に、まったく違う角度から斬り込むのがSVMだ。