Site cover image

Site icon imageSen(Qian)’s Memo

This website is Donglin Qian (Torin Sen)’s memo, especially about machine learning papers and competitive programming.

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

中国の有名な機械学習の本の勉強ノート。自分がわからなかったところだけなので飛び飛びだろう。

https://nndl.github.io/

全結合層だけで構築すると、以下のような問題が生じてしまう。

  1. パラメタが多すぎる 入力画像が100*100*3なら、入力層から隠れ層への写像で、1つの隠れ層のニューロンごとに、100*100*3=30000個の入力が入り、それぞれに1つ重みが必要なので30000個のパラメタが生じる。隠れ層のニューロンを増やすとこれが簡単に増えてしまい、訓練が遅いばかりか、高すぎる学習能力による過学習も生じてしまう
  2. 局所的な特徴を捉えられない 画像認識の例でいうならば、画像の拡大縮小回転反転平行移動などは全部同じものだと認識してほしい。ただ、全結合層だけで作ると、各場所におけるパターンそれぞれが全部必要となってしまい、面倒なdata augmentationが必要なばかりか訓練もかなり大変になる。

生物学的に受容野は網膜などの上の局所的=一部の場所の周辺の信号のみ受容するという性質を持つ。この局所的な特徴を捉えるのを意識したネットワーク構造が、Convolutional Neural Networkである。

畳み込み(Convolution, 卷积)

一次元の畳み込みの例

一次元の畳み込みの例として、信号処理でよく用いられる。信号の列x1,x2,x_1, x_2, \cdotsに対して、減衰を考える。時間1では1倍、時間2では0.5倍、時間3では0.25倍のように各信号ごとに時間によって減衰を考える。これはw1=1,w2=1/2,w3=1/4w_1=1, w_2=1/2, w_3=1/4であるとおく。(これはFilterやConvolution Kernelと呼ばれたりする)

この時、時刻ttにおける信号を考える。

yt=w1xt+w2xt1+w3xt2=i=13witti+1y_t=w_1 x_t + w_2 x_{t-1} + w_3 x_{t-2} = \sum_{i=1} ^ 3 w_i t_{t-i+1}

このように、総和や積分の中で、パラメタiiを動かしているとき、添え字iiaia-iが互いに掛け合わせているものが、一次元の畳み込みである。

一般的に、畳み込みは以下のようにあらわす。先ほどのはyty_tの1点のみの畳み込みだったが、すべてについて行うとすると、同様なベクトルが得られる。

y=wx\mathbf{y} = \mathbf{w} * \mathbf{x}

二次元の畳み込みの例

同様に、二次元の畳み込みも定義できる。XRM×NX \in \mathbb{R}^{M \times N}の画像に対して、フィルタWRU×VW \in \mathbb{R}^{U \times V}の畳み込みを行うとき、以下のようになる。

yi,j=u=1Uv=1Vwu,vxiu+1,jv+1y_{i,j} = \sum _{u=1}^U \sum _{v=1}^V w_{u,v} x_{i-u+1, j-v+1}

畳み込みを行った結果、YR(MU+1)×(NV+1)Y \in \mathbb{R}^{(M-U+1) \times (N - V + 1)}となる。

なお、数学的には畳み込みは互いに交換可能である。

画像処理などでよく使われるmean filterなどはすべての値が同じフィルタを使って平均を取っている。例えば、フィルタの一例。

Image in a image block

CNNでは、このフィルタ自体を機械学習によって学ぶというもの。

Cross-Correction

なお、畳み込みの順序を真逆にすることによって、フィルタとの似てる度を測定できる。内積みたいな感じで。これはCross-Correction=相互相関関数という。

yi,j=u=1Uv=1Vwu,vxi+u1,j+v1y_{i,j} = \sum _{u=1}^U \sum _{v=1}^V w_{u,v} x_{i+u-1, j+v-1}

StrideとPadding

