JDLA認定プログラム：深層学習（Day4）

本記事は、Study-AI社様のJDLA認定プログラムの提出レポートを兼ねた記事となっております。

##講義要約

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

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

####1-3. 探索と利用のトレードオフ
* 環境について事前に完璧な知識があれば、最適な行動を予測し決定することが可能
 + 強化学習の場合、この仮定は成り立たないとする。よって不完全な知識を元に行動しながらデータを収集、最適な行動を見つけていく必要がある
* 探索が足りない状態
 + 過去のデータでベストとされる行動のみを常に取り続ければ、他にもっとベストな行動を見つけることはできない
* 利用が足りない状態
 + 未知の行動のみを取り続ければ、過去の経験が活かせない

####1-4. 強化学習のイメージ
![強化学習.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/036dec15-3b1e-772c-6eab-4db19e5f4856.png)

* エージェントの学習：方策と価値の最適化
 + 方策関数：$\pi (s, a)$
 + 行動価値関数：Q(s, a)

####1-5. 強化学習の差分
* 強化学習と、通常の教師あり・教師なし学習との違い
 + 結論：目標が違う
   - 教師あり・なし学習では、データに含まれるパターン（特徴量）を見つけ出すこと及びデータから予測することが目標
   - 強化学習では優れた方策を見つけることが目標

####1-5.5. 強化学習の歴史
* 強化学習について
 + 冬の時代があったが、計算速度の進展により大規模な状態を持つ場合の強化学習が可能となりつつある
 + Q学習と関数近似法を組み合わせる手法の登場
* Q学習：行動価値関数を、行動する毎に更新することにより学習を進める方法
* 関数近似法：価値関数や方策関数を関数近似する手法のこと

####1-6. 行動価値関数
* 価値関数
 + 状態価値関数：ある状態の価値に注目する場合
 $$ V^{\pi} (s) $$
 s=状態
 + 行動価値関数：状態と価値を組み合わせた価値に注目する場合
 $$ Q^{\pi} (s, a) $$
 s=状態、a=行動
* ゴールまで今の方策を続けた時の報酬の予測値が得られる

####1-7. 方策関数
* 方策ベースの強化学習手法において、ある状態でどのような行動を採るかの確率を与える関数
$$ \pi (s) = a $$
* エージェントは、方策に基づいて行動する
* 囲碁の場合、一手を決めるのが方策関数、その一手の勝利への寄与具合が価値関数

####1-8. 方策勾配法
* 方策反復法：方策をモデル化して最適化する手法
* 方策勾配法
$$ \theta^{(t+1)} = \theta^{(t)} + \epsilon \nabla J(\theta) $$
 + J() = 期待収益（方策の良さ）、NNでは誤差関数
 + $\theta$ = 方策のパラメータ、NNでは重みW
 + t = 時点・時刻
 + $\epsilon$ = NNでは学習率
 + NNでは誤差関数を最小化することが目的だったが、強化学習では期待収益を最大化することが目的。よって加算する
$$\pi (s, a | \theta )$$
 + 方策関数$\pi$はNNの重みとして$\theta$をとることを表す
 
 + $\pi$の学習式が上記方策勾配法

* 定義方法
 + 平均報酬
 + 割引報酬和
   - 上記の定義に対応して、行動価値関数：Q(s, a)の定義を行うことで方策勾配定理が成り立つ。
