G検定メモ⑫　ディープラーニング　CNN編


G検定を受ける前に、公式テキストを読んでメモした走り書きがあったので公開するよ。

---------------------------------------------------------------------

#6－4　CNN：畳み込みニューラルネットワーク

ディープラーニングの基本
隠れ層を増やしたニューラルネットワーク

一部の分野では、よりその分野に適した形のニューラルネットワークが考えられている。
具体的には、
・画像データ
・時系列データ

###CNN
:画像データに適したニューラルネットワーク


【前提と課題】
一般的な数値データと画像データとの違い
⇒縦横の2次元である点
　厳密には、画像はRGBやHSVといった色情報を持つので、数値情報としては3次元


画像を通常のニューラルネットワークに入力すると、1列に分解して並べる事になる為、
縦横斜めの関係性が失われてしまう。


【解決策】
CNN（Convolutional Neural Network）　畳み込みニューラルネットワークという手法を使う
CNNでは画像をそのまま2次元で入力に用いる事が出来るモデル
・画像分野ではCNNを用いるのが常識
・ディープラーニングの中でも一番研究が活発な分野の一つ

###２．CNNの基本形
######CNNの原型
1982年　福島邦彦　「ネオコグニトロン」
人間が持つ視覚野の神経細胞の二つの働きを模してみようというもの
・単純型細胞（S細胞）：画像の濃淡パターン（特徴）を検出する。
・複雑型細胞（C細胞）：物体の位置が変動しても同一の物体であるとみなす。
ネオコグニトロンではS細胞層とC細胞層を交互に複数組み合わせた多層構造をとっている。

######1998年　ヤン・ルカン　「LeNET」
畳み込み層とプーリング層（サブサンプリング層）の2種類の層を交互に複数組み合わせた構造

ネオコグニトロンとLeNETは構造上は同じである。
それぞれ、S細胞層が畳み込み層、C細胞層がプーリング層に対応している。
※違う点
ネオコグニトロンは勾配計算を用いないadd-if silentと呼ばれる手法を用いる
LeNETは誤差逆伝播法を用いる

######現在のCNNでは、
・誤差逆伝播法を用いる
・層の名前も畳み込み層、プーリング層を用いる

###３．畳み込み
畳み込み（convolution）とは何か
畳み込みとは、カーネルと呼ばれるフィルタを用いて画像から特徴を抽出する操作の事を指す
このフィルタは画像よりだいぶ小さいものを利用する
例）
フィルタを画像の左上から順番に重ね合わせていき、画像とフィルタの値をそれぞれ掛け合わせたものの総和をとった値を求めていく処理
縦横５×５の上に、縦横３×３のフィルタを左上から順番に移動していく
縦横５×５の25ますには、それぞれ１か０が記入されていて、3×３の9ますカーネルにも１か０が記入されている
【画像】
１	0	0	1	1
0	1	1	1	0
1	1	1	0	1
0	1	0	1	1
1	0	0	1	1
【カーネル】
1	0	1
0	1	0
1	0	1

これを左上で重ねて、それぞれの値を掛けた総和を出すと、
１＋０＋0＋0＋1＋0＋1＋0＋1＝４となる
左上から一ます右にずらすと
００１０１０１００＝３
さらに右にずらして一番右に行くと
001010101＝4となる
これをすべてのマスで繰り返すと、3×3の特徴マップを作成できる

【特徴マップ】
4	3	4
2	5	2
4	2	4

特徴マップとは、畳み込みにより新しく2次元のデータが得られたもの
フィルタの各値が通常のニューラルネットワークでいう重みにあたる。

この畳み込み処理は、人間の視覚野が持つ局所受容野に対応しているので、
「移動不変性」の獲得に貢献する
↓
通常ニューラルネットワークでは、同じ画像が1ピクセルずれると別の画像と判別してしまう。
畳み込みニューラルネットワークでは、位置がずれていても、同じものだと認識できる
「位置ズレ」に強いモデル

###４．プーリング
フィルタ・・・モデルのパラメータ
プーリング・・・決められた演算を行うだけ
プーリングは「ダウンサンプリング」「サブサンプリング」ともいわれるる。
画像サイズを決められたルールで小さくするのがプーリング。

######●プーリングの種類
・maxプーリング
2×２ごとに、画像（特徴マップ）の最大値を抽出する
・avgプーリング
同様に、平均値を抽出する

まとめ、畳み込みと異なり、プーリングは気あった計算を行うだけ
学習すべきパラメータは存在しない

５．全結合層
畳み込み層・プーリング層を複数組み合わせる事で深いネットワークができる。
最終的に「猫」「犬」と識別できるモデルにするには、
出漁の形を１次元にする必要がある。

CNN(LeNET)では
畳み込み層・プーリング層を繰り返し、全結合層に接続する
全結合層・・・通常ニューラルネットワークと同じ隠れ層・出力層

入力⇒畳み込み層⇒プーリング層⇒畳み込み層⇒プーリング層⇒・・・・⇒全結合層⇒出力

######●最近のCNNの手法
全結合層を用いない場合が増えている
↓
「１つの特徴マップに１つのクラスを対応させる」ことで分類を行う
Global Average Poolingと呼ばれる処理を行う事がほとんど。

######GAP　（Global Average Pooling）
maxプーリングで7×7が512枚できたとする

各チャンネル（面）の画素平均を求め、それをまとめる
そうすると、重みパラメータは５１２で済む

