プーリング層シミュレーター 戻る
機械学習

プーリング層シミュレーター — CNN

CNN(畳み込みニューラルネットワーク)のプーリング層を体験するツールです。最大プーリングと平均プーリングを切り替え、プールサイズ・ストライド・入力特徴マップを変えると、出力サイズや演算回数、走査アニメーションがリアルタイムで変化し、特徴マップを縮小するダウンサンプリングの仕組みを直感的に理解できます。

パラメータ設定
プーリング種類
窓内の代表値の取り方を選択
プールサイズ k
k×k の窓の一辺の大きさ
ストライド s
窓を1回にずらす画素数
入力特徴マップサイズ N×N
px
プーリングをかける入力マップの一辺
入力パターン
プーリングをかける入力特徴マップの形状
計算結果
出力サイズ
ダウンサンプリング率
出力要素数
学習パラメータ数
演算回数
プーリングの効果
プーリングの走査アニメーション(入力 → 出力)

左が入力特徴マップ、右がプーリング後の出力。黄色い枠が k×k のプーリング窓で、ストライド分ずつスライドしながら、対応する出力セルを順に計算します。

出力サイズ vs プールサイズ
中央行の入力 vs 出力
理論・主要公式

$$\text{outN}=\left\lfloor\frac{N-k}{s}\right\rfloor+1$$

出力特徴マップの一辺の大きさ。N:入力サイズ、k:プールサイズ、s:ストライド。出力は outN×outN になります。

$$y_{max}=\max_{(i,j)\in\text{window}}x_{ij},\qquad y_{avg}=\frac{1}{k^2}\sum_{(i,j)}x_{ij}$$

最大プーリングは窓内の最大値、平均プーリングは窓内の平均を出力します。k はプールサイズ、s はストライドで、プーリング層には学習するパラメータが一切ありません。

プーリング層とは

🙋
CNNの図を見ると、畳み込み層の次によく「プーリング層」っていうのが入っていますよね。あれは何をしているんですか?
🎓
ざっくり言うと「特徴マップを小さく縮める」係だね。畳み込み層が画像からエッジや模様を見つけて特徴マップを作るけれど、そのままだと縦横のサイズが大きすぎて、後ろの層の計算量とメモリが膨れ上がる。そこでプーリング層が、k×kの小さな窓ごとに値を1つの代表値にまとめて、マップをぎゅっと縮小(ダウンサンプリング)するんだ。左のスライダーで「ストライド」を2にすると、出力が縦横とも半分になるのが分かるよ。
🙋
縮めるって、ただ間引くだけじゃダメなんですか?「最大プーリング」と「平均プーリング」が選べるのはなぜ?
🎓
いい質問だね。窓の中の値をどう1つにまとめるかが2種類あるんだ。最大プーリングは窓の中の「一番強い値」だけを残す。畳み込みの後の特徴マップでは、大きい値は「ここにエッジや模様がある」という強い証拠だから、最大値を取れば顕著な特徴がしっかり残る。これがCNNで一番よく使われる。平均プーリングは窓の平均を取るので、特徴がなめらかにぼけて平滑化される。右上のグラフと走査アニメーションで、両者の出力プロファイルがどう違うか見比べてみて。
🙋
プーリングって、畳み込み層みたいに学習で賢くなっていくんですか?
🎓
いや、ここが大事なポイントで、プーリング層には学習するパラメータが1つもないんだ。左の「学習パラメータ数」がずっと0のままなのはそのため。「最大値を取る」「平均を取る」という演算は固定で、誤差逆伝播で変わる重みは存在しない。畳み込み層がカーネルの数字を学習するのとは対照的だね。プーリングが決めるのはプールサイズ k とストライド s というハイパーパラメータだけで、これは設計者が事前に決める。
🙋
学習しない層なのに、わざわざ入れる意味ってあるんですか?
🎓
大ありだよ。理由は2つ。1つは計算削減——ストライド2のプーリングで特徴マップが縦横半分になると、面積は4分の1。深い層の計算量とメモリが一気に軽くなる。もう1つが「平行移動不変性」。最大プーリングでは、特徴が窓の中で1〜2画素ずれても最大値が同じ画素から取られる限り出力が変わらない。つまり、犬が画像の中で少し位置ずれしても安定して認識できる。例えば手書き数字認識のLeNetや、ImageNetで有名なAlexNetも、畳み込みの後に必ずプーリングを挟んでいるんだ。
🙋
最近のモデルでもプーリングは使われているんですか?
🎓
使われ方は少し変わってきたね。古典的なCNNは「畳み込み+最大プーリング」をワンセットで何度も重ねていた。最近のResNetなどは、ダウンサンプリングを「ストライド2の畳み込み」で代用して、途中のプーリングを減らす設計も多い。ただし、ネットワークの最後で特徴マップ全体を1点に潰す「大域平均プーリング(Global Average Pooling)」は今でも定番だよ。プーリングは形を変えながら、CNNの基本部品であり続けているんだ。

よくある質問