Strideは畳み込みで、毎indexごとに増やす数。普通は1。Paddingはエリア外を0埋めすることによって、畳み込みしても元のデータとサイズが変わらないようにするためのもの。

入力はMMで、フィルタサイズはKK、ストライドはSSだとする。よくあるやり方の例としては以下の通り

  • Narrow Convolution S=1,P=0S=1, P=0 畳み込み後はMK+1M-K+1となる。
  • Wide Convolution S=1,P=K1S=1, P=K-1 畳み込み後はM+K1M+K-1となる。
  • Equal Width Convolution S=1,P=(K1)/2S=1,P=(K-1)/2 畳み込み後はMMのまま。
    • これよく見る気がする。

なお、一般的には畳み込み後のサイズは(MK+2P)/S+1(M-K+2P)/S + 1である。

CNN

畳み込み層

全結合層では、z=ϕ(Wx+b)\mathbf{z} = \phi(W\mathbf{x} + \mathbf{b})であった。畳み込み層では代わりに、以下のようになる。

z=ϕ(w)x+b\mathbf{z} = \phi(\mathbf{w}) * \mathbf{x} + \mathbf{b}

これによって過学習の原因となる大量のパラメタを減らすことができ、真に有意義のようなパラメタだけを残すことができる。

畳み込みの性質上、1つのフィルタに対して決められたストライドで動かして畳み込んでいくので、複数のフィルタによって複数個の特徴をつかみたいのであれば、複数の畳み込みフィルタを用意する必要がある

具体的に画像について述べると、H×W×DH \times W \times Dのデータが与えられる。DDは色の次元数でRGBの三色なら3。

畳み込みフィルタはH×WH \times Wの次元に対して、CH×CWC_H \times C_Wのサイズで畳み込みを行う。つまり、全体では、CH×CWC_H \times C_Wのフィルタは、P×DP \times D個存在している。(PPはフィルタの数である つまり実際はフィルタの数に深さを乗じたもの個のフィルタが存在することになる)

この場合、畳み込みした結果も当然行列がP×DP \times D個存在することになる。

プーリング層(Pooling Layer, 聚汇层)

畳み込み層によって、特徴抽出における重みのパラメタ数は劇的に減少したが、畳み込みの結果の行列はP×DP \times D個存在しており、サイズ不変のまま畳み込んだとしたら、次の層への入力はH×W×P×DH \times W \times P \times Dとなり、次の層への入力は大きいままである

これをダウンサイジングするにあたって、全結合層でやると結局大量の重みを抱えてしまう。そこで、H×WH \times Wの中でBh×BwB_h \times B_wの各ブロックに区分し、その中から計算を施し、1つだけ値を出力してそれだけを残すという作業を考える。これはプーリングという。

よく使用されるプーリングは二種類存在する。

  • Max Pooling 対象の中で最大の値を選択する。
  • Mean Pooling 対象の中の平均値を取る。

これによって、画像の全体的な構図大きく損なうことなく、特徴量を減らすことができる。

CNNの全体的な構造

Image in a image block

パラメタの更新の理論的な部分はスキップだ。

有名なCNNアーキテクチャ

CVの識別タスクなどで、高い性能を(その時点で)出したSOTAモデルたちの中で、技術のブレークスルーを導いたもの。基本的に論文でも、ベンチマークの基準として使用されている。

LeNet-5

