ラビットチャレンジ 深層学習day4

##本記事について
ラビットチャレンジの深層学習day4のレポートです。
ラビットチャレンジはStudy-AI開講のE資格受験資格を得られる認定プログラムとなっています。

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

- 強化学習イメージ
  - エージェントが方策を立てて行動する
  - エージェントの行動により環境が変化する
  - エージェントが行った結果の報酬を得る
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/efff1db9-5fa2-2d77-1803-dea23f734a82.png)

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

#### 探索と利用のトレードオフ
過去のデータでベストとされる行動のみを常に取り続けると、他にもっとベストな行動を見つけることはできない。一方、未知の行動のみを常に取り続ければ、過去の経験が活かせない。
両者はトレードオフの関係にある。

#### 強化学習イメージ
- 学習対象
  - 方策関数：どのような行動をとるか学習
  - 行動価値関数：エージェントにとって価値のある行動は何かを学習

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/4295ec94-0095-7a41-23b9-72ed0170f1c5.png)

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

#### 強化学習の歴史
- 強化学習について
  - あまり技術の進まない時期もあったが、計算速度の進展により大規模な状態をもつ場合の強化学習を可能としつつある
  - 関数近似法とQ学習を組み合わせる手法の登場により近年研究が加速

- Q学習
  - 行動価値関数を行動する毎に更新することにより学習を進める方法

- 関数近似法
  - 価値関数や方策関数を関数近似する手法のこと

#### 価値関数
- 状態価値関数と行動価値関数の2種類がある
  - 状態価値関数
     - ある状態の価値に注目する場合に利用
     - エージェントの行動は含まれない
  - 行動価値関数
     - 状態と価値を組み合わせた価値に注目する場合に利用
     - 環境の状態とエージェントの行動から価値を学習する
     - 最近よく使われている

#### 方策関数
- 方策関数とは
  - 方策ベースの強化学習手法において、ある状態でどのような行動をとるかの確率を与える関数のこと
  - エージェントの行動を決める関数
  - 報酬が最大となるような行動を学習

#### 方策勾配法
- 方策反復法
  - 方策をモデル化して最適化する手法
- 方策勾配法
  - ニューラルネットワークの重みの更新と考え方は同じ

- 数式
- 下記数式で表される
  - $J$は期待される収益で定義する必要がある
  - 教師あり学習などでは誤差を小さくするため勾配を引いていたが、強化学習では報酬を大きくするよう学習を進めるため重みを足していく必要がある

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

- $\nabla J(\theta)$の定義方法
  - 下記の式で表される
  - $ \pi _{\theta}(\alpha | s)Q^{\pi}(s, \alpha) $はある行動をとるときの報酬

$$ \nabla_{\theta} J(\theta) = \nabla_{\theta} \sum_{\alpha \in A} \pi _{\theta}(\alpha | s)Q^{\pi}(s, \alpha) $$

$$  \nabla_{\theta} J( \theta ) = \mathbb{E}_{\pi _{\theta}}[(\nabla _{\theta} \log{\pi _{\theta}}(\alpha | s)Q^{\pi}(s, \alpha) )]  $$

#### 実装演習
講義内になかったため割愛

### Alpha Go
#### 概要
- 囲碁のプログラム
- AlphaGo (Lee)とAlphaGo Zeroの2種類がある

- 方策関数
  - 19×19、48チャンネルの盤面の予測確立を出力し、最良の手を予測する
  - 畳み込みニューラルネットワークが利用されている
  - 出力層にはSoftMax関数が利用される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/7a67f545-42ea-7b58-9f76-9bb38ae12c03.png)

- 価値関数
  - 19×19、49チャンネルの盤面の勝率を―1～1で予測する
  - 畳み込みニューラルネットワークが利用されている
  - 出力層にはTanHを利用する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/45f0dd75-6c49-e57e-2fa2-5543e1a2eeeb.png)

