Ch.14
CNN完全攻略:カーネル・ストライド・パディングから骨格の進化まで
基礎畳み込み→モダン骨格
左から右へ、畳み込み・プーリング・残差が積み上がるイメージです。
カーネルが画像を走査して特徴を作り、プーリングで要約し、分類へ。深いブロックでは残差F(x)とスキップxが加わります。
入力畳み込みプーリング全結合出力
基本のCNN(畳み込みニューラルネットワーク)は、AIに画像を理解させた最も偉大な発明の一つです。本章ではCNNの心臓部であるカーネルが画像をどう走査するか、移動幅のストライド、余白を埋めるパディングを、できるだけ丁寧に分解します。
こうした基礎ブロックがどう組み立てられ、深い層でも学習が崩れないResNetや、現代的な巨大アーキテクチャConvNeXtのようなバックボーンへ進化するか、その流れを押さえましょう。
数式の読み方(カーネル・ストライド・パディング)
1. 出力一辺の長さ
2. ストライドとパディング
ストライドが大きいほど重なりが減りマップが早く小さくなる。パディングは端の過小サンプリングを緩和する。
3. 標準Convのパラメータ(バイアス込み)
4. 残差とモダン骨格
のようなスキップは深いCNNを安定化し、ResNet・ConvNeXtなどへつながる。
モダンCNN:畳み込みの基礎からResNetまで
1. カーネル(フィルタ):特徴を探す虫眼鏡のスタンプ
概念: カーネルは普通 や の小さな数字のタイル(行列)です。原画像の上を滑るように動かし、重なる位置のピクセルと掛けて全部足す(畳み込み)ことで、「横線があるか」「色が急に変わる境界があるか」を計算します。
比喩: 『ウォーリーを探せ』で、全体をぼんやり見ず小さな虫眼鏡を当てて部分だけを順に見るのと同じです。虫眼鏡(カーネル)が探しているパターン(例:赤い縞)とよく合う場所を見つけると「いた!」と高いスコア(活性化)をスタンプのように叩きつけます。
2. ストライドとパディング:歩幅と安全クッション
ストライド: 虫眼鏡(カーネル)が一歩で何ピクセル進むかという歩幅です。1なら密に、2なら飛び飛び。歩幅が大きいほど同じ大きさの入力を早く走査でき計算は軽く感じられますが、特徴マップの縦横はより早く小さくなります。
パディング: 畳み込みを重ねると端のピクセルは中央より重なりが少なく、縁の情報が相対的に弱くなり、パディングなしでは解像度もどんどん削られます。周囲に0の仮ピクセルをゼロパディングとして敷き、サイズを保ち、端も公平に「押し」が当たるようにします。
3. プーリング:要点だけ残す要約
概念: 畳み込みの多数の応答から最もはっきりした値を中心に残し、空間サイズを大きく減らします。多くは窓内の最大値だけ残す最大プーリング(必要なら平均プーリングも)。
比喩: ざわつく会議室で全員が同時に話すとき、小さな雑談(背景・弱い応答)は飛ばし、一番大きくはっきりした声(強い特徴)だけ議事録に書く要約のようなものです。データ量は減らしつつ、判断に必要な信号は残します。
4. チャネルと3次元畳み込み:重ねたペストリー
概念: グレースケールはチャネル1枚、カラーは R, G, B の薄いフィルムが重なったチャネル3のデータです。だからカーネルも平面1枚ではなく、入力チャネルの厚みを持つ3Dブロックとして同じ位置をまとめて見ます。層が深くなるほど縦横は小さくなり、代わりに別々のパターンを表すフィルタ(出力チャネル)が64、128、256…と折り重なるペストリーの層のように増えていきます。
重要性
パラメータ共有(効率の極大化)
全結合で画素ごとに別々の重みを置くと、解像度が少し上がるだけで重み数が爆発します。CNNは1つのカーネル(虫眼鏡)を空間全体で再利用します。広い部屋を掃除するとき、タイルごとに掃除員を雇うのではなく、ほうき1本で部屋全体を掃く1人に任せるのに近いです。学習パラメータとFLOPsがまとめて減り、スマートフォン・ライブCCTVのような制約のきつい環境でもビジョンモデルが回せる余地が生まれます。
平行移動への頑健性
犬が中央できちんと座っていても、左の隅に押しつぶされていても、CNNは同じ「犬」の手がかりを探します。固定座標を暗記しているのではなく、カーネルが画像全体を走査してパターンを探すからです。プーリングが加わるとピクセルが少し揺れてもずれても強い応答にまとまりやすく、実務で言う頑健な物体認識に近づきます。(回転・スケールまで完全に不変、という意味ではありません。)
階層的特徴(部分から全体へ)
浅い層は線・角・粗い質感など単純な手がかりだけを取り、深くなると円や輪郭へつなぎ、さらに犬の目・車のホイールのようなオブジェクトの一部へ組み立てます。小さなレゴから大きな形を積む直感と同じです。同じバックボーンを分類から検出(バウンディングボックス)・セグメンテーションへ広げやすく、人間の視覚野の階層処理ともつながります。
ビジョンの共通語であり必須の教養
PyTorch・TensorFlowでは `Conv2d` が当たり前の基本モジュールです。ViT(Ch.05)のようなトランスフォーマーが流行しても、画像を最初に細かく刻むときや局所特徴を取るときは、畳み込みがstem・ハイブリッドの中にまだ混ざります。ImageNet事前学習の重みは論文・サービスの出発点になりがちです。「画像をどう数値にするか」のCNNの文法を押さえて初めて、オープンソースや最新論文を読み、直し、プロジェクトに合わせて改造できます。
使い方
ステップ1:特徴抽出 — にごった水を澄ます
画像は [畳み込み(特徴を探す) 活性化(例:ReLU、負を落とす) (任意)BatchNorm プーリング(要約)] のコンベアを何度も通ります。手前の層が粗い砂(単純な線・色)をこし、奥の層が細かいノイズまで落としてより抽象的な形だけ残す設計が多いです。背景のノイズは減り、どの核となる特徴がどこに強くあるかが載った特徴マップが残ります。
ステップ2:Flatten — レゴを一列に並べる
特徴抽出のあと、チャネル・高さ・幅が重なった3次元特徴マップを、画像ごとに1本の長いベクトルに伸ばします。複雑に積んだ3Dレゴをばらして床に一列に並べるイメージです。バッチ次元(一度に何枚入れるか)はそのままで、1枚あたりの空間・チャネルだけをつなぎます。続く全結合層がクラスごとのスコアを出しやすい形になります。
ステップ3:全結合 — 裁判官の最終判断
伸ばしたベクトルをDense(全結合)層に入れ、クラスごとにロジットを出します。多クラスではsoftmaxで確率にし、学習では交差エントロピーと組み合わせます。「この写真は95%の確率で猫です」という文は、この段階の出力を人が読みやすく包んだものです。
ステップ4:転移学習とファインチューニング
実務では数百層のCNNをゼロからよく学習させません。数百万枚で既に学習されたResNet、EfficientNetなどの事前学習済みバックボーン(名門の骨格)を取り込みます。データが少ないときはバックボーンの重みを固定し、最後の分類ヘッド(裁判官)だけ目的に合わせ付け替えて再学習します。入力サイズ(例:)・RGB正規化(例:ImageNet平均/標準偏差)は事前学習時と同じ前処理に揃えないと性能が出ません。データが多いときは上のブロックを解放してファインチューニングします。ViT・ハイブリッドでも「畳み込みで局所特徴を取る」という直感はそのまま通じます。
まとめ
一行まとめ: CNNはカーネルで探し、ストライドで動き、パディングで端を守り、プーリングで要点を圧縮する仕組みです。
つながり: これらの基礎が発展し、ResNetの残差接続やConvNeXtなど、強力なモダンCNNへつながります。
実務: よくあるのは形状不一致です。出力サイズの式で層ごとに縦横とチャネルを追跡する習慣が伸びます。
解法のヒント
CNNの問題の肝は出力特徴マップのサイズ計算とパラメータ数計算です。この2つの型を押さえれば、巨大なモダン構成も分解しやすくなります。
重要公式1:出力サイズ(一辺)
入力 、フィルタ 、パディング 、ストライド のとき、出力一辺 は
例: 、、パディング1、ストライド1なら でサイズが保たれます。
重要公式2:パラメータ数(バイアス込み)
フィルタ、入力チャネル 、出力チャネル のとき、出力チャネルごとにバイアス1つを含めて
例: 、(RGB)、 なら 個。
概念ドリル
「パディングの主目的に近いのは?
①計算量を増やすため
② 端の情報損失を抑えサイズを保つため
③色空間変換」→ 答え 2
概念ドリル2
「ストライドを1から2にすると、特徴マップの縦横はだいたい…」→ 歩幅が広がり、約半分に縮みます。