畳み込みニューラルネットワーク(CNN)
学習目標
CNNの構造を理解し、各層の役割と層間のデータの流れについて理解する。
CNNの基本形
畳み込み層
プーリング層
全結合層
データ拡張
CNNの発展形
転移学習とファインチューニング
キーワード:ネオコグニトロン、LeNet、サブサンプリング層、畳み込み、フィルタ、最大値プーリング、平均値プーリング、グローバルアベレージプーリング、Cutout、Random Erasing、Mixup、CutMix、MobileNet、Depthwise Separable Convolution、Neural Architecture Search(NAS)、EfficientNet、NASNet、MnasNet、転移学習、局所結合構造、ストライド、カーネル幅,プーリング,スキップ結合、各種データ拡張、パディング
画像認識はディープラーニングで大きな成功を収め最も研究が盛んな分野です。ディープラーニングで画像データを扱うときには畳み込みニューラルネットワーク(Convolutional Neural Network、CNN)がよく使われます。このセクションでは画像データの構造やCNNの特徴について説明します。
画像データの構造
画像データは縦、横、奥行きの3つの次元を持ちます。奥行きをチャンネルと呼びます。
また、色空間には様々な種類があります。よく使われるRGB画像ならば、赤と緑と青のチャンネルがあります。

HSVは、色相(Hue)と彩度(Saturation・Chroma)と明度(Value・Brightness)のチャンネルがあります

グレースケールはモノクロでチャンネル数は1つです。
画像データの特徴として画像内の縦横の位置関係が重要な意味を持つという点があげられます。それは画素(ピクセル)の集まりが線や質感を生み出すことからも直感的に理解できます。このような特徴量を抽出するための研究によってCNNが発展しました。
CNNの基本形
ネオコグニトロン
ディープラーニングによる画像認識の仕組みの発想の元になったネオコグニトロンは1980年代に福島邦彦によって提唱されました。ネオコグニトロンは人間の視覚野(後頭部にある脳の部位)が2種類の神経細胞の働きによって画像の特徴を抽出していることをモデルとしています。
単純型細胞(S細胞):画像の濃淡パターンから局所の特徴量を検出する
複雑型細胞(C細胞):位置ずれ影響されないパターンを認識する
ネオコグニトロンは視覚野にある階層構造(S細胞とC細胞の機能を交互に組み合わせた構造)を採用しました。

この構造によってネオコグニトロンでも画像から様々なパターンを認識できるようになっています。

後々のCNNもこれに似た構造を持っていますが、ネオコグニトロンでは誤差逆伝播法は使われませんでした。
LeNet
1998年にヤン・ルカン(Yann LeCun)によるLeNetが手書き数字認識において優れた性能を発揮するCNNとして注目を集めました。LeNetには現在のCNNの先駆けであり、以下のような層を含んでいます。
ネオコグニトロンでのS細胞層がLeNetにおける畳み込み層、C細胞層がプーリング層に対応します。ただし、LeNetはネオコグニトロンとは違って、これらの層を誤差逆伝播法で訓練しました。
2012年にILSVRCで初めてディープラーニングを導入して優勝したAlexNetなどと比べると小規模なネットワークですが、手書き数字の認識の性能はすでに実用レベルでした。

この頃はまだ、シグモイド関数を隠れ層で使っていたのが見えて興味深いですね。憶測ですが、勾配消失を避けるためにあまり層を増やせなかったのかもしれません。AlexNetではReLU関数が使われています。
畳み込み層
画像では近隣の画素(ピクセル)同士の関係、つまり局所結合構造が重要です。そのような特徴量を抽出するために、畳み込み層では畳み込み(convolution)処理を行います。
この辺りはプログラミングを通した具体例の方がわかりやすいので、Pythonがわかる方には、別記事「畳み込みのフィルタを自分で作って畳み込みニューラルネットワークで数字画像の識別をしてみる」をお勧めします。以下では、要点だけを切り出したもので説明します。
次のデータを見てください。0と1だけで定義されています。なんの画像でしょうか。

画像として表示したものは次の通りです。人間はすぐに7だと認識できます。

この画像が7であることを畳み込みを使って特徴抽出をすることで認識してみます。
まず、次のようなフィルタ(カーネルとも呼ばれる)を設定します。これは縦の線を抽出する意図で定義しました。

カーネル幅は3x3としました。これを縦線がある部分に使用してみます。
7の画像では中央下のところに縦の線があります。この区域の各要素とカーネルの各要素を掛け合わせて和をとると3になります。

