ラビットチャレンジ （深層学習 day3 & day4）

#◆深層学習 day3

## 0. 復習

**AlexNet**
AlexNetとは2012年に開かれた画像認識コンペティション2位に大差をつけて優勝したモデルである。
AlexNetの登場で、ディープラーニングが大きく注目を集めた。
5層の畳み込み層およびプーリング層など、それに続く3層の全結合層から構成される。

#### 確認テスト
サイズ5×5の入力画像を、サイズ3×3のフィルタで畳み込んだ時の出力画像のサイズを答えよ。なおストライドは2、パディングは1とする。

答：
　　　縦（横）サイズ＝(5+2-3)/2+1 = 3
　　　よって　3×3


## 1. 再起型ニューラルネットワークの概念
**＜概要＞**
**RNNとは？**
　　時系列データに対応可能な、ニューラルネットワークである。
　　中間層が再帰構造を持ち、前後の時刻の中間層を繋ぐ。
　　時間に遡って逆伝播が行われる。

**時系列データとは？**
<dd>時間的順序を追って一定間隔ごとに観察され、しかも相互に統計的依存関係が認められるようなデータの系列。
音声データ、テキストデータなどがある。
時系列モデルを扱うには、初期の状態と過去の時間t-1の状態を保持し、そこから次の時間でのtを再帰的に求める再帰構造が必要になる。
</dd>
　　




**RNNの全体像図**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/4b5864be-4d7a-2def-c7bf-adfdae8a3449.png)

**RNNの数学的記述**

　　　　$u^t = W_{(in)}x^t + W z^{t-1} + b$
　　　　$\ z^t = f(u^t)$
　　　　$v^t = W_{(out)}z^t + c$
　　　　$y^t = g(v^t)$

**BPTTとは？**
<dd>BPTT(backpropagation through time)はRNNにおける誤差逆伝搬によってパラメータを更新する手法のことである。</dd>

#### 確認テスト
＜確認テスト1＞
RNNのネットワークには大きくわけて3つの重みがある。1つは入力から現在の中間層を定義する際にかけられる重み、1つは中間層から出力を定義する際にかけられる重みである。残り1つの重みについて説明せよ。

答：残る1つの重みは、前の中間層から現在の中間層を定義する際にかけられる重みである。

＜確認テスト2＞
連鎖律の原理を使い、dz/dxを求めよ。

答：
　　微分の連鎖率は
　　　　$\frac{dz}{dx}=\frac{dz}{dt}\times\frac{dt}{dx}$

　　　　$\frac{dz}{dt}=2t$
　　　　$\frac{dt}{dx}=1$

　　　　より
　　　　$\frac{dz}{dx}=\frac{dz}{dt}\times\frac{dt}{dx}=2t\times 1=2(x+y)$

＜確認テスト3＞
下図のy1をx1,s0,s1,win,w,woutを用いて数式で表わせ。また、中間層の出力にシグモイド関数を作用させよ。

答：
　　　$z_1=sigmoid \left( s_0 W+x_1W_{in}+b \right)$
　　　$y_1=sigmoid \left( z_1 W_{out}+c \right)$

#### 演習
「3_1_simple_RNN.ipynb」を使用して演習

・weight_init_stdやlearning_rate, hidden_layer_sizeを変更してみよう
・重みの初期化方法を変更してみよう　Xavier, He
・中間層の活性化関数を変更してみよう

■初期設定時
　weight_init_std = 1、learning_rate = 0.1、hidden_layer_size = 16の場合
　Loss:0.00036944179324640213
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/3cf34197-febe-cad4-f7c9-9242b90218e1.png)
学習初期はまったく計算できていないが中盤以降正しく計算されている。

**学習初期**
iters:0
Loss:2.495287446169305
Pred:[1 1 1 1 1 1 1 1]
True:[0 1 1 0 0 0 0 0]
90 + 6 = 255
－－－－－－－－－－
iters:100
Loss:0.670924829282013
Pred:[1 1 1 0 0 0 0 0]
True:[1 1 1 0 0 0 0 0]
100 + 124 = 224


