ラビットチャレンジ #14 深層学習Day4

# Section1：強化学習
## 強化学習とは
* 長期的に報酬を最大化できるように環境のなかで行動を選択できるエージェントを作ることを目標とする機械学習の一分野
    * 行動の結果として与えられる利益(報酬)をもとに、行動を決定する原理を改善していく仕組み

## 強化学習のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/ba511d1e-f0a5-c881-7194-5f06e20f9119.png)

## 強化学習の応用例
### マーケティングの場合
* 環境
    * 会社の販売促進部
* エージェント
    * プロフィールと購入履歴に基づいて、キャンペーンメールを送る顧客を決めるソフトウェア
* 行動
    * 顧客ごとに送信、非送信のふたつの行動を選ぶ
* 報酬
    * キャンペーンのコストという負の報酬とキャンペーンで生み出されると推測される売上という正の報酬を受ける

## 探索と利用のトレードオフ
### 例1
* 環境について事前に完璧な知識があれば、最適な行動を予測し決定することは可能
    * どのような顧客にキャンペーンメールを送信すると、どのような行動を行うのかが既知である状況
* 強化学習の場合、上記仮定は成り立たないとする。不完全な知識を元に行動しながら、データを収集。最適な行動を見つけていく

### 例2
* 過去のデータで、ベストとされる行動のみを常に取り続ければ他にもっとベストな行動を見つけることはできない
    * 探索が足りない状態
* 未知の行動のみを常に取り続ければ、過去の経験が活かせない
    * 利用が足りない状態

上記2つはトレードオフの関係性

## 強化学習の差分
* 強化学習と通常の教師あり、教師なし学習とは目標が違う
    * 教師なし/あり学習では、データに含まれるパターンを見つけ出すおよびそのデータから予測することが目標
    * 強化学習では、優れた方策を見つけることが目標

## 価値関数
* 価値を表す関数としては、状態価値関数と行動価値関数の2種類がある
    * ある状態の価値に注目する場合
        * 状態価値関数
    * 状態価値を組み合わせた価値に注目する場合は
        * 行動価値関数

## 方策関数
* 方策ベースの強化学習手法において、ある状態でどのような行動を採るのかの確率を与える関数のこと

## 方策勾配法
* デル化して最適化する手法

```math
\theta^{(t+1)} = \theta^{(t)} + \epsilon \nabla J(\theta)
```

* $J$は方策の良さを表す
    * 定義する必要がある

* 定義方法は2つある
    * 平均報酬
    * 割引報酬和

* 上記の定義に対応して、行動価値関数$Q(s,a)$の定義を行い。方策勾配定理が成り立つ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/2ffdebe9-f8b0-a31c-dac5-089f56708a62.png)


##参考

強化学習 (Reinforcement Learning) とは、機械学習の一種であり、コンピューター エージェントが動的環境と、繰り返し試行錯誤のやりとりを重ねることによってタスクを実行できるようになる手法です。この学習手法により、エージェントは、タスクの報酬を最大化する一連の意思決定を行うことができます。人間が介入したり、タスクを達成するために明示的にプログラムしたりする必要はありません

https://jp.mathworks.com/discovery/reinforcement-learning.html

# Section2：AlphaGo
## PolicyNet(方策関数)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/5fec09fa-4418-157b-5c63-8f2bd2637355.png)
## ValueNet(価値関数)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/e3231168-9416-1aa3-d7b8-fe306eaef3c1.png)

## Alpha Go の学習
### 1. 教師あり学習によるRollOutPolicyとPolicyNetの学習
* KGS Go Server（ネット囲碁対局サイト）の棋譜データから3000万局面分の教師を用意し、教師と同じ着手を予測できるよう学習を行った。* * 具体的には、教師が着手した手を1とし残りを0とした19×19次元の配列を教師とし、それを分類問題として学習した。
* この学習で作成したPolicyNetは57%ほどの精度である。