$$
(−1) \times 0 + 1 \times 1 + (−1) \times 0 + \\
(−1) \times 0 + 1 \times 1 +(−1)×0 + \\
(−1) \times 0 + 1 \times 1 + (−1) \times 0 = 3
$$
しかし、縦線がないところだともっと低い値になります。

$$
(−1)×1+1×1+(−1)×1+ \\
(−1)×0+1×0+(−1)×0+ \\
(−1)×0+1×0+(−1)×0=−1
$$
このような方法は古くからソーベルフィルタの手法で使われています。
同様に横線を抽出するためのカーネルも考えられます。

さらに、斜線を抽出するカーネルなども考えられます。

このように複数のカーネルを使って、縦線、横線、斜線などを抽出したものを各チャンネルへと出力します。入力画像は白黒で1チャンネルでしたが、3つのカーネルを使うことでチャンネルが3つに増えます。
もちろん、ディープラーニングではこれらの特徴量を抽出するカーネルの重さが自動で計算されます。ここでは、単純な例として自分で決めたものを使っています。
ここまでで、縦と横と斜を抽出する3つのカーネルを準備しましたが、これらを適用する前にやることがあります。
ゼロパディング
パディングあるいはゼロパディングは画像データの周りにゼロを付け足す操作で、これをすることで画像の端っこの特徴も抽出できるようになります。
例えば、7の画像の上部にある横線を抽出したいとします。ゼロパディングをしない状態ではうまく抽出することができません。

ゼロパディングを施して8×8の画像の周りに0を付け足して10×10のサイズにしたものを使えば横線を抽出できます。

ここでは3x3のカーネルを使いましたが、より大きなカーネルを使う場合はゼロパディングもより大きくなります。例えば、5x5ならば2回りのゼロパディングが必要となります。
ただし、ゼロパディングするかどうかはネットワークをデザインする人が決めることでもなります。もし、端っこの特徴を重視しないのであればゼロパディングをしないという選択もあるわけです。
もう一点注意が必要なのは、ゼロパディングをしないと畳み込み処理を施された画像のサイズが元のものよりも小さくなるということです。例えば、8x8の画像を3x3のカーネルで畳み込みする場合、結果の画像のサイズは6x6になります。もちろん、このことを理解した上であえてゼロパディングをしないという選択をする場合もあります。ここはネットワークをデザインする人次第なので絶対の規則はありません。
プーリング層
画像分類などでは徐々に太極の特徴を取り出す必要があります。最初は線などの細かい特徴量を抽出し、その線の組み合わせのパターンを取り出します。よって、画像から抽出した特徴を圧縮する必要があります。
最大値プーリングでは局所の特徴量から一番大きいものを取り出します。例えば、2x2の最大値プーリングでは2x2の範囲から一番大きい値を取り出し、それを4つのデータの代表として使います。よって画像のサイズが縦と横が両方とも半分になります。
下図では縦線を抽出するカーネルからの出力に最大値プーリングを適用した様子です。2x2の領域ごとに最大値を採取します。

