畳み込みニューラルネットワーク (CNN)

1. CNN の概要

畳み込みニューラルネットワーク( Convolutional Neural Networks : CNN / ConvNet)は画像認識で用いられるDeep neural neworkの1種である,CNN は,畳み込みカーネル(convolutional kernel)をメインの学習可能な層として用いるDeep Neural Networkのことを指し,その中でも,とりわけクラス識別問題に用いるものがCNNと初期は呼ばれていた.その後は,物体検出やセマンティックセグメンテーションなどいろんな問題向けのネットワークにおいて,VGGNetやResNetなどのCNN構造が「Encoder ( 画像から特徴ベクトルを抽出する部分ネットワーク)」として採用され,その際にはネットワークがEncoderに利用しているCNN構造のことを「ネットワーク中のBackbone (背骨) 部分」と呼ぶようになった (1.2節).

CNNは「重み共有 (weight sharing)」の仕組みを採用し,全結合層の層間全ニューロン同士の接続に比べて省モデル化と高認識精度化を実現したことで,DeepなNeural Networkでも,画像認識応用が現実的になった.また,畳み込み操作とPooling層の恩恵により,画像中のどこに対象物体が登場しても認識可能である並進不変性 (translation invariance) も保持している.そして,Deep Learning登場以前の画像認識システムと同様に同様,対象物体の局所変形 (local deformation)に対して頑健な学習も行うことが可能である.

CNNは,入力画像が各層の処理を経ていく中で,各畳み込み層の(学習済み) 畳み込みカーネルが,画像の特徴を階層的にとえらえてゆく.CNNの順伝搬では,前層の$i-1$番目の畳み込み層の各カーネルに各位置が応答した結果である 特徴マップ (feature map)に対して,次の$i$番目の層の畳み込みカーネル群によって畳み込みを行い,更に別の特徴マップを得る.この「特徴マップの特徴マップを獲得する作業」を何層も繰り返すことにより,CNNは画像の特徴を階層的にとらえていく.

tanh,シグモイド,ReLuなどの非線形層は,畳み込み層で捉えた応答のうち,値の高い場所だけ強調してよりシャープにする微分可能関数を用いる.高い値だけ強調して活性化させるので,これらの関数は活性化関数とも呼ばれる.

こうしてCNNの学習の結果,教師ラベルに関連した場所の応答が強くなるように特徴マップが順に洗練されていくことで,CNNの最後の方の層では,対象物体の識別がしやすくなった「予測クラスの空間領域だけ畳み込み結果の重みが高くなった,高レベル特徴の特徴マップ」が得られる.

1.1 CNN が捉えるもの:大規模データから得られる階層的な画像特徴群

1つ前の世代の画像認識システムの代表である「マルチクラスSVM」や「Random Forest」などを用いたシステムでは,多くとも10~30クラス程度の識別モデルを高精度に学習するのが限度であった(Pascal VOCなどのコンペで取り組まれていた問題難易度).それに対して,画像認識用のCNNでは,階層的で深い表現を学習できるようになったおかげで,例えば1000クラス程度以上の多種多様な物体クラスを,1つの大規模CNNネットワークだけで一挙に識別できるようになった (ISLVRC (ImageNetデータセット)で取り扱われるようになった問題難易度).ただし,その分,多層のネットワークで各層に128個や256個のカーネルを持つので,パラメータ数が非常に多い「大規模モデル」でもあり,過学習には弱いので正則化が非常に重要となる.

学習済みのCNNでは,順伝搬を行うと終盤の方の層の畳み込み/Poolingを終えた特徴マップほど,学習した物体全体を示す高レベル特徴 (high-level feature)に応答する畳み込みカーネルが学習され,逆に序盤の層の特徴マップでは「エッジ特徴」「色特徴」などの低レベル特徴 (low-level feature)のみが,各畳み込みカーネルに反応する.

畳み込み後の特徴マップ上の各位置$(x,y)$のもつ$C$(チャンネル数)次元の特徴ベクトルは,それまでの畳み込み層(や他の非線形化層やプーリング層などでの処理)で獲得して収集してきた,受容野 (receptive field) の範囲全体の情報を,その座標$(x,y)$に対して集約した「周辺コンテキスト特徴ベクトル」に相当する.

