← 機械学習テキスト 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:パーセプトロンと多層パーセプトロン誤差逆伝播法

要点(BLUF)

1. なぜ MLP では画像が苦手か

パーセプトロンと多層パーセプトロン の全結合層(fully connected)を、そのまま画像に当てると3つの問題が起きます。

(1) パラメータ爆発。 全結合は入力の全画素と全ニューロンを総当たりで繋ぎます。224×224224\times224 のカラー画像(224×224×315224\times224\times3 \approx 15 万画素)を 1000 ユニットの隠れ層に繋ぐだけで、重みは 15×1000=1.5億個15\text{万}\times1000 = 1.5\text{億個}。1 層でこれです。学習しきれず、過学習し、メモリも足りません。

(2) 並進不変性がない。 全結合では「左上にある猫」と「右下にある猫」はまったく別の入力パターンです。左上で猫を学んでも、右下の猫には別の重みが要る。同じ物体が画像のどこに出ても認識したいのに、全結合はその知識を共有できません。

(3) 空間構造を壊す。 全結合に入れるには画像を 1 次元ベクトルに潰します(flatten)。すると「隣り合う画素」という空間的な近さの情報が消え、(i,j)(i,j)(i,j+1)(i,j+1) がただのベクトルの 2 成分になります。画像で最も効く手がかり——局所的な模様——を最初に捨ててしまうわけです。

要するに:画像には「局所性」と「位置によらず同じ模様は同じ意味」という強い構造があるのに、全結合はそれを一切使えません。CNN はこの構造をネットワークの形そのものに組み込みます。

2. 畳み込み演算の定義

畳み込み層は、小さな重み行列=カーネル(kernel)/フィルタ(filter) を入力画像の上でずらしながら、各位置で要素ごとの積の和(局所の重み付き和) を計算します。

入力画像を XXF×FF\times F のカーネルを KK とすると、出力(特徴マップ)SS の位置 (i,j)(i,j) は次式です:

S(i,j)=m=0F1n=0F1X(i+m,j+n)  K(m,n)S(i,j) = \sum_{m=0}^{F-1}\sum_{n=0}^{F-1} X(i+m,\,j+n)\; K(m,n)

カーネルを 1 マスずつ右へ・下へ動かしながら、この内積を全位置で繰り返したものが 1 枚の特徴マップになります。

要するに:「小さな模様の型紙(カーネル)を画像の上で滑らせ、型紙とよく一致する場所ほど大きな値を出す」——これが畳み込みです。出力 S(i,j)S(i,j) は「位置 (i,j)(i,j) にカーネルの模様がどれだけあるか」のスコアになります。

⚠️ 厳密にはこの式(カーネルを反転しない版)は数学では相互相関(cross-correlation) と呼ばれ、真の畳み込み X(im,jn)K(m,n)\sum X(i-m,j-n)K(m,n) はカーネルを上下左右反転します。深層学習ではカーネルを学習で決めるので反転しても表現力は同じ。慣習で「畳み込み」と呼びつつ中身は相互相関、というのが実装の実態です(後述の落とし穴)。

3. CNN を支える3つの鍵

畳み込みが全結合と決定的に違うのは、次の3つの制約です。これがそのまま「パラメータが激減する理由」になります。

局所受容野(local receptive field)

出力の各ニューロンは、入力全体ではなくカーネルが覆う F×FF\times F の小領域だけに繋がります。これが受容野(receptive field)。画像の手がかりはまず局所(エッジ・角・模様)に現れる、という事前知識を「繋がりを局所に限る」という形で入れています。全結合の「総当たり」を「ご近所だけ」に絞ったわけです。

重み共有(parameter sharing)

同じカーネル KK全位置で使い回します。左上を見るときも右下を見るときも、重みは同じ F×FF\times F 個。位置ごとに別の重みを持つ全結合と違い、パラメータ数は画像サイズに依存せず、カーネルサイズだけで決まります

ここがパラメータ激減の核心です。例として 32×3232\times32 入力・出力も 32×3232\times32 とすると:

5 桁違います。パラメータが減れば過学習しにくく、少ないデータでも学べます。

