Rabbit Challenge レポート(深層学習 DAY4)

# 1. 強化学習

## 強化学習とは
長期的に報酬を最大化できるように環境の中で行動を選択できるエージェントを作ることを目標とする機械学習の一分野

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/3e834079-7ceb-e79b-2503-96e73138aa96.png)

- 方策TT: どうすれば報酬を得ることができるのか -> これを学習させる
- 状態S: 状態の変化を表す
- 価値V: 報酬としてこれを得る

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


## 強化学習の歴史
冬の時代であったが、以下理由により注目されるようになった
- 計算スピードの向上
- 関数近似法とQ学習を組み合わせる手法の誕生

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

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

## 価値関数
- 状態価値関数
    - ある状態の価値に注目する
- 状態価値関数
    - 状態と価値を組み合わせた価値に注目する

## 方策関数
方策ベースの強化学習手法において、
ある状態でどのような行動をとるのかの確率を与える関数のこと
方策関数 $ \pi (s) = a $

### 関数の関係
エージェントは方策に基づいて行動する。やり続けた場合最終的にどうなるのか
$\pi (s,a)$:　VやQをもとにどういう行動をとるか
$V^{\pi}(s)$: 状態関数 => ゴールまで今の方策を続けた時の報酬の予測値が得られる
$Q^{\pi}(s,a)$: 状態+行動関数 ⇒ 上に同じ

### 方策勾配法について
$ \theta ^{(t+1)} = \theta^{(t)} + \epsilon \nabla J(\theta)$
J=方策の良さ

更新する場合、上記式の右側を更新していく必要があり、このように表す
$\nabla_ \theta J(\theta ) = E_{\pi_\theta}[(\nabla _\theta \log \pi _\theta (a|s) Q^\pi (s,a))] $

# 2. Alpha Go

## Alpha GOとは

Google DeepMindによって開発されたコンピュータ囲碁プログラムである。 2015年10月に、人間のプロ囲碁棋士を互先（ハンディキャップなし）で破った初のコンピュータ囲碁プログラムとなった

## 方策関数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/3674d2c2-f960-2bd0-5dcd-9e7ccb2d05ce.png)

## 価値関数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/7c7b283a-95ed-1c32-deef-45eac5f2a5bf.png)

二次元データの扱いはこの方法が定石

## Alpha Goの学習
### 教師有り学習によるRollOutPolicyとPolicyNetの学習
#### RollOutPolicy
NNではなく線形の方策関数。探索中に拘束に着手確率を出すために使用される。
PolicyNetより高速

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/ecb026fb-8e25-7807-294e-f511103aa815.png)

#### PolicyNetの教師有り学習
- 教師データ
    - KGS Go Server（ネット囲碁対局サイト）の棋譜データから3000万局面分のデータ
    - 教師が着手した手を1とし残りを0とした19×19次元の配列を教師とし、それを分類問題として学習



### 教科学習によるPolicyNetの学習
PolicyPoolというから選択したPolicyNetの対局シミュレーションを行い、方策勾配法で学習
### 強化学習によるValueNetの学習
対局シミュレーションの勝敗を教師として学習

## モンテカルロ木探索
囲碁ソフトでは現在もっとも有効とされている探索法
盤面評価値に頼らず末端評価値、つまり勝敗のみを使って探索を行うことができないか、という発想で生まれた探索法である。
現局面から末端局面までPlayOutと呼ばれるランダムシミュレーションを多数回行い、その勝敗を集計して着手の優劣を決定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/a2fde8bc-ed96-696a-2693-3eeeee1ac7d1.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/8a1db3c0-94c6-1369-1009-0bae7c8f84c1.png)

### Residual Network
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/29842829-8470-af85-83b4-d952c46186b0.png)

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

## AplhaGO Zeroのモンテカルロ木探索
評価および成長、バックアップという３つのステップで構成される

### 選択
- Root局面にて着手選択方策に従って手を選択する。
$\pi = Q(s,a)+cP(s,a)\frac{\sqrt{\sum_b N(s,b)}}{1+N(s,a)}$