CNNは,畳み込み層を用いたパラメータ共有(parameter sharing)まとめ重み(tied weight)のおかげで,全結合メインの旧来の「三層ニューラルネットワーク」と比べると,画像認識用途において「処理効率化 + メモリの省力化」を実現でき,Deep Neural Networkの応用が現実的となった.また,DropOutやBatchNormalizationなどの正規化技術の発展のおかげで,深層化(※ 4層以上) しても旧来の3層ネットワーク時代の頃のように過学習しないで大規模モデル化でき,大量のデータや大量のクラスに対するビッグデータ問題にニューラルネットを応用できるようにパラダイムシフトしたのである.

また,その後のResNet論文における Residual Connection (2.2節 B)の提案により,更に深いネットワーク(および深い表現)が学習ができるようになり,更に認識精度が向上した.初期によく用いられてAlexNetやVGGnetなどのCNNは,「深い」と言っても,せいぜい7~10層程度の深さであったが,ResNetの登場で50層-150層にもおよぶ深いネットワークを,勾配損失しないで学習できるようになり,ResNet登場以降,CNNは初期の頃より更にデータ量もスケールできるようになった.

1.2代表的なバックボーン構造

CNNは,当初はImageNetを用いた大規模クラス識別のタスクに使用されていた.それが,その後は物体検出やセマンティックセグメンテーションなど,他のタスクにも特徴抽出部分(バックボーン)としてAlexNetやVGGNetが使われ始めた.今日では,大規模データセットで学習済みのCNNの重みを固定して,バックボーンとして特徴抽出部に用いるのが通例である.

CNNの代表的なバックボーンのネットワーク構造には,たとえば以下のようなものがある:

  • AlexNet
  • VGGNet
  • GoogleNet
  • ResNet
  • DenseNet
  • SENet(Squeeze-and-Exitation Networks)
  • Deep Layer Aggregation

これらの代表的なネットワーク構造は,手動でエンジニアリングされて設計されてきた.本記事では2節以降で,これらの代表的なバックボーン構造を構成する要素.および学習方法についてまとめていく.

※ 近年では最適なネットワーク構造を自動的に探索するニューラル構造探索(Neural Architecture Search)の研究も活発であるが,この記事では対象外とする.

2. CNN の構成要素

この2節では,1.1節で列挙したような代表的なCNNのネットワーク構造で用いられる部品として,層の種類(2.1節),層間の接続(2.2節)について,それぞれ代表的な構成要素を述べる.

2.1 層の種類

CNNでは「畳み込み層/非線形化層で得られた特徴マップをプーリングする」ことを複数回繰り返す順伝搬を行うことで,複数解像度で画像の特徴をとらえた特徴マップを計算することができ,その階層的な表現が旧来の画像認識を大きく量がすることになった.この2.1節では,そのCNNの構成要素を,機能別に簡単に紹介する.(End-to-EndにCNNをSGDで学習するためには,微分可能な関数のみが各層で使用可能である点に注意.)

A. 畳み込み層

CNNでパターンマッチングを行うための中心的な構成要素が畳み込み層(convolutional layer)である.各畳み込み層では,その時点までの順伝搬で再生された$M$チャンネル分の特徴マップに対して,畳み込みを行う$k \times k$のカーネル$N$個を用意しておく.そして,入力の$M$チャンネル分の特徴マップに対して畳み込み処理を行い,$N$個のテンプレートパターンに対する応答である出力の特徴マップを得る.

この畳み込み層は,古くからの画像処理用の2次元畳み込み操作をそのまま学習可能な層としてニューラルネット向けに用いたものである.畳み込みに用いる学習可能な$n \times n$の$2次元関数のことを,古典的な画像処理と同様にカーネル (もしくはフィルタ) と呼ぶ.ただし,畳み込み層とは呼ぶものの,実際のCNNの多くではCross-correlation(相互相関)を用いて畳み込み層が実装されている(相互相関は,カーネルへのアクセスを逆順にする点が,畳み込みと異なる).

ImageNetなどで学習済みのCNNでは,(既に述べたように) 各畳み込み層において入力に近い方から順に,「低レベル特徴」=>「中レベル特徴(パーツ単位)」->「パーツの組み合わせに相当する特徴(モチーフ単位)」->「高レベル特徴(物体全体に対する物体検出器のような応答)」がそれぞれ学習されていることに(おおよそ)相当する.そしてCNNを順伝搬を行うことで,これらの学習済みパターンからの応答を全て満たしたクラスが,最後に識別結果として出力される.

B. 全結合層

全ニューロン同士を線形結合でつなぐ層を,全結合層(fully connected layer)もしくは線形層 (Linear layer)と呼ぶ.古典的な3層ニューラルネットワークの時代から用いられているもので,2層のあいだの全ニューロン同士に,重みとバイアスを用意する.

