ディープラーニング講座「深層学習：Day4」要点まとめ＆実装演習

私は、2020年7月に<font color="red">__「G検定（2020 #2）」__</font>に合格した。
次は、2021年2月実施の「E資格（2021 #1）」受験資格である__JDLA認定プログラム「３カ月で現場で潰しが効くディープラーニング講座」__に2020年8月から挑戦中。

本記事では、__JDLA認定プログラム「3カ月で現場で潰しが効くディープラーニング講座」__の課題であり、__「深層学習：Day4」__実装演習結果をまとめる。


## 1.「深層学習：Day4」講義動画の要点まとめ


### Section1）強化学習

#### 1-1.　強化学習の概念

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

　強化学習のイメージとして、職場で働く主人公をイメージするとわかりやすい。

* エージェント：主人公
* 環境：日々変化する職場
* 価値：ボーナス
* 方策：高額なボーナスを得るために立てる方策
![deep4-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/aafd28aa-4626-3ec7-78d1-787b6c03596a.jpeg)

　強化学習は、報酬を最大化する事前知識や最善な行動はわからないため、__不完全な知識を元に行動__しながら、まずは__データ収集__を行い、徐々に__最適な行動を見つけていく__学習となる。ただし、最善な行動のみを__利用__し続けるだけだと、もっと最善な行動を__探索__することができない。また、未知行動を__探索__し続けるだけだと、過去の経験を__利用__することができない。つまり、__探索と利用はトレードオフの関係__となっている。

#### 1-2.　強化学習と教師あり・なし学習との違い

　__強化学習__と教師あり学習、教師なし学習の違いは、学習時の__目標__が違う。

* 強化学習：__優れた方策を見つけること__が目標
* 教師あり・なし学習：データに含まれる__パターンを見つけ出すこと__、および__そのデータから予測すること__が目標


#### 1-3.　強化学習の歴史

　強化学習の概念としては、うまくいきそうだとわかっていたものの、計算量が多く、当時の計算量を扱えなかった。しかし、コンピュータの高速化、計算速度の進展により、大規模な状態をもつ場合であっても強化学習を実現することができた。強化学習は教師あり学習・なし学習と比べ計算量が増える傾向がある。

　強化学習は、__Q学習__、__関数近似法__の登場でより強化学習が発展した。

* Q学習：行動価値関数Qを、行動する毎に更新することにより学習を進める方法
* 関数近似法：価値関数や方策関数を関数近似する手法のこと

#### 1-4.　価値関数

　価値関数とは、価値$V$を表す関数として、__状態価値関数__と__行動価値関数__の2種類がある。この2種類の関数は、強化学習の価値を決める上でどんな要素でどの情報を使って価値を決めるかによって使い分ける。ある状態の価値に注目する場合は状態価値関数、状態と行動を組み合わせた価値に注目する場合は行動価値関数を使う。

* 状態価値関数：環境の状態が価値を決める対象。環境の状態が良ければ価値が上がる。
* 行動価値関数：環境の状態とエージェントの行動が価値を決める対象。


#### 1-5.　方策関数

　方策関数とは、方策ベースの強化学習手法において、ある状態でどのような行動を採るのかの確率を与える関数のことである。エージェントは方策に基づいて行動をする。

* 方策関数：方策が価値を決める対象。方策が良ければ価値が上がる。


#### 1-6.　各種関数の関係

* 方策関数　$\pi (s,a)$：$V$や$Q$を基にどういう行動（経験を活かした行動、チャレンジ行動）をとるか
* 状態関数　$V^{\pi}(s)$：ゴールまで今の方策を続けた時の報酬の予測値を得る
* 状態+行動関数　$Q^{\pi} (s,a)$：ゴールまで今の方策を続けた時の報酬の予測値を得る

囲碁の場合、どの一手を打つかは方策関数、最終的に勝てそうかどうかは価値関数で決める。

#### 1-7.　方策勾配法

　方策関数を学習させるため、方策をモデル化して最適化する手法として、__方策勾配法__がある。以下の式に基づき、重みを求める。ニューラルネットワークでは誤差は__小さく__させるため、$\epsilon$以降の項を__減算__していたが、今日学習では期待収益を__大きく__させたいため、$\epsilon$以降の項を__加算__する。

```math

\begin{align}
\theta^{t+1}&=\theta^{t}+\epsilon \nabla J(\theta)\\
\theta&：重み\\
\epsilon&：学習率\\
J(\theta)&：誤差関数\\

\end{align} 
```

また、$\epsilon \nabla J(\theta)$ は以下の式で求められる。

```math

\begin{align}
\nabla_{\theta}J(\theta)&=E_{\pi_{\theta}}[(\nabla_{\theta} \log \pi_{\theta}(a|s)Q^{\pi}(s,a))]\\

\end{align} 
```

### Section2）Alpha Go

　囲碁の強化学習で有名な__AlphaGo__には、__AlphaGo Lee__、__AlphaGo Zero__の2種類ある。その2種類のうち、まずは__AlphaGo Lee__について説明する。

#### 2-1.　ValueNet、PolicyNet

　__AlphaGo Lee__は__CNN__で構成された__価値関数__と__方策関数__を使い実現している。その価値関数のことを__ValueNet__、方策関数のことを__PolicyNet__と言う。

　囲碁は、碁盤上に石を置ける点が19×19か所あり、AlphaGo Leeの入力も19×19の入力である。但し、チャンネル数は以下の表のようにValueNetでは__48チャンネル__、PolicyNetでは__49チャンネル__を用意している。

* ValueNet、PolicyNetの入力チャンネル一覧
![deep4-02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/89177c96-e110-e904-b1f2-3081eff562e3.jpeg)

ValueNet、PolicyNetのCNN構成はそれぞれ以下のようになっている。

* PolicyNetのCNN構成

　方策関数__PolicyNet__の出力は、19×19マスの着手予想確率で、次に打つべき一手としてどの手が良いかの確率が出力される。そのため、出力層の活性化関数には__SoftMax関数_を使い、全結合Affine層は使わない構成となっている。

![deep4-03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/058dd82c-814b-cadc-048a-e95e10cfa9c9.jpeg)

* ValueNetのCNN構成

　価値関数__ValueNet__の出力は、現局面の勝率を-1～1で表したもので、このまま打ち続けるとどれくらいの確率で勝つことができるのかが出力される。そのため、出力は1要素、出力層の活性化関数には__tanh関数_を使い、途中から全結合Affine層を使い実現している。
![deep4-04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/346e8d65-ac51-a969-eed3-0d00171c1293.jpeg)

#### 2-2.　RollOutPolicy

　AlphaGo Leeを、ValueNet、PolicyNetの2関数をそれぞれ強化学習のみで学習していくことが可能であるが、非常に学習に時間がかかる。
　そこで、強化学習の前に__教師あり学習__を加えることで学習時間を低減することが可能となる。

1. __教師あり学習によるRollOutPolicyとPolicyNetの学習__
2. 強化学習によるPolicyNetの学習
3. 強化学習によるValueNetの学習

　__RollOutPolicy__とは、日本語訳すると、__公開された方策__の意味で、過去の対戦結果のことである。ネット囲碁対局サイトの棋譜データから3000万局面分をRollOutPolicyとして用意、PolicyNetの教師あり学習を行うことで、人と同じ次の一手を打てる確率57%ほどの精度となった。

#### 2-3.　AlphaGo Leeの強化学習

　強化学習の学習手法として__モンテカルロ木探索法__が使われている。__PolicyNetの強化学習__では、__PolicyPool__を活用し、PolicyNetと対局シミュレーションすることで学習を行っている。PolicyPoolとは、PolicyNetの強化学習の過程を500イタレーションごとに記録し保存したものである。また、__ValueNetの強化学習__は、PolicyNetを活用した対局シミュレーションの結果の勝敗を教師として学習を行っている。

* ValueNetの強化学習における教師データ作成手順

1. まずSL　PolicyNet（教師あり学習で作成したPolicyNet）でN手まで打つ
2. N+1手目の手をランダムに選択し、その手で進めた局面をS（N+1）とする
3. S（N+1）からRL　PolicyNetで終局まで打ち、その勝敗をRとする
4. S（N+1）とRを教師データ対とし、損失関数を平均二乗誤差とし、回帰問題として学習する。

#### 2-4.　AlphaGo LeeとAlphaGo Zeroの違い

AlphaGo LeeとAlphaGo Zeroを以下に表す。人間の過去の棋譜データや人が要素として要れるべきと考えた要素を一切排除、またPolicyNet、ValueNetを1つに統合したネットワークを実現させている。

1. 教師あり学習を一切行わず、強化学習のみで学習
2. 特徴入力からヒューリスティックな要素（人が要れるべきと入れたチャンネル・要素）を排除し、医師の配置のみにした
3. PolicyNetとValueNetを1つのネットワークに統合した
4. __Residual Net__を導入した
5. モンテカルロ木探索からRollOutシミュレーションをなくした

![deep4-05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/8e7f9de9-c851-0a57-3558-aa709d04802d.jpeg)

#### 2-5.　Residual Network

前述のAlphaGo Zeroで新たに導入した__Residual Network__について、追加で説明する。Residual Networkとは、__ショートカット構造を追加__したネットワークのことで、ショートカット構造を追加することで多層になり生まれやすい勾配爆発や勾配消失を抑制している。また、ショートカットの組み合わせにより、層数の異なるネットワークの__アンサンブル効果__も得られる。

* AlphaGo Zero内Residual Blockの基本形
　AlphaGo Zeroでは、このResidual Block基本形がResidual Block内に39個並んでいる。

![deep4-06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/966da68f-9b3b-05d4-140d-256b6d16a5c3.jpeg)

* 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。


### Section3）軽量化・高速化技術

　深層学習では、多くのデータを使用したり、パラメータ調整のために多くの時間を使用したりするため、__高速な計算__が求められる。また、__コンピュータの性能は18～24カ月でおおよそ2倍__になるという定説がある反面、__扱うデータ量は毎年10倍に増える__と言われており、深層学習する上での__軽量化・高速化技術__が必須となっている。

まずは、深層学習の__高速化技術__である、__データ並列化__、__モデル並列化__について説明し、__軽量化技術__として、。__量子化__、__蒸留__、__プルーニング__を説明する。

#### 3-1.　データ並列化

　__データ並列化__とは、学習モデルを親モデルとして各ワーカー（PC等）に子モデルとしてコピー、分割したデータを各ワーカーごとに計算させることを言う。データを分割して各ワーカーで学習させることで、より多くのデータ量を高速で処理できる技術である。

![deep4-07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/726a9fe0-8a41-0d0e-ce95-80f5774a830d.jpeg)

データ並列化技術の中にも__同期型__と__非同期型__の2種類ある。

* 同期型・・・各ワーカーの__勾配計算が終わるのを待ち__、各ワーカーの勾配の平均を計算、__親モデルパラメータを更新__する方法。
![deep4-08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/3c0b4a6e-43d9-10a7-8c5e-39680d53b875.jpeg)

* 非同期型・・・各ワーカーは__お互いの計算を待たず、各子モデル毎にパラメータ更新__を行い、学習が終わった子モデルは共通の__パラメータサーバにPush__される。新たに学習を始めるときは、__パラメータサーバからPopしたモデルに対して学習をする__方法。

![deep4-09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/937702f5-92f1-eb1e-6609-06bc5e4d0dbd.jpeg)

同期型、非同期型を比較すると、各ワーカーの勾配計算を待たない分、__非同期型が早い__。但し、各ワーカーのモデルPushタイミングにより、最新モデルのパラメータを利用できないため、__非同期型は学習が不安定になりやすい__。現在の主流は、__精度が良いことが多い同期型__である。

#### 3-2.　モデル並列化

　__モデル並列化__とは、学習モデルを各ワーカー用に分割、学習させた後、全ての学習済みデータを一つのモデルに復元することを言う。モデルを分割して各ワーカーで学習させることで、より多くのデータ量を高速で処理できる技術である。前述したデータ並列化との使い分けは、モデルが大きいときは__モデル並列化__、データが大きいときは__データ並列化__を使うことが多い。
![deep4-10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/09e75b93-8448-1aee-d78b-340c9c018069.jpeg)

モデルの分割する方法として、上図のようにシリアルに並んだモデルを分割する方法もあるが、モデルの複雑化に伴い、分岐が多用されているため、その分岐部分も分割対象となることが多い。また、__データ並列化は、子ワーカーを別PCに割り当てる__ことが主流に対し、__モデル並列化は1台のPCで複数のGPU等を使い実現する__ことが主流である。

#### 3-3.　量子化（Quantization）

　ネットワークが大きくなると大量のパラメータが必要となり、学習や推論に多くのメモリ、演算処理が必要となる。通常のパラメータは__64bit(8byte)浮動小数点で保存させるところを、32bit(4byte)浮動小数点、16bit(2byte)浮動小数点などの下位の精度に落とすことでメモリと演算処理を削減を行うことを__量子化__と言う。

　量子化には、__計算の高速化__、__省メモリ化__といったメリットがあるが、__精度の低下__というデメリットがある。それは、データの精度を落とすことにより、使用するメモリが少なり、計算量も減るからである。

|            | 16bit    | 64bit   |
|:-----------|:---------|:--------|
| メモリ消費 | 少ない    | 多い    |
| 計算量     | 少ない    | 多い    |
| 計算速度   | 速い      | 遅い    |
| 精度       | 悪い      | 良い    |


#### 3-4.　蒸留（Distillation）

　精度の高いモデルはニューロンの規模が大きなモデルになっている。そのため、推論に多くのメモリと演算処理が必要となってしまう。そこで規模の大きなモデルの知識を使い、軽量なモデルの作成を行うことを__蒸留__と言う。__学習済みの精度の高いモデルの知識を軽量なモデルへ継承__させることにより、モデルを簡約かする手法である。

![deep4-11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/7b18ab54-3aee-0891-49bd-090585b49d83.jpeg)

上記の学習済みの精度の高いモデルのことを__教師モデル__と言い、教師モデルを基に作られる軽量なモデルのことを__生徒モデルと言う。教師モデルの重みが学習済みのため重みは固定、生徒モデルの重みのみ更新していく手法。誤差は、教師モデルと生徒モデルの誤差を足し合わせ生徒モデルの重みを更新することで、教師モデルの誤差や重みを継承した重み更新が実現できるようになる。

![deep4-12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/db7e2669-53fe-4c2d-b626-a0eda4f4dbe7.jpeg)

#### 3-5.　プルーニング（Pruning）

　ネットワークが大きくなると大量のパラメータとなるが、全てのニューロンの計算が精度に寄与しているわけではない。__プルーニング__とは、モデルの精度への寄与度が低いニューロンを削減することで、モデルの軽量化、高速化を実現する手法である。

![deep4-13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/43465234-e969-f927-b5d7-08a96f1d9d85.jpeg)

　具体的な削減手法例は以下である。重みが0.1以下のニューロンを削減している例である。

* 【左→中】重み0.01の経路を削除
* 【中→右】重み0.01の経路に寄与し、他に影響を与えないニューロンを削除
![deep4-14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/e20eea57-19e2-e9d0-a920-223a7d321969.jpeg)

　下記表では、`Oxford 102 category ower dataset`を`CaffeNet`で学習したモデルのプルーニング効果である。$α$=0.5時、1.5時の全結合層全体の削減率と精度を見ると、全結合層全体の48.86%を削減しても精度が91.66%を維持、更に全結合層全体の94.18%を削減しても精度を90.69%を維持している結果となっている。プルーニング効果が非常に大きいことがわかる結果となった。

![deep4-15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/abbf78db-960d-16ca-0572-d8dc5edb52b3.jpeg)


### Section4）応用技術

#### 4-1.　MobileNet

　CNNで用いられる一般的な畳み込みレイヤーは計算量が多い。そこで、__MobileNet__では、__Depthwise Convolution__と__Pointwise Convolution__という2つの畳み込みレイヤーの組み合わせで軽量化を実現している。

* 一般的な畳み込みレイヤー
 * 入力特徴マップ（チャネル数）：$H×W×C$
 * 畳み込みカーネルのサイズ：$K×K×C$
 * 出力チャネル数（フィルタ数）：$M$
 * ストライド1でパディングを適用した場合の畳み込み計算の計算量：__$H×W×K×K×C×M$__

![deep4-16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/5b004d8d-564b-48d9-0d8e-51c8907f7d31.jpeg)

* Depthwise Convolution
 * 入力マップのチャネルごとに畳み込みを実施
 * 出力マップをそれらと結合（入力マップのチャネル数と同じになる）
 * 各層ごとの畳み込みなので層間の関係性は全く考慮されない
 * Depthwise Convolutionにおける出力マップの計算量：__$H×W×C×K×K$__

![deep4-17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/04eb14e6-7a61-7047-7f28-d0321ffa3b8a.jpeg)

* Pointwise Convolution
 * 1×1 convとも呼ばれる（正確には$1×1×C$）
 * 入力マップのポイントごとに畳み込みを実施
 * 出力マップ（チャネル数）はフィルタ数文だけ作成可能
 * Pointwise Convolutionにおける出力マップの計算量：__$H×W×C×M$__

__MobileNet__は、Depthwise ConvolutionとPointwise Convolutionを併用し、計算量を削減している。
![deep4-19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/1065f5ac-726d-5bcb-fb7c-f971c541f736.jpeg)

#### 4-2.　DenseNet

　以下の図で__DenseNet__の構成図を示す。

* 初期の畳み込み
* Denseブロック
* 変換レイヤー（Convolution+Pooling）
* 判別レイヤー（Pooling+Linear）
![deep4-20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/ea22b9ce-b31c-ffba-a21f-1e5fb0185a70.jpeg)

　__Denseブロック__では、層間の情報伝達を最大化するため、全ての同特徴量サイズの層を結合している。そのため、Denseブロック内の中間層を経由する毎に特徴量マップが増えていくブロックとなっている。その経由毎に特徴量マップが増える割合を__growth rate（成長率）$k$__で示し、以下の図の計算式で表される。

![deep4-22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/30c7407c-c017-8da5-70dc-2bc094da0bf4.jpeg)

　変換レイヤー（Transition Layer）では、Denseブロックで増えた特徴量マップをダウンサンプリングし削減、次のDenseブロックにつないでいる。この変換レイヤーにより、複数のDenseブロックは常に特徴量マップサイズを一致させ、学習を実現している。
![deep4-24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/ea06895c-0f36-e705-441b-ae818d8836eb.jpeg)

#### 4-3.　BatchNorm/LayerNorm/InstanceNorm

* BatchNorm（バッチノルム）：ミニバッチに含まれるSampleの同一チャネルが同一分布に従うよう正規化する方法
* LayerNorm（レイヤーノルム）：それぞれのSampleの全てのpixelsが同一分布に従うよう正規化する方法
* InstanceNorm（インスタンスノルム）：さらにチャネルも同一分布に従うよう正規化する方法

![deep4-25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/377ddf7e-f2e2-3392-d6a7-936fb70021f8.jpeg)

　__BatchNorm__は、$H×W×C$のサンプルがN個あった場合に、N個の同一チャネルが正規化する単位となる。ミニバッチサイズに依存されるため、ミニバッチサイズが大きくとれない場合は、正規化する効果が薄れてしまうため、注意が必要。

![deep4-26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/125a66f4-3ee3-74e4-274a-bf7e9bc9da2e.jpeg)

　__LayerNorm__は、N個のサンプルの一つに着目され、$H×W×C$の全てのpicelが正規化する単位となる。ミニバッチサイズに依存されない。LayerNormは、入力データや重み行列に対して、以下の操作を施しても、出力が変わらないことが知られている。

* 入力データのスケールに関してロバスト
* 重み行列のスケールやシフトに関してロバスト

![deep4-27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/adcc7554-3ac0-8cd9-325e-856029f74ec5.jpeg)

　__InstanceNorm__は、各サンプルの各チャネルごとが正規化する単位となる。コントラストの正規化に寄与・画像のスタイル転送やテクスチャ合成タスクなどで利用されている。

![deep4-28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/14033140-0f17-1433-3cd7-6fc09c7f1218.jpeg)

#### 4-4.　WaveNet

　__WaveNet__は、生の音声波形を生成する深層学習モデルである。Pixel CNN（高解像度の画像を精密に生成できる手法）を音声に応用したモデルで、2016年にDeepMind社が提案したモデル。

　WaveNetのメインアイディアは、時系列データの対して畳み込み（__Dilated convolution__）を適用していること。Dilated convolutionとは、以下の特徴がある。

* Dilated convolutionの特徴
 * 層が深くなるにつれて畳み込むリンクを離す
 * 受容野を簡単に増やすことができる（以下図では、Dilated=1,2,4,8）

![deep4-29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/b2b9a81a-68fa-6d11-d661-eae37ed538f8.jpeg)


### Section5）例題解説

#### 1-13.　Seq2seq

　__Seq2seq__とは、系列（Sequence）を入力として、系列を出力するもので、__Encoder-Decoder__モデルとも呼ばれる。入力系列がEncode（内部状態に変換）され、内部状態からDecode（系列に変換）する。応用例として、翻訳（英語→日本語）や音声認識（波形→テキスト）、チャットボット（テキスト→テキスト）などがある。

　Seq2seqの理解にはRNNと言語モデルの理解が必要である。

* RNNは系列情報を内部状態に変換することができる
* 文章の各単語が現れる際の同時確率は、事後確率で分解でき、事後確率を求めることがRNNの目標になる
* 言語モデルを再現するようにRNNの重みが学習されていれば、ある時点での次の単語を予測することができ、先頭単語を与えれば文章を生成することも可能となる

　Seq2seqは、RNNが2つ連結されたものである。左のRNNをEncoder RNN、右のRNNをDecoder RNNと呼ぶ。
![deep4-30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/021a3b59-ff62-27ac-13df-9ce2346ed715.jpeg)



#### 1-14.　Transformer

* Attention（注意事項）
　情報量が増えたときに何に注意し、何が注意不要か、重みづけを行う
* attentionは辞書オブジェクト
　　query（検索クエリ）に一致するkeyを索引し、対応するvalueを取り出す操作。辞書オブジェクトと同機能。
![deep4-31.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/4892ec37-948c-350a-e6d7-48b61f8ac320.jpeg)

* Attentionには2種類存在する
 * Source Target Attention（ソース・ターゲット注意事項）
　　　情報が来る場所、狙うべき場所が近いものに注意をあてる

 * Self-Attention（自己注意事項）
　　　QKVが同じ場所からくる。自分の入力だけで注意を充てる箇所を決める

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

![deep4-32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/4b8471cf-83c4-571e-68de-0520f6557dbd.jpeg)

* Scaled dot product attention
　　全単語に関するAttentionをまとめて計算

![deep4-33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/84d4377f-d380-2022-91c5-d1820d1b0d1d.jpeg)

* Multi-Head attention
　8個のScaled dot product attentionの出力を結合している。それぞれのScaled dot product attentionが異なる種類の情報を収集している。

![deep4-34.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/b140a7ff-fa9b-dff5-232f-c0720c966d52.jpeg)

* Decoder
 * Encoderと同じ6層構成で、各層に2種類の注意機構。注意機構の仕組みはEncoderと同様。
 * 自己注意機構（Self-Attention）　生成単語列の情報を収集し、直下の層出力へ注意を充てる。また、未来の情報を見ないようにマスク 。

* Add（Residual Connection）
 * 入出力の差分を学習させる
 * 実装上は出力に入力をそのまま加算するだけ
 * 効果：学習・テストエラーの低減

* Norm（Layer Normalization）
 * 各層においてバイアスを除く活性化関数への入力を平均0、分散1に正則化
 * 効果：学習の高速化

* Position Encoding
　RNNを用いないため、単語列の語順情報をPosition Encodingで追加。ポジションを2進数表現して、以下の動作イメージを持たせている。

 ![deep4-35.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/67da6146-5f8e-9866-ec4f-d00e69a2c65a.jpeg)
![deep4-36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/36a5792f-d438-fbaf-a26c-cb5c4a657679.jpeg)

![deep4-37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/a34db5b3-8cc0-1840-7ca3-0db9fc7c5cd9.jpeg)

#### 1-15.　物体検知

* 入力は画像（カラー・モノクロは問わない）
* 出力に応じて認識タスクが4つに分かれる
 * Classification（分類問題）
 * Object Detection（物体検出）
 * Semantic Segmentation（意味領域分割）
 * Instance Segmentation（個体領域分割）

|            |出力|タスクの難易度|
|:----------:|:-----:|:-----:|
|分類問題|（画像に対し単一または複数の）<br>クラスラベル|易|
|物体検出|Bounding Box [bbox/BB]|↓|
|意味領域分割|（各ピクセルに対し単一の）<br>クラスラベル|↓|
|個体領域分割|（各ピクセルに対し単一の）<br>クラスラベル|難|
![deep4-38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/238efce4-0549-91d9-6f16-f552c36d71b7.jpeg)

* 物体の位置に興味なし・・・分類
* インスタンスの区別に興味なし・・・物体検知、意味領域分割
* インスタンスの位置・区別に興味・・・個体領域分割

##### 1-15-1.　物体検出

 __物体検知__において、画像上に画像物体の__位置__、__予測ラベル__、__コンフィデンス（信頼度）__の3つが合わせて出されることが一般的である。その物体検知のモデルの性能を判断する上で、コンペティションでも用いられる4つの代表的なデータセットがある。

* 代表的データセット・・・物体検知コンペティションで用いられたデータセット

|コンペティション|クラス|Train+Val|Box/画像<br>（1画像あたりの平均Box数）|Instane Annotation<br>（物体個々のラベリング有無）|
|:---:|:-----:|:-----:|:-----:|:-----:|
|VOC12|20|11,540|2.4|有|
|ILSVRC17|200|476,668|1.1|無|
|MS COCO18|80|123,287|7.3|有|
|OICOD18|500|1,743,042|7.0|有|

* 1画像あたりの平均Box数が多いということは、物体的な重なり等も見られる。より日常生活のコンテキストに近い。

* 目的に応じたデータセット、Box/画像の選択をする

* 代表的データセットのポジショニングマップ

![deep4-39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/098c89fe-39fa-f00b-d644-0817ceb0fa8a.jpeg)

##### 1-15-2.　物体検出の評価指標

* Confusion Matrix（復習）
![deep4-40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/44664e4f-e597-de4a-173d-88a42219139d.jpeg)

* 閾値変化に対する振る舞い
 * クラス分類：閾値（Threshold）を変化させてもConfusion Matrixに入る総数に変化は無い
 * 物体検出：閾値以上のものしか抽出されない。つまり、閾値変化に応じてConfusion Matrixに入る総数が変化する。

* 物体位置の評価指標　IOU（Intersection Over Union）
　　真のBBox（Ground-Truth BB）と予測のBBox（Predicted BB）から、物体位置の予測指標IOUが求められる。
![deep4-41.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/0c789a8e-719b-6837-8a3c-c1ab967cb748.jpeg)

上記IOUの定義含め、物体検出には、コンフィデンス（Conf.）と物体位置の予測指標（IOU）のそれぞれに閾値を用いて評価が必要となる。
以下は、__Conf.、IOUの閾値を0.5__とした時の1枚の画像における__Precision/Recall__評価結果である。P5以外は、全て閾値に対し__TP/FP__が判定されているが、__P5__は閾値を上回っているにも関わらず__FP__となっている。その理由は、すでに検出済みの物体に対し、より低い評価結果で判定されたものは、__FAIL__とみなすからである。

![deep4-42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/3cc3277e-3aa6-22f3-2bcf-bd05b6fadfc9.jpeg)

* 複数画像での物体検出
　　上記1枚の画像での予測指標から次は複数画像での予測指標について考える。今回の例では4枚の画像が__All Ground-Truth__として予測指標を算出する。
　ここで注意すべきは、__P3__と__P5__、そして__Recall__。P3は、P1で既に__TP__判定をしているが、画像2（Ground-Truth2）で初めての人検出結果のため、__TP__と判定される。また、P5は、既に画像1（Ground-Truth1）で人検出済みのため、閾値以上ではあるが__FP__と判定されている。今回、Recallの分母に__FN__が1として足されている。その理由は、画像4（Ground-Truth4）に人がいるにも関わらず、人検出できなかったため、__FN=1__と判定されているのである。

![deep4-43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/18cf553d-aab3-3e87-29a9-c93618f27202.jpeg)

* 物体位置の評価指標　AP（Average Precision）
　　IOUの閾値は変えず、Conf.の閾値を0.05～1まで変化させたときのP-R曲線（Precision-Recall curve）を描いた際の下側面積を__AP（Average Precision）__とする。但し、ここではクラス毎の指標として判定する。（例：人検出のAP、車検出のAP、など）

![deep4-44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/cbbba293-a288-1735-93f3-5e864f64cb94.jpeg)

* 物体位置の評価指標　mAP（mean Average Precision）
　　クラスを跨いだ全てのクラスにおけるAPの平均を__mAP（mean Average Precision）__と言う。以下、例では、3クラスのAP平均が求められた例となっている。

![deep4-45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/bfd7f925-800e-43f7-8524-df73ec50c28b.jpeg)


* 物体位置の評価指標　mAPcoco（mean Average Precision coco）
　　MS COCOで導入された新たな指標。IOUの閾値は0.5固定だったmAP指標に対し、追加でIOUの閾値を0.5～0.95まで0.05刻みでのmAPを計算し平均をとった指標である。

```math

\begin{align}
mAP_{COCO}=\frac{mAP_{0.5}+mAP_{0.55}+・・・+mAP_{0.95}}{10}\\
\end{align} 
```

* 物体位置の評価指標　FPS（Flames per Second）
　物体検出の__検出速度__に対する評価指標。詳細は割愛。

![deep4-46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/673b7ab8-e949-ec84-d04c-8d8eb7c4841e.jpeg)

##### 1-15-3.　深層学習以降の物体検知

* 2012年：AlexNetの登場を皮切りに、時代は__SIFT__から__DCNN__へ
 * SIFT:Scale Invariant Feature Transform
 * DCNN:Deep Convolutional Neural Network

代表的なネットワークおよび物体検知のフレームワークは、2013年以降、多くのものが開発されている。

![deep4-47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/a389a324-35ad-a52c-20c2-3f11e8a4b422.jpeg)

物体検知のフレームには検出器の構成で、__2段階検出器__と__1段階検出器__に分かれる。

![deep4-48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/fb3a3a52-effb-4c3f-4932-3fe0570b729d.jpeg)


#### 1-16.　Semantic Segmentation

　画像検知を行う上で、__Convolution__と__Pooling__を繰り返すことにより解像度が落ちていくことは周知の事実である。だが、その解像度が落ちていくということが、__Semantic Segmentation（意味領域分割）__には、大きな問題となる。その理由は、Semantic Segmentationが、入力画像と同じサイズの画像の各ピクセルに対してクラス分類がされることが基本となっているからである。
　落ちた解像度をどう戻すかがSemantic Segmentationの肝となるのだが、その戻す方法の一つに__Up-Sampling__という方法がある。

　解像度が落ちる原因は__プーリング__。でも、プーリングは__受容野を広げる上で必要な処置__なのである。
![deep4-49.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/0c218313-3ccb-bd2e-3d57-80bb5ad94a85.jpeg)

##### 1-16-1.　Up-Sampling手法：Deconvolution

　下図は、3×3の入力画像を5×5の出力画像に変換している__Deconvolution__の例である。通常のconvolution層と同様に、__kernel size__、__padding__、__stride__を指定したのち、以下の処理手順に沿って演算を行う。

![deep4-50.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/17999890-3ff1-e160-85b1-1b1a825cf8e2.jpeg)

* Deconvolutionの処理手順

1. 特徴マップのPixel感覚をstrideだけ空ける
2. 特徴マップのまわりに(Kernel size -1) -paddingだけ余白を作る
3. 畳み込み演算を行う。

##### 1-16-2.　FCNによるUp-Sampling事例

　__FCN（Fully Convolutional Network）__は__VGG6__の全結合層をConvolution層に変更しているネットワークである。その変更により最終出力はヒートマップの出力とすることができる。

![deep4-51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/bc51edef-b756-8d29-aa5f-e07773444f09.jpeg)

　FCNもConvolution、Poolingを使用しているため、解像度低下は避けられない問題であるが、そこで、Up-Sampling手法の一つ、Deconvolutionを使用している。その中での工夫は、__element-wise addtion__。__低レイヤーPooling層の出力と2倍Up-Samplingデータを足し合わす__ことで、ローカルな情報を補完し、Up-Samplingを実現している。

![deep4-52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/2a09abf4-6803-4347-59a6-003837dda77e.jpeg)


##### 1-16-3.　U-Net

　FCN同様、低レイヤー情報を使いUp-Samplingしているネットワークとして、__U-Net__も有名である。インプットからMaxプーリングを繰り返す（Encoder）ことで解像度が落ちるが、Up-Sampling（Decoder）で解像度を戻している。

　FCNとU-Netは、Up-Sampling時の低レイヤー情報の結合の仕方に違いがある。FCNは、Up-Samplingしたものと低レイヤー情報を要素ごとにに足し算（element-wise addtion）している。その反面、U-Netは、Up-Samplingしたものと低レイヤー情報をチャンネル方向で結合している点が違いである。

##### 1-16-4.　Up-Sampling手法：Unpooling

　Up-Sampling手法のもう1つに__Unpooling__がある。この方法は、プーリングした際にどこが最大値だったかの位置情報を保持しておき、その情報を引き出し元に戻す方法である。

##### 1-16-5.　Convolution層で受容野を広げる工夫

　Convolution層で受容野を広げる工夫として__Dilated Convolution__がある。この方法は、Kernelの間に隙間を持たせ、より広い受容野での畳み込みを行う方法である。
　下図では、rate=2（Kernelの間に1マス空けた場合）と、rate=4（Kernelの間に3マス空けた場合）の例がある。この畳み込みにより広範囲の受容野を確保できる工夫となっていることが見てわかる。

![deep4-53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691536/b97bda2d-fe3a-275f-803a-52d0f0cb96f9.jpeg)




###関連ページ

* [ディープラーニング講座「応用数学」要点まとめ](https://qiita.com/Shinji333/items/3aec7b74d5bbd6fdd383)
* [ディープラーニング講座「機械学習」要点まとめ](https://qiita.com/Shinji333/items/0ecd7270e1adee2dbe94)
* [ディープラーニング講座「機械学習」実装演習](https://qiita.com/Shinji333/items/42e820362fb2169c9f8a)
* [ディープラーニング講座「深層学習：Day1」要点まとめ＆実装演習](https://qiita.com/Shinji333/items/b4ea4c4d6047bb0255f4)
* [ディープラーニング講座「深層学習：Day2」要点まとめ＆実装演習](https://qiita.com/Shinji333/items/e55f0183e1214cde16dc)
* [ディープラーニング講座「深層学習：Day3」要点まとめ＆実装演習](https://qiita.com/Shinji333/items/b8d9c10ce66733bd78f3)
* ディープラーニング講座「深層学習：Day4」要点まとめ＆実装演習＜本記事＞