$$ \nabla_{\theta} J(\theta = \mathbb E_{\pi_{\theta}} [(\nabla_{\theta} log \pi_{\theta}(a|s) Q^{\pi} (s,a))]$$
   - 元の式：
$$\nabla_{\theta} J(\theta) = \nabla_{\theta} \sum_{a \in A} \pi_{\theta} (a|s) Q^{\pi} (s, a) $$
   - 「ある行動をとる時の報酬」の総和を、$\theta$について微分している





###Sec2: Alpha Go
####2-1: Alpha Go Lee
* 概要
![Alpha Go_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/5926538f-e321-fcf6-9d95-75ff4a18f2bb.png)
 + PolicyNet (方策関数)：
    - エージェントはどこに打つかを知る事ができる
    - 19×19の２次元データを出力(2次元データはconvが鉄則)
![Alpha Go_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/63eb676f-0696-7ad7-06cf-e6b9a360e125.png)
 + ValueNet (価値関数)：
    - エージェントはこのままの方策で勝てるかどうかを知る事ができる
    - -1~1の数字を出力←全結合層からflattenして２次元データを１次元に
![Alpha Go_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/68b46465-f117-8e3a-4e63-02ed72c861c0.png)
 + RollOutPolicy
![Alpha Go_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/d775a743-868b-a45e-7e70-c367f6c73a9e.png)

   - どこに石を置くか？の探索を高速で行う(PolicyNetの1000倍高速) 方策関数。PolicyNetの教師あり学習で使用（後述）

* モンテカルロ木探索
 + 価値関数をどう更新するかを学習させるのに用いる
 + AlphaGoLee では RollOutPolicy を用いて高速で行う
 + 詳細：
   - コンピュータ囲碁ソフトで現在最も有効とされている探索法。<br>
   他のボードゲームではminmax探索やその派生系のαβ探索を使うことが多いが、盤面の価値や勝率予測値が必要となる。しかし囲碁では盤面の価値や勝率予測値を出すのは難しいとされてきた。<br>
そこで盤面評価値によらず末端評価値、つまり勝敗のみを使って探索を行うことができないのかという発想で生まれたのがモンテカルロ木探索法である。囲碁の場合、他のボードゲームと違い最大手数はマスの数でほぼ限定されるため、末端局面に到達しやすい。
   - 具体的には、現局面から末端局面までPlayOutと呼ばれるランダムシミュレーションを多数回行い、その勝敗を集計して着手の優劣を決定する。<br>
また該当手のシミュレーション回数が一定数を超えたら、その手を着手した後の局面をシミュレーション開始局面とするよう、探索木を成長させる。
   - この探索木の成長を行うというのがモンテカルロ木探索の優れているところで、これによって、一定条件下において探索結果は最善手を返すということが理論的に証明されている。
![Alpha Go_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/9777feb9-3938-f308-d4fb-4942109ad87f.png)
* Alpha Go Lee のモンテカルロ木探索
 + 選択：
   - Root 局面にて着手選択方策 $ \pi = Q(s, a) + cP(s, a) \frac{\sqrt{\Sigma_b N(s, b)}}{1 + N(s, a)} $ に従って手を選択する。cは定数、P(s, a)はPolicyNetによる選択確率、N(s, a) はその手が探索中に選ばれた数、$\Sigma N(s, b) $ は現局面の全合法手が選ばれた数の合計である。
   - Q(s, a)が現状の勝敗期待値、$cP(s, a) \frac{\sqrt{\Sigma_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) と $ \Sigma N(s, b) $ が 1 加算される。それらの値から勝敗期待値が再計算される。これを Root 局面まで遡って更新する。
   - $Q(s, a) = (1 - \lambda) \frac{Wv}{N(s, a)} + \lambda \frac{Wr}{N(S, a)} $ とし、$\lambda (0 \leqq \lambda \leqq 1) $ の定数である。AlphaGoLeeでは0.5が使用されている。
 + 成長：
   - 選択・評価・バックアップを繰り返し一定回数選択された手があったら、その手で進めた局面の合法手ノードを展開し、探索木を成長させる。

* Alpha Go Lee の学習
![AlphaGo_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/ff5f8df4-1cb4-85fb-fe4f-9b4d037d7501.png)
 + PolicyNetの教師あり学習
   - KGS Go Server (ネット囲碁対局サイト) の棋譜データから3000万局面分の教師を用意し、教師と同じ着手を予測できるよう学習を行った
   - 具体的には、教師が着手した手を１とし残りを０とした19 × 19次元の配列を教師とし、それを分類問題として学習した。この学習で作成したPolicyNetは57%ほどの精度である
   - RollOutPolicyにも同じ処理を行い、この精度は24%程になる
 + PolicyNetの強化学習
   - 現状のPolicyNetと、PolicyPool(PolicyNetのセット)からランダムに選択されたPolicyNetとで対局シミュレーションを行い、その結果を用いて方策勾配法で学習を行った。
   - PolicyPool とは、PolicyNet の強化学習の過程を500iteration ごとに記録し保存しておいたものである。
   - 現状のPolicyNet同士の対局ではなく、PolicyPoolに保存されているものとの対局を使用する理由は、対局に幅を持たせて過学習を防ごうというのが主である。
   - この学習を mini batch size 128 で１万回行った。
 + ValueNetの学習
    - PolicyNetを使用して対局シミュレーションを行い、その結果の勝敗を教師として学習した。教師データの作成手順は
   1. まず SL PolicyNet(教師あり学習で作成したPolicyNet) でN手まで打つ。
   2. N+1手目の手をランダムに選択し、その手で進めた局面をS(N+1)とする。
   3. S(N+1)からRL PolicyNet(強化学習で作成したPolicyNet) で終局まで打ち、その勝敗報酬をRとする。
   - S(N+1) とRを教師データ対とし、損失関数を平均二乗誤差とし、回帰問題として学習した。この学習を mini batch size 32 で5000万回行った。
   - N手までとN+1手からのPolicyNetを別々にしてある理由は、過学習を防ぐためであると論文では説明されている。

####2-2: Alpha Go Zero
* Alpha Go Lee と Alpha Go Zero の違い
 1. 教師あり学習を一切行わず、強化学習のみで作成
 2. 特徴入力からヒューリスティックな要素を排除し、石の配置のみにした
 3. PolicyNetとValueNetを一つのネットワークに統合した
 4. Residual Net を導入した
 5. モンテカルロ木探索からRollOutシミュレーションを無くした
![AlphaGo_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/910a9996-038d-f070-5c9b-c304bc516763.png)
* Residual Network
 + ネットワークにショートカット構造を追加して、勾配消失・爆発を抑える効果を狙ったもの
 + Residual Networkを使うことにより、100層を超えるネットワークの安定した学習が可能になった
 + 基本構造は Convolution → BatchNorm → ReLU→ Convolution → BatchNorm → Add → ReLU のBlockを1単位にして積み重ねる形となる
 + また、Residual Network を使うことにより、層数の違うNetworkのアンサンブル効果が得られているという説もある（ネットワークの表現力が上がる）
![AlphaGo_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/f030d562-8ced-72a2-dde4-d72e6f24054e.png)
* Residual Network の派生形 (マイナーチェンジ程度)
 + ネットワークの基本構造はあくまでConvolution, Pooling, RNN, Attention, 活性化関数の組み合わせからなる
 + Residual Blockの工夫
   - Bottleneck：1×1KernelのConvolutionを利用し、1層目で次元削減を行って3層目で次元を復元する3層構造にし、2層のものと比べて計算量はほぼ同じだが1層増やせるメリットがある、としたもの
   - PreActivation：ResidualBlockの並びを BatchNorm → ReLU → Convolution → BatchNorm → ReLU → Convolution → Add とすることにより性能が上昇したとするもの
 + Network構造の工夫
   - WideResNet：ConvolutionのFilter数をk倍にしたResNet。1倍→k倍 × ブロック→2*k倍yブロックと段階的に幅を増やしていくのが一般的。Filter数を増やすことにより、浅い総数でも深い総数のものと同等以上の精度となり、またGPUをより効率的に使用できるため学習も早い。
   - PyramidNet：WideResNetでは幅が広がった直後の層に過度の負担がかかり精度を落とす原因になっているとし、段階的でなく各層でFilter数を増やしていくResNet。
![AlphaGo_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/4b10cc15-71e9-9152-51a1-1137435e3272.png)
* Alpha Go Zero のモンテカルロ木探索
 + Alpha Go Zero のモンテカルロ木探索は選択・評価及び成長・バックアップの３ステップで構成される。
 + 選択：
   - Root 局面にて着手選択方策 $ \pi = Q(s, a) + cP(s, a) \frac{\sqrt{\Sigma_b N(s, b)}}{1 + N(s, a)} $ に従って手を選択する。
   - 選択された合法手aで進めた局面がLeafノードでなければ、そのノードの着手選択方策に従って選択を行い、局面を進める。
   - 選択された合法手aで進めた局面がLeafノードであれば評価及び成長ステップに移行する。
 + 評価及び成長：
   - Leafノードまで進めた局面 sa を PolicyValueNet で評価する。RollOutは行わない。
   - また、局面 sa の合法手ノードを展開し木を成長させる。
 + バックアップ：
   - 評価フェイズで評価した値を積算する。
   - 局面 sa での ValueNet の評価の積算値 Wv が積算され、N(s, a) と $ \Sigma N(s, b) $ が 1 加算される。それらの値から勝敗期待値$Q(s, a) = \frac{Wv}{N(s, a)} $が再計算される。これを Root 局面まで遡って更新する。

* Alpha Go Zero の学習法
 + Alpha Go Zero の学習は自己対局による教師データの作成・学習・ネットワークの更新の３ステップで構成される。
 + 自己対局による教師データの作成：
   - 現状のネットワークでモンテカルロ木探索を用いて自己対局を行う。
   - 先ずは30手までランダムで打ち、そこから探索を行い勝敗を決定する。
   - 自己対局中の各局面での着手選択確率分布と勝敗を記録する。
   - 教師データの形は（局面、着手選択確率分布、勝敗）が１セットとなる。
 + 学習：
   - 自己対局で作成した教師データを使い学習を行う。
   - NetworkのPolicy部分に着手選択確率分布を用い、Value部分の教師に勝敗を用いる。
   - 損失関数はPolicy部分はCrossEntropy、Value部分は平均二乗誤差。
 + ネットワークの更新：
   - 学習後、現状のネットワークと学習後のネットワークとで対局テストを行い、学習後のネットワークの勝率が高かった場合、学習後のネットワークを現状のネットワークとする。




###Sec3: 軽量化・高速化技術
####3-0. 分散深層学習とは
* 深層学習は多くのデータを使用したり、パラメータ調整のために多くの時間を使用したりするため、高速な計算が求められる。
* 複数の計算資源（ワーカー）を使用し、並列的にニューラルネットワークを構成する事で効率のいい学習を行いたい。
* モデル並列化・データ並列化・GPUによる高速技術は不可欠である。
* 昨今では毎年およそ10倍の勢いでデータ量が増加しモデルが複雑化して、必要な計算量が増加していると言われる。それに対しコンピュータは定説的には約18ヶ月で計算速度が2倍に向上すると言われるという背景があり、分散学習は計算速度を向上する上で重要である。

####3-1. モデル並列
* 実際には枝分かれするモデルの枝部分を分割するパターンが多いか
* １台のPCに何台かのGPUを接続して行う、といった場合が多い（ネットワーク経由でデータを集約すると遅いため）
![3-1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/2ef8cc99-d842-d2ac-83da-606f21644e3d.png)
![3-1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/2fa7d44c-2513-38c4-b6e3-cc5f76ca207f.png)

####3-2. データ並列
* 親モデルを各ワーカー（演算機＝CPU、GPUなど）に子モデルとしてコピー
* データを分割し、各ワーカー毎に計算させる
* ワーカーはコンピュータ１台中に複数持つことも可能
![3-2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/b2101178-f6ac-231a-ca93-fd997450d013.png)
![3-2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/957e89d5-8686-fe6e-2c96-c8b483d9709c.png)
![3-2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/8770fbc9-15fe-ed44-2a42-3168db83284e.png)
* 処理の速度は非同期型の方が早いが、最新のモデルのパラメータを利用できないので学習が不安定になりやすい

####3-3. GPU
* CPU：
 + 高性能なコアが少数の構成（少数精鋭）
 + 複雑で連続的な処理が得意
 + CPUの高性能化のペースは遅い
* GPU：
 + 比較的低性能なコアが多数
 + 簡単な並列処理が得意（複雑なことはできない）
 + NNの学習は単純な行列演算が多いので高速化が可能
* GPGPU：
 + NvidiaのCUDAがDeepLearning用
 + DL用フレームワーク（Tensorflow, Pytorch）内で実装されているので、使用する際は指定すれば良い

####3-4. 量子化 (Quantization)
* ネットワークが大きくなると大量のパラメータが必要になり、学習や推論に多くのメモリと演算処理が必要
* 通常のパラメータの64bit浮動小数点を32bitなど下位の精度に落とすことでメモリと演算処理の削減を行う
* メモリを多く使うのは重みの情報（レイヤ数が多い）。重みの表現方法が64bitなど浮動小数点数であり、桁数を落とすことで計算削減ができる。
 + 64bitで量子化すると１つの数字を表すのに8byteかかる （1KB = 1byte * 1024, 1MB = 1KB * 1024, 1GB = 1MB * 1024）
 + 量子化の程度を落とす事でメモリ使用量を削減できる（64bit=8byte, 32bit=4byte, 16bit=2byte）
![3-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/958437fe-c897-ebae-6d62-0f4c9400c22b.png)
 * bit内の割り当て（exponentとfractionの比率）を変える手法もある

####3-5. 蒸留 (Distillation)
* 概要：
 + 精度の高いモデルはニューロンの規模が大きなモデルになっている。そのため、推論に多くのメモリと演算処理が必要
 + 規模の大きなモデルの知識を使い軽量なモデルの作成を行うのが蒸留
* 方法：
 + 学習済みの精度の高いモデルの知識を軽量なモデルへ継承させる
 + 知識の継承により、軽量でありながら複雑なモデルに匹敵する精度のモデルを得る事が期待される
 + 教師モデルの重みは固定し、生徒モデルの重みを更新していく
 + 誤差は教師モデルと生徒モデルの誤差を合わせて生徒モデルのみ更新
![3-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/b4f4a876-099d-8e48-1f0a-f7dd708e6069.png)

####3-6. プルーニング (Pruning)
* 概要：
 + ネットワークが大きくなるちパラメータが大量になるが、全てが精度に寄与しているわけではない
 + 寄与の少ないニューロンを削減しモデルの圧縮を行う事で、高速に計算を行う事ができるようにする
![3-6-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/a0492555-b031-bf2c-e39c-f76a82cc2f5f.png)
* 方法：
 + 重みが閾値以下のニューロンを削除
 + 閾値を高くするとニューロンは大きく削減できるが精度も減少する
 + ただしパラメータ削除率に対して精度がそこまで大きく変わらず効果が大きい場合もある
![3-6-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/98f1a664-b266-b337-7c54-9b5a8a19652b.png)




###Sec4: 応用技術
####4-1. MobileNet
* 論文タイトル：MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
* 概要：
 + 画像認識ネットワーク
 + ディープラーニングモデルは精度は良いが、その分ネットワークが深くなり計算量が増える。計算量が増えると、多くの計算リソースが必要でお金がかかってしまう。
 + ディープラーニングモデルの軽量化・高速化・高精度化を実現(その名の通りモバイルなネットワーク)
* 参考：https://qiita.com/HiromuMasuda0228/items/7dd0b764804d2aa199e4
![4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/6b737c09-e874-57f9-5810-219c3a5a0f16.png)
* 仕組み：
 + MobileNetはDepthwise ConvolutionとPointwise Convolutionの組み合わせで畳み込み演算の軽量化を実現
* Depthwise Convolution
 + フィルタ数１固定
 + 入力マップのチャネルごとに１枚のフィルタで
畳み込みを実施（Mを省略）
 + 出力マップをそれらと結合(入力マップのチャネル数＝出力マップのチャネル数となる)
 + 通常の畳み込みカーネルは全ての層にかかっていることを考えると、計算量が大幅に削減可能
 + 各層ごとの畳み込みなので層間の関係性は全く考慮されない。通常はPW畳み込みとセットで使うことで解決
![4-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/92d29059-4f21-65c6-6ac0-a1cd0e08d990.png)
* Pointwise Convolution
 + Depthwiseと逆でフィルタサイズを１×１、フィルタ数をMに（K×Kを省略）
 + 入力マップのポイントごとに畳み込みを実施
 + 出力マップ(チャネル数)はフィルタ数分だけ作成可能(任意のサイズが指定可能)
 + 出力マップの計算量は H × W × C × M
![4-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/4cc36146-11d4-2828-b983-888800100dfe.png)
* MobileNetは畳み込み演算を空間方向・チャネル方向で分けて、個別に計算を行う事で計算量を削減する方法
* 削減量は大きく使い勝手が良い
![4-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/b279b504-9df3-6fb2-177e-d942c1d5a57b.png)

####4-2. DenseNet
* 論文タイトル：Densely Connected Convolutional Networks. G. Huang et., al. 2016
* 概要：
 + 画像認識ネットワーク
 + Dense Convolutional Network（以下、DenseNet）は、畳込みニューラルネットワーク（以下、CNN）アーキテクチャの一種である。ニューラルネットワークでは層が深くなるにつれて、学習が難しくなるという問題があったが、Residual Network（以下、ResNet）などのCNNアーキテクチャでは前方の層から後方の層へアイデンティティ接続を介してパスを作ることで問題を対処した。DenseBlockと呼ばれるモジュールを用いた、DenseNetもそのようなアーキテクチャの一つである。
* 参考：https://arxiv.org/pdf/1608.06993.pdf <br> https://www.slideshare.net/harmonylab/densely-connected-convolutional-networks
* 仕組み：
 + Dense Block 内の各レイヤを通る毎にチャネル数が増える構造
![4-4.5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/ab28e88c-f62c-ac92-0e71-1e04a5319cd9.png)
 + 出力層に前の層の入力を足しあわせる
   - 層間の情報の伝達を最大にするために全ての同特徴量サイズの層を結合する
![4-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/b6ad95fd-f901-92d1-faa3-4e7af6595b4b.png)
 + DenseBlock内のレイヤでの処理
 + 特徴マップの入力に対し、下記の処理で出力を計算
   - Batch正規化
   - Relu関数による変換
   - 3 x 3畳み込み層による処理
 + 計算した出力に入力特徴マップを足し合わせる
   - 入力特徴マップのチャンネル数が l x kだった場合、出力は( l +1) x kとなる
   - 第 l 層の出力を $ x_l $ とすると
$$ x_l = H_l ([x_0, x_1, \cdots , x_{l-1}]) $$
![4-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/bb49fa68-3de8-266c-3b80-d9dd28203e9e.png)
 + DenseBlockでは最初の値$k_0$ に(畳み込みのレイヤ数 × kチャネル)が加算されていく 
 + kをネットワークのgrowth rateと呼ぶ
   - kが大きくなるほど、ネットワークが大きくなるため、小さな整数に設定するのがよい
![4-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/4957907a-f623-613d-c86c-954805dc9ff0.png)
 + Transition Layer
    - ConvとPoolの処理を行う
    - DenseBlockで追加された分のチャネル数を元に戻す
    - 特徴マップのサイズを変更し、ダウンサンプリングを行うため、Transition Layerと呼ばれる層でDence blockをつなぐ
![4-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/e09cb81b-cc00-0790-6d32-fb1288080184.png)
* スキップ構造を持つDenseNetとResNetの違い
 + DenseBlockでは前方の各層からの出力「全て」が後方の層への入力として用いられる
 + RessidualBlockでは前1層の入力のみ後方の層へ入力
* DenseNet内で使用されるDenseBlockと呼ばれるモジュールでは、成⻑率(Growth Rate)と呼ばれるハイパーパラメータが存在する。
 + DenseBlock内の各ブロック毎にk個ずつ特徴マップのチャネル数が増加していく時、kを成⻑率と呼ぶ
 + k=チャネル数＝成長率

####4-3. Layer正規化/Instance正規化
![4-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/1f0893f1-a184-7062-500f-760771901781.png)
* BatchNorm：
 + あるチャネルのデータに対して、全てのバッチサイズで平均０分散１になるように正規化する
 + H x W x CのsampleがN個あった場合に、N個の同一チャネルが正規化の単位
 + RGBの3チャネルのsampleがN個の場合は、それぞれのチャンネルの平均と分散を求め正規化を実施(図の⻘い部分に対応)。チャンネルごとに正規化された特徴マップを出力
 + ミニバッチのサイズを大きく取れない場合には、効果が薄くなってしまう（ミニバッジサイズはTPUでも100枚程度が上限）
 + 問題：
   - 使用デバイスのスペックによりミニバッジサイズの上限が異なり互換性の面で不便
   - バッチサイズが小さい条件下では学習が収束しない事があり、代わりにLayer Normなどの正規化手法が使われることが多い 
![4-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/3027feb8-0da5-6e85-1d84-4e0fc073a256.png)
* Layer Norm：
 + 一つの画像に対して、全てのチャネルで平均０分散１になるように正規化する
 + N個のsampleのうち一つに注目。H x W x Cの全てのpixelが正規化の単位
 + RGBの3チャネルのsampleがN個の場合は、あるsampleを取り出し、全てのチャネルの平均と分散を求め正規化を実施(図の⻘い部分に対応)。特徴マップごとに正規化された特徴マップを出力
 + ミニバッチの数に依存しないので、BatchNormの問題を解消できていると考えられる
 + Layer Normは、入力データや重み行列に対して、以下の操作を施しても、出力が変わらないことが知られている
   - 入力データのスケールに関してロバスト（堅牢）
   - 重み行列のスケールやシフトに関してロバスト
   - 参照：https://www.slideshare.net/KeigoNishida/layer-normalizationnips
![4-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/c00e1020-7e97-95f7-577c-41c828ced764.png)
* Instance Norm：
 + 各sampleの各チャネルごとに正規化 (Batch Normalizationのバッチサイズが1の場合と等価)
 + コントラストの正規化に寄与・画像のスタイル転送やテクスチャ合成タスクなどで利用
![4-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/e9c5176c-a1c7-2bd4-e905-44d4bd24b71b.png)

####4-4. Wavenet
* Aaron van den Oordet. al., 2016らにより提案
* 生の音声波形を生成する深層学習モデル
* Pixel CNN(高解像度の画像を精密に生成できる手法)を音声に応用したもの
* 参考：
 + https://gigazine.net/news/20171005-wavenet-launch-in-google-assistant/
  + https://qiita.com/MasaEguchi/items/cd5f7e9735a120f27e2a
  + https://www.slideshare.net/NU_I_TODALAB/wavenet-86493372
* 仕組み：
 + 時系列データに対して畳み込み(Dilated convolution)を適用する
   - 層が深くなるにつれて畳み込むリンクを離す
   - 受容野を簡単に増やすことができるという利点がある
   - 下図では Dilated = 1,2,4,8
![4-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/ce8e1035-d3d6-8023-d541-b4bd1820550e.png)

###Sec5: BERT

![5-1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/ababf7f3-d429-d27b-5a27-80d8620037f6.png)
####5-1: Seq2seq
* Seq2seq
 + 系列(Sequence)を入力して、系列を出力するもの
 + Encoder-Decoderモデルとも言われ、入力系列がEncode(内部状態に変換)され、内部状態からDecode(系列に変換)する
 + 系列情報：
   - 翻訳（英語→日本語）
　- 音声認識（波形→テキスト）
   - チャットボット（テキスト→テキスト）
* RNN
![5-1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/6fb27fcb-1280-14c1-79d1-e988549d7f40.png)
 + 最終的に内部状態ベクトルをはき出す
* 言語モデル
 + 単語の並びに対して尤度（文章として自然か）で評価
   - You say goodbye → 0.092 (自然)
   - You say good die → 0.00000032 (不自然)
 + 時刻 t-1 までの情報で、時刻 t の事後確率を求めることが目標
![5-1-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/332e8dee-62bf-c343-27c8-f45cfa577eb7.png)
* RNN × 言語モデル
 + 言語モデルを再現するようにRNNの重みが学習されていれば、ある時点の次の単語を予測可能。また先頭単語を与えれば文章を生成する事も可能
* Decoder
![5-1-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/64111540-209f-82f6-95a9-dff8abe0d401.png)
![5-1-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/ea98cf31-fb74-9bab-1b9a-c24f8c963cd4.png)
 +  教師データとの差分をとって誤差が分かると誤差逆伝播が可能になり、ネットワーク全体の重みの更新が可能になる
* Teacher Forcing
 + Decoderの入力に間違いを使った時に誤差がRNNによって肥大化する問題に対処
 + 最初に正解を一回与えてから学習する
 + 学習時はいいが検証時にはダメになる可能性
 + Teacher Forcingの拡張として、ターゲット系列を入力とするか生成された結果を入力とするかを確率的にサンプリングするScheduled Samplingという手法が存在する
![5-1-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/bc122e1d-f761-4475-f661-1a44c6684d6f.png)

####5-2: Transformer
* Attention
 + ニューラル機械翻訳は、文長が長くなると表現力が足りなくなる
 + Attention(注意機構)により長い文章に対応(各単語への注意を分配)
![5-2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/bdf41267-bbbc-4d4b-2346-c62b10b3716e.png)
![5-2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/8ced7123-32ba-7be3-13bd-3eb5f26e21b2.png)
 + Attention は query, key, value に分かれ、key の中から query(入力) に似た文章を類似度をとって検索する。これに softmax をかけて正規化されたベクトルを、value(分の羅列) にかけるとどの文に注目すべきかが引き出せる。
![5-2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/e2071250-047b-75c0-726f-9fc1ef012290.png)
* Transformer (2017.6)
 + Attenton のみ使い RNN を使わないモデル
 + 英仏(3600万文)の学習を8GPUで3.5で完了
 + 文字の位置情報は保存できないので最初に追加
![5-2-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/1570366e-a44b-2c28-371a-fb5ca437996c.png)
 + 注意機構には二種類ある
 $$ softmax(QK^T) V $$
   - ソース・ターゲット注意機構 (Source Target Attention)
   - 自己注意機構 (Self-Attention)
![5-2-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/8ff2c4ec-5908-29f2-ade3-332fb60b609e.png)
 + Position-Wise Feed-Forward Networks
   - 位置情報を保持したまま順伝播させる構造 (通常全結合層は位置情報を壊す)
   - outputの次元を揃える必要があるので、行列の形式を整える（＝線形変換する）層
 + Scaled dot product attention
   - Attention の計算機構
   - 入力として線形変換されたQ, K, V が与えられる
   - $d_k$は内部状態の次元数。内積をとって数値が大きくなり過ぎると誤差逆伝播がうまくいかなくなるのでスケーリングをする
   - Mask(opt.) では扱いたくない Attention をカットする (unknown や pad など)
![5-2-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/6a458bbc-9521-597b-2a25-818c90f22f2f.png)
 + Multi-Head Attention
   - 8つの Scaled dot product attention を連結（Concat）し、線形変換してはき出す
   - 8つのAttention層の独自の注意の掛け方の総合的な値を算出（アンサンブル学習に近い）
![5-2-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/268d49ee-f05d-aa23-2fdf-81be27f1b036.png)
 + Decoder
   - Source Target Attention と Self-Attention 両方が使われる
 + Add (Residual Connection)
   - 入出力の差分を学習させる
   - 実装上は出力に入力を加算するだけ
   - 効果：学習・テストエラー低減
 + Norm (Layer Normalization)
   - 各層においてバイアスを除く活性化関数への入力を平均０、分散１に正則化
   - Batch Normと同じで入力のばらつきを抑える
   - 効果：学習の高速化
 + Position Encoding
   - inputそのものに語順情報を付与する機構
   - 単語情報が embed された時にその次元数に見合う位置特有の重みが与えられる（アドレス情報がソフトな２進数表現で付加されていく）
![5-2-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/4a96cc2c-1a02-e9e9-0cfa-462a004c7935.png)
![5-2-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/0b4c8783-8bfe-77b9-a0ef-bea881f8f52a.png)


##確認テストと考察
###Sec4
####4-1
* MobileNetのアーキテクチャ
 + Depthwise Separable Convolutionという手法を用いて計算量を削減している。通常の畳込みが空間方向とチャネル方向の計算を同時に行うのに対して、Depthwise Separable ConvolutionではそれらをDepthwise ConvolutionとPointwise Convolutionと呼ばれる演算によって個別に行う。
 + Depthwise Convolitionはチャネル毎に空間方向へ畳み込む。すなわち、チャネル毎にDK×DK×１のサイズのフィルターをそれぞれ用いて計算を行うため、その計算量は（い）となる。
 + 次にDepthwise Convolutionの出力をPointwise Convolutionによってチャネル方向に畳み込む。すなわち、出力チャネル毎に１×１×Mサイズのフィルターをそれぞれ用いて計算を行うため、その計算量は（う）となる。

```
(い) H×W×C×K×K
(う) H×W×C×M
```

####4-2
* 深層学習を用いて結合確率を学習する際に、効率的に学習が行えるアーキテクチャを提案したことがWaveNet の大きな貢献の1 つである。提案された新しいConvolution 型アーキテクチャは（あ）と呼ばれ、結合確率を効率的に学習できるようになっている。

```
Dilated causal convolution
```

* （あ）を用いた際の大きな利点は、単純なConvolution layer と比べて（い）ことである。

```
パラメータ数に対する需要野が広い
```

###Sec5: JDLA例題
* 例題１
![例1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/4a0fee77-4f3c-e06f-47eb-ecc369c9ca8f.png)

```
a
```

* 例題２
![例２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/0a7bffd5-622b-fd4f-efd3-6ba2ab61965f.png)

```
a
```

* 例題３
![例３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/1d1027a1-bf65-1706-12cc-dc984d31bbf3.png)
![例４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/d1f01330-8382-9264-de26-08847f5eee37.png)
![例５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/34afbe64-125a-f4de-acc0-78455615328f.png)

```
(あ)a
(い)a
(う)a
```

* 例題４
![例６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/320ed465-fab9-464a-3eb0-37bb232d42de.png)

```
a
```

* 例題５
![例７.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816981/2444532e-115f-320c-0a7d-3783c8caebed.png)

```
a
```

##演習結果と考察

###4_1_tensorflow_codes
* 演習結果<br>
https://41tensorflow.s3-ap-northeast-1.amazonaws.com/4_1_tensorflow_codes.html

###4_3_keras_codes
* 演習結果<br>
https://43keras.s3-ap-northeast-1.amazonaws.com/4_3_keras_codes.html

* 考察
 + 単純パーセプトロン:
    - AND・OR回路だと線形分離可能で学習可能であり、XOR回路だと線形分離不可能で学習不能であることが確認できた。
    - エポック回数に対しバッチサイズが大きすぎると誤差が収束しないことがある。
 + 分類(mnist):
    - 誤差関数に categorical_crossentropy を使うときは mnistデータ形式をone_hot_label にする(=True)。sparse_categorical_crossentropy を使うときは mnistデータ形式をone_hot_label にしない(=False) ことを確認した。
    - learning_rate を5倍、10倍と吊り上げていくと学習精度が悪化した。またbeta_2の値を低くし過ぎると学習がうまく行かないことが見て取れた。
 + RNN:
    - RNNの出力ノード数を増やすことで、１エポック毎の精度向上率が上がった。
    - 出力活性化関数は sigmoid < ReLU < tanh の順で今回は効果が上がった。
　 - optimizer を adam に変更することで学習精度の向上が見て取れた。
    - RNNの入力 Dropout を0.5に設定すると、学習速度が極端に遅くなる（全く進まない訳ではない）。
    - RNNの再帰 Dropout を0.3に設定しても上記と同様だが、学習の収束は比較的早い。
    - RNNのunrollをTrueに設定すると学習速度が向上することが確認できた。


###lecture_chap1_exercise_public
* 演習結果<br>
https://bert1.s3-ap-northeast-1.amazonaws.com/lecture_chap1_exercise_public.html

###lecture_chap2_exercise_public
* 演習結果<br>
https://s3-ap-northeast-1.amazonaws.com/bert2.2/lecture_chap2_exercise_public.html