CNNにおいては,終盤の層でのみこの全結合層を用いることが多い.畳み込み層だけ繰り返していると,特徴マップが$C \times W \times H$の3階テンソルのままであり,これでは出力の$N$クラスの各確率を示すベクトルと次元数が合わないし,学習のためのロスも計算できない.そこで,CNNの終盤では全結合層を利用して平坦化することで,$C \times W \times H$のテンソルの特徴マップから$N$次元ベクトルへ変換し,最後の出力層との次元調整を行う.

C. プーリング

直前までに得ている特徴量マップに対して,Max, Averageなどの操作を用いて局所範囲ごとに(例:$2 \times 2$の範囲ごとに),代表値1つだけを選ぶ処理を行うことで,局所範囲内の代表値のみからダウンサンプリングされた特徴マップを得る処理をプーリング(Pooling)とよぶ.

CNN向けの代表的なプーリングには平均値プーリング(Average pooling)最大値プーリング(Max pooling)がある.それぞれプーリング範囲の最大値/最小値だけを残す操作である.プーリングを行うことで特徴マップ上の各$(x,y)$がとらえる情報の元画像における対応範囲が広くなっていく(= 受容野が広まる)こととなる.

ちなみに,受容野を広くするプーリング以外の方法としては,画像セグメンテーション問題向けに広範囲のコンテキストを効率よく計算する目的で用いられる膨張化畳み(Dilated Convolution)があげられる.

D. 活性化関数

CNNの畳み込み層や全結合層は,基本的には「重みとバイアスのみを用いた線形の変換」のみであり,これらだけでは表現力に限界が出る.そこで,畳み込み/全結合層の処理のあとに,各フィルタの応答をより強調して小さい応答は抑える目的で,ReLU などの活性化関数が全ニューロンに対して個別に適用される.

ReLU 

ReLU (Rectified Linear Unit)は,汎化性能低下の悪影響をあまり受けないままに,学習も高速に行える性質を持つ.Reluは,マイナスの応答を全て0として出力することにより勾配消失問題(banishing gradient problem)を回避でき,それでいて旧来のニューラルネットワークのシグモイド関数やtanhを精度でも上回る.よって近年は,ReLUとその拡張手法 (LeakyReLU や PReLUなど) が,非線形層としてよく用いられる.

SoftMax

クラス識別問題のCNNの出力直前では,Softmax関数を用いたクラス識別値の確率化 (全体の合計を1にする)が行われる.softmaxは $\arg \max$をソフト化して微分可能にした以下の関数である:

\begin{align}f(x_i) = \frac{e^{x_i}}{\sum_{j}^{K} e^{x_j}}\end{align}

ここで,softmax関数に入力する$K$個のニューロンのうち,$x_i \in \mathcal{R}^K$が,$i$番目(クラス$i$)のニューロンの値であり,分母の「全クラス分のexponentialの和」により正規化される.このsoftmax関数により各クラスの出力確率が合計で足すと1になるように調整されるので,softmax後の出力をカテゴリカル分布として (全体の和が1の)$K$次元確率値ベクトルとしてCNNが出力できるようになる.

また,SGDでCNNをクラス識別ラベルから学習する際,そのロス関数としては Cross Entropy ロス関数が標準的に用いられる.

2.2 CNN の層間接続による拡張

A. スキップ接続

スキップ接続 (skip connection) はセマンティックセグメンテーション向けのネットワーク構造として当初提案されたFCN (Fully Convolutional Network) や,セグメンテーション目的の標準的ネットワーク構造の1つとなったUNetなどで用いられ始めた仕組みである.

スキップ接続の目的は,「何度も畳み込み層とPooling層を経て消失してしまった低レベル特徴も,後半の層に直接移動させてしまえば生き残らせる」ことである.離れた層間で特徴マップをコピーして接続させ,接続したあいだの層は順伝搬と逆伝搬をスキップする.

関連記事:画像のセマンティックセグメンテーション | CVMLエキスパートガイド

B. 残差接続 (residual connection) と ResNet

ResNet [He et al., 2016]の論文では,過去のバックボーンであるVGGNetなどよりも更に多層化したCNNを学習できるようにする目的で,残差接続 (residual connection)を用いた残差ブロック (residual block)が提案された.50~150層もの非常に深いCNNが初めて学習できるようになった(※ ResNet論文で用いられている残差ブロック内の「identity connection」という呼び方は,間の層をスキップして繋げる「スキップ接続」と同一のものを指しているのだが,[He et al., 2016] では別名が付けられてしまっているのでややこしい).