最大値ではなく平均値を代表値として使いたい場合は、平均値プーリングを使用します。
ストライド
画像のサイズを小さくするために、ストライドを使いこともあります。ストライドは畳み込みを行う際にカーネルを適応させる領域を縦と横にずらす時のサイズです。デフォルトでは1なので1ピクセルずつずれた位置でカーネルが使われますが、ストライドを2にすると2ピクセルずつずれていくので畳み込み処理の後の画像サイズが半分になります。
全結合層
全結合層は通常のニューラルネットワークの層です。CNNでは畳み込みが何層か続いた後に、ネットワークの最後の数層を全結合層にして最終的にクラス数分の値を出すのに使われます。
これらの層は畳み込みで抽出された特徴量から最終的な予測のための判断をしているところになります。画像の分類をするのであれば、最後にシグモイド関数で真偽を判断したり、ソフトマックス関数でどのクラスが最も確率が高いのかを判断したりします。
また、全結合層では1次元のニューロンを入力とするので、畳み込み層からの出力を1列(フラット)にする処理を行います。
グローバルアベレージプーリング
モデルによっては、全結合層を使わずに最後にグローバルアベレージプーリングを使います。グローバルアベレージプーリングは平均値プーリングを全ての領域にわたって行うので、全てのニューロンの平均値を計算することになります。
グローバルアベレージプーリングを使う場合は、畳み込み層からの出力をフラットにする必要はありません。
データ拡張
畳み込みやプーリング層によって、物体が画像の中のどの位置にあるかに関わらず分類することができるようになりました。しかし、訓練データだけでは十分ではない場合は各種データ拡張を行います。
例えば、数字を識別するにしても数字がちょっと斜めになっていたりすると上述の単純なフィルタ(カーネル)では特徴量をうまく抽出できないでしょう。よってもっとたくさんのカーメルが必要になってくるのですが、そのためには訓練用のデータが様々な可能性を提供できている必要があります。また、大きさや光のあたり具合や色の違いやぼやけなどたくさんの条件・状況が考えられます。
データ拡張(data augmentation)は、訓練データに何らかの画像処理を加えて異なる特徴を持った画像を作り出すことです。
上下左右にずらす。
上下左右を反転する。
拡大・縮小する。
回転する。
斜めに歪める。
一部を切り出す。
コントラストを変える。
色彩を変える。
ぼやしを入れる。
このほかにも、画像の一部分を0にするCutoutや画像の一部分をランダムな値にするRandom Erasingというデータ拡張の手法もあります。Mixupでは二枚の画像を合成します。CutMixはCutoutとMixupを組み合わせた手法です。
なお、データ拡張を行う際に現実にはあり得ない画像にしてしまうと、検証における精度や汎化(テスト)性能が悪くなるので注意が必要です。
CNNの発展形
AlexNet
AlexNetはAlex KrizhevskyがIlya SutskeverとGeoffrey Hinton(Alexの博士号の指導者)と一緒に開発したCNNで2012年のILSVRC(ImageNet Large Scale Visual Recognition Challenge)で初めてディープラーニングによるモデルを導入して優勝した。彼らの論文によるとネットワークの層を増やすことが精度を上げるのに重要であり、GPUを利用した訓練で達成することが可能になったとのこと。活性化関数にReLUを使っていシグモイド関数やtanh関数よりも優れていることを示した。

ZFNet
ZFNetはAlexNetの改良版で2013年の画像分類部門でILSVRCで優勝した。AlexNetが11×11のカーネル幅を最初の層で使っていたのに対し、ZFNetでは7×7のカーネル幅を使っている。また、ストライドをAlexNetの4から2にした。また、AlexNetが1 枚の画像を上下半分に分けて学習をするのに対して、ZFNet は 1 枚の画像で学習をするようになっている。

VGG
VGGはオックスフォード大学のVisual Geometry Groupによって開発され、2014年のILSVRCの画像分類部門で第2位を獲得した。AlexNetよりも小さいカーネル幅(3×3)を最初の層から使っており、層の数も16や19と多くなっている。NVIDIAのTitan Black GPUを使って何週間にもわたって訓練された。

GoogLeNet
GoogLeNetは2014年のILSVRCの画像分類部門で優勝した。AlexNetやVGGと大きく異なり、1×1畳み込みやグローバルアベレージプーリング、Inceptionモジュールを導入した。Inceptionモジュールは異なるカーネル幅からの特徴量を組み合わせている。また、Inceptionモジュールが層を深くすることを可能にし22 層になっている。

ResNet
ResNet(residual networks)はMicrosoftのHeらによって開発され2015年のILSVRCの画像分類部門で優勝した。
残差学習(residual learning)により勾配消失の問題を解決した。従来の層は$${x}$$から $${H(x)}$$ という関数を学習するのだが、Skip connection(スキップ結合)と呼ばれる層から層への結合を加えたことにより、$${H(x) = F(x)+x}$$ となるので、入力値$${x}$$に対して残差$${F(x)}$$を学習するようになっている。これを残差ブロック(residual block)と呼ぶ。

$${F(x)}$$の勾配が消失したとしても、Skip connectionにより全体として勾配が消失しにくくなっており、ResNetは最大152 層を持つ。

また、ResNetはさまざまな長さのネットワークが内包されているという意味でアンサンブル学習にもなっています。
MobileNet
MobileNetはモバイルや埋込機器を念頭にネットワークの全体のパラメータ数を抑えたネットワークです。2017の論文でGoogleの研究者たちによって発表されました。
MobileNetでは畳み込み、バッチ正規化、ReLU活性化関数で構成されるブロックをDepthwise畳み込みとPointwise畳み込みによって2つに分けました。これをDepthwise Separable Convolutionと呼びます。

Depthwise畳み込みは、チャンネルごとに畳み込みを行うのでパラメータの数を減らすことができます。
まず、通常の畳み込みでフィルタ幅が$${D_K}$$、入力チャンネル数$${M}$$、出力チャンネル数$${N}$$のケースを考えます。

