← 機械学習テキスト 一覧

🎓 レベル:標準 | 重要度:B(標準)

📎 前提:畳み込みニューラルネットワーク | 関連:重み初期化と正規化(BatchNorm)

要点(BLUF)


1. CNNアーキテクチャの発展史

まず系統を1枚で押さえます。横軸は登場年、縦軸はおおよその深さ(層数)です。

graph LR
    A["LeNet (1998)<br>5層・手書き数字"] --> B["AlexNet (2012)<br>8層・ReLU/Dropout/GPU"]
    B --> C["VGG (2014)<br>16〜19層・3×3を積む"]
    B --> D["GoogLeNet (2014)<br>22層・Inception"]
    C --> E["ResNet (2015)<br>残差接続で152層"]
    D --> E
    E --> F["その後 (要最新確認)<br>EfficientNet・ConvNeXt 等"]

各世代の「何が新しかったか」を要点で並べます。

世代鍵となる発明ひとことで
LeNet-51998畳み込み+プーリングの原型手書き数字(郵便番号)認識の初期CNN
AlexNet2012ReLU・Dropout・GPU学習・データ拡張ImageNetで圧勝し深層学習ブームの引き金
VGG20143×3畳み込みだけを深く積む単純さと深さ。設計指針が明快
GoogLeNet / Inception2014Inceptionモジュール・1×1畳み込みマルチスケールかつ少パラメータ
ResNet2015残差接続(skip connection)超深層(152層)を学習可能に

LeNet(1998)— 原型

畳み込み層とプーリング層を交互に積み、最後に全結合層で分類する、という現在まで続く基本骨格を最初に確立したのが LeNet-5 です。手書き数字(MNIST的なタスク)向けで、規模は5層程度。当時は計算資源とデータが足りず、これ以上は広がりませんでした。

AlexNet(2012)— ブームの引き金

LeNetを大規模化したのが AlexNet です。重要なのは規模だけでなく、後の標準となる工夫を導入した点です。

これらが噛み合って ImageNet で誤差を大幅に下げ、「深層学習は効く」と業界全体が動き出しました。

VGG(2014)— 3×3を深く積む

VGGの主張は明快で「大きいフィルタを使わず、3×3だけを深く積めばよい」というものです。なぜそれで十分かは受容野(receptive field)の計算でわかります。

そのうえでパラメータ数を比べると:

5×5=255×5を1枚>2×(3×3)=183×3を2枚\underbrace{5 \times 5 = 25}_{\text{5×5を1枚}} \quad>\quad \underbrace{2 \times (3 \times 3) = 18}_{\text{3×3を2枚}}

要するに、同じ広さを見ながらパラメータが少なく、しかも非線形(ReLU)を挟む回数が増えるので表現力も上がります。「小さいフィルタを積む」は以後の設計の定番になりました。

GoogLeNet / Inception(2014)— マルチスケール+1×1

VGGが「深さ」で攻めたのに対し、GoogLeNet は「1つの層の中で複数のフィルタサイズを並列に使う」発想です。これが Inceptionモジュール で、1×1・3×3・5×5の畳み込みとプーリングを並列に走らせ、出力を結合します。狙いは、対象の大きさ(スケール)がまちまちでも同じ層で拾えるようにすることです。

ただし並列に大きい畳み込みを走らせると計算量が爆発します。そこで効くのが 1×1畳み込み です。役割は2つ:

  1. 次元削減(ボトルネック):チャネル数を 1×1 で先に圧縮してから 3×3・5×5 に渡す → 計算量を大幅に削減
  2. 非線形の追加:1×1の後にもReLUを挟めるので表現力が増す

この工夫で、GoogLeNet はパラメータ数を AlexNet より大幅に減らしながら(おおよそ1桁規模)高精度を達成しました。

graph TD
    IN["入力特徴マップ"] --> R1["1×1 畳み込み<br>(次元削減)"]
    IN --> R2["1×1 畳み込み<br>(次元削減)"]
    IN --> P["3×3 プーリング"]
    IN --> C1["1×1 畳み込み"]
    R1 --> C3["3×3 畳み込み"]
    R2 --> C5["5×5 畳み込み"]
    P --> P1["1×1 畳み込み<br>(次元削減)"]
    C1 --> CAT["チャネル方向に結合<br>(concat)"]
    C3 --> CAT
    C5 --> CAT
    P1 --> CAT

1×1畳み込みは「空間サイズは変えずチャネルだけ混ぜる・減らす」操作です。詳しくは 畳み込みニューラルネットワーク のチャネルの考え方を参照してください。

理解確認(軽く):VGGが「3×3を2層」で5×5の受容野を作るのに、なぜわざわざ5×5を1枚使わないのでしょう?


2. 「深くする」ことの困難 — 劣化問題

ここが ResNet を理解する核心です。素朴には「層を増やすほど表現力が上がり精度も上がる」はずですが、実際には ある深さを超えると精度が頭打ちになり、さらに深くすると悪化 します。

重要なのは、これが 過学習ではない ことです。過学習なら「訓練誤差は下がるのにテスト誤差が上がる」はずですが、劣化問題では 訓練誤差そのものが、浅いモデルより悪化 します。つまり「学習しきれていない」=最適化の問題です。

なぜおかしいか。深い方が損なはずがない、という論理があります。

