深層学習 学習まとめ: 畳み込みニューラルネットワーク

# 畳み込みニューラルネットワーク(CNN)
- 1979年に福島邦彦によって提唱された視神経を模したニューラルネットワーク、ネオコグニトロンが出発点
    - ネオコグニトロンは、複数の種類の細胞から構成され、その中で最も重要な細胞は「S細胞」(単純型細胞)および「C細胞」(複雑型細胞)と呼ばれる
    - S細胞は特徴抽出を担い、これに対し微小変位（local shift）といった特徴の変形はC細胞に委ねられている
        - C細胞は位置ずれを許容する
    - S細胞層はCNNでの畳み込み層、C細胞層はCNNでのプーリング層に相当する
- CNNは次元間で繋がりのあるデータを扱える
    - 特に画像処理に活用されるが、音声などにも活用が可能

## CNNの全体構造
- CNNは以下のような多層構造になっている
    - 入力層
        → 畳み込み層(複数)
        → プーリング層
        → 畳み込み層(複数)
        → プーリング層
        → 全結合層
        → 出力層
    - 〜プーリング層までは、次元の繋がりを維持したまま特徴量を抽出する
        - 畳み込み層で、エッジのようなタスクを解くために有用な特徴を抽出する
        - プーリング層では、入力データの微小な位置変化に対しほぼ不変な表現を出力する
    - 全結合層〜で人間が欲しい結果を求める
- LeNetの例
    - 32*32ドットの画像を入力し、最終的に10種類に分類する
    - Input (32, 32)
        → Convolution (28, 28, 6)
        → Subsampling (14, 14, 6)
        → Convolution (10, 10, 16)
        → Subsampling (5, 5, 16)
        → Full connection (120,)
        → Full connection (84,)
        → Gausstan connections: Output (10,)

## 畳み込み層(Convolution)
- 畳み込み層では、画像の場合で言えば、縦、横、チャンネル(RGB)の3次元のデータをそのまま学習し、次に伝えることができる
    - これに対し、全結合層の場合、縦、横、チャンネル(RGB)の3次元のデータが1次元のデータとして処理されるため、チャンネル間の関連性が学習に反映されない
- 定義
    - $ (I * K)(i, j) = \displaystyle \sum_m \sum_n I(i + m, j + n)K(m, n) $
        - 入力が$ I $(大きさ$ i×j $)、学習対象であるフィルタが$ K $(大きさ$ m×n $)