### 2. 強化学習によるPolicyNetの学習
* 現状のPolicyNetとPolicyPoolからランダムに選択されたPolicyNetと対局シミュレーションを行い、その結果を用いて方策勾配法で学習を行った。
* PolicyPoolとは、PolicyNetの強化学習の過程を500Iteraionごとに記録し保存しておいたものである。
* 現状のPolicyNet同士の対局ではなく、PolicyPoolに保存されているものとの対局を使用する理由は、対局に幅を持たせて過学習を防ごうというのが主である。
* この学習をminibatch size 128で1万回行った。

### 3. 強化学習によるValueNetの学習
* PolicyNetを使用して対局シミュレーションを行い、その結果の勝敗を教師として学習した。
* 教師データ作成の手順は
    1. まずSL PolicyNet(教師あり学習で作成したPolicyNet)でN手まで打つ
    1. N+1手目の手をランダムに選択し、その手で進めた局面をS（N+1）とする
    1. S（N+1）からRLPolicyNet（強化学習で作成したPolicyNet）で終局まで打ち、その勝敗報酬をRとする。
* S(N+1）とRを教師データ対とし、損失関数を平均二乗誤差とし、回帰問題として学習した。
* この学習をminibatch size 32で5000万回行ったN手までとN+1手からのPolicyNetを別々にしてある理由は、過学習を防ぐためであると論文では説明されている

## モンテカルロ木探索
* コンピュータ囲碁ソフトでは現在もっとも有効とされている探索法
* 他のボードゲームではminmax探索やその派生形のαβ探索を使うことが多いが、盤面の価値や勝率予想値が必要となる
* しかし囲碁では盤面の価値や勝率予想値を出すのが困難であるとされてきた
* そこで！盤面評価値に頼らず末端評価値、つまり勝敗のみを使って探索を行うことができないか、という発想で生まれた探索法
* 囲碁の場合、他のボードゲームと違い最大手数はマスの数でほぼ限定されるため、末端局面に到達しやすい
* 具体的には、現局面から末端局面までPlayOutと呼ばれるランダムシミュレーションを多数回行い、その勝敗を集計して着手の優劣を決定する
* また、該当手のシミュレーション回数が一定数を超えたら、その手を着手したあとの局面をシミュレーション開始局面とするよう、探索木を成長させる
* この探索木の成長を行うというのがモンテカルロ木探索の優れているところである
* モンテカルロ木探索はこの木の成長を行うことによって、一定条件下において探索結果は最善手を返すということが理論的に証明されている。

##　Alpha Go (Lee) のモンテカルロ木探索
* Alpha Goのモンテカルロ木探索は選択、評価、バックアップ、成長という４つのステップで構成される 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/84802ad0-4e57-5a12-3cdb-a5077ae04b72.png)

* 選択
    * Root局面にて着手選択方策$\pi = Q(s,a+cP(s,a) \frac{\sqrt{\sum_b N(s,b)}}{1+N(s,a)} )$に従って手を選択する
    * cは定数、$P(s,a）$はPolicyNetによる選択確率、$N(s,a)$はその手が探索中に選ばれた数、$ΣN(s,b)$は現局面の全合法手が選ばれた数の合計である
    * $Q(s,a)$が現状の勝敗期待値$cP(s,a) \frac{\sqrt{\sum_b N(s,b)}}{1+N(s,a)}$がバイアス項となり、基本的には勝敗期待値のより高い手を選択するが、選択数が少ない手には高いバイアスがかかり、選択されやすくなる
    * また、従来のモンテカルロ木探索では$P(s,a)$がバイアス項にそもそもないものや、人間が手作業で作ったヒューリスティックな方策評価が使われていたが、これにPolicyNetを使用するとしたのがAlphaGoの特徴のひとつである。
    * この選択、着手をLeafノードに到達するまで行う。
* 評価
    * 着手選択方策によって選ばれた手で進めた局面saがLeafノードであればその局面saをValueNetで評価する
    * また、局面saを開始局面とした末端局面までのシミレーションを行い、勝敗値を出す。
    * このときのシミレーション時にはRollOut方策を使用する
* バックアップ
    * 評価フェイズで評価した値を積算
    * 局面saでのValueNetの評価の積算値$Wv$、RollOutでの勝敗値での積算値$Wr$が積算され、$N(s,a)$と$ΣN(s,b)$が１加算
    * それらの値から勝敗期待値が再計算される
    * これをRoot局面までさかのぼって更新する。
    * $Q(s,a) =(1-\lambda \frac{Wv}{N(s,a)} + \lambda \frac{Wr}{N(s,a)}) $とし、$λ$は$0≦λ≦1の$定数である
    * AlphaGoLeeでは0.5が使用されている
* 成長
    * 選択、評価、バックアップを繰り返し一定回数選択された手があったら、その手で進めた局面の合法手ノードを展開し、探索木を成長させる

## AlphaGo(Lee) とAlphaGoZeroの違い
* 教師あり学習を一切行わず、強化学習のみで作成
* 特徴入力からヒューリスティックな要素を排除し、石の配置のみにした
* PolicyNetとValueNetを１つのネットワークに統合した
* Residual Net（後述）を導入した５、モンテカルロ木探索からRollOutシミュレーションをなくした

## AlphaGo ZeroのPolicyValueNet
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/c9de3c2d-8c07-c309-0340-a7b15305960b.png)

## Residual Network
* ネットワークにショートカット構造を追加して、勾配の爆発、消失を抑える効果を狙ったもの
* Residula Networkを使うことにより、100層を超えるネットワークでの安定した学習が可能となった
* 基本構造はConvolution→BatchNorm→ReLU→Convolution→BatchNorm→Add→ReLUのBlockを１単位にして積み重ねる形となる
* また、Resisual Networkを使うことにより層数の違うNetworkのアンサンブル効果が得られているという説もある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/37fe9413-a77b-897f-a54b-8c355ca14fe9.png)

### Residual Blockの工夫
#### Bottleneck 
* 1×1KernelのConvolutionを利用し、1層目で次元削減を行って3層目で次元を復元する３層構造にし、２層のものと比べて計算量はほぼ同じだが１層増やせるメリットがある、としたもの

#### PreActivation 
* ResidualBlockの並びをBatchNorm→ReLU→Convolution→BatchNorm→ReLU→Convolution→Addとすることにより性能が上昇したとするもの

### Network構造の工夫
#### WideResNet 
* ConvolutionのFilter数をk倍にしたResNet。１倍→k倍ｘブロック→2*k倍yブロックと段階的に幅を増やしていくのが一般的。Filter数を増やすことにより、浅い層数でも深い層数のものと同等以上の精度となり、またGPUをより効率的に使用できるため学習も早い

#### PyramidNet 
* WideResNetで幅が広がった直後の層に過度の負担がかかり精度を落とす原因となっているとし、段階的にではなく、各層でFilter数を増やしていくResNet

### Alpha Go Zeroの学習法
#### 自己対局による教師データの作成、学習、ネットワークの更新の３ステップで構成される
##### 自己対局による教師データの作成
* 現状のネットワークでモンテカルロ木探索を用いて自己対局を行う。
* まず30手までランダムで打ち、そこから探索を行い勝敗を決定する。
* 自己対局中の各局面での着手選択確率分布と勝敗を記録する。
* 教師データの形は（局面、着手選択確率分布、勝敗）が１セットとなる。

##### 学習
* 自己対局で作成した教師データを使い学習を行う。
* NetworkのPolicy部分の教師に着手選択確率分布を用い、Value部分の教師に勝敗を用いる。
* 損失関数はPolicy部分はCrossEntropy、Value部分は平均二乗誤差

##### ネットワークの更新
* 学習後、現状のネットワークと学習後のネットワークとで対局テストを行い、学習後のネットワークの勝率が高かった場合、学習後のネットワークを現状のネットワークとする

##参考

https://data.wingarc.com/alpha-go-26586

# Section3：軽量化・高速化技術
### 分散深層学習
* 深層学習は多くのデータを使用したり、パラメータ調整のために多くの時間を使用したりするため、高速な計算が求められる。
* 複数の計算資源(ワーカー)を使用し、並列的にニューラルネットを構成することで、効率の良い学習を行いたい。
* データ並列化、モデル並列化、GPUによる高速技術は不可欠である。

## データ並列
* 親モデルを各ワーカーに子モデルとしてコピー
* データを分割し、各ワーカーごとに計算させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/de653ca2-0dce-633d-6bcb-0616232d261e.png)

### 同期化
* データ並列化は各モデルのパラメータの合わせ方で、同期型か非同期型か決まる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/ba8bc401-6601-c293-2c9e-bba7c422f6f2.png)

* 同期型のパラメータ更新の流れ
    * 各ワーカーが計算が終わるのを待ち、全ワーカーの勾配が出たところで勾配の平均を計算し、親モデルのパラメータを更新する

### 非同期型

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/8571833d-fb7b-2343-fdb5-e7c803050f71.png)

* 非同期型のパラメータ更新の流れ
    * 各ワーカーはお互いの計算を待たず、各子モデルごとに更新を行う。
    * 学習が終わった子モデルはパラメータサーバにPushされる。
    * 新たに学習を始める時は、パラメータサーバからPopしたモデルに対して学習していく。

### 同期型と非同期型の比較
* 処理のスピードは、お互いのワーカーの計算を待たない非同期型の方が早い。
* 非同期型は最新のモデルのパラメータを利用できないので、学習が不安定になりやすい。
    * Stale Gradient Problem
* 現在は同期型の方が精度が良いことが多いので、主流となっている

## モデル並列
* 親モデルを各ワーカーに分割し、それぞれのモデルを学習させる。全てのデータで学習が終わった後で、一つのモデルに復元。
* モデルが大きい時はモデル並列化を、データが大きい時はデータ並列化をすると良い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/02c8d283-80ab-107e-7ab0-5a1ef9943488.png)

* モデルのパラメータ数が多いほど、スピードアップの効率も向上する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/ab67fd28-436e-3f9a-cfd7-e31f143f2b9a.png)

## GPU
### GPGPU 
* 元々の使用目的であるグラフィック以外の用途で使用されるGPUの総称

### CPU
* 高性能なコアが少数
* 複雑で連続的な処理が得意

### GPU
* 比較的低性能なコアが多数
* 簡単な並列処理が得意
* ニューラルネットの学習は単純な行列演算が多いので、高速化が可能

### GPGPU開発環境
#### CUDA
* GPU上で並列コンピューティングを行うためのプラットフォーム
* NVIDIA社が開発しているGPUのみで使用可能
* Deep Learning用に提供されているので、使いやすい
#### OpenCL
* オープンな並列コンピューティングのプラットフォーム
* NVIDIA社以外の会社(Intel, AMD, ARMなど)のGPUからでも使用可能
* Deep Learning用の計算に特化しているわけではない

Deep Learningフレームワーク(Tensorflow, Pytorch)内で実装されているので、使用する際は指定すれば良い

##モデルの軽量化
* モデルの精度を維持しつつパラメータや演算回数を低減する手法の総称
* 高メモリ負荷・高い演算性能が求められる
* 通常は低メモリ・低演算性能での利用が必要とされるIotなど

#### モデルの軽量化の利用
* モデルの軽量化はモバイル, IoT 機器において有用な手法
* モバイル端末やIoT はパソコンに比べ性能が大きく劣る
    * 主に計算速度と搭載されているメモリ
* モデルの軽量化は計算の高速化と省メモリ化を行うためモバイル,IoT 機器と相性が良い手法になる

* 代表的な手法として下記の3 つがある
    * 量子化
    * 蒸留
    * プルーニング

### 量子化
* ネットワークが大きくなると大量のパラメータが必要なり学習や推論に多くのメモリと演算処理が必要
* 通常のパラメータの64 bit 浮動小数点を32 bit など下位の精度に落とすことでメモリと演算処理の削減を行う

#### メリット
* 計算の高速化
    * 倍精度演算(64 bit)と単精度演算(32 bit)は演算性能が大きく違うため、量子化により精度を落とすことによりより多くの計算をすることができる。
* 省メモリ化
    * ニューロンの重みを浮動小数点のbit数を少なくし、有効桁数を下げることでニューロンのメモリサイズを小さくすることができ、多くのメモリを消費するモデルのメモリ使用量を抑えることができる

#### デメリット
* 精度の低下
    * ニューロンが表現できる少数の有効桁が小さくなる
    * つまりモデルの表現力が低下する

### 蒸留
* 精度の高いモデルはニューロンの規模が大きなモデルになっている
* そのため推論に多くのメモリと演算処理が必要
* 規模の大きなモデルの知識を使い軽量なモデル作成を行う

#### モデルの簡素化
* 学習済みの精度の高いモデルの知識を軽量なモデルへ継承させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/312bef2e-885b-573f-79b4-95a4de47ffba.png)

* 知識の継承により軽量でありながら複雑なモデルに匹敵する
* 精度のモデルを得ることが期待できる

#### メリット
* 下記のグラフはCifar 10 データセットで学習を行ったレイヤー数と精度のグラフになる
    * back propagation は通常の学習
    * Knowledge Distillation は先に説明した蒸留手法
    * Hint Taraing は蒸留は引用論文で提案された蒸留手法
* 図から蒸留によって少ない学習回数でより精度の良いモデルを作成することができている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/192dbaf3-f591-f6cf-4ba4-3df877233a3c.png)

### プルーニング
* ネットワークが大きくなると大量のパラメータがすべてのニューロンの計算が精度に寄与しているわけではない
* モデルの精度に寄与が少ないニューロンを削減することでモデルの軽量化、高速化が見込まれる

#### 計算の高速化
* 寄与の少ないニューロンの削減を行いモデルの圧縮を行うことで高速化に計算を行うことができる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/26b96e51-dac3-1de6-917c-c931b49f6542.png)

#### ニューロンの削減
* ニューロンの削減の手法は重みが閾値以下の場合ニューロンを削減し、再学習を行う
* 下記の例は重みが0.1 以下のニューロンを削減した

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/9a9fe823-b19e-852e-b8e5-21aab358663e.png)

### まとめ
##### 量子化
* 重みの精度を下げることにより計算の高速化と省メモリ化を行う技術

##### 蒸留
* 複雑で精度の良い教師モデルから軽量な生徒モデルを効率よく学習を行う技術

##### プルーニング
* 寄与の少ないニューロンをモデルから削減し高速化と省メモリ化を行う技術

### 確認テストがないので代わりに考察
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/1071be8e-132e-3b00-5bd0-88f93d9c3d0e.png)

*　処理の量が少ないと、比例するようにして時間も少なくなっている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/7f0ed3b0-61bf-bdea-4327-d0a4b80025fb.png)

* 精度はあまり変わらないことが分かる

##参考

https://laboro.ai/activity/column/engineer/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%82%92%E8%BB%BD%E9%87%8F%E5%8C%96%E3%81%99%E3%82%8B%E3%83%A2%E3%83%87%E3%83%AB%E5%9C%A7%E7%B8%AE/

# Section4：応用モデル
## MobileNet
* 一般的な畳み込みレイヤーは計算量が多い
* MobileNetは組み合わせで軽量化を実現

### Depthwise Convolution
* 仕組み
    * 入力マップのチャネルごとに畳み込みを実施
    * 出力マップをそれらと結合(入力マップのチャネル数と同じになる)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/a17b3261-f86a-43aa-eb82-b750c0ddd924.png)

* 通常の畳み込みカーネルは全ての層にかかっていることを考えると計算量が大幅に削減可能
* 各層ごとの畳み込みなので層間の関係性は全く考慮されない。通常はPW畳み込みとセットで使うことで解決

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/81b26811-996d-ff28-f701-7f70a40aba22.png)

### Pointwise Convolution
* 仕組み
    * 1 x 1 convとも呼ばれる(正確には1 x 1 x c)
    * 入力マップのポイントごとに畳み込みを実施
    * 出力マップ(チャネル数)はフィルタ数分だけ作成可能(任意のサイズが指定可能)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/83e8a4a4-6f56-faf2-3e43-624905e7100a.png)

* 出力マップの計算量は$H×W×C×M$

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/d82e8492-cdd3-b111-2337-f31340ecfdb1.png)

## DenseNet
* 初期の畳み込み
* Denseブロック
* 変換レイヤー
* 判別レイヤー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/538881f9-84a2-b320-355e-3cc4350f0254.png)

* 出力層に前の層の入力を足しあわせる
    * 層間の情報の伝達を最大にするために全ての同特徴量サイズの層を結合する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/e5d04ce1-6c5d-ca0d-518c-e4d5f1a27c50.png)

* 特徴マップの入力に対し、下記の処理で出力を計算
    * Batch正規化
    * Relu関数による変換
    * 3 x 3畳み込み層による処理

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/6096e98f-cf80-5c92-0ad4-41e7baac34f6.png)

* 計算した出力に入力特徴マップを足し合わせる
* 入力特徴マップのチャンネル数がl x kだった場合、出力は(l+1) x kとなる
* 第l層の出力をとすると$x_1 = H_l([x_0, x_1,・・,x_{l-1}])$

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/aa2a387a-f256-7c87-fd24-16b779e8ea9b.png)

### growth rate
* kをネットワークのgrowth rateと呼ぶ
* kが大きくなるほど、ネットワークが大きくなるため、小さな整数に設定するのがよい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/41f825ea-02dd-a088-2342-baf9eb480f30.png)

### Transition Layer
* CNNでは中間層でチャネルサイズを変更し
* 特徴マップのサイズを変更し、ダウンサンプリングを行うため、Transition Layerと呼ばれる層でDence blockをつなぐ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/45015b3a-38f8-216f-a98b-acc76509cbac.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/d4942e48-a89e-1c12-cd65-83adf73907cc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/6a1c7186-3c2e-a0f1-0d70-22fa01b4944b.png)

* DenseNet内で使用されるDenseBlockと呼ばれるモジュールでは成⻑率(Growth Rate)と呼ばれるハイパーパラメータが存在する。
* DenseBlock内の各ブロック毎にk個ずつ特徴マップのチャネル数が増加していく時、kを成⻑率と呼ぶ

### DenseNetとResNetの違い
* DenseBlockでは前方の各層からの出力全てが後方の層への入力として用いられる
* RessidualBlockでは前1層の入力のみ後方の層へ入力

## Layer正規化/Instance正規化
### いろんな正規化
#### Batch正規化
* ミニバッチに含まれるsampleの同一チャネルが同一分布に従うよう正規化

* H x W x CのsampleがN個あった場合に、N個の同一チャネルが正規化の単位
    * RGBの3チャネルのsampleがN個の場合は、それぞれのチャンネルの平均と分散を求め正規化を実施(図の⻘い部分に対応)
    * チャンネルごとに正規化された特徴マップを出力。
* ミニバッチのサイズを大きく取れない場合には、効果が薄くなってしまう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/1f2a0fc5-81d3-07f6-294d-e78bf23198f5.png)


#### Layer正規化
* それぞれのsampleの全てのpixelsが同一分布に従うよう正規化
* N個のsampleのうち一つに注目。H x W x Cの全てのpixelが正規化の単位
* RGBの3チャネルのsampleがN個の場合は、あるsampleを取り出し、全てのチャネルの平均と分散を求め正規化を実施(図の⻘い部分に対応)
* 特徴マップごとに正規化された特徴マップを出力
* ミニバッチの数に依存しないので、上記の問題を解消できていると考えられる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/ed8f9ece-0a65-1c6d-b838-ef27b1275f93.png)

* 入力データや重み行列に対して以下の操作を施しても出力が変わらないことが知られている
    * 入力データのスケールに関してロバスト
    * 重み行列のスケールやシフトに関してロバスト

#### Instance正規化
* さらにchannelも同一分布に従うよう正規化
* 各sampleの各チャネルごとに正規化
* コントラクトの画像に寄与・画像のスタイル転送やテクスチャ合成タスクなどで利用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/e2a6c1c5-b631-306f-fdeb-bd7cb2867868.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/9b3af4f4-9e62-30da-84f8-016851fca913.png)

## Wavenet
* Aoron van den Oord et. al., 2016らにより提案
    * Alpha Goのプログラムを開発しており、2014年にGoogleに買収される
* 生の音声波形を生成する深層学習モデル
* Pixel CNN(高解像度の画像を精密に生成できる手法)を音声に応用したもの

### 考え方
* 時系列データに対して畳み込み(Dilated convolution)を適用する
* Dilated convolution
    * 層が深くになるにつれて畳み込むリンクを話す
    * 受容野を簡単に増やすことができるという利点がある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/528b5df0-99dc-622d-0fcc-ee414639ac51.png)

(右図ではDilated=1,2,4,8となっている)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/f494f2ba-5a5f-97f0-d95d-36728a49937b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/cb14714a-3312-bd5f-92b3-1c0178a14211.png)


* (あ) Dilated causal convolution
* (い) パラメータに対する需要やが広い

##参考

https://agirobots.com/depthwise-pointwise-convolution/

# Section5：Transformer
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/a4a19bc5-d7c8-1bce-bfb3-102220ed4212.png)

### ちょっとニューラル機械翻訳の復習
* Encoder-Decoderモデル
* Encoder RNN
    * 翻訳元の文を読み、実数値ベクトルに変換
* Decoder RNN
    * 実数値ベクトルから、翻訳先の言語の文を生成

#### 弱点
*  **長さに弱い**

* 翻訳元の文の内容をひとつのベクトルで表現
    * 文長が長くなると表現力が足りなくなる
* 文長と翻訳精度の関係性

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/0175de6d-a811-a979-546b-a9908492d380.png)

### Attention
* 翻訳先の各単語を選択する際に翻訳元の文中の各単語の隠れ状態を利用

* 翻訳元の各単語の隠れ状態の加重平均

```math
c_i = \sum^{T_x}_{j=1} \alpha_{ij}h_j・
```

* 重みはすべて足すと1
* 重みはFFNNで求める