**学習終盤**
iters:9800
Loss:0.0009113598085292483
Pred:[0 1 1 1 0 1 0 1]
True:[0 1 1 1 0 1 0 1]
55 + 62 = 117
－－－－－－－－－－
iters:9900
Loss:0.00036944179324640213
Pred:[1 0 0 1 0 0 1 0]
True:[1 0 0 1 0 0 1 0]
77 + 69 = 146
－－－－－－－－－－

■　weight_init_std = 1、learning_rate = 0.5、hidden_layer_size = 16の場合
　　Loss:0.00011130339656977336
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/b6f8e4ef-35e6-0fca-7a79-10c54f29a49e.png)

■　weight_init_std = 5、learning_rate = 0.1、hidden_layer_size = 16の場合
　　Loss:0.26565063715142545
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/4435b7a2-18a3-6d66-bbc4-0fc23f969fab.png)

■　weight_init_std = 1、learning_rate = 0.1、hidden_layer_size = 32の場合
　　Loss:0.0005047485425984668
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/c78ffef7-d907-0e28-9d85-bbaa15ba5784.png)


■　重みの重みの初期化方法をXavierに変更

```python
# Xavier
W_in = np.random.randn(input_layer_size, hidden_layer_size) / (np.sqrt(input_layer_size))
W_out = np.random.randn(hidden_layer_size, output_layer_size) / (np.sqrt(hidden_layer_size))
W = np.random.randn(hidden_layer_size, hidden_layer_size) / (np.sqrt(hidden_layer_size))
```
Loss:0.0019408171865118262
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/5d1c2bc4-8e8f-4517-52c7-0c8d948cc5db.png)

■　重みの初期化方法をHeに変更

```python
# He
W_in = np.random.randn(input_layer_size, hidden_layer_size) / (np.sqrt(input_layer_size)) * np.sqrt(2)
W_out = np.random.randn(hidden_layer_size, output_layer_size) / (np.sqrt(hidden_layer_size)) * np.sqrt(2)
W = np.random.randn(hidden_layer_size, hidden_layer_size) / (np.sqrt(hidden_layer_size)) * np.sqrt(2)
```
Loss:0.0016985682208860195
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/f8d247e5-2cb5-233b-1b52-400b69d0e0ef.png)

■　中間層の活性化関数をReLUに変更してみる
以下の4か所を変更した。
　z[:,t+1] = functions.relu(u[:,t+1])
　y[:,t] = functions.relu(np.dot(z[:,t+1].reshape(1, -1), W_out))
　delta_out[:,t] = functions.d_mean_squared_error(dd, y[:,t]) * functions.d_relu(y[:,t])  
　delta[:,t] = (np.dot(delta[:,t+1].T, W.T) + np.dot(delta_out[:,t].T, W_out.T)) * functions.d_relu(u[:,t+1])


Loss:1.0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/9bb230bf-e26c-dba1-170c-7fb304ccf6bd.png)
予測値がすべて0であり、学習が全く進んでいない。
プログラム修正誤りなのでしょうか？


## 2. LSTM
**＜概要＞**
RNNの課題として時系列を遡れば遡るほど勾配が消失していくため、長い時系列の学習が困難なことがあげられる。
解決策として構造自体を変えて解決したものがLSTMである。

LSTM(Long short-term memory)はRNNの一種であり、RNNの再帰構造を持つ隠れ層をLSTMブロックで置き換えている。

LSTMブロックには、CEC(Constant Error Carousel)と入力ゲート・出力ゲート・忘却ゲートの３つのゲートで構成されている。

CEC
<dd>過去のデータを保存するためのユニット。
CECの課題は、入力データについて、時間依存度に関係なく重みが一律であるためニューラルネットワークの学習特性が無いということ。
</dd>
入力・出力ゲート
<dd>入力・出力ゲートを追加することで、それぞれのゲートへの入力値の重みを、重み行列W,Uで可変可能となりCECの課題を解決することができる。
</dd>
忘却ゲート
<dd>CECは、過去の情報が全て保管されている。
過去の情報が要らなくなった場合、そのタイミングで情報を忘却する機能が必要でその機能が忘却ゲートとなる。
CECの中身をどの程度残すかを調整する。
</dd>
覗き穴結合
<dd>CECの保存されている過去の情報を、任意のタイミングで他のノードに伝播させたり、あるいは任意のタイミングで忘却させるためにCEC自身の値に、重み行列を介して伝播可能にした構造。
</dd>
#### 確認テスト
＜確認テスト1＞
シグモイド関数を微分した時、入力値が0の時に最大値をとる。その値として正しいものを選択肢から選べ。