#### Alpha Goの学習
- 学習ステップ
  1. 教師あり学習によるRollOutPolicyとPolicyNetの学習
  1. 強化学習によるPolicyNetの学習
  1. 強化学習によるValueNetの学習

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

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

- 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を別々にしてある理由は、過学習を防ぐためであると論文では説明されている。

#### 計算技術
- RollOutPolicy
  - NNではなく線形の方策関数
  - 探索中に高速に着手確率を出すために使用される
  - 学習ステップ1つ目の教師あり学習の際に利用される

- モンテカルロ木探索
  - 価値関数の学習時に利用される
  - 参考文献の説明がわかりやすい
     - 「徹底攻略ディープラーニングE資格」第17章 Alpha Go

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/b36ed704-52d4-d04f-b7b8-010a9c5eb7be.png)

- Residual Block
  - ネットワークにショートカット構造を追加して深いネットワークを回避して勾配爆発、消失を抑える効果を狙ったもの
  - 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/2235425/52413b06-8c5d-85be-4ce8-af1151fb77a4.png)

- Residual Networkの派生形
  - E資格でこのような名前と内容の対応は狙われやすいらしい
  - 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。

#### 実装演習
講義内になかったため割愛

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

#### モデルの高速な学習
##### データ並列化
- 概要
  - 親モデルを各ワーカーに子モデルとしてコピー
  - データを分割し、各ワーカーごとに計算させる

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/28948241-69f3-1978-4585-ed278e3e3a04.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/47d3ffc7-057f-fa9d-d641-ab4966c03969.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/901f458f-4785-f16a-8867-fd176b978fdf.png)

- モデル並列
　　- モデルのパラメータ数が多いほど、スピードアップの効率も向上する。

- 参照論文
  - Large Scale Distributed Deep Networks 
     - Google社が2016年に出した論文
     - Tensorflowの前身といわれている
  - 並列コンピューティングを用いることで大規模なネットワークを高速に学習させる仕組みを提案。
  - 主にモデル並列とデータ並列(非同期型)の提案をしている。

##### GPUによる高速化
- GPGPU (General-purpose on GPU)
  - 元々の使用目的であるグラフィック以外の用途で使用されるGPUの総称

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

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

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

#### 軽量化の手法
- 代表的な手法
  - 量子化
  - 蒸留
  - プルーニング

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

- 量子化の利点と欠点
  - 利点
     - 計算の高速化
     - 省メモリ化
  - 欠点
     - 精度の低下

- 計算の高速化
  - 倍精度演算(64 bit)と単精度演算(32 bit)は演算性能が大きく違うため、量子化により精度を落とすことによりより多くの計算をすることができる。
  - 深層学習で用いられるNVIDIA社製のGPU の性能は下記のようになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/a2af10c6-d9c1-68a0-2c7e-12491243e5d7.png)

- 省メモリ化
  - ニューロンの重みの浮動小数点のbit数を少なくし有効桁数を下げる
  - それによりニューロンのメモリサイズを小さくでき、メモリの使用量を抑えることができる

- 精度の低下
  - ニューロンが表現できる小数の有効桁数が小さくなるとモデルの表現力が低下する
  - 学習した結果、ニューロンが$1.175494×10^{-38}$未満の値になる場合などに重みを表現できなくなる
  - ただし実際の問題では倍精度を単精度にしてもほぼ精度は変わらない

##### 蒸留
- 概要
  - 精度の高いモデルはニューロンの規模が大きいい
  - そのため推論に多くのメモリと演算処理が必要
  - 上流では規模の大きなモデルを一度作成し、そこから軽量なモデルの作成を行う

- モデルの簡約化
  - 学習済みの精度の高いモデルの知識を軽量なモデルへ継承させる
  - 知識の継承により、軽量でありながら複雑なモデルに匹敵する精度のモデルを得ることが期待できる