- 選択された合法手aで進めた局面がLeafノードでなければ、そのノードの着手選択方策に従って選択を行い、局面を進める。
- 選択された合法手aで進めた局面がLeafノードであれば評価および成長ステップに移行する。

### 評価及び成長
- Leafノードまで進めた局面saをPolicyValueNetで評価する。
- RollOutは行わない。
- 局面saの合法手ノードを展開し木を成長させる。


### バックアップ
- 評価フェイズで評価した値を積算する。
- 局面saでのValueNetの評価の積算値Wvが積算され、N(s,a）とΣN(s,b）が１加算される。
- それらの値から勝敗期待値が再計算される。
$ Q(s,a) = \frac{Wv}{N(s,a)}$

- これをRoot局面までさかのぼって更新する。

## Alpha Go Zeroの学習法
自己対局による教師データの作成、学習、ネットワークの更新の３ステップで構成される

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

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

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


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

## データ並列化
- 親モデルを各ワーカーに子モデルとしてコピー
- データを分割し、各ワーカーごとに計算させる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/3f13e62d-2151-cbdf-cbe4-6612d20ac884.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/53535a00-b4e6-d6ba-9584-012e2e85350f.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/148b646d-43fe-4d5b-e8cb-a0808a5b8d46.png)

### 比較
- 処理速度 => 非同期型
- 学習の安定度 => 同期型
- 精度 => 同期型

## モデル並列化
- 親モデルを各ワーカーに分割し、それぞれのモデルを学習させる。<br>
  全てのデータで学習が終わった後で、一つのモデルに復元。
- モデルが大きい時はモデル並列化を、データが大きい時はデータ並列化をすると良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/faf06de6-f304-7ae5-922e-3418a6db746c.png)

- モデルのパラメータ数が多いほどスピードアップの効率も良くなる

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

## モデルの軽量化とは
モデルの精度を維持しつつパラメータや演算回数を低減する手法の総称

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



### 量子化(Quantization)

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


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


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

#### モデルの簡約化
学習済の精度の高いモデルの知識を軽量なモデルへ継承させる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/54e5a225-7bb7-b52b-25d5-a4e611d7028d.png)

#### 教師モデルと生徒モデル
蒸留は教師モデルと生徒モデルの2つで構成される

- 教師モデル
    - 予測精度の高い、複雑なモデルやアンサンブルされたモデル
- 生徒モデル
    - 教師モデルをもとに作られる軽量なモデル


教師モデルの重みを固定し生徒モデルの重みを更新していく
誤差は教師モデルと生徒モデルのそれぞれの誤差を使い重みを更新していく


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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/4751f9b4-0d82-f728-668b-80de9e0cbdaf.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/6e59a8a6-45bc-3d2c-e5d5-03c522c4a559.png)


# 4. 応用技術
## MobileNet
論文タイトル

- MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

提案手法

- ディープラーニングモデルは精度は良いが、その分ネットワークが深くなり計算量が増える。
- 計算量が増えると、多くの計算リソースが必要で、お金がかかってしまう。
- ディープラーニングモデルの軽量化・高速化・高精度化を実現
- https://qiita.com/HiromuMasuda0228/items/7dd0b764804d2aa199e4

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

⇒ 計算量が多い！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/82affbcb-9fb0-a534-0abd-69cd73650d6a.png)



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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/f3796a74-d6ed-8696-e5f0-e65892e2a04d.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/8753ac39-6321-b8f5-07b0-4be9ca9cba3b.png)

### MobileNetのアーキテクチャ
- Depthwise Separable Convolutionという手法を用いて計算量を削減(2つの畳み込みに分割)
    - Depthwise Convolution
    - Pointwise Convolution
- Depthwise Convolitionはチャネル毎に空間方向へ畳み込む。すなわち、チャネル毎に$D_K \times D_K \times 1$のサイズのフィルターをそれぞれ用いて計算を行うため、その計算量は$H \times W \times C \times K \times K$となる。
- 次にDepthwise Convolutionの出力をPointwise Convolutionによってチャネル方向に畳み込む。すなわち、出力チャネル毎に１×１×Mサイズのフィルターをそれぞれ用いて計算を行うため、その計算量は$ H \times W \times C \times M$となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/52742c2b-9487-e05f-4ef3-504ba245de48.png)