答：　0.25

＜確認テスト2＞
以下の文章をLSTMに入力し空欄に当てはまる単語を予測したいとする。文中の「とても」という言葉は空欄の予測においてなくなっても影響を及ぼさないと考えられる。このような場合、どのゲートが作用すると考えられるか。

答：　忘却ゲート

## 3. GRU
**＜概要＞**
従来のLSTMでは、パラメータが多数存在していたため、計算負荷が大きいという課題があった。
GRU(Gated recurrent unit)はゲート付き回帰型ユニットと呼ばれ、LSTMをシンプルにしたモデルにあり、LSTMより高速に動作する。
GRUでは、そのパラメータを大幅に削減し、精度は同等またはそれ以上が望める様になった。

#### 確認テスト
＜確認テスト1＞
LSTMとCECが抱える課題について、それぞれ簡潔に述べよ。
解答：
LSTM：パラメータ数が多く、計算負荷が高い
CEC：ニューラルネットワークの学習特性がない

＜確認テスト2＞
LSTMとGRUの違いを簡潔に述べよ。
答：　
LSTMでは、パラメータが多数存在していたため、計算負荷が大きかったが、GRUでは、パラメータを大幅に削減し、精度は同等またはそれ以上が望める様になっており、計算負荷が低い。

## 4. 双方向RNN
**＜概要＞**
時間軸に対して未来方向と過去の方向のRNNを組み合わせたものを双方向RNNと呼ぶ。
過去の情報だけでなく、未来の情報を加味することで、精度を向上させるためのモデルである。
実用例：文章の推敲や、機械翻訳等
#### 確認テスト
＜確認テスト1＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/8e4b5992-ff21-b068-9fd8-f25a47c91e7f.png)

答：4

## 5. Seq2Seq
**＜概要＞**
seq2seqはEncoder-Decoderモデルの一種であり、データを解くように変換するEncoderと、特徴を新しいデータに変換するDecoderを組み合わせたものである。自然言語用のモデルである。
seq2seqは英語を日本語に置き換えたり、質問を回答に置き換えるルールを学習することができる。
具体的な用途は機械対話や機械翻訳などである。

**Encoder RNN**
<dd>ユーザーがインプットしたテキストデータを、単語等のトークンに区切って渡す構造。
Taking：文章を単語等のトークンごとに分割し、さらにトークンごとのIDに分割する。
Embedding：IDからそのトークンを表す分散表現ベクトルに変換する。
Encoder RNN：ベクトルを順にRNNに入力していく。
　
＜Encoder RNN処理手順＞
・vec1をRNNに入力し、hidden stateを出力。
・このhidden stateと次の入力vec2をまたRNNに入力してきたhidden stateを出力という流れを繰り返す。
・最後のvecを入れたときのhidden stateをfinal stateとしてとっておく。
・このfinal stateがthought vectorと呼ばれ、入力した文の意味を表すベクトルとなる。
</dd>
**Decoder RNN**
<dd>システムがアウトプットデータを、単語等のトークンごとに生成する構造。
　
＜Decoder RNNの処理＞
・Decoder RNN: Encoder RNNのfinal state (thought vector)から、各token の生成確率を出力。
  final stateをDecoder RNNのinitial stateととして設定し、Embeddingを入力。
