11.10 計算量の話 — ニューラルネットを動かすコストはどう決まるのか
ニューラルネットワークは「強力だが重い」。その重さの正体はたった一行の公式に隠れている。 O(NpML) ——4つの記号が掛け算で並ぶだけ。なぜ「ちょっと大きく」したつもりが 「桁違いに重い」になるのか、そして計算量とは別の落とし穴とは何か。一緒に見ていこう。
たった一行の公式 — O(NpML) の正体
どのくらいの計算が必要なのか——それを知らずに大きなネットワークを動かすと、 思いがけず何時間も待つことになる。ニューラルネットを学習するのに必要な計算は、 おおよそ次のオーダーで表される。
たった4つの記号が掛け算で並ぶだけ。けれどここに、なぜ「データが10倍になれば 学習も10倍重くなる」のか、なぜ「層を厚くするとコストが跳ね上がる」のか、 その理由が全部入っている。

それぞれが何を意味するか、ひとつずつ確かめよう。
- N : 学習に使うサンプル数。 手元のデータが何件あるか——1000件のデータなら N = 1000。
- p : 入力特徴量の数。 1件のデータが何個の数字で表されているか——身長・体重・年齢の3変数なら p = 3。
- M : 隠れユニットの数。 入力と出力の「あいだ」にいる小さな計算装置で、入力をいったん受け取って 加工して次に渡す、ネットワークの幅を決める部品。
- L : エポックの数。 データ全体を頭から末尾まで一周なめて学習することを「1エポック」と呼ぶ。 同じデータを何周も繰り返すので、その回数。
ここで重要なのは、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$ オーダー。
そして、これを $N$ 個のサンプルすべてに対して行う。 だから1エポックあたり
これは「データ1件あたり、入力 × 隠れユニットの行列演算を2回(往復)行う」と読み下せる。 ここに学習を $L$ 回繰り返せばよい、 というだけのことが、最初の公式 $O(NpML)$ の意味だ。
4本の軸が同時に伸びると何が起こるか
線形回帰なら、データ数を2倍にすればコストも2倍。それだけだ。 ところがニューラルネットでは、コストを決める軸が4つもある。
ここに「線形依存の罠」がある。 それぞれの軸は線形にしか効かない。けれど4つが同時に少しずつ大きくなると、 掛け算の結果は爆発的に膨らむ。

| 2倍 | 5倍 | 10倍 | |
|---|---|---|---|
| 1軸のみ拡大 | ×2 | ×5 | ×10 |
| 4軸同時に拡大 | ×16 | ×625 | ×10,000 |
これは「ちょっとデータを増やして、特徴量も増やして、ネットワークも少し大きくして、 学習も丁寧に長く回そう」と無邪気にやると、最後に10,000倍重い計算が待っている、という現実だ。
逆に言えば、計算量を削るにはどの軸を削るかを意識することが大切になる。
- データ N を増やすほど精度は上がるが、コストも上がる
- 特徴量 p は前処理で削れる場合がある(次元削減)
- 幅 M は表現力との trade-off
- エポック L は学習の速さ(学習率、最適化アルゴリズム)に依存する
ニューラルネットの「重さ」と戦うとは、これら4つの軸のどれを削り、 どれを残すかを決める作業に他ならない。
「重さ」だけじゃない — 入力スケーリングの落とし穴
ここまでは「いかに計算量が爆発するか」を見てきた。 では計算量を抑えるために、データを軽くし、ネットワークを小さくすればよいのか。
——その前にもうひとつ、ESL 11.10 が真っ先に釘を刺している落とし穴がある。 それは計算量とは別の次元の問題、すなわち入力スケーリングへの敏感さだ。 雑に前処理をすると、$O(NpML)$ の式の中の$L$ がいくら大きくなっても、 ネットワークはそもそも学習できない。

なぜスケールの違いが問題になるのか
たとえば、ある入力特徴量が 0〜1 の範囲、 別の特徴量が 0〜10000 の範囲だったとする。 両者の重みは同じ最適化アルゴリズムで更新される。 だが勾配の大きさは桁違いに違う。
すると小さい範囲の特徴量はほとんど無視され、大きい範囲の特徴量だけが学習を支配してしまう。 結果として、
- 学習が遅い(あるいは収束しない)
- 局所最適に落ちやすい
- 学習率を調整しても解決しない
という事態に陥る。だから ESL は教える:「ソフトウェアは慎重に選び、慎重にテストせよ」と。
解決策:標準化
最もシンプルで強力な前処理は、すべての特徴量を「平均0、分散1」に揃えることだ。
ここで $\mu$ は平均、$\sigma$ は標準偏差。 この正規化によって、すべての特徴量が同じスケールに揃い、 勾配の大きさも揃う。
これは現代の深層学習でも変わらない真実だ。バッチ正規化、 レイヤー正規化、入力の標準化——すべてはこの「スケールの違い」に対処するための工夫だと言える。
計算量 $O(NpML)$ という冷たい公式の裏には、こうした実装上の温かい注意点が隠れている。 それを忘れたとき、ネットワークは沈黙し、何時間動かしても損失は下がらないのだ。
まとめ
ニューラルネットの学習コストは、たった一行の公式で記述できる。
この掛け算の中には、なぜ大規模学習にGPUが必要なのか、なぜ前処理を怠ると 学習が崩壊するのか、なぜ「ちょっと大きく」したつもりが「桁違いに重い」になるのか、 その答えがすべて入っている。
線形回帰のような「単純なモデル」と違って、ニューラルネットは計算量を決める軸が4つもある。それぞれは線形にしか効かない。 だがそれらが同時に伸びると、コストは指数的に膨れ上がる。
そして公式の外側には、入力スケーリングのような「実装の作法」がいる。 式は美しくとも、現実は荒い。
11章はここで終わる。次の章では、まったく違うアプローチで複雑な決定境界を引く手法 ——サポートベクターマシン(SVM)へと進む。 「ニューラルネットは関数を曲げて当てはめ、SVMはマージンを最大化する」。 同じ非線形分類の問題に、まったく違う角度から斬り込むのがSVMだ。