- 教師モデルと生徒モデル
  - 蒸留は教師モデルと生徒モデルの2つで構成される
  - 教師モデル
     - 予測精度の高い、複雑なモデルやアンサンブルされたモデル
     - 学習済み
  - 生徒モデル
     - 教師モデルをもとに作られる軽量なモデル
  - 教師モデルの重みを固定し生徒モデルの重みを更新していく
  - 誤差は教師モデルと生徒モデルのそれぞれの誤差を使い重みを更新していく

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/03ddbabf-6e4b-13c5-8710-f8a7732f1caa.png)

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

- 計算の高速化
  - 寄与の少ないニューロンの削減を行いモデルの圧縮を行う

- ニューロンの削減
  - 重みが閾値以下の場合ニューロンを削減し、再学習を行う

##### モデルの軽量化まとめ
- 量子化：重みの精度を下げることにより計算の高速化と省メモリ化を行う技術
- 蒸留：複雑で精度の良い教師モデルから軽量な生徒モデルを効率よく学習を行う技術
- プルーニング：寄与の少ないニューロンをモデルから削減し高速化と省メモリ化を行う技術

### 応用技術
#### MobileNet
- 論文タイトル
  - MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
- 提案手法
  - ディープラーニングモデルは精度は良いが、その分ネットワークが深くなり計算量が増える
  - 計算量が増えると、多くの計算リソースが必要で、お金がかかってしまう
  - ディープラーニングモデルの軽量化・高速化・高精度化を実現(その名の通りモバイルなネットワーク)
- 参考文献
  - https://qiita.com/HiromuMasuda0228/items/7dd0b764804d2aa199e4

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/119da71d-fdb0-c0e9-eb5a-35f7c9ddf8d0.png)

- MobileNetsはDepthwise ConvolutionとPointwise Convolutionの組み合わせで軽量化を実現
- Depthwise Convolution
   - 仕組み
      - 入力マップのチャネルごとに畳み込みを実施
      - 出力マップをそれらと結合(入力マップのチャネル数と同じになる)
   - 通常の畳み込みカーネルは全ての層にかかっていることを考えると計算量が大幅に削減可能
   - 各層ごとの畳み込みなので層間の関係性は全く考慮されない。通常はPW畳み込みとセットで使うことで解決
   - 計算量はH×W×C×K×K

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/18c9d4bf-b355-98e1-d744-e838b6088932.png)

- Pointwise Convolution
  - 仕組み
      - 1 x 1 convとも呼ばれる(正確には1 x 1 x c)
      - 入力マップのポイントごとに畳み込みを実施
      - 出力マップ(チャネル数)はフィルタ数分だけ作成可能(任意のサイズが指定可能)
      - 計算量はH×W×C×M

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/6aa99700-ab80-859e-ee39-a428d292abe9.png)

- 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

#### DenseNet
- 論文タイトル
  - Densely Connected Convolutional Networks. G. Huang et., al. 2016
  - https://arxiv.org/pdf/1608.06993.pdf
  - https://www.slideshare.net/harmonylab/densely-connected-convolutional-networks
- 概要
  - Dense Convolutional Network（以下、DenseNet）は、畳込みニューラルネットワーク（以下、CNN）アーキテクチャの一種である。ニューラルネットワークでは層が深くなるにつれて、学習が難しくなるという問題があったが、Residual Network（以下、ResNet）などのCNNアーキテクチャでは前方の層から後方の層へアイデンティティ接続を介してパスを作ることで問題を対処した。DenseBlockと呼ばれるモジュールを用いた、DenseNetもそのようなアーキテクチャの一つである。

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

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

#### Batch Norm Layer
- 概要
  - レイヤー間を流れるデータの分布を、ミニバッチ単位で平均が0、分散が1になるように正規化
  - Batch Normalizationはニューラルネットワークにおいて学習時間の短縮や初期値への依存低減、過学習の抑制など効果がある。

- Batch Normの問題点
  - Batch Sizeが小さい条件下では、学習が収束しないことがあり、代わりにLayer Normalizationなどの正規化手法が使われることが多い。

#### Batch Norm以外の正規化
- Batch Norm
  - ミニバッチに含まれるsampleの同一チャネルが同一分布に従うよう正規化