プーリング層は、CNN(畳み込みニューラルネットワーク)の中で特徴マップを縮小(ダウンサンプリング)する層です。畳み込み層の後に挿入し、k×kの小さな窓を特徴マップ上でストライド s ずつスライドさせ、各窓を1つの代表値に置き換えます。これにより空間サイズが小さくなり、深い層の計算量とメモリを大きく減らせます。出力サイズは outN = floor((N−k)/s)+1 で決まります。
最大プーリングは各窓の中の最大値だけを出力します。窓内で最も強く反応した活性値、つまり「その特徴が存在する最も顕著な証拠」を残すため、エッジや模様などの顕著な特徴を保持しやすく、CNNで最もよく使われます。平均プーリングは窓内の全画素の平均を出力するため、特徴を平滑化(ぼかし)します。背景を含めて全体をなだらかにしたいときや、最終層の大域平均プーリングで使われます。
ありません。プーリング層は「最大値を取る」「平均を取る」という固定の演算であり、学習で最適化される重みは1つもありません(学習パラメータ数 = 0)。これは重みを学習する畳み込み層や全結合層との大きな違いです。プーリング層が決める要素はプールサイズ k とストライド s というハイパーパラメータだけで、これらは設計者が事前に決め、学習中は変化しません。
プーリングは、入力がわずかに平行移動しても出力がほとんど変わらない「平行移動不変性」をネットワークに与えます。最大プーリングでは、窓の中で特徴が1〜2画素ずれても最大値が同じ画素から取られる限り出力は変わりません。これにより、物体が画像内で少し位置ずれしても安定して認識できます。ただし不変性は窓のサイズ程度までで、大きなずれには別の工夫(データ拡張など)が必要です。

実世界での応用

画像認識AI(CNN):プーリング層は、物体検出・顔認識・医療画像診断・自動運転の画像系AIで広く使われる基本部品です。手書き数字認識のLeNet、ImageNetで一世を風靡したAlexNetやVGGは、いずれも「畳み込み層+最大プーリング層」をワンセットで何度も重ねた構造でした。プーリングが空間サイズを段階的に縮めることで、ネットワークは局所的なエッジから、より広い領域の物体パーツや全体形状へと、受容野を広げながら特徴を抽象化していきます。

計算量とメモリの削減:高解像度の特徴マップをそのまま深い層まで持ち越すと、計算量とメモリが爆発します。ストライド2のプーリングを1回かけるだけで特徴マップの面積は4分の1になり、後続の全層の演算量とメモリが大きく軽くなります。これにより、限られたGPUメモリでも深いネットワークを学習でき、スマートフォンなどのエッジデバイスでの推論も現実的になります。

大域平均プーリング(Global Average Pooling):近年のCNNでは、ネットワークの最終段で特徴マップ全体(H×W)を1つの値に平均する「大域平均プーリング」が定番です。これは全結合層の代わりに使われ、膨大なパラメータを削減しつつ過学習を抑え、特徴マップとクラスの対応を分かりやすくします。クラス活性化マップ(CAM)による可視化も、この大域平均プーリングを土台にしています。

信号処理・時系列データ:プーリングの考え方は画像だけでなく、1次元の音声・センサー信号にも応用されます。1次元の最大プーリングや平均プーリングで時系列を間引くことで、音声認識や異常検知のネットワークが時間方向のずれに頑健になり、計算も軽くなります。ダウンサンプリングという発想は、CAEの計算結果のマルチグリッド的な粗視化とも通じる、工学に共通の考え方です。

よくある誤解と注意点

まず多いのが、「プーリングは学習している」という誤解です。プーリング層には学習可能な重みが1つもなく、学習パラメータ数は常に0です。誤差逆伝播では、最大プーリングなら「最大値を取った画素にだけ勾配を流す」、平均プーリングなら「窓内に均等に勾配を分配する」という固定のルールで勾配が伝わるだけで、層自体が賢くなることはありません。賢くなるのは重みを持つ畳み込み層や全結合層です。プーリングはあくまで固定のダウンサンプリング操作だと理解しておきましょう。

次に、「出力サイズの計算で端数を切り捨てる」点の見落としです。出力サイズは outN = floor((N−k)/s)+1 で、floor(切り捨て)が入ります。入力サイズ N とプールサイズ k、ストライド s の組み合わせによっては、入力の端のほうの数画素が、どのプーリング窓にも入らず無視されることがあります。これに気づかないと、計算したつもりの出力サイズと実際のサイズがずれ、後続の層の形状不一致エラーにつながります。パディングを入れてサイズを揃える設計もよく使われます。

最後に、「平行移動不変性を過大評価する」ことです。プーリングが与える不変性は、せいぜい窓のサイズ程度の小さなずれに対するものです。物体が画像内で大きく移動したり、回転・拡大縮小したりする変化には、プーリングだけでは対応できません。大きな位置ずれや姿勢変化に強くするには、学習データを増やすデータ拡張(平行移動・回転・反転)や、より大域的な仕組みが必要です。プーリングは「小さなずれを吸収する保険」であって、万能の不変性を与える魔法ではない、と捉えるのが正確です。

使い方ガイド

  1. 入力特徴マップのサイズを設定します。例えば32×32ピクセルのRGB画像から抽出された特徴マップを想定し、gridNで28×28を指定します
  2. プールサイズ(2×2または3×3)とストライド(1〜3)を選択します。ResNet50では3×3プール・ストライド2が標準で、空間解像度を50%削減します
  3. 最大プーリングと平均プーリングを切り替えて比較実行し、出力サイズ・ダウンサンプリング率・演算回数の変化を確認します

具体的な計算例

VGG16の第1プーリング層を例に:入力特徴マップ64×64、プールサイズ2×2、ストライド2の場合、出力サイズは(64-2)/2+1=32×32となります。ダウンサンプリング率は75%(元の要素数4096から1024へ削減)。演算回数は各出力位置で4要素の比較または平均計算となり、合計4096回の演算が必要です。AlexNetでは5×5プール・ストライド3を使用し、227×227入力から55×55出力(95%削減)を実現しています

実務での注意点