1 x 1 畳み込み (1 x 1 Convolution, 点単位畳み込み層)

1. 1 x 1 畳み込み (1 x 1 Convolution) とは [概要]

1 x 1 畳み込み (1×1 Convolution, 点単位畳み込み層)とは,各カーネルの空間サイズが [1 x 1] である,CNN向け2D畳み込み層である.「2D畳み込み層の基本型 (畳み込みの記事の2節)」と同じ定式化であり,つまりは,カーネル空間サイズが [1 x 1] になっている畳み込み層である.深さ単位分解可能畳み込み層や,SE-Net (Squeeze-and-Excitaion Networks)など以降に新潮流となった「畳み込み層カーネルの分解」の文脈では,空間グリッド上の1点のみにチャンネル方向に畳み込むものであるため,点単位畳み込み層 (pointwise convolution)ともよく呼ばれる.

この記事では,1 x 1 畳み込み層の処理手順をおさえたのち(2.1節), 主要な2つの用途(2.2節)として,「1. 画素単位の識別器 (2.2.1節)」と「2. チャンネル方向の次元削減 (2.2.2節)」について紹介する.

1 x 1 畳み込み層は,シンプルなアイデアながら,深層学習流行初期には「[1 x 1] 空間サイズでの使用」を誰も思いつかなかったのと,2節で呼ばれるような用途を狙って使用することから,「1 x 1 畳み込み層」と区別されて呼ばれることとなった.

2. 1 x 1 畳み込み の処理と用途

2.1 処理の内容

1 x 1 畳み込み層 (1 x 1 Convolution)
図1. 1 x 1 畳み込み層 (1 x 1 Convolution)

1×1 畳み込み層の処理(図1)では,入力特徴マップ各画素のCチャンネル画像に,[1 x 1] x Cチャンネルの画像を畳み込む.

カーネルサイズが[1 x 1]であるということは,周辺の画素のコンテキストは一切畳み込まないということである(=チャンネル方向にしか,応答の重みづけ伝搬が行われない) .これは,VGGNetなどのCNNバックボーンでいえば「画素ごとに,全結合層の順伝搬を行う」ことに相当するとみなせる.従って,用途1 (2.2.1節)のように,FCN提案以降の「密な推定」タスクにおいて,終盤層の識別器として用いられるようにもなった.

2.2 用途

2.1.1 用途1: 「画素単位での識別器」としての使用

セマンティックセグメンテーション向けの,FCN(完全畳み込みネットワーク)の提案論文では,VGGNet終盤の全結合層を,1 × 1 畳み込み層に差し替えることで,終盤の特徴マップ ([14 x 14] や [7 x 7] 程度の空間サイズ) に対して, 全画素で,1 × 1 畳み込み層による識別を個別に実行するという方法が提案された.つまりは,特徴マップ上の各1グリッドにおいて,深さ方向の畳み込みのみを個別実行するという処理である.

これ以降,物体検出むけのSSD(Single Object Multishot Detector)の終盤層(クラス識別+オフセット回帰)や,セマンティックセグメンテーション向けのFCNの終盤層において,空間サイズが狭まった特徴マップに対し,1 x 1 畳み込み層を識別器として最後に使用することが試された.

ただ,これらの2タスクでは,その後は画像Encoder-Decoder構成にして解くことも定番化していく.より具体的には,Feature Pyramid NetworkU-Net型の「砂時計型マルチスケール構成」にして,出力画像を入力画像サイズまで復元する方針が,定番となっていった.これに伴い,入力画像サイズを復元していく上では,Decoder側では転置畳み込みで空間サイズも(同時に)拡げていくことが多くなり,1 x 1 畳み込み層の出番はなくなっていった.

2.1.2 用途2: 「チャンネル方向の次元削減」としての使用

また,1 x 1 畳み込み層は,チャンネル方向の次元削減の目的でもよく用いられる.また,周辺画素を畳み込まないので,「チャンネル方向の(全結合的な)処理」になっている.ブロック内にボトルネック層部分を作りたい場合い,チャンネル方向次元削減の目的で 1 x 1 畳み込み層がよく用いられる (ResNetブロックやInceptionブロックなど).

これは,Network-in-Network [Lin et al., 2013]で提案されたのち,そのアイデアがInceptionNet v1で採用されたことをきっかけに,広く使われるようになった用途である.

例えばVGGNetでは,終盤層になると,特徴マップが128チャンネルになっており,カーネルも128チャンネル× k個必要になってしまう.これは,畳み込み層の演算コストだけでなく,ReLUやバッチ正規化の処理負担も大きい.よって,例えば前半~中間あたりの層で,10チャンネルの 1 x 1 畳み込み層を挿入すると,特徴マップを10チャンネルまで減らすことができ,以降の層の計算負荷の削減および,畳み込み層のチャネル数削減によるパラメータ節約が達成できる

※ CNN終盤層だと,既に特徴マップの空間サイズは [14 x 14] ,[7 x 7]くらいでかなり小さいので,あまり効率化の効果は期待できない.

また,Encoder-Decoder全体やブロック中央部の「ボトルネック層」部分に,1 x 1畳込み層は用いやすい.ResNetブロックでも,ボトルネック層を形成するために, 256→64チャンネルに次元削減し,そのあと再度64->256チャンネルに戻す際に,毎回 1 x 1 畳み込み層を使用している.InceptionNetDenseNetでも,ブロック内の次元削減目的で,1 x 1 畳み込み層が用いられている.Vision and Languageや,動画行動認識に,自動運転のマルチモーダルセンサー処理(画像+デプス画像)など「2種類入力を別のEncoderで処理するマルチモーダル入力なネットワーク」でも,それらのEncode後にボトルネック層を配置することが多い.(※ 詳しくはボトルネック層の記事で書きたい)

※ 「1 x 1 畳み込み層 = ボトルネック層」と取り違えている人もみかけるが,そうではない.正確には,「AutoEncoderや,Encoder-Decoderの真ん中で,前後の層に比べて,最も低次元化されている中間層( = 画像の場合(1 x 1) の特徴マップ)」のことをボトルネック層と呼ぶ.両者は別物であることに注意.

関連書籍