- Layer Norm
  - それぞれのsampleの全てのpixelsが同一分布に従うよう正規化
- Instance Nrom
  - さらにchannelも同一分布に従うよう正規化

#### Wavenet
- 概要
  - 生の音声波形を生成する深層学習モデル
  - Pixcel CNN(高解像度の画像を精密に精製できる手法)を音声に応用したもの
  
- 確認テスト
  1. 深層学習を用いて結合確率を学習する際に、効率的に学習が行えるアーキテクチャを提案したことがWaveNet の大きな貢献の1 つである。提案された新しいConvolution 型アーキテクチャは（あ）と呼ばれ、結合確率を効率的に学習できるようになっている。 
     - Dilated causal convolution
     - Depthwise separable convolution
     - Pointwise convolution
     - Deconvolution
  2. （あ）を用いた際の大きな利点は、単純なConvolution layer と比べて（い）ことである。
     - パラメータ数に対する受容野が広い
     - 受容野あたりのパラメータ数が多い
     - 学習時に並列計算が行える
     - 推論時に並列計算が行える

- 確認テスト解答
  1. Dilated causal convolution
  1. パラメータ数に対する受容野が広い

### transformer
#### Seq2seq
##### 概要
- 系列(Sequence)を入力として、系列を出力するもの
  - Encoder-Decoderモデルとも呼ばれる
  - 入力系列がEncode(内部状態に変換)され、内部状態からDecode(系列に変換)する
  - 実応用上も、入力・出力共に系列情報なものは多い
     - 翻訳 (英語→日本語) 
     - 音声認識 (波形→テキスト)
     - チャットボット (テキスト→テキスト)

- 復習
  - RNNとは
     - 系列データを読み込むために再帰的に動作するNN
     - 再帰処理は時間軸方向に展開できる
     - 前の時刻の出力を現在の時刻の入力にする
     - 系列情報を舐めて内部状態に変換できる
  - 言語モデルとは
     - 言語モデルは単語の並びに確率を与える
     - 単語の並びに対して尤度(それがどれだけ起こり得るか)、すなわち、文章として自然かを確率で評価する 
     - 例) 
         - You say goodbye → 0.092 (自然) 
         - You say good die → 0.00000032 (不自然) 
         - 数式的には同時確率を事後確率に分解して表せる
     - 時刻t-1までの情報で、時刻tの事後確率を求めることが目標
     -  →これで同時確率が計算できる

##### RNN x 言語モデル
各地点で次にどの単語が来れば自然(事後確率最大)かを出力できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/d086a28b-71d8-b097-d48e-e8a5c43316d4.png)

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

#### Seq2seq
##### 概要
- EncoderからDecoderに渡される内部状態ベクトルが鍵
- Decoder側の構造は言語モデルRNNとほぼ同じだが 隠れ状態の初期値にEncder側の内部状態を受け取る
- Decoderのoutput側に正解を当てれば教師あり学習がEnd2endで行える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/4f6cd8a9-ebd3-966f-cb02-f39ddf0f632d.png)

#### 実装演習
- 翻訳を行う
  - 付属のソースコード「lecture_chap1_exercise_public.ipynb」を利用

- はじめに
  - そのままGoogle Clabで動かすとエラーが発生するため下記のコードを最初のセルに記入する
  - (参考にしたサイト：https://qiita.com/amateur2020/items/6a07642ce9eaa02a805b )
  - また「print('Downloaded content "{}"'.format(downloaded.GetContentString()))」という記述でエラーが発生したためコメントアウトした
  - 途中でGoogleアカウントの認証が必要なことにも注意(気づかず実行できないまま何分も経っていたので)

```python
# セル内に下記コードを記入
%pip install "wheel==0.34.2"
```

- 演習結果
  - いくつか翻訳をしてみると下記のようになった
  - よくできているものもあれば、全然意味の分からないものもあった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/d0ca2a14-b40e-3571-2985-5d190c4cd241.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/8bf322c9-a19a-037a-f2ea-7475eb155001.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/606dce8f-50e9-2d4e-1ca2-eba119af1ffe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/166df926-fdeb-a521-2058-b3ddcea6657a.png)

