【E資格】　深層学習day4

#初めに
本記事はJDLAのE資格の認定プログラム「ラビット・チャレンジ」における深層学習day4のレポート記事です。この記事では以下の内容について、そのモデルの概念から確認し、数式・実装を含めてまとめていきます。

+ 強化学習
+ AlphaGo
+ 軽量化・高速化技術
+ 応用モデル
+ Transformer
+ 物体検知・セグメンテーション
+ DCGAN


#強化学習

+ 強化学習（Reinforcement learning）とは
長期的に報酬を最大化できるように環境の中で行動を選択できるエージェントを作ることを目標とする機械学習の一分野です。行動の結果kとして与えられる利益を元に、行動を決定する原理を改善していく仕組みです。教師あり学習や教師なし学習と違い、学習データなしに自身の試行錯誤のみで学習するのが特徴です。

+ エージェントと環境
強化学習では、行動する主体を「エージェント」、エージェントがいる世界を「環境」と呼びます。

+ 行動と状態
エージェントが環境に行う働きかけを「行動」と呼びます。エージェントは様々な行動をとることができますが、どの行動を採るかによって、その後の状況も変わります。

+ 報酬
強化学習では、行動の良さを示す指標として「報酬」を使います。

+ 即時報酬と遅延報酬
エージェントは基本的に報酬がたくさんもらえる行動を選べばよいのですが、行動直後に発生する報酬にこだわると、後で発生するかもしれない大きな報酬を見逃してしまします。行動直後に発生する報酬を「即時報酬」、後で遅れて発生する手法を「遅延報酬」と呼びます。

+ 収益と価値
**収益**
即時報酬だけでなく、後に発生する全ての遅延報酬を含めた報酬の合計を最大化することです。報酬が環境から与えられるものなのに対して、収益は最大化したい目標としてエージェント自身が設定するものです。
**価値**
エージェントの状態と方策を固定した場合の条件付き収益を計算します。

この価値が大きくなる条件を探し出せれば、学習ができていることになります。つまり、「価値の最大化」が「収益の最大化」につながり、さらには「多くの報酬をもらえる方策」という強化学習の目的につながります。

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

+ 探索と利用のトレードオフ
環境について事前に完璧な知識があれば、最適な行動を予測して決定することは可能です。
どのような顧客にキャンペーンメールを送信するとどのような行動を行うのかが既知である状況
↓
強化学習の場合、上記の過程成り立たないとする。不完全な知識を元に行動しながら、データを収集して最適な行動を見つけていきます。


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

+ 強化学習のイメージ

![スクリーンショット 2022-01-09 20.12.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/8e435577-5a45-e1a8-4d1a-3cef83ec6984.png)

+ 強化学習の歴史
Q学習（行動価値観数を行動する毎に更新することにより学習を進める方法）
関数近似法（価値観数や方策関数を関数近似する手法のこと）

## 価値関数

+ 状態価値観数
ある状態に注目する場合

+ 行動価値観数
状態と価値を組み合わせた価値に注目する場合

##マルコフ決定過程
強化学習の学習サイクルについて、マルコフ決定過程と呼ばれる手法を例に説明します。
マルコフ決定過程は、「次の状態」が「現在の状態」と採った「行動」によって確定するシステムです。

+ エージェントは、最初は何をすべきか判断できないため、採れる行動の中からランダムに決定する。
+ エージェントは報酬をもらえた時に、どのような状態で、どのような行動をしたら、どの程度の報酬がもらえたかという経験を記録する。
+ 経験に応じて方策を求める。
+ ランダムな動きはしつつ、方策を手掛かりに行動を決定する。
+ 2～4を繰り返して、将来的（ゲーム終了時まで）んじ多くの報酬を得られる方策を求める。

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

## 方策勾配法
方策を求める手法は、「**方策反復法**」と「**価値反復法**」の2つに大別されます。

**方策反復法**
方策に従って行動し、成功時の行動は重要と考え、その行動を多く取り入れるように方策を更新する手法です。この手法を利用したアルゴリズムの一つが方策勾配法になります。方策勾配法は以下の式で表されます。

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

方策関数の重みを更新する式

```math
\nabla_{\theta} J(\theta)=\mathbb{E}_{\pi_{\theta}}\left[\left(\nabla_{\theta} \log \pi_{\theta}(a \mid s) Q^{\pi}(s, a)\right)\right]
```

**価値反復法**
次の状態価値と今の状態価値の差分を計算し、その差分だけ今の状態価値を増やすような手法です。この手法を利用したアルゴリズムがSarsaとQ学習になります。

#AlphaGo

##AlphaGo Lee
方策と価値は関数として表すことができるので、それぞれ、方策関数、価値関数としてニューラルネットワークで学習させることができます。PolicyNetでは、盤面からの情報を19×19×48として入力します。活性化関数はSoftMaxを使用しています。

**ネットワークの構造図**

![スクリーンショット 2022-01-09 20.26.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/f0eafac2-0fca-0498-0661-c1e71d0e941d.png)

出力は現局面の勝率を-1～1で表したいため、全結合層を用いて単一の値を出力するようにして、活性化関数としてtanhを用いています。

![スクリーンショット 2022-01-09 20.27.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/0ca43977-2a37-91ac-29b0-81a82fdadf64.png)

PolicyNetとValueNetの入力について

![スクリーンショット 2022-01-09 20.31.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/7739fbb2-f747-2e99-3975-01cd8e491a14.png)

##Alpha Goの学習
1, 教師あり学習によるRollOutPolicyとPolicyNetの学習
2, 強化学習によるPolicyNetの学習
3, 強化学習によるValueNetの学習

![スクリーンショット 2022-01-09 20.35.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/346e8c69-3f60-9747-0a7a-6121309d875c.png)

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

**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を教師データ対として、回帰問題としてminibatch size 32で5000万回の学習を行います。
N手までとN+1手からのPolicyNetを別々にしてある理由は、過学習を防ぐためであると論文では説明されています。

