😎

『CNNで畳み込みを繰り返したら最終的にどの画像も同じ値になるのでは?』と勘違いした話

に公開

『CNNで畳み込みを繰り返したら最終的にどの画像も同じ値になるのでは?』と勘違いした話

はじめに

AIについて学習していれば必ず聞くであろうCNN。
画像認識タスクの王道手法(今はViTかもしれませんが)として、その仕組みを知る機会が一度はあるのではないでしょうか。

手法を簡単に説明してしまえば、

  1. 畳み込み層のカーネルで特徴量を抽出・サイズを小さくする(カーネルが1x1、マージンなしの場合はサイズはそのまま)
  2. プーリング層で決められたルールに従ってサイズを小さくする
  3. この2層を積み上げる(2012年のAlexNetがその走り)
  4. 全結合層で積み上げた結果を1次元にし、「○○らしさ」という特徴量に変換する

といった処理ですが、私がこれを初めて教わった時はどうも腑に落ちませんでした。

というのもこの話を聞いた時私は、
「畳み込み層とプーリング層でサイズを小さくする操作を続けていたら、最終的に小さくなりすぎて他の画像と区別ができなくなるのでは?」と思いました。

畳み込みを学んだ時に出されたイメージ画像。フィルターを通すだけでサイズが5x5から3x3になっている。最終的にはただの1つの数値になってしまうのか?と思いました。

結論から言うと全くそんなことはないのですが、これからこの概念を学ぶ人が同じ轍を踏んで時間をロスしないように自分が勘違いしたポイントをまとめました。


勘違いポイント1: フィルタ処理後のデータは「平面」ではなく、「厚み」がある

まず最初の勘違いは、データの捉え方についてです。
教科書の図だけを見ていると、画像データはいつまでも「平面(2次元)」のまま処理されているように見えてしまいます。しかし実際には、コンピュータの中で画像データは常に (縦の長さ, 横の長さ, 厚み) という3つの数字のセットで管理されています。
※専門用語では (Height, Width, Channels) と呼びます。

処理が進むにつれて、この3つの数字がどう変わっていくか、一般的なCNNモデル「VGG16」を例に見てみましょう。

段階 データの形 (縦, 横, 厚み) イメージ
1. 入力画像 (224, 224, 3) 縦横に大きいが、厚みは3(RGB)だけの薄い板。
2. 浅い層 (112, 112, 64) 縦横は半分になったが、厚みは64枚に増えた。
3. 中間の層 (56, 56, 256) 縦横はさらに小さく、厚みは256枚のブロックに。
4. 深い層 (7, 7, 512) 縦横は切手サイズだが、厚みは512枚もある細長い棒のような塊。

このように、CNNの処理が進むにつれて、データは「薄く広い板」から「太く短い棒(特徴量の塊)」へと変化していきます。
「畳み込みで小さくなる」というのはあくまで縦横の話であって、実はその分、情報の厚みは増していたのです。

勘違いポイント2: フィルタ自体も「ペラペラの正方形」ではなく、「入力データと同じ厚みの直方体」である

個人的に一番腑に落ちなかった理由、そして最大の勘違いがこれでした。

教科書の図解では、フィルタ(カーネル)はたいてい「3x3」のようなペラペラの正方形で描かれています。
そのため、よく使われるフィルタのサイズとして「1x1」が存在すると知った時、当時の僕は、

「1x1なんてフィルタを使ったら、ただの掛け算で全部同じような計算結果になってしまうじゃないか?」

と思いました。

しかし、これは大きな誤解でした。
実際には、フィルタは「入力データの厚み」と同じだけの奥行きを持っています。つまり、「ペラペラの正方形(2次元)」ではなく、「細長い直方体(3次元)」の形をしているのです。

1x1のフィルタであっても、そこには入力データと同じだけの「厚み(奥行き)」があり、奥行きごとに異なる数値を持っています。だからこそ、情報を圧縮したり特徴を統合したりする重要な役割を果たせるのです。

勘違いポイント3: フィルタは「1種類」だけ使うわけではない

初めてCNNの畳み込みを学んだ時、図示されたカーネル(フィルタ)は平面で、しかも1つだけ描かれていることがほとんどでした。
そのため、私は以下の画像を見た時に混乱しました。


File:LeNet-5 architecture.svg by Zhang, Aston; Lipton, Zachary C.; Li, Mu; Smola, Alexander J. is licensed under CC BY-SA 4.0

「なぜ、畳み込みをした後(右側)の直方体は、こんなに厚みが増えているんだろう?」と。

この答えは非常にシンプルでした。
「異なる種類のフィルタを何十個、何百個と用意して、一気に使っているから」 です。

  • フィルタを1つ使えば、出力される特徴マップ(板)は1枚。
  • フィルタを64個使えば、出力される特徴マップは64枚(厚み64)。

つまり、出力データの厚みは「いくつのフィルタを使ったか」で決まります。
1回の畳み込み処理で、私たちは1つのフィルタだけでなく、役割の異なる多数のフィルタをセットで適用していたのです。これを知った時、ようやく図の意味が理解できました。


まとめ

わかってしまえばその通りなのですが、読み物によるインプットだけだとどうしてもこの仕組みをイメージするのは難しいと感じました。特に学び始めに読む本は情報量をあえて減らしシンプルにしているので尚更沼にはまりそうです。(私もその一人でした。)

この記事を通じて少しでもお役に立てれば嬉しいです。

Zamio テックブログ

Discussion