### Transformer
ニューラル機械翻訳の問題点:長さに弱い

- 翻訳元の文の内容をひとつのベクトルで表現
   - 文長が長くなると表現力が足りなくなる
- 文長と翻訳精度の関係性
   - 長くなるほど低下しているのがわかる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/786db0a9-c531-20b5-d170-aa4b19365a8b.png)

#### Attention (注意機構) 
- 概要
  - 翻訳先の各単語を選択する際に、翻訳元の文中の各単語の隠れ状態を利用する
  - Attentionは辞書オブジェクト
     - query(検索クエリ)に一致するkeyを索引し、対応するvalueを取り出す操作であると見做すことができる。これは辞書オブジェクトの機能と同じである。
  - 文長が長くなっても翻訳精度が落ちない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/9aeac17b-68f4-095e-80c8-8e50344a3fc4.png)

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

- 主要モジュール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/066f6359-d6ee-d779-e004-b233e5493e6a.png)

- 注意機構の種類
  - ソース・ターゲット注意機構
  - 自己注意機構

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/51c216de-1dc2-3047-810c-42826d3de251.png)

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

- まとめ
  - Encorder Decorderは次の図のようになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/5406ed23-5868-e9c4-f3aa-5c808608b811.png)

#### 実装演習
- seq2seqと同様に翻訳タスクを行う
  - 付属のソースコード「lecture_chap2_exercise_public.ipynb」を利用

- 実装結果
  - seq2seqより近い翻訳になっている
  - またBLEUスコアも上がっている(約19→約27)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/0aeb457f-2013-9ef0-aa3a-d76b85c6366f.png)

## 物体検知とSS解説
### Foundations of Object Detection
#### 広義の物体認識タスク

|  |出力|対象範囲|
|---|---|---|
|分類 |(画像に対し単一または複数の） クラスラベル  |物体の位置に興味なし  |
| 物体検知 |Bounding Box [bbox/BB] |インスタンスの区別に興味なし|
|意味領域分割 |（各ピクセルに対し単一の） クラスラベル|インスタンスの区別に興味なし |
|個体領域分割|(各ピクセルに対し単一の） クラスラベル|物体位置、インスタンスの区別が可能 |

- 入力画像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/03b8d136-46f9-4f23-3067-432194faf257.png)

#### 代表的データセット
- データ選択学習のために重要
- データセット
  - Box/画像が少ない→映っているものが少ない

|  |クラス|Train + Val|Box/画像|Instance Annotation |
|---|---|---|---|---|
|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|〇|

#### 評価指標
- Confusion Matrixを利用する

|  |Positive|Negative|
|---|---|---|
|Positive|True Positive|False Negative|
|Negative|False Positive|True Negative|

$$ Precision = \frac{TP}{TP + FP} $$
$$ Recall = \frac{TP}{TP + FN} $$

##### IoU：Intersection over Union
- 物体検出においてはクラスラベルだけでなく物体位置の予測精度も評価したい
- Confusion Matrixの要素を用いて表現される

$$ IoU = \frac{TP}{TP + FP + FN} $$

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/4b448d60-4063-a3f6-e47b-15496c740131.png)

##### Precision/Recall
- 入力が1枚のとき
  - 画像内ではconf.とIoUの二つが0.5より大きい場合検出(TP)としている
  - P1～P6はconf.が0.5より大きいもののみ表示している
  - conf.とIoUがともに0.5を超えていてもすでに検出済みであれば誤検出（FP) となる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/d4419739-5950-36cb-f3b3-b6bdb7ebe478.png)

- クラス単位のとき
  - 入力が1枚の時と同様に判定していく
  - Picture 4は検出自体されていないので検出漏れ(FN)になることに注意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/fffc43c4-1e89-f37f-9aff-21104c514efe.png)