##RollOutPolicy
ニューラルネットワーク（NN）ではなく、線形の方策関数です。NNを用いたPolicyNetでは学習に時間が掛かかりますが、RollOutPolicyは探索中に高速に着手確率を出すために使用されます（PolicyNetと比較して計算速度は速いものの精度は落ちます）。

![スクリーンショット 2022-01-09 20.40.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/037293f3-dd7e-d875-3946-d7df4697de82.png)

##モンテカルロ木探索
**コンピュータ囲碁ソフトで現在最も有効とされている探索法**です。

モンテカルロ木探索は、盤面の価値や勝率予想値が必要となるminmax探索やαβ探索には課題がありました。そこで盤面評価値に頼らず末端評価値、つまり勝敗のみを使って探索を行うことができないかという発想で生まれた探索法です。
**探索の流れ**

+ 現局面から末端局面までPlayOutと呼ばれるランダムシミュレーションを多数回行い、その勝敗を集計して着手の優劣を決定する。
+ 該当手のシミュレーション回数が一定数を超えたら、その手を着手したあとの局面をシミュレーション開始局面とするよう、探索木を成長させる。

この探索木の成長を行うというのがモンテカルロ木探索の優れているところです。モンテカルロ木探索はこの木の成長を行うことによって、一定条件下において探索結果は、最善手を返すということが理論的に証明されています。

![スクリーンショット 2022-01-09 20.45.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/79414e47-579b-b040-770f-7470987af0d4.png)

##AlphaGo Zero

###AlphaGo(Lee)とAlphaGo Zeroの違い

+ 教師あり学習を行わず、強化学習のみで作成
+ 特徴入力からヒューリスティックな要素を排除し、石の配置のみにした
+ PolicyNetとValueNetを1つのネットワークに統合した
+ Residual Netを導入
+ モンテカルロ木探索からRollOutシミュレーションを無くした


###AlphaGo ZeroのNetwork
Residual Block以降、PolicyNetとValueNetが分かれる構造になっています。

![スクリーンショット 2022-01-09 20.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/d9bd68db-38df-d64a-fa52-ce603e2ac109.png)

###Residual Blockの基本形
Residual Blockには、ネットワークにショートカット構造を追加して、勾配の爆発と消失を抑える意図があります。結果として、下記の構造を用いることで、100層を超えるネットワークでの安定した学習が可能になりました。

![スクリーンショット 2022-01-09 20.50.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/ec47e77f-f08a-d734-1d6d-ecfa25ea8cc4.png)

###Residual Networkの派生系
モデルの工夫について、試験でも対応しているモデルと名前を確認します。命名されていますが、あくまで基本的な概念（畳み込みやプーリング）を抑えれば、内容の理解がしやすいですし、覚えやすいです。

![スクリーンショット 2022-01-09 21.00.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/f94f8794-aa94-42c1-bf24-01108bea0e41.png)


###Alpha Go Zeroの学習法
Alpha Goの学習は「**自己対局による教師データの作成**」「**学習**」「**ネットワークの更新**」の3つのステップで構成されています。

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

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

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

#軽量化・高速化技術
軽量化技術：非常に性能が悪いコンピュータの上でも動かせるようにする技術

##分散深層学習（現在最も重要な技術）

深層学習は多くのデータを使用したり、パラメータ調整のために多くの時間を使用したりするため、高速な計算が求められます。複数の計算資源（ワーカー）を使用し、並列的にニューラルネットを構成することで、効率の良い学習を行いたい。そのために、データ並列化、モデル並列化、GPUによる高速技術は不可欠です。毎年10倍の勢いでデータの量やモデルの大きさが増えているのが大きな問題で、ムーアの法則からもわかるように、コンピュータの性能の向上よりもはるかに早く伸びている。そこで分散処理することで、現在のPCの性能でも処理できるようになっている。

###データ並列
親モデルを各ワーカーに子モデルとしてコピーし、データを分割させ各ワーカーごとに計算させます。
（一台のパソコンだけ使用する場合→ワーカー1）

![スクリーンショット 2022-01-09 22.09.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/e6c33592-445c-5c7b-a5f4-ccd2fbfe1e56.png)

**同期型**
同期型のパラメータ更新の流れ

![スクリーンショット 2022-01-09 22.12.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/7971c188-1ed8-2339-5a13-3729c9a3ecd4.png)

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

**非同期型**
非同期型のパラメータ更新の流れ

![スクリーンショット 2022-01-09 22.15.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/8b338b80-ec86-b617-930e-8b6059fa5a70.png)

各ワーカーはお互いの計算を待たずに各モデルごとに更新を行います。学習が終わったモデルはパラメータサーバーにpushされます。新たに学習を始める時は、パラメーターサーバーからPopしたモデルに対して学習していきます。

###同期型と非同期型の比較

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

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

![スクリーンショット 2022-01-09 22.19.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/d8e5eafb-3470-f0d0-6653-0632647f855c.png)

**モデル並列化の効果**
大きなモデルほど効果が大きいです。つまり、モデルのパラメータ数が多いほど、スピードアップの効率も向上します。

![スクリーンショット 2022-01-09 22.20.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/d9c6ece8-2926-eaf8-2eb5-59d4fe2d4650.png)


##GPU(Graphics Processing Unit)
GPUとは3Dグラフィックスを描画する際に必要な計算処理を行う半導体チップのことです。
GPUは主に画面の描画の処理など単純な処理に適しています。

**GPUによる高速化**

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

+ CPU（Central Processing Unit）
高性能なコアが少数
複雑で連続的な処理が得意
CPUはパソコンにおける頭脳部分に当たり汎用的な複雑な処理を行う

+ GPU
比較的低性能なコアが多数
**簡単な並列処理が得意**
ニューラルネットの学習は単純な行列演算が多いので、高速化が可能になる
CPUに比べて多くのコアを搭載しているため、同時に対応できる処理が多い

##軽量化の手法