## 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もそのようなアーキテクチャの一つである。

### 全体像

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/45effd2d-599d-c0e0-ecb7-59cf609ced01.png)

### Denseブロック
出力層に前の層の入力を足し合わせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/86c67642-c56c-78c9-9c84-dae4c5095209.png)


### 計算方法
- 前のブロックの結果のデータも入力に利用

- 第l層の出力を$x_l$とすると
$x_l = H_l([x0,x1,・・・,x_{l-1}])$

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/e56a1a8c-cdac-5fd0-38db-9b305b6dcc81.png)


- kをネットワークのgrowth rateと呼ぶ
    - kが大きくなるほどネットワークが大きくなるため、小さな整数に設定するのがよい
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/694f9135-ceff-24cc-d03c-a6e620f4ec94.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/b57f2239-922d-79fd-5559-d19df064a01d.png)

### DenseNetとResNetの違い
- DenseBlockでは前方の各層からの出力全てが後方の層への入力として用いられる
- RessidualBlockでは前1層の入力のみ後方の層へ入力
- DenseNet内で使用されるDenseBlockと呼ばれるモジュールでは成⻑率(Growth Rate)と呼ばれるハイパーパラメータが存在する。
    - DenseBlock内の各ブロック毎にk個ずつ特徴マップのチャネル数が増加していく時、kを成⻑率と呼ぶ

## Batch Norm Layer

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/067d9d6f-15c6-677b-5a28-ecbf620097b3.png)

### Batch Norm

- 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/960917/8a6b962d-24f6-9413-f74d-80cf0a832e8b.png)

### Layer Norm
- N個のsampleのうち一つに注目。H x W x Cの全てのpixelが正規化の単位。
- RGBの3チャネルのsampleがN個の場合は、あるsampleを取り出し、全てのチャネルの平均と分散を求め正規化を実施(図の⻘い部分に対応)。特徴マップごとに正規化された特徴マップを出力
- ミニバッチの数に依存しないので、上記の問題を解消できていると考えられる
- Layer Normは、入力データや重み行列に対して、以下の操作を施しても、出力が変わらないことが知られている。
- 入力データのスケールに関してロバスト○重み行列のスケールやシフトに関してロバスト
- 詳細は下記のスライド参照
    - https://www.slideshare.net/KeigoNishida/layer-normalizationnips
    


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/1cd401d4-0502-2ca5-4a41-46b348e6d180.png)

### Instance Norm
- 各sampleの各チャネルをごとに正規化
- Batch Normalizationのバッチサイズが1の場合と等価
- コントラストの正規化に寄与・画像のスタイル転送やテクスチャ合成タスクなどで利用
    - https://blog.cosnomi.com/posts/1493/
    - https://gangango.com/2019/06/16/post-573/
    - https://blog.albert2005.co.jp/2018/09/05/group_normalization/
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/19ac51f8-7fca-0018-3b46-111f68f95571.png)

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

### WaveNetのメインアイディア
- 時系列データに対して畳み込み(Dilated convolution)を適用する
- Dilated convolution
    - 層が深くなるにつれて畳み込むリンクを離す
    - 受容野を簡単に増やすことができるという利点がある
    - 図(右)では、Dilated = 1,2,4,8となっている
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/3838274d-5265-3656-afaf-bfe8f877525e.png)

- 深層学習を用いて結合確率を学習する際に、効率的に学習が行えるアーキテクチャを提案したことがWaveNet の大きな貢献の1 つ
- 提案された新しいConvolution 型アーキテクチャはDilated causal convolutionと呼ばれ、結合確率を効率的に学習できるようになっている
Dilated causal convolution を用いた際の大きな利点は、単純なConvolution layer と比べてパラメータ数に対する受容野が広いことである

# 5. BERT
BERTを理解するために必要な材料

- Encoder-Decoder Model
- Transformer
- BERT

## Seq2seq
### Seq2seqとは？
系列(Sequence)を入力して、系列を出力するもの

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