##### AP(Average Precision)
PR曲線の面積  
conf.の閾値を$\beta$とするとき

$$ Recall = R(\beta), Precision = P(\beta) $$
$$ P = f(R) $$
$$ AP = \int_{0}^{1} P(R)dR $$
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/335ccecc-c162-75e6-da3a-88e584fd82ed.png)

##### mAP(mean Average Precision)
APの平均であることからクラス数をCとすると下記の式で表せる  
$$ AP = \int_{0}^{1} P(R)dR $$
$$ mAP = \frac{1}{C} \sum_{i=1}^{C} AP_{i} $$

##### FPS(Flames per Second)
物体検知応用上の要請から, 検出精度に加え検出速度も問題となる  

#### 物体検知の大枠
- マイルストーン：深層学習以降の物体検知
  - AlexNetの登場を皮切りに, 時代はSIFTからDCNNへ
     - SIFT：Scale Invariant Feature Transform 
     - DCNN：Deep Convolutional Neural Network

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/1da8ad32-6b91-4226-6c2a-a41803b057de.png)

- 物体検知のフレームワーク

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/4328e8f8-85a7-8a93-5eda-e9cfc7ce37ff.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/f93a9d3a-4f95-0c95-40d3-d1bee60519ce.png)

#### SSD: Single Shot Detector
##### SSD in a nutshell
- デフォルトボックスをうまく変形できるよう学習を行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/3a5e21ee-593c-5481-3593-68fec93b445c.png)

##### SSDのネットワークアーキテクチャ
- VGG16のネットワーク図
  - プーリング層、出力層はカウントされない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/b8e70576-0274-ddd2-ea5b-878b10eb81a6.png)

- SSD
  - 概要図は下記の通り

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/5b206cbf-a593-60ca-2aa3-1e821afbecb7.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/e9986908-ab3d-179b-f924-8aea3d24fb53.png)

##### SSDのデフォルトボックス数
- default boxの数は計算量などを考慮して設定されている
- 必ずしも4と6が良いわけではない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/4baea06e-f4b2-b3ac-0bd5-73d6420f1c53.png)

##### その他の工夫
- Non-Maximum Suppression
  - 一つの物体にpredicted bounding boxが表示されて冗長になる
  - IoUを計算して最も大きいものだけを利用する
- Hard Negative Mining
  - 背景として判断されるpredicted bounding boxが多くなる
  - Positive(非背景) : Negative(背景)　が少なくとも1:3になるよう制限

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/30ad590e-3b15-ad38-3cf3-c10a33003b37.png)

#### Semantic Segmentationの概略
##### Semantic Segmentationにおける問題
入力値と同じサイズの出力の各ピクセルに対して判定を行いたいが、ConvolutionとPoolingを繰り返すうちに解像度が下がってしまう

##### FCN（Fully Convolutional Network）の基本アイディア
その物体らしさを表すヒートマップを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/6f627d6f-59ef-0bc9-f1a1-1c04b3f656c5.png)

##### Deconvolution/Transposed convolution
下記画像のようにUp Samplingできる

![IMG_3827.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/141ecc5b-1e87-fd0f-3d87-5b36b6b0a9df.png)

##### 輪郭情報の補完
要素ごとに足し算することで情報を復元する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/cbccd39d-0a0a-6dce-dc82-2b0ef3f05554.png)

##### U-Net
FCNとは結合方法が異なる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/97dc3f60-c09f-0c70-cf68-687d74a54f8e.png)

##### Dilated Convolution
- Convolutionの段階で受容野を広げる工夫
- カーネルの間に隙間を開けることで受容野を広げる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235425/a7373d3b-8b44-e3e2-bccb-b942dd1300ef.png)

#### 実装演習
講義内になかったため割愛

#### 参考資料
- 「徹底攻略ディープラーニングE資格」　13章　畳み込みニューラルネットワーク
- 「ゼロから作るDeep Learning」 8章　ディープラーニング