1998年に提案された。入力は32*32のサイズの白黒画像であり、10カテゴリへの分類。(手書き数字の分類)

  1. 畳み込み層。32×3232 \times 32の画像から、S=1,P=0,fH=5,fW=5,N=6S=1, P=0, f_H=5, f_W=5, N=6で畳み込みを行い結果として325+1=2832-5+1=28なので、28×2828 \times 28の畳み込んだ結果が6つ得られる。(NNはフィルタの数)
  2. 2×22 \times 2でMax-Poolingを行い、14×1414 \times 14が6つに抽出する。
  3. 畳み込み層。S=1,P=0,fH=5,fW=5,N=16S=1,P=0,f_H=5, f_W=5, N=16で畳み込みを行い、結果として145+1=1014-5+1=10なので、10×1010 \times 10の結果が6×16=966 \times 16=96個の存在する、かと思いきやより相互依存を強く仮定することで上手く削減して1616個の結果としている。
  4. 2と同様なことをする。5×55\times5が16個得られる。
  5. 畳み込み層。S=1,P=0,fH=5,fW=5,N=120S=1,P=0,f_H=5,f_W=5,N=120。この時結果としては1×11 \times 1まで縮めた120個のスカラーが得られる。
  6. 全結合層+出力層 10個にまとめる。

AlexNet

2012年に革命(かぜ)を起こした深層CNNモデル。現代のCVでも活用されているテクすなわち、GPUで訓練し、ReLU関数を活性化関数として使い、Dropoutで過学習を防ぎ、Data Augmentationも行った。

Image in a image block

入力画像は224×224×3224 \times 224 \times 3であり、出力は10001000カテゴリ。

赤い部分はすべてS=2S=23×33\times3でMax-poolingを行っていて、サイズを落としている。落としてから、畳み込みをしている。

途中で2つの部分で交叉する畳み込みは、それぞれの部分(上下)から1回ずつ畳み込んで次の結果を作っている。

Inception

1つの畳み込み層に、複数のサイズのフィルタを許容しているのをInception Modelという。

Image in a image block

複雑でSequentialでなくなっている。

  • 左から1番目は、1×11 \times 1で畳み込み
  • 左から2番目は、1×11 \times 1で畳み込んでから、3×33 \times 3で畳み込み
  • 左から3番目は、1×11 \times 1で畳み込んでから、5×55 \times 5で畳み込み
  • 左から4番目は、3×33 \times 3でMax-poolingしてから、1×11 \times 1で畳み込み。
  • そして上の4つの結果をすべてflattenして1つのベクトルにする。

2014年のImageNet分類コンテストを制覇したGoogLeNetはInception Modelである。勾配消失問題を解消するため、中間層で2つの補助分類器を導入しているらしい。

ResNet

Residual Network、残差ネットワークと呼ばれる。

識別器f(x,θ)f(\mathbf{x}, \theta)を使って、h(x)h(\mathbf{x})を近似したいと考える。このとき、関数を恒等関数x\mathbf{x}と残差関数h(x)xh(\mathbf{x})-\mathbf{x}に分解することができる。実際、後者を学習させる方がずっとやりやすい。恒等関数は次図のように、そのまま持っていくことができるので、勾配消失に強いのである。

Image in a image block

以上では、サイズを変更しない畳み込み→ReLU→サイズを変更しない畳み込みによって、残差h(x)xh(\mathbf{x})-\mathbf{x}を近似させる一方で、x\mathbf{x}はそのまま持っていく。

他の畳み込みの方法について

主に、転置畳み込み、アトラス畳み込みの2つがある。

転置畳み込み(转置卷积)

通常の畳み込みは次元を落とすのが普通だが、低次元から高次元に写像しつつ、畳み込みをしたいときがある。

xRd,zRp,p<dWRp×d,x=WTz\mathbf{x} \in \mathbb{R}^{d}, \mathbf{z} \in \mathbb{R}^p, p < d \\ W \in \mathbb{R}^{p \times d}, \mathbf{x}=W^T \mathbf{z}

次のように畳み込みの重みをずらして配置することで、実現は可能。

Image in a image block

Fractionally-Strided Convolution(微步卷积, 小数点ストライド畳み込み)

S<1S<1の小数点のストライドで畳み込みを行う。各特徴量の行列の成分の間には0を挟むことによって、影響させないようにする。

Image in a image block

Atrous Convolution(空洞卷积, 空洞畳み込み)

元の間に0を挟むらしい。上と同じじゃね?Paddingの取り方で違うとか

Image in a image block