この場合、必要なパラメータの数は、$${D_K × D_K × M × N}$$となります。
次に、Depthwise Separable Convolutionを考えます。最初にDepthwise畳み込みを行いますが、これはチャンネル毎の処理なので必要なパラメータは$${D_K × D_K × M}$$となります。その次のPointwise畳み込みで1×1カーネルを使いチャンネル数をMMからNNにするので$${M × N}$$のパラメータが必要となります。合計で、$${D_K × D_K × M + M × N}$$のパラメータが必要です。

通常の畳み込みのパラメータ数: $${D_K × D_K × M × N = D^2_K M N}$$
Depthwise Separable Convolution:$${D_K × D_K × M + M × N = (D^2_K + N) M}$$
よって、Depthwise Separable Convolutionのパラメータ数が通常の畳み込みに対する比率は、
$$
\frac{(D^2_K + N)M}{D^2_K M N} = \frac{D^2_K + N}{D^2_K N} = \frac{1}{N} + \frac{1}{D^2_K}
$$
となります。フィルタ幅が大きいほど、また出力チャンネル数が大きいパラメータ数の削減率が高くなります。
なお、Depthwise Separable Convolutionは通常の畳み込みの近似であり、必ずしも精度が一致しません。
2018年にはMobileNetのバージョン2が登場し、Depthwise Separable ConvolutionがInverted Residualで置き換わりました。2019年にはバージョン3が登場していますが、これは次に解説するNeural Architectureを利用しています。
Neural Architecture Search
Neural Architecture Search(NAS)はネットワークの構造そのものを探索する仕組みです。人間が手探りで構築してきたディープニューラルネットワークを基本的なブロック構造を積み重ねて自動的に構築します。このブロック構造はResNetのResidual Blockのようなもので、畳み込み、バッチ正規化、活性化関数などを含みます。
また、NASでは既成のネットワークをベースに探索することで、精度を保ちながらパラメータ数を減らす構造を探索することもできます。
NASはリカレントニューラルネットワークや強化学習を使ってネットワークの構造を出力します。例えば、強化学習を使う場合はネットワークを出力することを行動とし、出力されたネットワークをある程度の学習を行った後に精度や速度などで評価したものを報酬として使います。
NASNet
NASNetはQuoc V. Le(Google)らによってICLR2017で発表されました。Quoc V. LeはMobileNet V3にも関わっています。ResNetのResidual Blockをベースにネットワークを自動構築する仕組みをRNNと強化学習を使って実現しました。
MnasNet
MnasNetもQuoc V. Leらによるもので、2018年に発表されました。モバイル機器での速度を実機で測定したものを利用したNASです。MobileNetV2よりも1.5倍速く、NASNetよりも2.4倍速く、ImageNetで高い認識精度を達成しました。
ProxylessNAS
ProxylessNASはSong Han(MIT)のグループによって2018年に発表されました。MobileNet V2をベースに精度落とさずに高速化を達成しました。これまでのNASがネットワークの一部(Proxyと呼ぶ)などでモデルの評価をしていたのに対し、ProxylessNASではProxyなし、つまりフルのネットワークを使ったネットワークの探索をImageNetのデータで訓練しながら行いました。
FBNet
FBNet(Facebook-Berkeley-Nets)はFacebookとカリフォルニア大学バークレー校の研究者らによって2018年に発表されました。MnasNet同様でモバイルための軽量化と高速化を目指したものです。
FBNetはImageNetで74.1%の正確率を保ちながらSamusung S8上でMobileNetV2よりも2.4倍軽量で1.5倍高速を達成しました。
EfficientNet
EfficientNetもまたQuoc V. Leらによるもので2019年に発表されました。従来よりかなり少ないパラメータ数で高い精度を出しました。Kaggleなどで転移学習に有用なモデルとして活用されています。
転移学習とファインチューニング
ネットワークの層の数が多くなりと同時に学習に必要な計算量(時間と電力)は莫大なものになっていきました。
よって、ImageNet(ILSVRCのデータセット)で学習済みのネットワーク(VGGやGoogLeNetやResNetなど)を使った転移学習によって短時間で高性能のネットワークを訓練することが一般的になりました。これらのネットワークはImageNetにおける学習で畳み込み層が特徴量を抽出できるようになっているからです。その最適化されたネットワークの重みを再利用することで余計な訓練を省くというわけです。
転移学習では最後の方の結合層を入れ替えてそこだけ訓練する方法と、ネットワーク全体を微調整するファインチューニングとがあります。
参照:
