ラビットチャレンジ　深層学習　Day4 前半

### ラビットチャレンジに関するリンクはこちら
[ラビットチャレンジ　応用数学](https://qiita.com/matsu0130/items/6ba0279485ef8904fffb)
[ラビットチャレンジ　機械学習](https://qiita.com/matsu0130/items/12d6ed23e4189fd494cd)
[ラビットチャレンジ　深層学習　Day1](https://qiita.com/matsu0130/items/fa36ff86aa24a3e05810)
[ラビットチャレンジ　深層学習　Day2](https://qiita.com/matsu0130/items/2afa699b2d008e6fe19a)
[ラビットチャレンジ　深層学習　Day3](https://qiita.com/matsu0130/items/adc56e82168f9f86c8ee)
[ラビットチャレンジ　深層学習　Day4前半](https://qiita.com/matsu0130/items/36b867605960e3ea9aca)
[ラビットチャレンジ　深層学習　Day4後半](https://qiita.com/matsu0130/items/68f32635b63f74dc723c)

### 1.強化学習
#### 1.1.強化学習とは
**長期的に報酬を最大化できるように環境のなかで行動を選択できるエージェントを作ることを目標とする機械学習の一分野**。
行動の結果として与えられる利益(報酬)をもとに、行動を決定する原理を改善していく仕組み。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/1980fe9a-20ba-d14d-3255-bbde4b61f3a2.png)


**方策関数**：方策ベースの強化学習手法において、**ある状態でどのような行動を取るのかの確率を与える**関数。
**価値関数**：**状態価値関数**と**行動価値関数**の２種類がある。
**ある状態の価値に注目する場合**は**状態価値関数**。
**状態と価値を組み合わせた価値に注目する場合**は**行動価値関数**。

#### 1.2.方策勾配法
方策をモデル化して最適化する手法
$$
θ^{t+1} = θ^t + ε∇J(θ)
$$
**関数Jは方策の良さを表し、定義しなければならない**

【定義方法】
・平均報酬
・割引報酬和
上記の定義に対応して、行動価値関数Q(s,a)の定義を行い、方策勾配定理が成り立つ。

$$
∇𝐽(𝜃) = E_{𝜋𝜃}[∇log_{𝜋𝜃}(𝑎|𝑠)𝑄^{𝜋𝜃}(𝑠,𝑎)]
$$

#### 1.3.強化学習のトレードオフ関係
環境について事前に完璧な知識があれば、最適な行動を予測し決定することは可能。
どのような顧客にキャンペーンメールを送信すると、どのような行動を行うのかが既知である状況。

強化学習の場合、上記仮定は成り立たないとする。不完全な知識を元に行動しながら、
データを収集し、最適な行動を見つけていく。

過去のデータで、ベストとされる行動のみを常に取り続ければ他にベストな行動を見つけることはできない
→**探索が足りない状態**
↑
**トレードオフの関係**
↓
未知の行動のみを取り続ければ、過去の経験が活かせない
→**利用が足りない状態**

#### 1.4.強化学習と通常の教師あり、教師なし学習との違い
結論から述べると**目標が異なる**。
教師なし、教師あり学習では、**データに含まれるパターンを見つけ出すこと**が目標。
一方で、強化学習では、**優れた方策を見つけること**が目標。

### 2.AlphaGo
####2.1.PolicyNet（方策関数）とValueNet（価値関数）について
<img width='600' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/6b9fb7dd-7678-b1bc-bb74-af147a8901f0.png'>
<img width='600' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/528e2279-0091-7d82-94bb-58a9df7db054.png'>
<img width='600' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/4c540a97-20cc-2fce-97c1-77115f5678de.png'>

#### 2.2.RollOutPolicy
NNではなく、**線形の方策関数**である。
**PolicyNetでは学習に時間がかかるため、この手法を用いる（ただし精度は落ちる）**。
<img width='600' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/545b73e2-b253-0da6-d97b-90e9a4745e1c.png'>

#### 2.3.AlphaGoの学習
１) 教師あり学習による**RollOutPolicy**と**PolicyNet**の学習
２) 強化学習による**PolicyNet**の学習
３) 強化学習による**ValueNet**の学習
<img width='400' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/c5ce3779-506c-20b4-06e4-dad1e31f73a9.png'>

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


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

#####2.3.3. ValueNetの強化学習
PolicyNetを使用して対局シミュレーションを行い、その**結果の勝敗を教師として学習**した。
【教師データ作成の手順】
１) まずSL PolicyNet(教師あり学習で作成したPolicyNet)でN手まで打つ。
２) N+1手目の手をランダムに選択し、その手で進めた局面をS（N+1）とする。
３) S（N+1）からRLPolicyNet（強化学習で作成したPolicyNet）で終局まで打ち、その勝敗報酬をRとする。

S(N+1）とRを教師データの対にして、**回帰問題（誤差関数は平均二乗誤差）**として学習した。この学習をminibatch size 32で5000万回行った。
**N手までとN+1手からのPolicyNetを別々にしてある理由は、過学習を防ぐため**であると論文では説明されている。

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

#####2.4.2.AlphaGo　ZeroのNetwork
先ほど述べたように**PolicyNetとValueNetが１つのネットワークに統合**している。
<img width='600' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/f63c3c4b-1fde-628c-70e5-edd159428783.png'>

#####2.4.3.ResidualBlock
上図のResidualBlockの中身。
ネットワークにショートカット構造を追加して、**勾配の爆発、消失を抑える効果を狙ったもの**。
Residula Networkを使うことにより、100層を超えるネットワークでの安定した学習が可能となった。
基本構造は
**Convolution→BatchNorm→ReLU→Convolution→BatchNorm→Add→ReLU**
のBlockを１単位にして積み重ねる形となる。また、Resisual Networkを使うことにより層数の違うNetworkのアンサンブル効果が得られているという説もある
<img width='600' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/51cdc5f3-392e-8e30-ddc3-6ec68a41f0a8.png'>

#####2.4.4.AlphsGo Zeroの学習
Alpha Goの学習は大きく分けて３ステップある。
1) **自己対局による教師データの作成**
2) **学習**
3) **ネットワークの更新**

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

2)学習自己対局で作成した教師データを使い学習を行う。**NetworkのPolicy部分の教師に着手選択確率分布**を用い、**Value部分の教師に勝敗**を用いる。

3)損失関数は**Policy部分はCrossEntropy**、**Value部分は平均二乗誤差**。
ネットワークの更新学習後、現状のネットワークと学習後のネットワークとで対局テストを行い、学習後のネットワークの勝率が高かった場合、学習後のネットワークを現状のネットワークとする。


### 3.軽量化・高速化技術
####3.1.分散深層学習
深層学習は多くのデータを使用したり、パラメータ調整のために多くの時間を使用したりするため、高速な計算が求められる。
•複数の計算資源(ワーカー)を使用し、並列的にニューラルネットを構成することで、効率の良い学習を行いたい。
•データ並列化、モデル並列化、GPUによる高速技術は不可欠である。
####3.2.データ並列化
#####3.2.1データ並列化とは
•親モデルを各ワーカーに子モデルとしてコピーする。
•データを分割し、各ワーカーごとに計算させる。
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/e918f11b-7b65-6c6f-9df4-2cedad41fba1.png'>

#####3.2.2.データ並列化　同期型
データ並列化の同期型は、**各ワーカーの計算が終わるのを待ち、全ワーカーの勾配が出たところで勾配の平均を計算し、親モデルのパラメータを更新する**手法。

<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/4611d02d-d4b8-09d4-f5e1-77d9b0653509.png'>

#####3.2.3.データ並列化　非同期型
非同期型のパラメータ更新は、**各ワーカーはお互いの計算を待たず、各子モデルごとに更新を行う**。

<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/bf0deab9-6eaf-0f34-e3b0-256085f25826.png'>

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

####3.3.モデル並列化
•親モデルを各ワーカーに分割し、それぞれのモデルを学習させる。全てのデータで学習が終わった後で、一つのモデルに復元。
•モデルが大きい時はモデル並列化を、データが大きい時はデータ並列化をすると良い。
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/85d159e3-c73a-ba7f-acbf-344549271fda.png'>

モデルのパラメータ数が多いほど、スピードアップの効率も向上する。
<img width='400' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/f6512018-8691-e6e0-7473-6ff89d221ad8.png'>

#### 3.4.GPUによる高速化
・**GPGPU** (General-purpose on GPU)
元々の使用目的であるグラフィック以外の用途で使用されるGPUの総称
・**CPU**
高性能なコアが少数。**複雑で連続的な処理が得意**
・**GPU**
比較的低性能なコアが多数。**簡単な並列処理が得意**。
**ニューラルネットの学習は単純な行列演算が多いので、高速化が可能**

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

##### 3.5.2.蒸留
規模の大きなモデルの知識を用いて、軽量なモデルの作成を行う手法。
学習済みの精度の高いモデルの知識を軽量なモデルへ継承させる。
<img width='300' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/5d3011af-c46b-835d-088a-a931cfcbff5f.png'>

蒸留は**教師モデル**と**生徒モデル**の2つで構成される。
**教師モデル**
予測精度の高い、複雑なモデルやアンサンブルされたモデル
**生徒モデル**
教師モデルをもとに作られる軽量なモデル

<img width='300' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/8199957b-2cec-9e2c-2072-4faaf1d59c9f.png'>

##### 3.5.3.プルーニング
モデルの精度に対して**寄与度が小さいニューロンを削減**することで**モデルの軽量化・高速化**が見込まれる。
以下の表は、実際にOxford 102 category ower datasetをCaffeNetで学習したモデルをプルーニングしたものである。
<img width='200' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/e0907d79-059a-7a71-716f-5156dcbb6dab.png'>
> 佐々木健太、佐々木勇和、鬼塚真（２０１５）「ニューラルネットワークの全結合層におけるパラメータ削減手法の比較」

###4.応用技術
####4.1.MobileNets
**Depthwise Convolution**と**Pointwise Convolution**の組み合わせで軽量化を実現。
全体像は以下の通りとなっている。
具体的な説明は後述していく。
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/7ce935ba-f537-6e52-dc86-565d88c8ccde.png'>

【一般的な畳み込みレイヤー】
○入力特徴マップ(チャネル数)：H×W×C
○畳込みカーネルのサイズ：K×K×C
○出力チャネル数(フィルタ数)：M
○ストライド１でパディングを適用した場合
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/08cb703d-b4a7-5121-1adb-29d2aee98b28.png'>
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/d54c2c7f-e89b-ad3f-4f82-77a51403b29a.png'>

【**Depthwise Convolution**】
・**入力マップのチャネルごとに畳み込みを実施**。
・出力マップをそれらと結合(入力マップのチャネル数と同じになる)
・通常の畳み込みカーネルは全ての層にかかっていることを考えると**計算量が大幅に削減可能**。
・各層ごとの畳み込みなので層間の関係性は全く考慮されない。
　→通常はPW畳み込みとセットで使うことで解決
・出力マップの計算量
$$H×W×C×K×K$$
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/b93dd03f-d1be-656c-37ad-a8d57bdb453d.png'>

【**Pointwise Convolution**】
・1 x 1 convとも呼ばれる（正確には1 x 1 x c）
・入力マップのポイントごとに畳み込みを実施
・出力マップ(チャネル数)はフィルタ数分だけ作成可能(任意のサイズが指定可能)
・出力マップの計算量
$$H×W×C×M$$
<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/84bce961-2f90-4042-5dc5-a84c01b8e566.png'>

#### 4.2.DenseNet
Dense Convolutional Network（以下、DenseNet）は、**CNNアーキテクチャの一種**である。ニューラルネットワークでは層が深くなるにつれて、学習が難しくなるという問題があったが、**ResNetなどのCNNアーキテクチャでは前方の層から後方の層へアイデンティティ接続を介してパスを作ることで問題を対処**した。**DenseNetは、DenseBlockと呼ばれるモジュールを用いたアーキテクチャの一つである**。

**Transition Layer**と呼ばれる層でDence blockをつなぐ。そこでは特徴マップのサイズを変更し、ダウンサンプリングを行っている（青い枠内がTransition Layer）。
![スクリーンショット 2021-07-10 21.06.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/a9ff531a-3f2b-e4a3-f133-7cd5c477b15e.png)


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

![スクリーンショット 2021-07-10 21.02.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/8bc44bff-a1ca-93fb-9180-4fb85d9ac3d1.png)

#### 4.3.WaveNet
**時系列データに対してDilated Convolution（畳み込み）を適用する**
【**Dilated Convolution**】
層が深くなるにつれて畳み込むリンクを離す。
受容野を簡単に増やすことができるという利点がある。
![スクリーンショット 2021-07-11 15.15.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/5d816002-347d-b0ba-a17c-1e812a1074f2.png)

<確認テスト>
深層学習を用いて結合確率を学習する際に、効率的に学習が行えるアーキテクチャを提案したことがWaveNetの大きな貢献の1つである。提案された新しいConvolution 型アーキテクチャは（あ）と呼ばれ、結合確率を効率的に学習できるようになっている。(あ)に入るものを選べ。
1) Dilated causal convolution
2) Depthwise separable convolution
3) Pointwise convolution
4) Deconvolution

<解答>
1)が正しい
2)、3)はMobileNetで扱われるもの
4)は逆畳み込みと呼ばれ、画像の解析度を上げる際に用いられる

<確認テスト2>
Dilated causal convolutionを用いた際の大きな利点は、単純なConvolution layer と比べて（い）ことである。
1)　パラメータ数に対する受容野が広い
2)　受容野あたりのパラメータ数が多い
3)　学習時に並列計算が行える
4)　推論時に並列計算が行える

<解答2>
1)が正しい