・Sampling:生成確率にもとづいてtokenをランダムに選びます。
・Embedding:選ばれたtokenをEmbeddingしてDecoder RNNへの次の入力とします。
・Detokenize:以上を繰り返し、得られたtokenを文字列に直します。
</dd>
**HRED**
<dd>HREDは過去n-1個の発話から次の発話を生成する。
Seq2seqでは、会話の文脈無視で、応答がなされたが、HREDでは、前の単語の流れに即して応答されるため、より人間らしい文章が生成される。
HREDはseq2seqとcontext RNNを組み合わせた構造を持つ。
　
HREDの課題
・確率的な多様性が字面にしかなく、会話の「流れ」のような多様性が無い。
→同じコンテキスト（発話リスト）を与えられても、答えの内容が毎回会話の流れとしては同じものしか出せない。
・短く情報量に乏しい答えをしがちである。
→短いよくある答えを学ぶ傾向がある。
<dd/>　
**VHRED**
<dd>HREDに、VAEの潜在変数の概念を追加したもの。
→HREDの課題を、VAEの潜在変数の概念を追加することで解決した構造
</dd>　
**オートエンコーダ**
<dd>教師なし学習の一つ。そのため学習時の入力データは訓練データのみで教師データは利用しない。

オートエンコーダ具体例：
MNISTの場合、28x28の数字の画像を入れて、同じ画像を出力するニューラルネットワークということになります

オートエンコーダの構造：
入力データから潜在変数zに変換するニューラルネットワークをEncoder
逆に潜在変数zをインプットとして元画像を復元するニューラルネットワークをDecoder。

メリット：次元削減が行えること
</dd>　
**VAE**
<dd>通常のオートエンコーダーの場合、何かしら潜在変数zにデータを押し込めているものの、その構造がどのような状態かわからない。
VAEはこの潜在変数zに確率分布z∼N(0,1)を仮定したもの
</dd>
####確認テスト
＜確認テスト1＞
下記の選択肢から、seq2seqについて説明しているものを選べ。
（1）時刻に関して順方向と逆方向のRNNを構成し、それら2つの中間層表現を特徴量として利用するものである。
（2）RNNを用いたEncoder-Decoderモデルの一種であり、機械翻訳などのモデルに使われる。
（3）構文木などの木構造に対して、隣接単語から表現ベクトル（フレーズ）を作るという演算を再帰的に行い（重みは共通）、文全体の表現ベクトルを得るニューラルネットワークである。
（4）RNNの一種であり、単純なRNNにおいて問題となる勾配消失問題をCECとゲートの概念を導入することで解決したものである。

答：(2)

＜確認テスト2＞
VAEに関する下記の説明文中の空欄に当てはまる言葉を答えよ。

答：確率分布

＜確認テスト3＞
Seq2SeqとHRED、HREDとVHREDの違いを簡潔に述べよ。

答：
Seq2SeqとHREDの違い：　Seq2Seqは一問一答しかできないが、HREDは過去n−1個の発話から文脈に応じた回答ができる。

HREDとVHREDの違い：　HREDは発話に多様性がなく情報量に乏しいが、VHREDはそれらの課題を解決し、多様性ある発話ができる。

## 6. Word2vec
**＜概要＞**
・単語をベクトル表現する手法。単語間の関係性を捉えつつベクトル化するのが特徴。
・与えられた文章中の単語（文字列）をベクトルとして表現することで演算を可能にしている。
・ベクトル化した単語を単語ベクトルと呼び、この単語のベクトルの値を足したり引いたりすることで単語の意味関係を捉えることができる。
・大規模データの分散表現の学習が、現実的な計算速度とメモリ量で実現可能となった。

## 7. Attention Mechanism
**＜概要＞**
・seq2seq の問題は長い文章への対応が難しいことである。
　　→2単語でも、100単語でも、固定次元ベクトルの中に入力しなければならない。
・解決策として文章が長くなるほどそのシーケンスの内部表現の次元も大きくなっていく仕組みが必要となる。
・Attention Mechanismは「入力と出力のどの単語が関連しているのか」の関連度を学習する仕組み。

#### 確認テスト
＜確認テスト1＞
RNNとword2vec、seq2seqとAttentionの違いを簡潔に述べよ。

答：
RNNとWord2vecの違い：RNNは時系列データを処理するのに適したNNであり、Word2vecは単語の分散表現ベクトルを得る手法。

seq2seqとAttentionの違い：Seq2Seqは一つの時系列データから別の時系列データを得るネットワークであり、Attentionは時系列の中身に対して、関連性に重みをつける手法。


# ◆深層学習 day4