全結合で行うと、
7×7×512＝25088
それを1×1×4096に全結合するので、重みパラメータは102760448存在することになる。
それが
それがGAPを利用すると512で済む事になる
結果　使用メモリは少なくなり、識別率も遜色ないむしろ良いくらいとの事。

###６．データ拡張
畳み込みやプーリングは移動不変性を獲得する処理になるので、層を深くするアプローチは画像認識精度を向上する。

######●問題点
・同じ物体でも、角度が異なれば画像としては全く見え方が異なる
・同じ物体でも、拡大縮小によって全く見え方が異なる
・同じ物体でも、光の当たり方（例えば昼と夜）によって全く見え方が異なる。

######●問題点の解決
・問題点を網羅したデータで学習を行う

######●問題点の解決策の問題点
・現実的にあらゆるパターンを想定したデータを準備する事は不可能

######●問題点の解決策の問題点の解決策
・手元にあるデータから疑似的に別のデータを生成する
「データ拡張（data augmentation）」と呼ばれる手法
データの「水増し」と言われる。

######●具体的なデータ拡張方法
・上下左右にずらす
・上下左右を反転する
・拡大・縮小をする
・回転する
・斜めにゆがめる
・一部を切り取る
・コントラストを変える
これらの手法にてデータ拡張した効果は大きく、画像認識を行う場合の必須処理となっている。

######●注意点
やみくもに全ての処理をしてはいけない
例）いいねボタンを逆にした画像で学習させると意味が逆になってしまう。
現実的にあり得るデータを再現するデータ拡張が必要

###７．CNNの発展形

画像認識において高い精度を得るために、畳み込み層とプーリング層を深くしていくアプローチがとられた。

例）

######2012年　AlexNet（アレックスネット）
畳み込み層⇒プーリング層⇒畳み込み層⇒プーリング層⇒畳み込み層⇒畳み込み層⇒畳み込み層⇒プーリング層⇒全結合層（3層）という構造をしている。

AlexNet以降、畳み込みとプーリングの繰り返しをさらに増やしたより深いネットワークモデルが続々と登場している。

AlexNetよりさらに深い
######・VGG
2014年ILSVRCで2位になった、オックスフォード大学のVGGチームのネットワーク。AlexNetをより深くした、畳み込み層とプーリング層からなる　ドノーマルなCNNで、重みがあるそう（畳み込み層や全結合層）を16層、もしくは19層重ねたもの。それぞれVGG16やVGG19と呼ばれる
小さいフィルターを持つ畳み込み層を２~４層連続して重ね、それをプーリング層でサイズを半分にするというのを繰り返し行う構造が特徴。大きなフィルターで画像を一気に畳み込むよりも小さいフィルターを何個も畳み込む（＝層を深くする）方が特徴をよりよく抽出できる。

######・GoogLeNet
2014年ISLVRCにて1位になったアーキテクチャ。
このアーキテクチャは通常入力層から出力層まで縦一直線の構造でなく、インセプション構造と呼ばれる横にも層が広がる構造をしている。このためインセプションモデルと呼ばれる。
横への層の広がりは、異なるサイズのフィルターの畳み込み層を複数並べて、それを結合するという形になっている。

これらの手法がILSVRCの記録をさらに大きく塗り替えた

######●問題点
単純に層を深くしていくだけでは計算量が非常に大きくなって学習が進まない
######●解決策
1×１や３×３といった「小さなサイズの畳み込みフィルターを差し込んで次元（計算量）を削減する」という工夫がとられた。

GoogLeNetでは、「Inceptionモジュール」というブロックを構成する事で、並列計算を行いやすくしている。
GooｇLeNetはInceptionモジュールを積み重ねていったネットワーク。

######■更なる問題点
これらの工夫で、層を深くしても効率的に学習が出来ていたが、「超」深層になると、逆に精度が落ちてくるという問題に直面した
理由は誤差が逆伝播しにくくなるから。通常NNと同じ理由だ。

######■解決策
Skip connectionと呼ばれる「層を飛び越えた結合」を加える
この結合を導入したネットワークを「ResNet」と言う
・層が深くなっても、層を飛び越える部分は伝播しやすくなる
・様々な形のネットワークのアンサンブル学習になっている

現在では100層以上のネットワークが構築される事も多い

######■ResNet
マイクロソフトのKaiming He氏による、2015年のILSVRCで優勝したネットワーク。
それまでのネットワークでは層を深くしすぎると性能が落ちるという問題があったが、
それを「スキップ構造」によって解決し、１５２層もの深さ（前年優勝のGoogLeNetでも22層）を実現した
スキップ構造は、ある層への入力をバイパスし層をまたいでおくの層へ入力してしまうというもので、これにより勾配の消失や発散を防止し、超多層ネットワークを実現している。

###８．転移学習
より深層なネットワークを構築し学習する事が可能になった事に伴い、学習に必要な計算量も莫大になった
ディープニューラルネットワークによる予測を行いたいときに必要なのは、「最適化されたネットワークの重み」であり、学習過程はその重みを得るためのステップに過ぎない
学習済みのネットワークがあるならが、新たに学習する必要はない。

######●ImageNetで学習済みのモデルが公開　されている
だれでも利用可能
実際に予測したいタスクは、ImageNetで学習したモデルに何層かを自分でつけたし、
そこをファインチューニングするだけでかなり高性能なネットワークを得る事が出来る

このように、学習済みのネットワークを利用して新しいタスクの識別に活用する事を
「転移学習」と呼ぶ