###量子化(Quantize：一番良く用いられる手法)
ネットワークが大きくなると大量のパラメータが必要となり、学習や推論に多くのメモリと演算処理が必要になります。量子化とは重みなどのパラーメータをより小さいビットで表現することで、モデルの軽量化を図る手法です。使用するビットを制限することでネットワークの構造を変えずにメモリ使用量を削減できます。つまり、通常のパラメータの64bit浮動小数点を、32bitなど下位の精度に落とすことでメモリと演算処理の削減を行います。この時、計算の高速化、省メモリ化の一方で、精度は低下します。

###蒸留(Distillation)
規模の大きなモデルの知識を用いて、軽量なモデルの作成を行う手法です。つまり、大きいモデルやアンサンブルモデルを教師モデルとして、その知識を小さいモデル（生徒モデル）の学習に利用することで、大きいモデルに匹敵する精度を持つ小さいモデルを作ることが期待できます。

![スクリーンショット 2022-01-09 22.36.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/524a5c30-6986-614a-d2ea-d664ea9899e7.png)

一度学習した精度の高いモデルの知識（予測結果）を別の軽量なモデルに継承するということです。蒸留によって少ない学習回数により精度の良いモデルを作成できます。

![スクリーンショット 2022-01-09 22.38.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/25da8b2e-604b-7ffc-a925-89d4f352e48d.png)

###枝刈り（Pruning）
Deep Learningのノード間の重みが小さい箇所の接続を削除する、または影響の小さいノードを削除することでパラメータ数を削減する手法をPruning（プルーニング：枝刈り）と呼びます。ノードや重みを削除することでパラメータ数を減少させます。記憶する必要があるパラメータが減少することによって、計算する回数が削減され、メモリ使用量が少なくなります。その結果、モデルの軽量化と処理の高速化が期待できます。

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

![スクリーンショット 2022-01-09 22.42.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/278cd95e-45d5-a087-04ed-cb87a23fb145.png)

**ニューロンの削減**
ニューロンの削減の手法は重みが閾値以下の場合、ニューロンを削減し、再学習を行います。

![スクリーンショット 2022-01-09 22.43.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/a840df3f-2df7-5a17-8688-8607d22654a1.png)

下記の図でもわかるように、このPruningでは想像以上に削減できるにもかかわらず、性能はあまり変わりません。

![スクリーンショット 2022-01-09 22.45.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/8e5db79d-5b02-5eb8-3f2b-35d49f792cd7.png)

#応用モデル

##MobileNet
DeepLearningモデルの軽量化・高速化・高精度化を実現するために、MobileNetでは畳み込みの演算を工夫しています。現在は第三世代まである。

**MobileNetのアーキテクチャ**
以下のような6ピクセル×6ピクセルの36ピクセルのカラー画像（3チャンネル分）に対して畳み込みを行う場合、3つの情報を元に、4つを出力としてカーネルが働きます。

この1点を計算するための計算量は$K \times K \times C \times M$

![スクリーンショット 2022-01-10 14.33.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/104d2c3f-d116-52eb-329c-f45128e3d4e6.png)

出力のデータを全部作りたい場合は$H \times W \times K \times K \times C \times M$

![スクリーンショット 2022-01-10 14.33.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/601f675c-cec7-63d6-354d-e056d724e3c0.png)

+ **Depthwise Convolution**と**Pointwise Convolution**の組み合わせで軽量化を実現しています。

**Depthwise Convolution**
仕組みとしては、入力マップのチャンネルごとに畳み込みを実施します。出力マップをそれらと結合することで、入力マップのチャネル数と同じになります。これにより、計算量が大幅に削減できます。

**一般的な畳み込み**：$H \times W \times K \times K \times C \times M$

**Depthwise Convolution**：$H \times W \times C \times K \times K$

**Pointwise Convolution**
1×1convとも呼ばれています。入力マップのポイントごとに畳み込みを実施します。出力マップでは、フィルタ数分だけ作成可能です。

**一般的な畳み込み**
**Pointwise Convolution**：$H \times W \times C \times M$

##確認問題

MobileNetのアーキテクチャについて

+ Depthwith Separable Convolutionという手法を用いて計算量を削減している。通常の畳み込みが空間方向とチャネル方向の」計算を同時に行うのに対して、Depthwith Separable ConvolutionではそれらをDepthwith ConvolutionとPointwise Convolutionと呼ばれる演算によって個別に行う。

+ Depthtwise Convolutionはチャネル毎に空間方向へ畳み込む。すなわち、チャネル毎に$D_{K} \times D_{K} \times 1$のサイズのフィルターをそれぞれ用いて計算を行うため、その計算量は**$K \times K \times C \times M$**までで1ピクセル分なので、Depthtwise Convolutionでは$H \times W \times C \times K \times K$となる。

+ 次にDepthwith Convolutionの出力をPointwise Convolutionによってチャネル方向に畳み込む。すなわち、出力チャネル毎に$1 \times 1 \times M$サイズのフィルターをそれぞれ用いて計算を行うため、その計算量は$H \times W \times C \times M$となる。