## 1. 強化学習
長期的に報酬を最大化できるように環境のなかで行動を選択できるエージェントを作ることを目標とする機械学習の一分野
行動の結果として与えられる利益(報酬)をもとに、行動を決定する原理を改善していく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/d199c6a0-f90e-f70d-16e2-382076b0ea56.png)

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

・ある状態を入力として次の行動を出力する関数を方策関数と呼ぶ。
・エージェントが選択した行動の最終的な報酬の期待値をQ値（状態行動価値）と呼び、強化学習ではQ値が最大になるように学習する。
　Q値を求める関数をQ関数（状態行動価値関数）と呼ぶ。
・Q学習は最初に設定されているQ値と、実際に行動して得られるQ値の期待値との差をQ値に反映させる手法。


**価値関数**
　　価値を表す関数としては「状態価値関数」と「行動価値関数」の2種類がある。
　　ある状態の価値に注目する場合は、状態価値関数
　　状態と価値を組み合わせた価値に注目する場合は、行動価値関数


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

## 2. AlphaGo
・AlphaGoはコンピュータ囲碁プラグラムであり、教師あり学習と強化学習の併用により作られたモデルである。
・AlphaGoはモンテカルロ法を取り入れており、報酬を得たタイミングで今までに行った行動のQ値を一気に更新する。

AlphaGoの学習は以下のステップで行われる
1. 教師あり学習によるRollOutPolicyとPolicyNetの学習
2. 強化学習によるPolicyNetの学習
3. 強化学習によるValueNetの学習

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/b1ba14e1-a778-9b17-af77-05ed8a810287.png)

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

**PolicyNetの強化学習**
現状のPolicyNetとPolicyPoolからランダムに選択されたPolicyNetと対局シミュレーションを行い、その結果を用いて方策勾配法で学習を行った。
PolicyPoolとは、PolicyNetの強化学習の過程を500Iteraionごとに記録し保存しておいたものである。
現状の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を別々にしてある理由は、過学習を防ぐためであると論文では説明されている

**モンテカルロ木探索**
コンピュータ囲碁ソフトでは現在もっとも有効とされている探索法。
他のボードゲームではminmax探索やその派生形のαβ探索を使うことが多いが、盤面の価値や勝率予想値が必要となる。しかし囲碁では盤面の価値や勝率予想値を出すのが困難であるとされてきた。
そこで、盤面評価値に頼らず末端評価値、つまり勝敗のみを使って探索を行うことができないか、という発想で生まれた探索法である。囲碁の場合、他のボードゲームと違い最大手数はマスの数でほぼ限定されるため、末端局面に到達しやすい。
具体的には、現局面から末端局面までPlayOutと呼ばれるランダムシミュレーションを多数回行い、その勝敗を集計して着手の優劣を決定する。
また、該当手のシミュレーション回数が一定数を超えたら、その手を着手したあとの局面をシミュレーション開始局面とするよう、探索木を成長させる。
この探索木の成長を行うというのがモンテカルロ木探索の優れているところである。
モンテカルロ木探索はこの木の成長を行うことによって、一定条件下において探索結果は最善手を返すということが理論的に証明されている。

**AlphaGoZero**
AlphaGOZeroは教師あり学習を一切行わず、セルフプレイによる強化学習のみで作成されたモデル。

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

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

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

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

## 3. 軽量化・高速化技術
**データ並列化**
親モデルを各ワーカーに子モデルとしてコピー、データを分割し、各ワーカーごとに計算させることをデータ並列化と呼ぶ。

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

データ並列化：非同期型
<dd>各ワーカーはお互いの計算を待たず、各子モデルごとに更新を行う。学習が終わった子モデルはパラメータサーバにPushされる。新たに学習を始める時は、パラメータサーバからPopしたモデルに対して学習していく。</dd>　
処理のスピードは、お互いのワーカーの計算を待たない非同期型の方が早い。
しかし、非同期型は最新のモデルのパラメータを利用できないので、学習が不安定になりやすい。
現在は同期型の方が精度が良いことが多いので、主流となっている
　
**モデル並列化**
親モデルを各ワーカーに分割し、それぞれのモデルを学習させる。全てのデータで学習が終わった後で、一つのモデルに復元。
モデルが大きい時はモデル並列化を、データが大きい時はデータ並列化をすると良い。

