深層学習[MobileNet,DenseNet,Normalization,WaveNet]

#1. 軽量画像認識モデル MobileNet

画像認識のモデルの精度としては、2017年頃に実用水準にまで到達してしまった。
それ以降は、技術的には軽量化などの方向にいっている。
そのひとつが、MobileNet。

MobileNet1は、畳み込み処理にDepthwise Convolutionと、Pointwise Convolutionという二つの演算に畳み込み処理を分けて計算量を削減しているという特徴がある。

![MobileNet.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/f8ca6b1d-8231-05d7-c1e8-c3736d1e58be.png)


なお、普通のコンボリューションの計算量は以下のようにカーネルサイズ、チャンネル数、フィルタ数、画像サイズで決まる。入力のチャンネル数が複数あっても、フィルタ1個につき出力は1個になる。

![Convolution.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/4c2546e5-92e2-fc3c-94a6-a5b1a4ab5895.png)


##1.1. Depthwise Convolution
普通の畳み込みは、フィルタが複数個あるが、Depthwise Convolution　では、フィルタは1個しかない。色んな個性の人が見る事で、いろんな特徴量を出力しようという考えはここにはない。なお、この場合、入力のチャンネル毎に出力を出している。


凄く単純な畳み込みしかしないことにより、計算量を減らしているのを、Depthwise Convolutionと呼んでいる。

![MoblieNet_DW.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/3387dafe-b552-53b9-ef0e-41ad48295e12.png)



##1.2. Pointwise Convolution

普通のカーネルは、サイズが数ピクセルあるが、Pointwise Convolutionでは、カーネルサイズが1×1である。畳み込みなのか？　
その代りに、フィルタ数Mを変動させる。色んな人が見て、いろんな特徴量を出そうとしている。
カーネルサイズK×Kの計算量はごっそり減る。

Depthwise Convolutionと、Pointwise Convolutionの二つを組み合わせることで、計算量を減らして、かつ特徴を得ることを両立させようとしている。


![MoblieNet_PW.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/c87c4156-1a51-a829-981d-551b7c07d242.png)



#2. 画像認識モデルDenseNet

DenseNetは、勾配消失問題を解消しながら、層を深くするための考え方である。
DenseNet内には、層を深くしていくDenseBlockと、深くなった層をリセットするような動きをするTransition Layerの2つの構造があり、これらを連結することで、深いNNを実現している。

![DenseNet.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/890ebf09-2c67-01fb-fc08-abc1ac7c9819.png)


##2.1. DenseBlock

DenseBlock内には、4層ほどCovolution層が連なっているが、その入力には、前の層の入力、その前の層の入力と、何層も前の入力を全て入力として入れている。これを**スキップコネクション**という。
入力に画像のRGBの3チャンネル（kチャンネル）があるとすれば、層ごとに入力が3チャンネル増えていくイメージである。
この何チャンネルずつ増えるかというのを、**成長率**という。

![DenseBlock.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/c61eee48-53cf-7347-4bd4-ba2101bd70ec.png)

##2.2. Transition Layer

DenseBlockを通ると、永遠と入力データが増えて行ってしまうので、Transition Layerで、増えたチャンネルをいったん元の3チャンネルに戻す。そして、プーリング（Max？Average？）層を通して、また次のDenseBlockへ、3チャンネルの入力を行っている。
DenseNetでは、この深層化とリセットを交互に繰り返すのが特徴。


##2.3. 画像認識モデルResNetとの違い

スキップコネクションを採用したモデルとして、似たようなものとして、もともとResNetがある。
ResNetとの大きな違いは以下の２つ。

+ 前の前の入力もスキップする
+ 成長率が存在する

ResNetでは、前の層の入力しかスキップしないが、DenseBlockでは、それより前の入力もスキップして巨大化していく点が異なる。
また、巨大化していく程度を成長率といっている点も異なる。


#3. Normalization

正規化層（Normalization　Layer）の働きをまとめる。
正規化とは、データを一定のルールに基づいて奇麗に整理して、利用しやすくすることである。
正規化は、最小値を0，最大値を1とするスケーリング手法であり、次元ごと（特徴ごと）にバラバラの値を持つデータを整理して、次元ごとの関係性を奇麗に整理が出来る。

正規化を行う対象の画像データは、一般的に$(H, W, C, N)$の形を持ったテンソルデータである。縦横（H,W）で、C個のチャンネルのある画像がN個集まったデータという意味。
この形のデータをどの切り口で正規化していくかによって、正規化のやりかたが複数種類ある。


##3.1. Batch Norm

ミニバッチ単位で、ミニバッチ内のあるチャンネル毎に平均が０、分散が１になるように正規化することをバッチ正規化（Batch Normalization)とよぶ。

**【バッチ正規化のメリット】**

+ 学習時間の短縮
+ 初期値への依存低減
+ 過学習の抑制

**【バッチ正規化のデメリット】**

+ バッチサイズが小さいと学習収束しない(※１)
+ HW性能によって、バッチサイズが変わる（※２）

（※１）例えば、ミニバッチサイズが２（画像２枚）とかで正規化したところで意味はない。
（※２）**GoogleのTPUですら、１００くらいまでしかしけない。実際問題として使えない。**

![Batch_Norm.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/158f239d-cbcc-ccbd-3fb9-f695522acc14.png)



##3.2. Layer Norm

各データ（画像1枚）内のデータ（ピクセルデータ）が同じ分布に従うように正規化することを、Layer Normalizationという。

**【レイヤー正規化のメリット】**

+ バッチサイズに影響されない
+ バッチ正規化が普通の考え方だが、これもそんなに性能悪くない。
+ 入力データの変化に対して堅牢（ロバスト）なモデルになる。
+ 重みの変化に対して堅牢（ロバスト）なモデルになる。


![Layer_Norm.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/2013a786-d20f-36ae-d75a-a58a701082fa.png)

##3.3. Instance Norm

Layer Normalizationをさらにスコープを小さくして、チャンネル内だけで正規化するのをInstance Normalization。

![InstanceNorm.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/1f2fa1e5-3138-b377-cee2-1c28aa555cb7.png)



#4. 音声生成モデルWaveNet

WaveNetは、AlphaGoを開発したGoogle傘下のDeepMindが2016年に開発した革命的な音声生成モデルである。
それまで音声生成の世界では、多数の課題があったが、それを突破するアイデアがなかった。それらをDNNを用いて解決して突破口を開いたのがWaveNetである。

+ 長期に渡る音声波形の依存関係をどうやって捉えるか？
+ 音声の揺らぎ成分をどうするか？


##4.1. Dilated Causal Convolutions

WaveNetでは、音声生成の際に時間的に過去の特徴に依存する問題を畳み込みを用いて解決している。
通常の畳み込み処理ではなく、より長期間の特徴量を畳み込むために、Dilated Causal Convolutionsという手法を使っている。
これは、横方向のデータの繋がりを畳み込んでいくConvolutionを、一つ飛ばし、二つ飛ばしで実施していこうという発想のものである。画像の場合、音声の場合のイメージは以下の図のとおり。

![Dilated_Convolution.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/3cc6de1e-58e2-c1de-6cc7-172163556b08.png)