並進等変性(translation equivariance)

重み共有の数理的な帰結が並進等変性です。「入力を平行移動 TT してから畳み込む」のと「畳み込んでから平行移動する」のが一致します:

f(T(x))=T(f(x))f(T(x)) = T(f(x))

要するに:入力中の猫が右に 10 画素ずれれば、特徴マップ上の反応も右に 10 画素ずれるだけで、反応の中身は変わらない。だから「左上で学んだ猫検出器」が「右下の猫」にもそのまま効きます。MLP に決定的に欠けていた性質が、重み共有から自動的に出てきます。

補足:畳み込み単体は等変性(equivariance, ずれが伝わる)。これに次節のプーリングを足すと、小さなずれを吸収する不変性(invariance, ずれても出力が変わらない) に近づきます。両者は別物として区別してください。

4. 特徴マップ・チャンネル・ストライド・パディング

実際の畳み込み層には、出力サイズと表現力を決める4つの要素があります。

出力サイズの式

入力幅 WW、カーネル幅 FF、パディング PP、ストライド SS のとき、出力幅は:

Wout=WF+2PS+1W_{\text{out}} = \left\lfloor \frac{W - F + 2P}{S} \right\rfloor + 1

要するに:「使える幅 (W+2P)(W+2P) にカーネル FF をストライド SS で何回置けるか+最初の 1 回」。高さも同じ式です。例:W=32, F=3, P=1, S=1W=32,\ F=3,\ P=1,\ S=1 なら (323+2)/1+1=32\lfloor(32-3+2)/1\rfloor+1 = 32 で、サイズが保たれます3×33\times3 カーネルなら P=1P=1 でサイズ維持、が定番)。S=2S=2 なら 31/2+1=16\lfloor 31/2\rfloor+1 = 16 と半分になります。

5. プーリング(pooling)

畳み込み層の後に置くダウンサンプリングの操作です。特徴マップを小さな窓(例 2×22\times2)に区切り、各窓を 1 つの値に集約します。

プーリングの効能は3つです:

  1. 空間の縮小2×22\times2・ストライド 2 なら縦横が半分、要素数は 1/4。後続の計算が軽くなります。
  2. 小さなずれへの頑健性:最大プーリングは「窓のどこかに反応があれば最大値は変わらない」ので、数画素のずれを吸収します。畳み込みの等変性に、プーリングが小さな不変性を足すわけです。
  3. 受容野の拡大:プーリングで解像度を下げると、同じ 3×33\times3 カーネルでも元画像上で見ている範囲(受容野)が実質的に広がります。層を重ねるほど受容野が広がり、局所の模様から大域の構造へと視野が育ちます。

⚠️ プーリングはチャンネル数を変えません(各チャンネル独立に縮小)。サイズだけ変えてチャンネルは保つ、という点が畳み込みとの違いです。

6. 階層的特徴 — なぜ層を重ねるのか

CNN の強さは、層を積むと特徴が階層的に抽象化されることにあります。

層の深さ何を捉えるか
浅い層(入力側)エッジ・色の境界・単純な向きの線
中間層テクスチャ・角・繰り返し模様
深い層物体のパーツ(目・タイヤ・窓)
最も深い層物体そのもの(顔・車)

要するに:浅い層が見つけたエッジを組み合わせて中間層が模様を作り、それを組み合わせて深い層がパーツ、さらに物体——とレゴのように積み上がります。受容野が層ごとに広がる(§5)ことが、この「小さい部品 → 大きい構造」を可能にします。人間が特徴量を設計しなくても、データから階層的な特徴表現を自動で学ぶ——これが古典的な特徴量エンジニアリングに対する CNN の決定的な勝ち筋です。

flowchart LR
    A["入力画像<br/>(H×W×3)"] --> B["畳み込み層1<br/>(エッジ検出)"]
    B --> C["プーリング1<br/>(1/2に縮小)"]
    C --> D["畳み込み層2<br/>(模様・パーツ)"]
    D --> E["プーリング2<br/>(さらに縮小)"]
    E --> F["平坦化<br/>(flatten)"]
    F --> G["全結合層"]
    G --> H["出力<br/>(クラス確率)"]