**GPUによる高速化**
GPGPU (General-purpose on GPU)
　元々の使用目的であるグラフィック以外の用途で使用されるGPUの総称
CPU
　高性能なコアが少数
　複雑で連続的な処理が得意
GPU
　比較的低性能なコアが多数
　簡単な並列処理が得意
　ニューラルネットの学習は単純な行列演算が多いので、高速化が可能
　
**軽量化**
１．量子化
<dd>通常のパラメータの64 bit 浮動小数点を32 bit など下位の精度に落とすことでメモリと演算処理の削減を行う。</dd>
２．蒸留
<dd>規模の大きなモデルの知識を使い軽量なモデルの作成を行う。</dd>
３．プルーニング
<dd>モデルの精度に寄与が少ないニューロンを削減することでモデルの軽量化、高速化が見込まれる。</dd>

## 4. 応用モデル

**MobileNet**
Depthwise Separable Convolution (Depthwise ConvolutionとPointwise Convolution)という仕組みを用いて画像認識において軽量化・高速化・高精度化したモデル。
通常の畳込みが空間方向とチャネル方向の計算を同時に行うのに対して、Depthwise Separable ConvolutionではそれらをDepthwise ConvolutionとPointwise Convolutionと呼ばれる演算によって個別に行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/8b1d94a8-22ea-5d38-6146-dea6218c82aa.png)


**DenseNet**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/12577dad-4bed-d7d8-20ef-a5e45165db72.png)
**正規化**
Batch Norm
　ミニバッチに含まれるsampleの同一チャネルが同一分布に従うよう正規化
Layer Norm
　それぞれのsampleの全てのpixelsが同一分布に従うよう正規化
Instance Nrom
　さらにchannelも同一分布に従うよう正規化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/db05b988-84c0-4553-3928-bc601094ddec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/b7bcede4-a8c6-ce74-c494-2a491914169c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/33125989-8a47-a825-1b3d-05557e3482b1.png)

**WaveNet**
生の音声波形を生成する深層学習モデル
Pixel CNNを音声に応用したもの
時系列データである音声に畳込みニューラルネットワーク(Dilated Convolution)を適用する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/dcc8406f-109d-9c86-a763-196d6ad8b52a.png)


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

答：（あ）Dilated causal convolution

＜確認テスト2＞
（あ）を用いた際の大きな利点は、単純なConvolution layer と比べて（い）ことである。

答：（い）パラメータ数に対する受容野が広い

## 5. Transformer

TransfomerはEncoder-DecoderとAttention機構を組み合わせ、最後に全結合層を経て翻訳結果を返すモデルである。
RNNを一切使っておらず、並列化が容易であるため、訓練時間を大幅に短縮することが可能となった。
　・2017年6月に登場 - RNNを使わない 
　・ 必要なのはAttentionだけ 
　・ 当時のSOTAをはるかに少ない計算量で実現 
　・ 英仏 (3600万文) の学習を8GPUで3.5日で完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/4ce07ae9-a254-f6c3-5fce-d63f9a717d41.png)


## 6. 物体検知・セグメンテーション
**＜概要＞**
物体検知では入力画像に対して、物体検出位置であるBounding Box、ラベル、コンフィデンスの３つを併せて出力するのが一般的である。
広義の物体認識タスクとしては、分類・物体検知（バウンディングボックス）・意味領域分割・個体領域分割に分かれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/b514b856-28ea-95c8-f21d-01fc978753d9.png)

物体検知において代表的なデータセットにVOC12、ILSVRC17、MS COCO18、OICOD18などがある。
この中でILSVRC17以外は物体個々にラベルが与えられている。


分類問題の評価指標として混合行列がよく用いられるが、この概念を物体検出のクラスラベルだけでなく、物体位置の予測精度評価にも用いることができる。
すなわち、IoU(Intersection over Union　別名：Jaccard係数)を用いる。
定義式は

```math
IoU=\frac{TP}{TP+FN+FP+TN}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/8142d126-5f60-56ff-9a8f-f898ea923abd.png)

**物体検知のフレームワーク**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593495/8fc96134-873c-d71a-702e-6ab70f1d3cb2.png)