### Seq2seqの理解に必要な材料
- RNNの理解
- LSTMなどの改良版RNNの理解
- 言語モデルの理解

### RNN × 言語モデル
各地点で次のどの単語が来れば自然かを出力できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/3544a892-63bf-c1c2-0b65-38565b656ce4.png)

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

## Seq2seqについて

- Decider側の構造は言語モデルRNNとほぼ同じ
- 隠れ状態の初期値にEncoder側の内部状態を受け取る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/38268109-ecb0-b6dd-12e7-87aed3d59370.png)


# 6. Transformer

## ニューラル機械翻訳の問題点
長さに弱い
- 翻訳元の文と内容をひとつのベクトルで表現
    - 文長が長くなると表現力が足りなくなる

文長と翻訳精度の関係性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/dc5b73fd-b99f-ebbb-47f0-6297df1ebb4c.png)

## Attention
情報量が多くなってきた際に、何に注意を払って、何に注意を払わないかということを学習する機構

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

翻訳元の各単語の隠れ状態の加重平均
$ c_i = \sum_{j=1}^{T_x} a_{ij}h_{j}.$

重み(すべて足すとと1) FFNNで求める
$ a_{ij} = \frac{\exp (e_{ij})}{\sum_{k=1}^{T_x} \exp (e_{ik})'}$
$ e_{ij} = a(s_{i-1},h_j)$

### 例: 英->仏

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/645440ae-7065-aa46-0801-674e4ae81fee.png)


### Attentionは何をしているのか
Attentionは辞書オブジェクト
queryに一致するkeyを索引し、対応するvalueを取り出す操作であると見なすことができる。
これは辞書オブジェクトの機能と同じである

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/fd6e69a8-d552-89b0-edc2-e423b7d2000c.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/302611c3-8d5a-5d3b-07d6-a70061a542a5.png)

Decoder,Endoder共にSelf-Attentionを用いている

#### Self-Attention
入力をすべて同じにして、学習的に注意箇所を決めていく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/1b79b0b9-cf42-7aa1-9aae-90ee0ac4d211.png)

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

$ FFN(x) = \max(0,xW_1+b)W_2+b_2$
$ W_1 \in R^{512 \times 2048}$ $b1 \in R^{2048}$
$ W_2 \in R^{2048 \times 512}$ $b1 \in R^{512}$

#### Scaled dot product attention
全単語に関するAttentionをまとめて計算する
$Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt {d_k}})V$

#### Multi-Head attention

- 8個のScaled dot product Attentionの出力をConcat
- それぞれのヘッドが異なる種類の情報を収集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/2e04412b-d993-0b27-8760-89b8352a200f.png)

#### Add(residual Connection)
- 入出力の差分を学習させる
- 実装上は出力に入力をそのまま加算する
- 効果: 学習・テストエラーの低減

#### Norm (Layer Normalization)
- 各層に置いてバイアスを除く活性化関数への入力を平均0,分散1に正則化
- 効果:　学習の高速化


#### Position Encoding
RNNを用いないので単語列の語順情報を追加する必要がある
- 単語の位置情報をエンコード

$PE_{(pos,2i)} = \sin \big( \frac{pos}{10000^{2i/512}} \big)$
$PE_{(pos,2i*1)} = \cos \big( \frac{pos}{10000^{2i/512}} \big)$

 
[動作イメージ]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/66ac1c20-6dc8-5439-38e4-d86fa391de98.png)



# 7. 物体検知
## 広義の物体認識タスク
入力が画像データだった場合のそれぞれの出力

- 物体の位置に興味なし
    - 分類
        - 出力: 画像に対し単一または複数のクラスラベル
- インスタンスの区別の興味なし
    - 物体検知
        - 出力: Bounding Box
    - 意味領域分割
        - 出力: 各ピクセルに対し単一のクラスラベル
- 物体の位置に興味もあり、インスタンスの区別も行う
    - 個体領域分割
        - 出力: 各ピクセルに対し単一のクラスラベル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/75541efe-72b8-69c9-67b3-0973e123b7a4.png)

## 代表的なデータセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/323513a1-e657-8b17-cd26-38a93d70c165.png)