```math
\alpha_{ij} = \frac{exp(e_{ij})}{\sum^{T_x}_{j=1}exp(e_{ij})'} \\
e_{ij} = a(s_{i-1}, h_j)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/13c11477-b17c-58b7-4d57-052f86f0e366.png)

#### Attentionの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/0363a6ac-59a5-2e33-ddba-36231dfbfce1.png)

#### Attentionの役割
*  **Attentionは辞書オブジェクト**

* query(検索クエリ)に一致するkeyを索引し、対応するvalueを取り出す操作であると見做すことができる
* 辞書オブジェクトの機能と同じである

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/82bfaafc-dedd-fa31-df5f-e3ccf614bba9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/e04fc36e-3d25-378d-dc8f-8f10a1b9c031.png)

### Transformer
* 2017年に登場
* RNNを使わない
    * 必要なのはAttentionだけ
* 当時のSOTAをはるかに少ない計算量で実現
* 英仏(3600万文)の学習を8GPUで3.5日で完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/7118e113-1b33-8165-8779-34dbcece4055.png)

$### Transformer Encoder
* 自己注意機構により文脈を考慮して各単語をエンコード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/3a85a940-6bce-f706-5507-7cd2bab68318.png)

* 入力を全て同じにして学習的に注意箇所を決めていく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/2e18a204-f1d3-dd51-8a47-b66a98f51491.png)

#### Position-Wise Feed-Forward Networks
*  **位置情報を保持したまま順伝播させる**
*  各Attention層の出力を決定
    *  2層の全結合NN
    *  線形変換→ReLu→線形変換

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/034902b5-ae99-68b4-5675-457031c8ac6b.png)

#### Scaled dot product attention
* 全単語に関するAttentionをまとめて計算する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/3d0b3a7b-6058-9877-7be9-d95f4ea220ff.png)

#### Multi-Head attention
*  **重みパラメタの異なる８個のヘッドを使用**
* ８個のScaled Dot-Product Attentionの出力をConcat
* それぞれのヘッドが異なる種類の情報を収集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/354c36f3-a855-2fb5-224c-62e7d78346ed.png)

#### Decoder
* Encoderと同じく6層
    * 各層で二種類の注意機構
    * 注意機構の仕組みはEncoderとほぼ同じ
* 自己注意機構
    * 生成単語列の情報を収集
        * 直下の層の出力へのアテンション
    * 未来の情報を見ないようにマスク
* Encoder-Decoder attention
    * 入力文の情報を収集
        * Encoderの出力へのアテンション

#### Add & Norm
* Add (Residual Connection)
    * 入出力の差分を学習させる
    * 実装上は出力に入力をそのまま加算するだけ
    * 効果：学習・テストエラーの低減
* Norm (Layer Normalization) 
    * 各層においてバイアスを除く活性化関数への入力を平均0、分散1に正則化
    * 効果：学習の高速化

#### Position Encoding
* RNNを用いないので単語列の語順情報を追加する必要がある

* 単語の位置情報をエンコード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/a1c2c90c-1896-bed5-56d0-faed9a9af7e3.png)

* posの(ソフトな)２進数表現
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/6ea482b1-3604-d5c1-9440-7e2b2f6c827f.png)

### まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/b56ad808-8984-90e1-2862-ac02f9a98d65.png)


#### Attentionの可視化
* 注意状況を確認すると言語構造を捉えていることが多い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/223d5a87-c190-375d-242d-98ab6be5547b.png)


##参考

https://ja.wikipedia.org/wiki/Transformer_(%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%A2%E3%83%87%E3%83%AB)

# Section6：物体検知・セグメンテーション

### 広義の物体認識タスク
* 入力
    * 画像（カラー・モノクロは問わない）
* 出力
　* 分類
    * （画像に対し単一または複数の）クラスラベル
　* 物体検知
    * Bounding Box
　* 意味領域分割
    * （各ピクセルに対し単一の）クラスラベル
　* 個体領域分割
    * （各ピクセルに対し単一の）クラスラベル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/8da77eae-c4e1-ce0c-a3cb-40add6270d57.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/a76169c8-b32a-0dd3-5e2f-cfce3353e594.png)

#### 分類問題における評価指標の復習

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/1ab62efd-05f3-9f46-966b-2406458a4ebf.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/2608076e-add2-78e8-2004-cc9f71185c86.png)


### IoU：Intersection over Union
* Union32Motivation
    * 物体検出においてはクラスラベルだけでなく, 物体位置の予測精度も評価したい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/5c16d5da-bf4d-5052-2414-f7602f9aa99d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/66f6e5d8-2db6-ffa3-f1ce-9943c23b7f94.png)


### AP：Average Precision

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/7caec62f-1735-635e-9627-cbf704c31506.png)


### mAP：mean Average Precision

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/0e9cd376-ea76-5867-bef8-36ea81c488b4.png)

### FPS：Flames per Second

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/3774cd22-f118-3854-41c5-0d6f287aee81.png)

### マイルストーン
* 深層学習以降の物体検知

2012: AlexNetの登場を皮切りに, 時代はSIFTからDCNNへ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/398ff720-9714-b80d-4fdc-f8da9fa6e216.png)

### SSD: Single Shot Detector

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/dc743e20-0dcb-552c-db8f-1f0d70a03092.png)

### SSDのネットワークアーキテクチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/a2667455-a518-30dc-6159-06edc5bd873e.png)

### 特徴マップからの出力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/93f7c38a-4c89-1d24-c909-4cb7012d95ea.png)


### SSDのデフォルトボックス数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/3717e4c3-8273-9a00-4a77-def81f44332d.png)

* VOCデータセットではクラス数20に背景クラスが考慮され, #Class = 21となることに注意
    * $4×(21+4)×38×38 + 4×(21+4)×3×3 + 4×(21+4)×1×1$
    * $6×(21+4)×19×19 + 6×(21+4)×10×10 + 6×(21+4)×5×5$
        * $=8,732 × (21+4)$

#### 工夫
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183979/c17be7de-8b4a-8e48-b7d9-da86dc71ddfe.png)

* RCNNでも既に用いられており初出の処理ではない
* 他にも, 原著論文では学習上の工夫としてDefault Boxのアスペクト比の選び方やData
 Augmentationについても触れられている


##参考

https://data-analysis-stats.jp/%E6%B7%B1%E5%B1%9E%E5%AD%A6%E7%BF%92/%E7%94%BB%E5%83%8F%E5%88%86%E9%A1%9E%E3%83%BB%E7%89%A9%E4%BD%93%E6%A4%9C%E5%87%BA%E3%83%BB%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%AF%94%E8%BC%83/