18層モデルがある解に到達できたとする。34層モデルは、その18層分をコピーし、残り16層を**恒等写像(何もしない層)**にすれば、原理上まったく同じ性能を出せる。

つまり深いモデルは浅いモデルの解を「内包」できるのだから、少なくとも同等以上になれるはずです。にもかかわらず実際は悪化する。これは「恒等写像を学ぶ」という一見簡単なことを、通常の積層(plain network)では SGD がうまく見つけられないことを意味します。

xychart-beta
    title "劣化問題(イメージ:訓練誤差)"
    x-axis ["浅い", "中", "深い", "超深い"]
    y-axis "訓練誤差" 0 --> 10
    line [8, 5, 4, 7]

図の意味:深くするほど誤差が単調に下がるのではなく、ある点を超えると訓練誤差まで上向く。これが劣化問題です。

勾配消失(誤差逆伝播法)も一因ですが、BatchNorm 等で勾配消失を抑えてもこの劣化は残ることが報告されました。**問題の本質は「恒等写像の学習しにくさ」**にあります。


3. ResNet — 残差接続(skip connection)

定式化

ResNet のアイデアは、層に「望ましい出力 H(x)H(x) をそのまま学ばせる」のではなく、入力 xx からのズレ(残差)だけを学ばせることです。数本の積層が学ぶ関数を F(x)F(x) とし、その出力に入力 xx を足し戻します。

H(x)=F(x)+xH(x) = F(x) + x

ここで F(x)F(x)残差関数(residual)+x+xショートカット接続(skip / shortcut connection) です。学習で更新されるのは FF の重みであり、xx は加算で迂回して直接運ばれます。

要するに:層に「正解そのもの」ではなく「正解と入力の差分」を作らせ、最後に入力を足して帳尻を合わせる構造です。

graph TD
    X["入力 x"] --> W1["重み層 (3×3 conv)"]
    W1 --> RELU1["ReLU"]
    RELU1 --> W2["重み層 (3×3 conv)"]
    W2 --> ADD(("+"))
    X -- "ショートカット(恒等)" --> ADD
    ADD --> RELU2["ReLU"]
    RELU2 --> OUT["出力 H(x) = F(x) + x"]

なぜこれで劣化問題が解けるのか(理論的裏付け)

ポイントは「恒等写像が最適なケースを、ほぼタダで表現できる」ことです。

H(x)=x    F(x)=0H(x)=x \;\Longleftrightarrow\; F(x)=0

要するに:「何もしない」を表すのが、ゼロを作る作業に化けるので簡単になる。これで「深いモデルは浅いモデル+恒等で同等以上になれるはず」という理屈が、実際に最適化で達成できるようになります。

もう一つの効果が 勾配の近道 です。逆伝播では、加算ノードは勾配をそのまま両側に流します。H=F(x)+xH=F(x)+x の出力に届いた勾配 L/H\partial \mathcal{L}/\partial H は、ショートカット側を通って FF を一切経由せず 入力 xx へ直接届きます。

Lx=LH(1+Fx)\frac{\partial \mathcal{L}}{\partial x} = \frac{\partial \mathcal{L}}{\partial H}\left(1 + \frac{\partial F}{\partial x}\right)

要するに:勾配の式に必ず「11」が残ります。F/x\partial F/\partial x が小さく潰れても、この 11 のおかげで勾配が0になりにくい。だから深い層にも更新信号が届き、勾配消失(誤差逆伝播法)が緩和されます。

この2点(恒等の作りやすさ+勾配の近道)で、ResNet は 152層 という当時桁違いの深さを安定して学習し、しかも VGG より計算量が小さいまま ImageNet の精度を更新しました。残差を積み上げる 残差ブロック(residual block) が基本部品で、これを多数重ねたものが ResNet-34/50/101/152 です。

BatchNorm との組み合わせ

ResNet は残差接続だけで動くわけではなく、各畳み込みの後に バッチ正規化(BatchNorm) を挟みます。BatchNorm は各層の入力分布を整え、勾配のスケールを安定させて学習を速め、深いネットを訓練しやすくします(詳細は 重み初期化と正規化)。

役割分担をひとことで:

この2つが噛み合って初めて、超深層の安定学習が成立します。どちらか一方では不十分です。


4. その後(要最新確認)

ResNet 以降も改良は続いています。急速に動く領域なので、最新の比較は要最新確認 として扱ってください。代表例だけ挙げます。

これらは Transformer(Attention系)との対比で理解すると位置づけが見えます。「CNN対Transformer」は今も決着していない論点で、タスク・データ規模・計算予算で使い分けるのが実務です。


⚠️ よくある誤解・落とし穴


対応するシミュレーション

simulations/resnet_gradient.py:層を素朴に重ねた「プレーン網」と、残差接続 h=h+F(h)h=h+F(h) を入れた「残差網」で、逆伝播の勾配が深さとともにどうなるかを比べます。プレーン網は各層のヤコビアンが掛かり続けて勾配が指数的に消える(劣化問題)のに対し、残差網はヤコビアンが I+FI+F' になり恒等写像 II の経路を通って勾配が O(1)O(1) に保たれることを対数軸で可視化します。これが ResNet が超深層を学習可能にした理由で、Transformer もブロックごとに残差を使います(Transformer)。

残差接続が勾配を保つ

関連ノート