CNN の典型構成は「畳み込み → 活性化 → プーリング」を数段繰り返し、最後に平坦化して全結合層で分類につなぐ形です。前半(畳み込み部)が特徴抽出器、後半(全結合部)が分類器、と役割が分かれています。

7. 畳み込みは誤差逆伝播で学習できる

「畳み込みは特殊な演算だから別の学習法が要るのでは?」と思いがちですが、不要です。畳み込みは線形演算——入力の重み付き和でしかない——ので、行列積として書けます。

具体的には、入力の各受容野パッチを列ベクトルとして取り出して並べ(im2col と呼ぶ展開)、カーネルを並べた行列を掛けると、畳み込みが 1 回の行列積になります。等価に、カーネルをトープリッツ行列(Toeplitz matrix)(対角線上の値が一定の行列)として組めば、畳み込みは「制約付き・重みを共有した全結合の行列積」そのものです。

線形演算であれば、勾配は 誤差逆伝播法 の連鎖律でそのまま求まります。結論だけ示すと:

重み共有は逆伝播では「同じカーネルが全位置で使われた → 各位置からの勾配を全部足す」という形で自然に処理されます。だから CNN の学習は、全結合と同じ「順伝播 → 損失 → 逆伝播 → 勾配降下」の枠組みにそのまま乗ります。重み初期化や正規化の作法も 重み初期化と正規化 がそのまま効きます。

8. よくある誤解・落とし穴

⚠️ 「畳み込み」と呼ぶが実装は相互相関。 §2 の通り、フレームワークの畳み込み層はカーネルを反転しません(相互相関)。カーネルは学習で決まるので結果は同じですが、数学の畳み込みの定義と混同しないこと。「真の畳み込みなら交換律 fg=gff*g=g*f が成り立つが、相互相関は成り立たない」といった性質の違いは押さえておきます。

⚠️ 「プーリングで情報が消える=悪」ではない。 最大プーリングは確かに正確な位置を捨てますが、それは狙ってやっていること——「数画素のずれは無視したい」という不変性の獲得そのものです。ただし捨てすぎ(過度なダウンサンプリング)は細部が必要なタスク(セグメンテーション等)で害になるので、タスク次第。近年はストライド付き畳み込みでプーリングを置き換える設計も一般的です。

⚠️ 全結合を完全に捨てるわけではない。 CNN でも最終段は全結合(または大域平均プーリング)で「抽出した特徴 → クラス」へ写します。畳み込みは局所的・空間的な特徴抽出に強く、全結合は全特徴を混ぜた最終判断に向く。両者は対立ではなく役割分担です。

⚠️ 「等変性」と「不変性」を混同しない。 畳み込み単体は等変性(ずれが出力に伝わる)、それにプーリングを重ねて初めて小さなずれへの不変性が出ます。CNN が完全な並進不変・回転不変を持つわけではない点に注意(大きなずれや回転には別途データ拡張などが要る)。

まとめ

CNN は「画像には局所性があり、位置が変わっても同じ模様は同じ意味」という事前知識を、局所受容野・重み共有・並進等変性という3つの構造制約としてネットワークに焼き込んだものです。これにより全結合のパラメータ爆発を回避し、データから階層的な特徴を自動で学べます。中身は線形演算なので学習は 誤差逆伝播法 のまま。次は、この部品をどう組み上げて高精度を達成してきたか——代表的アーキテクチャ(代表的なCNNアーキテクチャ)へ進みます。


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

simulations/cnn_convolution.py:合成画像(十字)に縦エッジ・横エッジ検出フィルタを畳み込み、それぞれが対応する向きの輪郭に強く反応する特徴マップを描きます。同じフィルタを全位置で使い回す重み共有並進等価性、そして最大プーリングが特徴マップを半分に縮小しつつ強い反応を残すことを可視化します。この「畳み込み→ReLU→プーリング」の積み重ねが CNN の土台です(代表的なCNNアーキテクチャ)。

畳み込みフィルタによるエッジ検出とプーリング

関連ノート

📝 出典(要最新確認の領域ではないが、定義の裏取りに用いた情報源)