Residual block
図:Residual Block

残差ブロックは「入力から出力への残差関数$F$」を,スキップ接続を利用することで,ブロック毎に学習できるようにしたものである.入力$\bm{x}$をそのままブロック出力へ伝えるスキップ接続を利用し,学習できる(わずかな)残差関数$F(\bm{x})$ を学習する.ブロックの最後に,スキップ接続で到達したブロック入力$\bm{x}$と$$足し合わることで出力は$relu(F(\bm{X}) +\bm{x})$となる.これにより,通常のCNNと比べて,それぞれの残差関数に少しずつだけ誤差を逆伝播できるようになり,とても深いCNNを初めて学習できるようになったわけである.

C. 更に「長い」スキップ接続

ResNetのスキップ接続は,残差ブロック単位での「短い」スキップ接続であるが,更に「長い」層間をつないだスキップ接続の提案がその後続いた.Highway Network [Srivastava et al., 2015] は層間の長いスキップ接続であり,ResnetはこのHighwayNetの特殊系と捉えることもできる.また,Resnetの拡張モデルがたくさん提案された中で,DenseNet (Densely connected CNN)では,あらゆる長さのスキップ接続で,全部の層の間を互いに接続することが提案された.

また,画像セグメンテーション向けのFCNでも,U-Netなどのように,序盤の層と終盤の層をつなぐ,長いスキップ接続を使用するネットワークが提案されよく用いられている.U-Netはセグメンテーション向けのアーキテクチャだが,その後,pix2pixなどの画像変換モデルでも使用されている.

3. CNNの学習

CNNの学習は,フィードフォーワード型のニューラルネットワークに対して,ロス関数から得られる誤差を逆伝搬 (back propagation)することで行う.これは伝統的なニューラルネットである3層パーセプロンと同様である.しかしその過去の時代とは異なり,CNNは4層以上の多層モデルであり,パラメータ数もより多く,モデルの学習対象の学習データセットも巨大である.したがって,学習サンプル全てを同時にメモリ上にロードし勾配降下法により学習することは,計算資源的に無理がある.

そこで,CNNや深層学習全般では確率的勾配降下法 (Stochastic Gradient Descent: SGD)を用いて,バッチ毎の勾配でオンライン学習を行うバッチ学習を標準的に用いる.SGDでは,学習データからランダムサンプリングした N= 8 ~ 64個ほどのサンプル (この塊$N$個をバッチと呼ぶ)のみを用いて,少しずつ確率的に近似学習を行う.

3.1 SGD最適化の改善の工夫

ディープニューラルネットをSGDでバッチ学習する際の問題として,狭い谷にはまると勢いが徐々になくなって谷から抜けられなくなり局所最小解で学習が終わってしまう点がある.

そこで,1つ前ステップにおける重み更新幅 (=速度)の$\delta w^(t))$も勾配更新時に使用するモーメンタム項(慣性項)も,SDGの更新時に追加して用いることが標準的である.モーメンタム項を用いると,まず目的関数の更新が速くなり,収束までのステップ数が減ることになる.加えて,狭い谷に一度はまったときも,勢い(慣性力)を失わずに谷から抜け出て大域解探索を継続することが可能となる.

また,モーメント項の係数$\mu$は固定値で経験的に手動で決めるものであったが,そのモーメント係数を適応的に推定しながらSGDを行うADAM (ADapitve Moment Estimation)アルゴリズムが提案された[Kingma+ 2014].現在ではこのADAMが,適応的SGDアルゴリズムとしてSGDでの学習時に標準的に使用される.

3.3. データ拡張

ディープニューラルネットワークは,パラメータが大量にある大規模モデルであり,これによって深く階層的な表現を学習できるのが利点であるのだが,その反面,データ量/分布に対してパラメータが多すぎて(Overparametarized)になってしまい過学習しがちである欠点も持つ.

ディープニューラルネットのパラメータを減らすことはなかなかできないので,過学習を防ぐには少しでも多くのデータが必要である.しかし,現実には教師あり学習で画像認識CNNを学習する時には,最低でも数万枚の画像を用意する手間が発生するのでラベル付けのコストが非常に高い.

そこでよく行われるのが,データ拡張(Data Augmentation)である.データ拡張では,データセットの各(画像,ラベル)のペアに対して,画像側を画像処理をもちいて複数枚ランダムに変形(Transform)させた画像を新たに作成する.たとえば,<ライオン画像, “ライオン”>という学習サンプルペアに対して,ライオン画像を左右反転させた画像を作ったり,アフィン変換で少しライオン領域を変形させたり,画像にランダムなノイズを加えりするなどの「画像処理」を行う.こうして,追加のラベル付けは行わずにサンプル画像を人工的にランダムに増やすことでデータセットのサンプル数合計を増やすわけである.