- Σ(入力値 * フィルター) = 出力値1
    - フィルターは全結合でいう重み($ \boldsymbol{w} $)
        - フィルターのパラメーターが学習対象
    - フィルターをずらしながら出力値1を得ていく
    - フィルターは(N, N)なので、周囲との繋がりが維持されている(=　次元間の繋がりが保たれている)
    - 入力が(M, M)の場合、基本的には出力は((M-N+1, M-N+1)になる
        - 以下のパディングやストライドがない場合
        - 逆に出力を(M, M)に維持するために、入力の周囲にパディングを行うという処理もある
            - パディングでは、固定値0を埋めたり、最も近い場所の値を埋める
    - 出力はフィルターの枚数(チャンネル)分得られる
    - フィルターを1ますずつずらすのではなく、Xますずつずらすこともある(ストライド)
        - 例えば、2ますずつずらすのが、2ストライド
            - ストライドが増えると、出力のサイズが小さくなる
- 出力される特徴マップのサイズ
    - $ O_H = \dfrac{画像の高さ + 2×パディング高さ - フィルターの高さ }{ストライド} + 1 $
    - $ O_W = \dfrac{画像の幅 + 2×パディング幅 - フィルターの幅}{ストライド} + 1 $
    - プーリング層でも同様
- 活性化関数(出力値1 + バイアス) = 出力値2
- 実装に際しては、入力を、フィルター適用のために、並び替えた行列を用意しておくことが一般的
    - それによって、フィルターの重みと直接掛け算(内積)ができる
    - im2col(image to column)という処理が一般的
        - im2colでは、N(バッチサイズ)分の入力画像C(チャンネル)×Ih(入力画像高さ)×Iw(入力画像幅)を、行がN×Oh(出力画像高さ)×Ow(出力画像幅)、列がC×Fh(フィルタ高さ)×Fw(フィルタ幅)の二次元配列に展開する
        - 行がC×Fh×Fw、列がFN(フィルタ数)と整形したフィルタに上の二次元配列をかけることで、行がN×Oh×Ow、列がFNの二次元配列が一気に得られる
        - これをreshape/transposeすることで、出力(N, FN, Oh, Ow)を得る

## プーリング層(Pooling)
- 畳み込み層のように(N, N)の領域を切り出し、ずらしながら処理をする
    - しかし、畳み込み層と異なり、重みはない
    - つまり、学習対象となるパラメーターは存在しない
- プーリング層では対象領域のMax値(Maxプーリング)または平均値(Averageプーリング)を取得する
    - 他にはLpプーリングというものが存在
- 畳み込み層ではフィルターの枚数によってチャンネル数が変わったが、プーリング層では一般的にチャンネル数は変わらない

## ILSVRCで注目を集めた代表的なCNN
- ILSVRC(ImageNet Large Scale Visual Recognition Challenge)は大規模な画像データセットであるImageNetを用いた画像認識の精度を競うコンペティション

|モデル|発表年|特徴|
|:--|:--|:--|
|AlexNet|2012|畳み込み層とプーリング層の繰り返し、最後に全結合層というCNNの基礎となったモデル。従来手法に対し圧倒的な精度向上を果たし、深層学習に基づくモデルとして初の優勝となった|
|GooLeNet|2014|フィルタサイズの異なる畳み込み層を並列に配置するインセプション(inception)モジュール、ネットワークの途中で分岐させたサブネットワークで予測を行う補助的分類器(auxiliary classifier)といった工夫が導入されているモデル|
|VGG|2014|フィルタサイズ3×3の畳み込み層を複数積み重ねることで、少ないパラメーターで大きなフィルタを使用した場合と同じ範囲を畳み込むことを提案したモデル|
|ResNet|2015|恒等写像(Identity mapping)を介して特徴マップ同士を足し合わせるショートカット結合(Skip connection)が特徴的なモデル。ショートカット結合によって、勾配消失を引き起こすことなく、より深く層を重ねることができるようになった|
|DenseNet|2017|ResNetのようにショートカット結合を持つが、ResNetのようにショートカットされた特徴マップを足し合わせるのではなく、特徴マップをチャンネル方向に結合するモデル。そのショートカット結合は、あるブロック内ですでに作られた特徴マップ全てを対象とする|

### GoogLeNetに関する補足
- Inceptionモジュールの進化
    - Inceptionモジュールはその後、ResNetのアーキテクチャーを採用したInception-ResNet、使用している畳み込みフィルターの大きさを変更したInception-v2、Batch Normalizationを採用したInception-v3などの改良されたバージョンが発表されている
- Global Average Poolingを採用している
    - Global Average Poolingは各チャンネルの画素の平均値を求め、各チャンネルの平均値を要素とするベクトルに変換する
    - Flattenして全結合層につなぐよりも、大幅に計算量を減らすことができる

## 最新のCNN: AlexNet
- 構造
    - Input (224, 224, 3)
        → Convolution(11, 11) → (55, 55, 96)
        → Max pooling(5, 5) → (27, 27, 256)
        → Max pooling(3, 3) → (13, 13, 384)
        → Convolution(3, 3) → (13, 13, 384)
        → Convolution(3, 3) → (13, 13, 256)
        → Full connection (4096,)
        → Full connection (4096,)
        → Output (1000,)
    - 畳み込み層から全結合層への処理
        - Flatten: 単純に横に並べる　(13, 13, 256) → (43264,)
        - Global Max Pooling: 各チャンネルの最大値を採用する　(13, 13, 256) → (256,)
        - Global Average Pooling: 各チャンネルの平均値を採用する　(13, 13, 256) → (256,)
        - Global Max PoolingやGlobal Average Poolingは効率がいい割に性能が良い
    - (4096,)の全結合層の出力にドロップアウトを使用し、過学習を防いでいる

## 効率的な学習方法
- 転移学習: 教師あり学習において、目的とするタスクでの教師データが少ない場合に、別の目的で学習した学習済みモデルを再利用する
- 事前にImageNetのように大量のデータセットで学習したモデルを再利用し、その上で転移学習を行う
    - ImageNetは1,400万件以上の写真のデータセット
    - ImageNetで学習済みのモデルも多く公開されている
    - 事前学習では、1,000分類に分類した教示データを利用し、ResNetで学習