> 原論文[MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications](https://arxiv.org/pdf/1704.04861.pdf)

##DenseNet
Dense Convolutional Networkは畳み込みニューラルネットワークアーキテクチャの一種です。ニューラルネットワークではそうが深くなるにつれて、学習が難しくなるという問題がありましたが、Residual NetworkなどのCNNアーキテクチャでは前方の層から後方の層へアイデンティティ接続を介してパスを作ることで対処した、DenseBlockと呼ばれるモジュールを用いました。DenseNetでも同様のアーキテクチャを採用しています。

DenseNetのアーキテクチャについて
メイン側はショートカット側で得られたフィルターを重ねていきます。論文では「メイン側は”The global state”と呼ばれ、そのグローバルな状態に対してDenseBlockが貢献していく」とあるため、ResNetと同様に考えるなら、ショートカット側で畳み込みをしていると考えるのが自然です。

![スクリーンショット 2022-01-10 15.01.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/f2eda4dd-766a-ac0e-5849-e671028c1ebd.png)

+ 初期の畳み込み
+ DenseBlock
+ 変換レイヤー
+ 判別レイヤー

以下のように「DenseBlock(s)→Transition→DenseBlock(s)→…」と交互に重ねていくのがDenseNetの全体の構造です。DenseBlockの層で×6、×12とありますがこれは1x1→3x3畳み込みからなるDenseBlockを6個、12個重ねことです。

![スクリーンショット 2022-01-10 15.04.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/27acd9d3-2f16-cbb7-b998-85a10f056ead.png)

DenseNetとResNetの違い（スキップコネクションのアーキテクチャ）

+ DenseBlockでは前方の各層からの出力全てが後方の層へ入力として用いられています。
+ RessidualBlockでは前1層の入力のみ後方の層へと入力します。
+ DenseBlockではとgrowth rate（成長率:k）呼ばれるハイパーパラメータが存在します。

> 原論文[Densely Connected Convolutional Networks](https://openaccess.thecvf.com/content_cvpr_2017/papers/Huang_Densely_Connected_Convolutional_CVPR_2017_paper.pdf)

> Github[DenseNet](https://github.com/liuzhuang13/DenseNet)

##Batch Normalization
Batch Normalizationは2015年に“Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift”というで最初に提案された仕組みになります。Batch Normalizationは、Deep Learningにおける各重みパラメータを上手くreparametrizationすることで、ネットワークを最適化するための方法の一つです。

+ $H \times W \times C$のサンプルがN個あった場合に、N個の同一チャネルが正規化の単位
RGBの３チャネルの場合には各チャネルの平均と分散を求め、正規化を実施します。

+ ミニバッチのサイズを大きく取れない場合には、効果が薄くなってしまう。

![スクリーンショット 2022-01-10 15.20.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/0cb14c3d-07f9-be46-5bd9-e1fa124775db.png)

> [原論文：Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift](https://arxiv.org/pdf/1502.03167.pdf)

###BatchNorm以外の正規化：Layer正規化/Instance正規化
Batch Normalizationはシンプルで非常に効果的な方法ですが、以下の問題点が指摘されています。

+ データセット全体の平均・分散ではなく、ミニバッチごとに平均・分散を計算するため、ミニ・バッチが小さい場合、平均・分散が不安定になる
+ 再帰的ニューラルネットワークに適用するのが難しい

+ **Layer Normalization**（それぞれのサンプルの全てのピクセルが同一分布に従うように正規化）
そこで、Layer Normalizationでは、1つのサンプルにおける各レイヤーの隠れ層の値の平均・分散で正規化します。

```math
\begin{aligned}
\mu^{l} &=\frac{1}{H} \sum_{i=1}^{H} a_{i}^{l} \\
\sigma^{l} &=\sqrt{\frac{1}{H} \sum_{i=1}^{H}\left(a_{i}^{l}-\mu^{l}\right)^{2}}
\end{aligned}
```

Layer正規化はN個の統計量を求めて、サンプル毎に正規化をします。層正規化はサンプル毎の統計量が大きく変わるような場合に有効であり、RNNやTransformerなどで利用されています。現在Transformerが注目されていることもあり、層正規化も広く使われる様になってきています。

![スクリーンショット 2022-01-10 15.25.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/2705ed2a-1c0d-a633-7266-63aaa8a851d9.png)

> [Layer Normalization](https://arxiv.org/pdf/1607.06450.pdf)

+ **Instance Normalization**（さらにチャネルも同一分布に従うように正規化）
インスタンスの正規化は、グループのサイズがチャネルサイズ（または軸のサイズ）と同じサイズであるグループ正規化の特殊な場合です。各サブプロットは、入力テンソルを示しています。Nはバッチ軸、Cはチャネル軸、（H、W）は空間軸（画像の高さと幅など）です。青のピクセルは、これらのピクセルの値を集計することによって計算された、同じ平均と分散によって正規化されます。

![スクリーンショット 2022-01-10 15.25.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/d1a64d34-4f61-6e5d-c18c-5fc4da600c09.png)

> [原論文：Instance Normalization:
The Missing Ingredient for Fast Stylization](https://arxiv.org/pdf/1607.08022v3.pdf)

##Wavenet
PixelCNNをベースにした音声波形を生成するためのディープニューラルネットワークの一つです。音声波形のデータセットを$\boldsymbol{x}=\left\{x_{1}, x_{2}, \cdots, x_{T}\right\}$として, 以下のように条件付き確率で生成されると仮定します。つまり、音声サンプル$x_{t}$は前時点の全てにおけるサンプルに条件づけられます。

$$
p(\mathbf{x})=\prod_{t=1}^{T} p\left(x_{t} \mid x_{1}, \cdots, x_{t-1}\right)
$$

WaveNetのメイン部分としては、時系列データセットに対してConvolutionを組み込んでいます。

既存の畳み込み
![スクリーンショット 2022-01-10 15.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/87980dc8-3292-80dd-eaf5-2a61b0490843.png)


畳み込み（Dilated）
![スクリーンショット 2022-01-10 15.40.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/c7094aca-f6f7-461b-9499-693fc320186d.png)


##確認テスト

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

-> 1) **Dilated causal convolution**

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

-> 1) **パラメータ数に対する受容野が広い**

> [WAVENET: A GENERATIVE MODEL FOR RAW AUDIO](https://arxiv.org/pdf/1609.03499.pdf)

#Transformer
TransformerはRNNやCNNを使用せず、Attentionのみを用いるSeq2Seqモデル（翻訳タスクにおいて、Seq2seq(RNNベースEncoder-Decoderモデル)よりも早くて精度が高いという優れもの）です。並列計算が可能なためRNNに比べて計算が高速な上、Self-Attentionと呼ばれる機構を用いることにより、局所的な位置しか参照できないCNNと異なり、系列内の任意の位置の情報を参照することを可能にしています。その他にもいくつかの工夫が加えられており、翻訳に限らない自然言語処理のあらゆるタスクで圧倒的な性能を示すことが知られています。

##Transformerの特徴

+ 再帰も畳み込みも一切使わない
+ 翻訳でSoTAを超えるBLEUスコア(28.4)を叩き出した
+ 並列化がかなりしやすく訓練時間が圧倒的に削減できる
+ Transformerは他のタスクにも汎用性が高い

経緯として、RNNとエンコーダ-デコーダモデルがこれまでのNLP界を牽引してきましたが、逐次的に単語を処理するがゆえに訓練時に並列処理できないという大きな欠点がありました。長文に対してはAttentionが使われていましたが、そのAttentionは概ねRNNと一緒に使われていました。そこで本論文（Attention Is All You Need（2017））では、RNNを一切使わずにAttentionだけを使うことで、入力と出力の文章同士の広範囲な依存関係を捉えられるモデルTransformerを提案しています。

##モデル構造
Transformerの基本的構造はエンコーダ-デコーダモデルでself-attention層とPosition-wise全結合層を使用していることが大枠の特徴となります。

### エンコーダー-デコーダモデル

**Transformerの全体像(左半分がエンコーダ、右半分がデコーダ)**

![スクリーンショット 2022-01-09 17.36.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/d5121e1c-6771-4f48-7e32-e94999ea7250.png)

> Vaswani, A. et al.(2017) Attention Is All You Need

### Attention機構
Attentionとは、文中のある単語の意味を理解する時に、文中の単語のどれに注目すれば良いかを表すスコアのことです。

**Self-Attentionを使用する理由**

+ 計算量が小さい
+ 並列計算可能
+ 広範囲の依存関係を学習可能
+ 高い解釈可能性

### 工夫

+ 最適化関数（Adam）
+ 正則化（ドロップアウト、ラベルスムージング）

#### **所感**
近年のNLP界隈で発表される最新モデル(BERT, BPT-3など)はどれもTransformerをbase modelとしており、そのTransformerの提案論文である「Attention Is All You Need（2017）」はNLPの動向を理解するには必読の論文であると思いました。

##参考文献

[原論文：Attention Is All You Need（2017）](https://arxiv.org/pdf/1706.03762.pdf)
[The Illustrated Transformer](http://jalammar.github.io/illustrated-transformer/)
[BLEUスコア](https://cloud.google.com/translate/automl/docs/evaluate?hl=ja)
[参考実装](https://github.com/jadore801120/attention-is-all-you-need-pytorch)

##実装コード

[Transformerモデル実装](https://github.com/seiji0203/Machine-Learning-Models/blob/master/Transformer_model.ipynb)

#物体検知・セグメンテーション


##物体認識タスク

+ **分類（Classification）**
入力画像がどのラベルに属するものなのかを分類します。分類では、対象画像のどの位置に物体があるのかについては興味がなく、ラベルに分類することがタスクになります。

+ **物体検知（Object Detection）**
物体検出では、画像分類と同じく対象画像内に写っている物体が属するラベルに加え、その物体が写っている位置も明らかにする必要があります。この位置については、バウンディングボックスと呼ばれる矩形で囲うことで表現します。

+ **意味領域分割（Semantic Segmentation）**
意味領域分割では、各ピクセルに対してラベルが割り当てられています。バウンディングボックスに対象物が収まらなければならない物体検知とは対照的に、不規則な形状の対象物を明瞭に検出することができます。

+ **個体領域分割（Instance Segmentation）**
各ピクセルにラベルが与えられ、さらにインスタンスの区別も付けられるようになります。意味領域分割では全て同じとみなしてたものも、個体領域分割では、物体個々の区別に興味があるため区別できます。

##代表データセット

+ **VOC12（VOC=Visual Object Classes）**
クラス数：20
Train+Valデータ数：11,540
Box/画像(物体数/1枚の画像)：2.4
Instance Annotation(物体個々にラベリング)が付与

+ **ILSVRC17（ImageNetのサブセット）**
クラス数：200
Train+Valデータ数：476,668
Box/画像(物体数/1枚の画像)：1.1

+ **MS COCO18（MS=Microsoft, COCO=Common Object in Context）**
クラス数：80
Train+Valデータ数：123,287
Box/画像(物体数/1枚の画像)：7.3
Instance Annotation(物体個々にラベリング)が付与

+ **OICOD18（Open Images V4のサブセット）**
クラス数：500
Train+Valデータ数：1,743,042
Box/画像(物体数/1枚の画像)：7.0
Instance Annotation(物体個々にラベリング)が付与

##評価指標
**適合率（Precision）**はPositive と予測したデータ(TP + FP)の中で実際にPositiveだったデータ(TP)数の割合。この値が高いほど性能が良く、間違った分類が少ないということを意味します。

**再現率（Recall）**は実際にPositiveであるデータ(TP + FN)の中で、正しくPositiveと予測された(TP)数の割合でした。この値が高いほど性能がよく、間違ったPositiveの判断が少ないという事を意味します。

**PR曲線（Precison Recall curve）**はPrecisonを縦軸、Recallを横軸に取ります。Positiveに予測されるかNegativeに予測されるかは、予測値と閾値の値によって決まります。予測値0.7という値が得られたとき、閾値が0.5だとしたら予測結果はPositiveになります。一方で閾値が0.8だった場合、予測結果はNegativeになります。この閾値を0～1と変化させたときのPrecisonとRecallの関係がPR曲線となります。

![スクリーンショット 2022-01-09 13.54.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/2c45ee4d-21ba-6d8d-cb3b-6419dd0fc735.png)

> 引用：ラビットチャレンジ講義資料

##IoU（Intersection over Union）
IoUはGround truth Bounding Boxとpredicted Bounding boxのOverlap/Unionです。物体検出においてはクラスラベルだけでなく、物体位置の予測精度も評価したいというモチベーションがあります。

$$
I o U=\frac{\text { Area of Overlap }}{\text { Area of Union }}
$$

![スクリーンショット 2022-01-09 14.02.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/44aeb967-8518-47f3-2d63-109f9a2bea6c.png)

混同行列を用いて表現

$$
I o U=\frac{T P}{T P+F P+F N}
$$

##Precision/Recall
物体検出ではconfidenceの他にIoUについても閾値を用意する必要があります。そこで物体検知において、入力画像1枚を見たときのPrecision/Recall指標について具体例を見ていきます。以下の図ではconfidenceの閾値を0.5としているので、まず「conf.> 0.5」となるクラスラベルの予測が表にピックアップされています。そしてIoUの閾値0.5より大きいものについては、物体位置の予測精度も良いとしてTPとなります（注意：既に検出済みの対象では「IoU > 0.5」でもFPになる）。同じ物体に対して複数のPredicted BBが出てきてしまったときは、最もconfidenceが高く、かつIoUの閾値を超えているものだけをTPとします。TPとFPの数が分かるので、PrecisionとRecallの計算が可能となります。

![スクリーンショット 2022-01-09 14.15.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/7bc877c3-b4ab-36f7-2e69-a79f85326dc9.png)

> 引用：ラビットチャレンジ講義資料

```math
\begin{gathered}
\text { Precision }=\frac{T P}{T P+F P}=\frac{3}{3+3}=0.5 \\
\text { Recall }=\frac{T P}{T P+F N}=\frac{3}{3+0}=1.0
\end{gathered}
```

次にクラス単位で画像が複数ある場合のPrecision/Recall指標についてみていきます。ここでは、まず「人」のクラスラベルだけに着目していきます。confidenceの閾値を0.5、IoUの閾値を0.5に設定しています。

**1, 表のP1**Ground-Truth1について「confidence 0.92」で人を検出・「IoU 0.88」の精度で位置を検出
**2, 表のP4**Ground-Truth3について「confidence 0.70」で人を検出・「IoU 0.83」の精度で位置を検出

1と2について、入力画像1枚の時と同じくTPであるかFPであるかの判断をしていき、PrecisionとRecallを求めます。Recallの計算では分母に+1があり、Recallの分母は、すべてのGround-Truth数を表します。今回、P1～P6までpicture4の「人」は一度も検出されませんでした。つまり、本当は検出する対象であるにもかかわらず検出できなかったもの（FN）が1つ存在するという事です。<- **+1に該当**

![スクリーンショット 2022-01-09 14.17.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/ceee7f78-9a78-7825-e3ab-621b720f7bc9.png)

```math
\begin{aligned}
&\text { Precision }=\frac{T P}{T P+F P}=\frac{3}{3+3}=0.5 \\
&\text { Recall }=\frac{T P}{T P+F N}=\frac{3}{3+1}=0.75
\end{aligned}
```

##Average Precision (AP)
複数画像の場合、Precision/Recallではconfidenceの閾値を0.5で計算をしていました。このconfidenceの閾値ごとにPrecision/Recallを算出してPR曲線を作成し、PR曲線の下側面積が物体検知で用いられる指標がAverage Precisionになります。

![スクリーンショット 2022-01-09 14.19.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/9bf17d5e-77cb-7efd-5e24-5ea69d93407c.png)

confidenceの閾値をβとすると、βの関数としてprecisionとRecallが記述できます。

```math
\begin{gathered}
\text { Recall }=R(\beta) \\
\text { Precision }=P(\beta)
\end{gathered}
```

これらを一つにまとめ、Recallの関数としてprecisionを記述することができます。
**PR曲線の式**
APはPR曲線の下側面積となるので、次の式で表すことができます。

$$
P=f(R)
$$

$$
A P=\int_{0}^{1} P(R) d R
$$

以上が、物体検知における評価指標であるAPの導出です。

##mean Average Precision (mAP)
各クラスごとにAPを求め、算術平均したものがmAPです。

![スクリーンショット 2022-01-09 14.21.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/aecd5dcb-e1f4-c244-441a-d32dc186a3b1.png)

$$
m A P=\frac{1}{C} \sum_{i=1}^{C} A P_{i}
$$

##mAP COCO
mAP COCOはMS COCOで導入された物体検知の評価指標です。これまで、mAPの導出はIoUの閾値を0.5に固定していました。mAP COCOはIoUの閾値を0.5~0.95まで0.05刻みで変化させたときの各AP、mAPを計算します。IoUの閾値毎のmAPを算術平均したものがmAP COCOです。

$$
m A P_{C O C O}=\frac{m A P_{0.5}+m A P_{0.55}+\ldots+m A P_{0.95}}{10}
$$

この指標はIoUの閾値を0.5より大きいものにしてmAPを求めます。つまり、Ground-Truth BBに被ったようなPredicted BBを評価する指標になります。

##Flames per Second (FPS)
物体検知では、検出精度に加えて検出速度も重要です。横軸はFrame Pre Secondであり、1秒あたりに何フレーム処理できるかという処理速度を測る指標です（大きいほど処理速度が速い）。

![スクリーンショット 2022-01-09 13.00.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/02679a22-8195-7e00-38b2-0e29f2633f88.png)

inference timeが用いられることもあります。つまり、1フレームあたり何秒処理に時間が掛かったかという推論の時間を表します（小さいほど処理速度が速い）。

![スクリーンショット 2022-01-09 13.01.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/7840e437-3ae2-bcc0-8b0c-cb3c60220df7.png)

##物体検知のフレームワーク
物体検知のフレームワークは大きく分けて2種類あります。
(a)一段階
(b)二段階

+ 歴史

![スクリーンショット 2022-01-09 14.27.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/1380edb4-9afd-636e-620a-8e423d90d173.png)

+ 2段階検出器（Two-stage detector）
RCNN、SPPNet、Fast RCNN、Faster RCNN、RFCN、FPN、Mask RCNN
1, 候補領域の検出とクラス推定を別々に行う
2, 相対的に精度が高い傾向
3, 相対的に計算量が大きく推論も遅い傾向

![スクリーンショット 2022-01-09 13.05.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/03e1fe87-a1e4-aaf6-d0cb-83655ce47a12.png)

> [引用：Deep Learning for Generic Object Detection: A Survey](https://arxiv.org/pdf/1809.02165.pdf)

+ 1段検出器（One-stage detector）
DetectorNet、YOLO、SSD、YOLO9000、RetinaNet、CornerNet
1, 候補領域の検出とクラス推定を同時に行う
2, 相対的に精度が低い傾向
3, 相対的に計算量が小さく推論も早い傾向

+ 歴史

![スクリーンショット 2022-01-09 13.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/4b118eb1-eb8f-160e-eafe-026bd4024476.png)

> [引用：Deep Learning for Generic Object Detection: A Survey](https://arxiv.org/pdf/1809.02165.pdf)

#DCGAN
DCGANはGANを改良したモデルなので、まずはGANのモデル構造について考えていきます。

##GAN(Generative Adversarial Nets)
> [GAN：I. J. Goodfellow, J. Pouget-Abadie, M. Mirza, B. Xu, D. W. Farley, S. Ozair, A. C. Courville, and Y. Bengio. Generative adversarial nets. In Neural Information Processing Systems(NIPS), pp. 2672-2680, 2014.](https://papers.nips.cc/paper/2014/file/5ca3e9b122f61f8f06494c97b1afccf3-Paper.pdf)

Generator : 乱数からデータを生成
Discriminator : 入力データが真データ（学習データ）であるかを識別


![スクリーンショット 2022-01-09 10.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/de7f6035-cb1f-756f-4321-b75f7d07c992.png)

> ラビットチャレンジ講義資料より引用

**２プレイヤーのミニマックスゲーム**
一人が自分の勝利する確率を最大化する作戦を取る
もう一人は相手が勝利する確率を最小化する作戦を取る
GANでは価値観数Vに対し、Dが最大化、Gが最小化を行う

```math
\begin{gathered}
\min _{G} \max _{D} V(D, G) \\
V(D, G)=\mathbb{E}_{x \sim p_{\text {data }}(x)}\left[\log _{a} D(x)\right]+\mathbb{E}_{z \sim p_{z}}(z)[\log (1-D(G(z)))]
\end{gathered}
```

この式はバイナリークロスエントロピーそのものなので、単純化して説明できます。
バイナリークロスエントロピー

$$
L=-\sum y \log \hat{y}+(1-y) \log (1-\hat{y})
$$

単一データのバイナリークロスエントロピー

$$
L=-y \log \widehat{y}+(1-y) \log (1-\widehat{y})
$$

真データを扱うとき

$$
y=1, \hat{y}=D(x) \Rightarrow L=-\log [D(x)]
$$

生成データを扱うとき

$$
y=0, \hat{y}=D(G(z)) \Rightarrow L=-\log [1-D(G(z))]
$$

二つの式を足し合わせると、以下の式のように表せます。

```math
\begin{aligned}
&L=-(\log [D(\boldsymbol{x})]+\log [1-D(G(\boldsymbol{z}))]) \\
&V(D, G)=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}(\boldsymbol{x})}[\log D(\boldsymbol{x})]+\mathbb{E}_{\boldsymbol{z} \sim p_{z}(\mathbf{z})}[\log (1-D(G(\mathbf{z})))]
\end{aligned}
```

複雑なデータを扱うために期待値を取ります。

**最適化方法**
Generatorのパラメータ$\theta_{g}$を固定

+ 真データと生成データをm個ずつサンプル
+ $\theta_{d}$を勾配上昇法(Gradient Ascent)で更新

$$
\frac{\partial}{\partial \theta_{d}} \frac{1}{m}[\log [D(\boldsymbol{x})]+\log [1-D(G(\boldsymbol{z}))]]
$$


Discriminatorのパラメータ$\theta_{d}$を固定

+ 生成データをm個ずつサンプル
+ $\theta_{g}$を勾配降下法(Gradient Descent)で更新

$$
\frac{\partial}{\partial \theta_{g}} \frac{1}{m}[\log [1-D(G(\mathbf{z}))]]
$$

生成データが本物のデータとそっくりな状況とは$p_{g}=p_{\text {data }}$であるはずなので、価値観数が$p_{g}=p_{\text {data }}$の時に最適化されていることを示せれば良いので、以下の２つのステップで確認します。

```math
\min _{G} \max _{D} V(D, G)=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}(\boldsymbol{x})}[\log D(\boldsymbol{x})]+\mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}[\log (1-D(G(\mathbf{z})))]
```

###1, Gを固定して価値観数が最大値をとる時のD(x)を算出する
**Generatorを固定**

```math
\begin{aligned}
V(D, G) &=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}(\boldsymbol{x})}[\log D(\boldsymbol{x})]+\mathbb{E}_{\mathbf{z} \sim p_{z}(\mathbf{z})}[\log (1-D(G(\mathbf{z})))] \\
&=\int_{\boldsymbol{x}} p_{\text {data }}(\boldsymbol{x}) \log (D(\boldsymbol{x})) d x+\int_{z} p_{z}(\mathbf{z}) \log (1-D(G(\mathbf{z}))) d z \\
&=\int_{\boldsymbol{x}} p_{\text {data }}(\boldsymbol{x}) \log (D(\boldsymbol{x}))+p_{g}(\boldsymbol{x}) \log (1-D(\boldsymbol{x})) d x
\end{aligned}
```

$\mathrm{y}=D(\boldsymbol{x}), a=p_{\text {data }}(\boldsymbol{x}), b=p_{g}(\boldsymbol{x})$とすれば

$$
a \log (y)+b \log (1-y)
$$

**$a \log (y)+b \log (1-y)$の極値**を求めます。

$a \log (y)+b \log (1-y)$をyで微分

```math
\begin{aligned}
&\frac{a}{y}+\frac{b}{1-y}(-1)=0 \\
&\frac{a}{y}=\frac{b}{1-y} \\
&a-a y=b y \\
&a=(a+b) y \\
&y=\frac{a}{a+b}
\end{aligned}
```

$\mathrm{y}=D(\boldsymbol{x}), a=p_{\text {data }}(\boldsymbol{x}), b=p_{g}(\boldsymbol{x})$なので

```math
D(\boldsymbol{x})=\frac{p_{\text {data }}(\boldsymbol{x})}{p_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}
```
でD(x)が上記の値をとる時、価値観数を最大化することがわかります。

###2, 上記のD(x)を価値関数に代入してGが価値観数を最小化する条件を算出する
価値観数のD(x)を$\frac{p_{\text {data }}(x)}{p_{\text {data }}(x)+p_{g}(x)}$で置き換え

```math
\begin{aligned}
V &=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}} \log \left[\frac{p_{\text {data }}(\boldsymbol{x})}{p_{\text {data }}(\boldsymbol{x})+p_{g}(x)}\right]+\mathbb{E}_{\boldsymbol{x} \sim p_{g}} \log \left[1-\frac{p_{\text {data }}(\boldsymbol{x})}{p_{\text {data }}(\boldsymbol{x})+p_{g}(x)}\right] \\
&=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}} \log \left[\frac{p_{\text {data }}(\boldsymbol{x})}{p_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}\right]+\mathbb{E}_{\boldsymbol{x} \sim p_{g}} \log \left[\frac{p_{g}}{p_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}\right]
\end{aligned}
```

JSダイバージェンスで二つ（P1, P2）の確率分布がどのくらい近いのか調べます。

```math
J S\left(p_{1} \| p_{2}\right)=\frac{1}{2}\left(\mathbb{E}_{x \sim p_{1}} \log \left(\frac{2 p_{1}}{p_{1}+p_{2}}\right)+\mathbb{E}_{x \sim p_{2}} \log \left(\frac{2 p_{2}}{p_{1}+p_{2}}\right)\right)
```

JSダイバージェンスは、マイナスにならず、分布が一致する時の0を取ります。
-> 最小値が0
この距離測れるJSダイバージェンスを価値観数の中から取り出します。

**価値観数を変形**

```math
\begin{aligned}
V &=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}} \log \left[\frac{p_{\text {data }}(\boldsymbol{x})}{p_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}\right]+\mathbb{E}_{\boldsymbol{x} \sim p_{g}} \log \left[\frac{p_{g}}{p_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}\right] \\
&=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}} \log \left[\frac{2 p_{\text {data }}(\boldsymbol{x})}{p_{\text {data }}(\boldsymbol{x})+p_{g}(x)}\right]+\mathbb{E}_{\boldsymbol{x} \sim p_{g}} \log \left[\frac{2 p_{g}}{p_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}\right]-2 \log 2 \\
&=2 J S\left(p_{\text {data }} \| p_{g}\right)-2 \log 2
\end{aligned}
```

$\min _{G} V$は$p_{\text {data }}=p_{g}$の時に最小値となります。
以上の学習過程からGANは本物のようなデータを生成できます。

###学習ステップの可視化

![スクリーンショット 2022-01-09 12.21.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/6ccbb39f-689a-3d0c-6d55-ae54491c5258.png)

> ラビットチャレンジの講義資料引用

###GANによる応用技術

> [Fast Bi-layer Neural Synthesis of One-Shot Realistic Head Avatars](https://arxiv.org/pdf/2008.10174.pdf)

**1枚の顔画像から動画像を高速に生成するモデル**

+ 初期化部：人物の特徴を抽出（1アバターにつき一回の計算コスト）
+ 推論部：所望の動きをつける（時間フレーム分だけの計算コスト）

**計算コストに関して**

+ 従来：初期化の計算コストが小さく、推論部の計算コストが大きい
+ 提案：初期化の計算コストが大きく、推論部の計算コストが小さい（つまりリアルタイムで推論できる）

推論部の計算コストの削減方法は綿密な輪郭（初期化時に輪郭情報を生成：ポーズに依存）と粗い顔画像（推論時に洗い動画像を生成：ポーズに依存）を別々に生成し結合します。

3つのネットワーク構造により構成されています。
1, Embedder
2, Texture Generator
3, Inference Generator



##DCGAN（Deep Convolutional GAN）
GANを利用した画像生成モデルです。GANと比較して幾つかの構造的制約を適用することにより生成品質を向上させています。

>[DCGAN：A. Radford, L. Metz, and S. Chintala. Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks. International Conference on Learning Representations(ICLR), 2016.](https://arxiv.org/pdf/1511.06434.pdf)

**Generator**

+ Pooling層の代わりに転移畳み込みを使用（乱数を画像にアップサンプリング）
+ 最終層はtanh、その他はReLU関数で活性化

**Descriminator**

+ Pooling層の代わりに畳み込みを使用（画像の特徴を抽出し、最終層をsigmoid関数で活性化）
+ Leaky ReLU関数で活性化

![スクリーンショット 2022-01-09 12.29.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896292/ed476072-e286-6def-c5ed-9c678afa15ae.png)

**共通点**

+ 中間層に全結合層を使用しない
+ バッチノーマライゼーションを適用



#参考文献

>[深層学習教科書 ディープラーニング G検定(ジェネラリスト)公式テキスト 第2版](https://www.amazon.co.jp/深層学習教科書-ディープラーニング-G検定-ジェネラリスト-公式テキスト/dp/4798165948/ref=sr_1_1?adgrpid=110064847812&gclid=CjwKCAiAz--OBhBIEiwAG1rIOuJjO_Inw6NaUHTijcYU5W3HPq5l5ZErbyv5QqnCRQWnTWENkzDvjRoCD_IQAvD_BwE&hvadid=553964702102&hvdev=c&hvlocphy=1009343&hvnetw=g&hvqmt=e&hvrand=16671887767236234728&hvtargid=kwd-821441291647&hydadcr=4072_13159912&jp-ad-ap=0&keywords=g検定公式テキスト&qid=1641803436&sr=8-1)

>[BERTによる自然言語処理入門 ―Transformersを使った実践プログラミング](https://www.amazon.co.jp/dp/B098J9M4PP/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)