また,他のデータ拡張の手段としては,(クラスごとに)深層生成モデルを学習し,その生成モデルが生成したサンプル画像をデータ拡張を行ったデータとして識別器の学習に用いることもできる(※ Few-shot Learningなどでよく見られるアプローチである).

3.4 バッチ正則化 (batch normalization)

CNNの学習時には正規化および学習の高速化の目的で,バッチ正規化 (Batch Normalizaiton)を行うことが多い.これもDropoutなどと同じく,ディープニューラルネットワークの過学習を防いで汎化性能を高めるテクニックの1つである.バッチ正則化は,学習時間の短縮目的と表現の正則化が達成できるので,好んで用いらている.

3.4.1 バッチ正規化の目的

バッチ正規化「層」は,学習中のSGD中に得る毎回のミニバッチ毎に,各層の出力でチャネル単位でミニバッチ全体の平均・分散を用いた正規化を行い,その正規化値をスケーリングする$\gamma$とシフトするバイアス項$\beta$の2つをパラメータとして学習する層である.このバッチ正則化層は,活性化関数 (ReLUなど)の手前に毎回配置し,その配置場所でベクトル表現 $\bm{x}$ に対してチャネル毎のバッチ正規化を行った表現を学習することができる.

本来は訓練サンプル全体の白色化と同様に,各層の入力でもそれぞれ白色化しておきたいが,その場合SVDを学習中に毎回何度も解くはめになる.そこで,各層間にバッチ正則化層を挿入しておくと,ネットワークの途中の中間表現 $\bm{x}$ で何度も正則化を行うことができるので,過学習を抑制する効果を得ることができる.これにより,バッチ正規化登場までCNNには正則化目的で標準的に用いられていたDropoutの必須性が無くなり,バッチ正規化で代替されることとなった.また,最適化中に解が過度な発散をすることがなくなるので,高速に収束できる効果も得られる.

3.4.2 バッチ正規化の発展型

オリジナルのバッチ正規化では,バッチ数$N$が小さいほど精度が落ちる.しかい,画像を用いる深層学習では,GPUメモリー量的にバッチサイズの限界があるので,あまり大きなバッチ数は用いることができない.そこで,バッチ数が少なめでも安定した正規化が行いやすい,Group Normalizationなどの改善手法がのちに提案されている.

また,条件付きGANを用いたスタイル変換などのネットワークでは,1サンプル(インスタンス)単位で正規化するInstance Normalizaitonが効果が高く,よく利用されている.

4. まとめ

この記事では,CNNの代表的なバックボーン構造の構成要素と,その学習方法について簡単にだけまとめた. DenseNetやSE-Networkなど,2017~2018以降の代表的なバックボーン技術については,この記事ではあまり触れておらず,それ以前の技術を中心に書いた.

個人的には,以下のお馴染みの「A. Karpathy 氏が Stanfordの授業のTAだったころに作った,CNNのチュートリアルページ」が初心者にはとても参考になると思うので紹介しておく:

Convolutional Neural Networks (CNNs / ConvNets)

CNNの詳細な挙動を簡潔に知れる上に,このページのわかりやすい「特徴マップ計算の可視化」はその後いろいろなところで見かける.正直なところ「CNNの畳み込みや特徴マップの図解」については,このページで読んで学んで頂いた方が早いので,この記事でもCNNについては独自に図を作らず文章説明にとどめた.

また,こちらも少し古いが,2017年のStanfordのComputer Visionの授業はYoutubeに動画がアップロードされており(当時はメインの講師がKarpathy氏とJustin Johnson氏)2020年現在でも初心者は参考になる.

Lecture 1 | Introduction to Convolutional Neural Networks for Visual Recognition

References

  • [Kingma et al., 2014] Kingma, Diederik P., and Jimmy Ba. “Adam: A method or stochastic optimization.” arXiv preprint arXiv:1412.6980 (2014).
  • [He et al., 2016] He, Kaiming, et al. “Deep residual learning for image recognition.” In, CVPR 2016.
  • [Srivastava et al., 2015] Srivastava, Rupesh Kumar, Klaus Greff, and Jürgen Schmidhuber. “Highway networks.” arXiv preprint arXiv:1505.00387 (2015).

外部参考サイト

関連記事