- 目的に応じたBox/画像の選択が必要
- クラス数が大きければ大きいほどよいわけではない


## IoU (Intersection over Union)
物体検出においてはクラスラベルだけではなく、物体位置の予測精度も評価したい
$ IoU = \frac{ Area Of Overrap}{Area Of Union} = \frac{ TP}{TP + FP + FN}$


## Average Precision
confの閾値を$\beta$とすると、
Recall = R($\beta$)
Precision = P($\beta$)
PRcurve = P=f(R)

$AP = \int_0^1 P(R)dR$

## mAP(mean Average Precision)
Average Precisionの平均
⇒ クラス数がCの時
$ mAP = \frac{1}{C} \sum_{i=1}^C AP_i$

## FPS(Flames Per Second)
物体検知では、応用上の要請から、検出速度に加え、検出速度も問題となる
FPS=単一時間に処理できるフレーム数


## 物体検知のフレームワーク
### 1段階検出器(One-stage detector)
- 候補領域の検出と暮らす推定を同時に行う
- 相対的に精度が低い
- 相対的に計算量が小さく推論も早い

### 2段階検出器(Two-stage detector)
- 候補領域の検出と暮らす推定を別々に行う
- 相対的に精度が高い
- 相対的に計算量が大きく推論も遅い

## SSD(Single Shot Detector)
- 1段階検出器モデル
- VGG16がベース

### Default Box

- 検出したい物体に応じて変形させるような使い方

### 特徴マップからの出力
マップの中の1つの特徴量における1つのDefault Boxについて
出力サイズは Class数 + 4※ となる
※4=($\Delta x.\Delta y,\Delta w, \Delta h$)

マップ中の各特徴量にk個のDefault Boxを用意するとき、
出力サイズは k ( Class数 + 4)　となり、

更に、特徴マップのサイズが$m \times n$であるとすれば
出力サイズは k (Class数 +4) mn　となる

### 多数のDefault Boxを用意したことで生ずる問題への対処
#### Non-Maximum Suppression
複数のBounding Boxが予測されてしまう問題
⇒　IoUで複数の予測があった場合、最も高いconfのものを残す　

#### Hard Negative Mining
多くの初期Default BoxがNegativeの値になってしまい、訓練の均衡がとれなくなってしまう問題
⇒　最大でも1:3となるようにする

### 損失関数

$ L(x,c,l,g) = \frac{1}{N} (L_{conf}(x,c) + \alpha L_{loc}(x,l,g)$



## 8. セマンティックセグメンテーション

### Up-sampling
畳み込みとプーリングを繰り返すことにより解像度はどんどん落ちていく
どのように元の画像と同様の解像度に戻すか ⇒ Up-samplingが必要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/41b2d778-46fa-ae37-193c-1f07e85c5040.png)

#### Deconvolution/Transposed convolution
通常のConv,層と同様、kernel size,padding,strideを指定
1. 特徴マップのpixel間隔をstrideだけ空ける
2. 特徴マップのまわりに(kernel size -1) - paddingだけ余白を作る
3. 畳み込み演算を行う

[例]
kernel size = 3
padding = 1
stride = 1
3×3の特徴マップが5×5にUp-samplingされる様子

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/31931f4e-e0a9-5dbc-54b4-dc4273322a92.png)

### U-Net
inputからmax-poolingを用いる事で特徴量の大きさを下げ、up-convolutionをかける
(Encoder-Decoderモデル)
FCNと同様にpooling前の情報を使う。
チャネル方向へ結合している点が、FCNとの違いである

### Unpooling
poolingの際の位置情報を記憶しておくことで、(どこが最大の値だったかを記憶)
戻す際にその情報を用いて処理を行う方法

### Dilated Convolution
convolutionの段階で受容野を広げる工夫
例では、3×3のカーネルを用いるが隙間を開ける事で5×5と同等の範囲をカバーしながら、計算量は3×3と同等で済むことを示している

(3×3の畳み込みをする場合は7層のConv.層が必要)

[例]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960917/f559d46b-ee64-9424-5d54-695d46879239.png)