---
# System prepended metadata

title: 深層学習day3

---

# 深層学習day3

## 1. 再帰型ニューラルネットワークの概念

### 概要

#### RNN(Recurrent Neural Network)

時系列データに対応可能なニューラルネットワーク
- 時系列データ
    - 音声データ
    - テキストデータ

前回の中間層の重みを使う

![](https://i.imgur.com/9dWruLk.png)


順伝播
$\displaystyle u_{t}=W_{(in)}x_{t}+Wz_{t-1}+b$
$\displaystyle z_{t}=f(W_{(in)}x_{t}+Wz_{t-1}+b)$　活性化関数通す
$\displaystyle v_{t}=W_{(out)}z_{t}+c$
$\displaystyle y_{t}=g(W_{(out)}z_{t}+c)$ 活性化関数通す

```python=
u[:,t+1]=np.dot(X, W_in)+np.dot(z[:,t].reshape(1,-1), W)
z[:,t+1]=functions.sigmoid(u[:,t+1])
np.dot(z[:,t+1].reshape(1, -1), W_out)
y[:,t] = functions.sigmoid(np.dot(z[:,t+1].reshape(1, -1), W_out)
```

#### BPTT(Backpropagation Throuh Time)時間方向誤差逆伝播法

重みが３つ
$E_{in}$に対して3つの微分

$\displaystyle \frac{\partial E}{\partial W_{(in)}}=\frac{\partial E}{\partial u^{t}}[\frac{\partial u^{t}}{\partial W_{(in)}}]^{T}=\delta^{t}[x^{t}]^{T}$

$\displaystyle \frac{\partial E}{\partial W_{(out)}}=\frac{\partial E}{\partial v^{t}}[\frac{\partial v^{t}}{\partial W_{(out)}}]^{T}=\delta^{out,t}[z^{t}]^{T}$

$\displaystyle \frac{\partial E}{\partial W}=\frac{\partial E}{\partial u^{t}}[\frac{\partial u^{t}}{\partial W} ]^{T}=\delta^{t}[z^{t-1}]^{T}$

$\displaystyle \frac{\partial E}{\partial b}=\frac{\partial E}{\partial u^{t}} \frac{\partial u^{t}}{\partial b}=\delta^{t}$

$\displaystyle \frac{\partial E}{\partial c}=\frac{\partial E}{\partial v^{t}} \frac{\partial v^{t}}{\partial c}=\delta^{out,t}$


### 実装演習結果

**3_1_simple_RNN.ipynb**

バイナリ加算(右から左に(過去から未来)時間的につながりがある情報と仮定)

時系列

時系列ループで1回のiterationで1回の学習
順伝播と逆伝播をしている

```
------------
iters:9800
Loss:0.005257748383586307
Pred:[0 1 1 1 1 0 1 0]
True:[0 1 1 1 1 0 1 0]
69 + 53 = 122
------------
iters:9900
Loss:0.008722374738758037
Pred:[1 0 1 1 1 0 1 0]
True:[1 0 1 1 1 0 1 0]
66 + 120 = 186
------------
```
![](https://i.imgur.com/VzfpPl8.png)



### 確認テスト

**1. RNNのネットワークには大きく分けて３つの重みがある。一つは入力から現在の中間層
を定義する際にかけられる重み、一つは中間層から出力を定義する際にかけられる重みである
残り一つの重みについて説明せよ**

答え：
過去の中間層の出力から現在の中間層に入力する際の重み

**2. 連鎖率の原理を使い、dz/dxを求めよ**
**$z=t^{2}$, $t=x+y$**

答え：
$\displaystyle \frac{dz}{dx}=\frac{dz}{dt}\frac{dt}{dx}$
$\displaystyle \frac{dz}{dt}=2t$
$\frac{dt}{dx}=1$
$\displaystyle \frac{dz}{dx}=2t=2(x+y)$

**下図の$y_{1}$を$x$,$s_{0}$,$s_{1}$, $w_{in}$, $w$, $w_{out}$を用いて数式で表せ。バイアスは任意の文字で定義せよ**
**また中間層の出力にシグモイド関数g(x)を作用させよ**

![](https://i.imgur.com/LzYgUPm.jpg)

答え
$\displaystyle y_{1}=g(W_{(out)}f(W_{(in)}x_{1}+Wz_{0}+b)+c)$


### その他関連事項

文章関連でどのような前処理が必要となりそうか

- 基本的な前処理
  - 不要な文字列の除去、置換
  - 名寄せ
  - 正規化処理
  - ストップワードの除去(意味のない語の除去)
- トークナイゼーション
  - 単語分割
      - Mecab, BPE(BytePairEncoding), SentencePiece
- 単語のベクトル化

などがある

## 2. LSTM

### 概要

LSTM(Long short term memory)
- RNNに記憶部に相当するようなもの(記憶セル)を追加
- ゲートの概念
    - どれだけ(何％)通すか？ゲートの開き具合も学習する


#### CEC(Constant Error Carousel)

これまでの入力を記憶しておく箇所。学習はしない。

- 入力ゲート
CECに覚えさせる。どんなふうに入力で覚えさせるか。
- 出力ゲート
どのようにCECを出力させるか。

入力、出力ゲートを追加することで、それぞれのゲートへの入力値の重みを、
重み行列W,Uで可変可能とする

- 忘却ゲート
    - CECでは過去の情報が全て保管されている。情報がいらなくなったら
    そのタイミングで情報を忘却する機能が必要
- 覗き穴結合
    - 現在のCEC状態も使ってみるという試みだが、あまり大きな改善は見られなかった

### 実装演習結果、考察

なし

### 確認テスト

**シグモイド関数を微分した時、入力値が０の時に最大値をとる**
**その値として正しいものを選択肢から選べ**

2. 0.25

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

答え：忘却ゲート　:o:

**演習チャレンジ 以下のプログラムはLSTMの順伝搬を行うプログラムである**
**ただし、_sigmoid関数は要素ごとにシグモイド関数を作用させる関数である。(け)に
当てはまるものはどれか**

答え：３　:o:

### その他関連事項

このあと色々と前提知識として用語の整理が必要であった

単語の分散表現＝文字をベクトルで表現したもの
ただ１hot表現もベクトルで表現したものと言えるが
わざわざ分散表現というと他の語との関連性を含めた表現のようだ。

隠れ層＝入力層と出力層の間にあるもの
隠れ状態ベクトル=Encoderの所で出てくる。$h_{t}$

> RNNでの出力$h$は「状態」を記憶し、時間が進むにつれ更新する。
> 多くの文献ではRNNの出力$h_{t}$は隠れ状態、隠れ状態ベクトルと呼ばれる
「ゼロからつくるDeepLearning(自然言語処理) P187」

単語埋め込み（Word Embedding）
->分散表現に落とし込む事のよう

## 3. GRU

### 概要

RNNを動かそうとしたけどLSTMではパラメータが多く、複雑。
処理に時間もかかる

GRU(Gated Recurrent Unit)により、精度は同等だが計算負荷が低くなった。
- CEC、入力ゲート、忘却ゲートは無くなった。
- 代わりにリセットゲート、更新ゲートの追加
- ゲートの概念は使っている

**リセットゲート**
- 過去の隠れ状態をどれだけ無視するかを決定

**更新ゲート**
- 隠れ状態を更新するゲート(LSTMのforgetゲートとinputゲートの2つの役割)

LSTMをよりシンプルにした構造

### 実装演習結果、考察

**3.2 predict_word.ipynb**

TensorFlow使用


デフォルトではTensorFlowのversion2.xを使うよう。
講師指定のversion1.xの指定
```
%tensorflow_version 1.x
```
Run
```
ipoprotein : 1.3668963e-14
ldl : 1.4424475e-14
statin : 1.3786473e-14
a--z : 1.3740822e-14
simvastatin : 1.4133777e-14
bmi : 3.1721086e-07
covariates : 2.834505e-06
yhl : 2.2330451e-07
yol : 9.9930106e-11
obesity : 1.3501609e-09
evgfp : 6.1830234e-09
unintended : 4.67851e-09
sizes : 2.5699424e-07
obese : 1.9368164e-07
<???> : 2.919565e-05
Prediction: some of them looks like et
```

### 確認テスト

**LSTMとCECが抱える課題についてそれぞれ簡潔に述べよ**

答え
- LSTM
    - 計算量が多い :o:
- CEC
    - ? :x: →学習能力がない

**演習チャレンジ**
**GRUもLSTMと同様にRNNの一種であり、単純なRNNにおいて問題となる
勾配消失問題を解決し、長期的な依存関係を学習する事ができる。LSTMに比べ変数の数やゲートの
数が少なく、より単純なモデルであるが、タスクによってはLSTMより良い性能を発揮する。以下のプログラムは
GRUの順伝搬を行うプログラムである。ただし_sigmoid関数は要素ごとにシグモイド関数を作用させる関数である。（こ）に当てはまるのはどれか**

答え 4 :o:

**LSTMとGRUの違いを簡潔に述べよ**

LSTMではCEC,入力ゲート、出力ゲート、忘却ゲートがある、
パラメータ数が多い。計算量が大きい。
GRUでは代わりにリセットゲートと更新ゲートがある。




### その他関連事項

LSTMとGRUはどちらが使われているか？

>解きたい(やらせたい)タスクによる。ほかにもLSTMの亜種も使われている
GRUもパラメータが少なく、計算量も少ないのでデータセットのサイズが小さい場合や
モデル設計で繰り返しの試行が必要な場合に特に適している。
LSTMの亜種＝MGU、SGUなど
```参考文献: ゼロからつくるDeep Learning(自然言語処理編)```


## 4. 双方向RNN

### 概要

過去の情報だけでなく、未来の情報を加味することで
精度を向上させるためのモデル

文章の推敲や機械翻訳など

ある語に対してのベクトルに周辺の情報も含ませたい
これまでのLSTMレイヤに加え。逆方向に処理するLSTMレイヤも追加する
各時刻において2つのLSTMレイヤの隠れ状態を連結し、それを最終的な
隠れ状態ベクトルとする

### 実装演習結果、考察

なし

### 確認テスト

**演習チャレンジ**

**以下は双方向RNNの順伝搬を行うプログラムである。
順方向については入力から中間層への重みW_f,1ステップ前の中間層出力から中間層への重みをU_f,逆方向に関しては同様にパラメータW_b, U_bを持ち、両者の中間層表現をあわせた特徴から出力層への重みはVである。
_rnn関数はRNNの順伝搬を表し、中間層の系列を返す関数であるとする。
(か)にあてはまるのはどれか**

答えわからず→
答え(4)

同じ場所につなげたい＝要素、列方向に連なるように
ただし注意：
１次元同士の配列のconcatenateでaxis=1はエラー

### その他関連事項

なし

## 5. Seq2Seq

### 概要

二つのネットワークがつながっている。
自然言語処理、機械翻訳で使われている

エンコーダー：入力 文脈がベクトル表現として保持される
デコーダー：出力　渡されたベクトル表現を作り変える

#### Encoder RNN

- 文の意味を集約。

- 自然言語のベクトル化、単語をIDで表して、ワンホットベクトルで表現

- one-hotで要素が数万、数十万->エンベディング表現 要素を数百程度に

- Bert MLM-Masked Language Model

#### Decoder RNN

システムがアウトプットデータを単語等のトークンごとに生成する構造

課題：
一問一答しかできない

- HRED
    - 過去n-1個の発話から次の発話を生成する
    - Seq2Seq＋ContextRNN
- VHRED
    - HREDの課題　同じ返答になりがち。バリエーションを付けたい
    - HREDにVAEの潜在変数の概念を追加したもの

- オートエンコーダ
    - 教師なし学習の一つ
    - 例としては画像を入力して、潜在変数zを介して同じ画像を出力する

- VAE
    - オートエンコーダの潜在変数zに確率分布z～N(0,1)を仮定するもの
    - 元のデータの類似度が潜在変数ｚでの類似度に近くなって欲しい
    -　　データを潜在変数ｚの確率分布という構造に押しこめる


### 実装演習結果

**lecture_chap1_exercise_public.ipynb**

**今回はGRU**
- エラー。最初に必要だったwheelのインストール
```!pip install wheel==0.34.1```
- データセットは田中コーパスを使用
- 英語を入力して、出力は日本語。説明変数_Xは英語
```python
print('train data', train_X[0])
print('valid data', valid_X[0])

train data ['where', 'shall', 'we', 'eat', 'tonight', '?']
valid data ['you', 'may', 'extend', 'your', 'stay', 'in', 'tokyo', '.']
```

- 単語辞書作成、中身を見る。さらに文章をID列に変換
```python
vocab_size_X = len(vocab_X.id2word)
vocab_size_Y = len(vocab_Y.id2word)

print('入力言語の語彙数：', vocab_size_X)
print('出力言語の語彙数：', vocab_size_Y)

入力言語の語彙数： 3725
出力言語の語彙数： 4405

print(type(vocab_X.id2word))
vocab_X.id2word

<class 'dict'>
{0: '<PAD>',
 1: '<S>',
 2: '</S>',
 3: '<UNK>',
 4: '.',
 5: 'the',
 6: 'i',
 7: 'to',
 
print('train data', train_X[0])
print('valid data', valid_X[0])

train data [132, 321, 28, 290, 367, 12, 2]
valid data [8, 93, 3532, 36, 236, 13, 284, 4, 2]
```

- ミニバッチでデータを(iteratorで)引き出してくれるようにするDataLoaderを用意
  - Pad挿入
  - 64個の文章を一つのバッチに
- PyTorch用のお作法(PackedSequece)
- Encoder用意　Embedding層->GRU層
- Decoder用意　Embedding->GRU-＞Softmax
- EncoderDecoder用意　(Teacher Forcingあり)
- 訓練、学習　(.to(device)でcuda実行指定)
訓練、評価双方ともlossは下がりつつ、BLEUは上がっている
```python
Epoch 1: train_loss: 52.15  train_bleu: 3.49  valid_loss: 49.14  valid_bleu: 5.30
--------------------------------------------------------------------------------
Epoch 2: train_loss: 44.67  train_bleu: 7.51  valid_loss: 45.06  valid_bleu: 8.28
--------------------------------------------------------------------------------
Epoch 3: train_loss: 40.04  train_bleu: 11.55  valid_loss: 42.48  valid_bleu: 11.28
--------------------------------------------------------------------------------
Epoch 4: train_loss: 37.30  train_bleu: 14.12  valid_loss: 41.35  valid_bleu: 14.17
--------------------------------------------------------------------------------
Epoch 5: train_loss: 34.97  train_bleu: 17.05  valid_loss: 40.45  valid_bleu: 15.23
--------------------------------------------------------------------------------
Epoch 6: train_loss: 33.15  train_bleu: 19.15  valid_loss: 39.90  valid_bleu: 15.48
--------------------------------------------------------------------------------
Epoch 7: train_loss: 31.82  train_bleu: 20.86  valid_loss: 40.13  valid_bleu: 15.81
--------------------------------------------------------------------------------
Epoch 8: train_loss: 30.13  train_bleu: 23.10  valid_loss: 40.12  valid_bleu: 17.18
--------------------------------------------------------------------------------
Epoch 9: train_loss: 29.16  train_bleu: 24.74  valid_loss: 40.14  valid_bleu: 15.36
--------------------------------------------------------------------------------
Epoch 10: train_loss: 28.02  train_bleu: 26.49  valid_loss: 40.24  valid_bleu: 16.44
--------------------------------------------------------------------------------
```

- テストデータで評価

```
src: is there any hope of his success ?
tgt: 彼 の 成功 の 見込み は あ り ま す か 。
out: 彼 の 成功 が が の こと が あ り ま す か 。
without trim: 彼 の 成功 が が の こと が あ り ま す か 。 </S> </S> </S> </S> </S> </S>

src: he lived a hard life .
tgt: 彼 は つら い 人生 を 送 っ た 。
out: 彼 は 辛 に 生活 を 送 っ た 。
without trim: 彼 は 辛 に 生活 を 送 っ た 。 </S> </S> </S> </S> </S> </S> </S> </S> </S> </S>

BLEU
16.39954981028505
```

微妙な文章も見受けられるが、小さなコーパスを用いている割りにはそれなりに良くできているのか。



### 確認テスト

**下記の選択肢からseq2seqについて説明しているものを選べ**

答え:2 :o:

1. 双方向RNNの説明
3.　構文木の説明
4.　LSTMの説明

**VAEに関する下記の説明文中の空欄にあてはまる言葉を答えよ**
**自己符号化器の潜在変数に＿＿＿を導入したもの**

答え：確率分布　:o:




### その他関連事項

オートエンコーダは以前別セミナーでセンサーの異常検知でも手法の一つとして紹介が
あった。
なぜオートエンコーダが異常検知が使えるのか？
→通常の状態(input)→Output
いつもと違う入力(以上)→正常に復元できない
inputとoutputのdiffを取り続けていると異常時が分かる


https://www.renom.jp/ja/notebooks/tutorial/clustering/anomaly-detection-using-autoencoder/notebook.html
https://qiita.com/shinmura0/items/06d81c72601c7578c6d3

評価指標のBLEUについて
あまり指標について載っている情報ソースが無かったので
wikipediaより
https://en.wikipedia.org/wiki/BLEU
また以下に詳しかった
https://att-astrec.nict.go.jp/member/mutiyama/corpmt/4.pdf
参照訳と共通するn-gramをカウントしていく


$\displaystyle BLEU=BP\times exp(\sum_{n=1}^{N}\frac{1}{N}\log P_{n})$

右項
BP:短い訳へのペナルティ項とn-gram精度の幾何平均
$P_{n}$: 修正n-gram精度
N: n-gramの最大長

$P_{n}$: $\frac{\sum_{n-gram}ある参照訳でのn-gramの共有数の最大値}{機械翻訳中のn-gram数}$


## 6. Word2vec

### 概要

単語のone-hotベクトルからembedding表現を見つける

単語→単語ID→one-hotベクトル→分散表現

- one-hot　単語が多い場合、1個のベクトル内に0が多く無駄
- 効率的な低次元のEmbedding表現に変換。単語の意味は変えずに。
- ここで変換表を作成する必要がある
- ニューラルネットワークへの入力はこのEmbedding表現に変換したものになる

単語の意味は周囲の語から形成されるという前提


### 実装演習結果、考察

なし

### 確認テスト

なし

### その他関連事項

word2vecの種類(例)
word2vec自体は単語分散表現を得るためのもの

- CBOW(continuous bag-of-words)
- skip-gram

CBOWについて
入力は周辺語、出力は中心語になる

他にword2vecの発展として
fastText, Doc2Vecというのがある


## 7. Attention Mechanizm

### 概要

seq2seqの問題は長い文章への対応が難しい。**Encoderの出力は固定長**

入力と出力のどの単語が関連しているのかの関連度を学習する仕組み

Encoderは最後の隠れ状態だけを送るのでなく、各時刻でのLSTMレイヤの隠れ状態をすべて利用する
＝各単語(時刻)に対応したベクトル集合ができる
Decoderも最後の状態だけでなく、ベクトル集合をすべて扱う。各単語の重要度を表す重み(コンテキストベクトル)も別途計算


### 実装演習結果、考察

なし

### 確認テスト

**RNNとword2vec, seq2seqとAttensionの違いを簡潔に述べよ**

- RNNは過去のデータも反映させる時系列データ向けのネットワーク
- word2vecは単語の分散表現ベクトルを得る
- seq2seqはひとまとまりの系列データから変換されたデータを得るネットワーク
- Attension　データ内に重み、重要度を付けるもの

**seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ**

- seq2seqのひとまとまりの時系列データに対して処理を行うのに対し、HREDでは過去の発話情報も使用する。
- VHREDでは潜在変数を利用して、HREDでありきたりの表現になっているものから変化させる。


### その他関連事項

画像へのAttention機構の応用というのもあったので調べてみた

https://www.softbanktech.co.jp/special/blog/cloud_blog/2019/0063/

単語一つ一つの位置が、画素中の場所(座標)に相当する。
CNNの中でAttension用の重み付き特徴量マップを作製。
値が大きければ大きいほどその領域に注目している事が分かる。
→以前から(2,3年前？）よく画像の分類でどこの部分を判断材料にしているとして色付けされたような写真を見ていたがこのAttension機構を利用していたようだ。
説明用に使うAttentionの一方、分類精度を高めるためのAttentionというのもある


# 深層学習day4

## 1. 強化学習

### 概要

教師あり学習
教師なし学習 　→パターンを見つけて未知データの予測
**強化学習**　→優れた方策を見つける事が目標

行動の結果として与えられる利益、報酬をもとに
行動を決定する原理を改善していく仕組み

- 環境
    - 状態S

- エージェント
    - 方策$\pi (s, a)$→環境で行動 
    - 価値$V$←環境から報酬　行動価値関数: $Q(s, a)$

最初はよくわからない環境でランダムに行動、
探索と利用のトレードオフ


#### 価値関数

- 状態価値関数　ある状態の価値に注目。状態だけを見る。
$V^{\pi}(S)$：状態関数
- 行動価値関数　状態と行動を組み合わせた価値に注目。最近はこちら。
$Q^{\pi}(s, a)$: 状態＋行動関数

ゴールまで今の方策を続けたときの報酬の予測値が得られる


#### 方策関数

エージェントがどのような行動を採るのかの確率を与える関数。
(価値関数が最大となるように)
$\pi(s)=a$

方策勾配法
$\displaystyle \theta ^{(t+1)}=\theta^{(t)}+ \epsilon \nabla J(\theta)$
なるべく多く報酬が得られるように

- 価値関数と方策関数を学習する


### その他関連事項

強化学習まわりの事項について少し調査

- DQN: ニューラルネットワークを導入したＱ学習
- Double DQN:　行動価値評価と行動選択のネットワークを一つにまとめたもの
- Actor-Critic: 囲碁やゲームのような離散的な行動でなく、ハンドル操作やセンサの開閉度合いのような連続的な行動を取り扱う向き
- A3C: Asynchronous, Advantage, Actor-Criticの3つから構成される。同時に複数の経験を処理できるような非同期機構
- UNREAL: A3Cをベースとして補助タスクを利用した手法。多分補助タスクは解く問題による所もあるかと思う。迷宮攻略においては補助タスクは画像中の画素値が大きく変化する動きを学習＝迷路を進みやすくする、また過去の経験をシャッフルして状態価値関数$V(s_{t})$を学習するなど

処理環境
1から構築は大変
環境をOpenAIがOpenAI Gymとして公開

```参考文献: イラストで学ぶディープラーニング(2018)```



## 2. AlphaGo

### 概要

**AlphaGo Lee**

畳み込みニューラルネットワーク
- Value net　価値関数
    - 19x19x49チャンネル　盤面特徴入力からスタート
    - このままいって勝てそうかどうかをtanhの後で1～-1で出力
- Policy Net 方策関数
    - 19x19x48チャンネル　盤面特徴入力からスタート
    - 最終的にはソフトマックスのあとに19x19の（エージェントが）どこに打てばいいか確率が出る

1. 教師あり学習(RollOutPolicy(スピードが速い)、PolicyNet)
    2. Policy Net 人間同士の対局
    3. RollOutPolicyも学習
　　モンテカルロ木探索　早く終わらせたい

3. ValueNetの学習、PolicyNetの学習
価値関数の学習でモンテカルロ木探索・・・強化学習の学習手法
早く終わらせたいのでRollOutPolicyが使える

**AlphaGo Zero**

- 教師あり学習を一切行わず、強化学習のみで作成
- **特徴入力で石の配置のみ**
- PolicyNetとValueNetを一つのネットワークに統合した
    - 中で枝分かれはする(Policy出力、Value出力)
- Residual Netを導入した
- モンテカルロ探索からRollOutシュミレーションをなくした
- Residual Block
    - ネットワークが深くなると生じる勾配消失問題を抑えるために
    ショートカット構造を入れている
    - スキップの組み合わせによる異なるネットワーク表現、アンサンブル効果


## 3. 軽量化、高速化技術

### 概要

分散深層学習

大量のデータのため計算の高速化が必要
データ並列化、モデル並列化、GPU

- データ並列
  - データを分割して各ワーカーに計算させる
  - 結果の反映
      - 同期型　各ワーカーが計算を終了するのを待ち、最後に勾配の平均を元に親モデルを更新
      こちらの方が精度が良い。
      - 非同期型　各ワーカーはお互いの計算を待たず処理

- モデル並列
    - モデルを分割させてワーカーで処理


モデルが大きい時はモデル並列化を、データが大きい時はデータ並列化をするとよい

- GPU
    - 行列演算が得意
    - 現在は主にNVIDIAのCUDAがプラットフォームとして採用されている

- 量子化
    - 通常のパラメータの64bit浮動小数点を32bitなど下位の精度に落とす事でメモリと演算処理の削減を行う
    - 実際問題単精度(4バイト)にしてもほぼ精度的には変わらない。半精度にするとより早く処理できる。

- 蒸留
    - 精度の高い大きなモデルから小さな軽量モデルを作る
    - 教師モデル:予測精度の高い、複雑なモデルやアンサンブルされたモデル
    - 生徒モデル:教師モデルをもとに作られる軽量モデル
    - 教師モデルの重みを固定し、生徒モデルの重みを更新していく

- プルーニング
    - ネットワークが大きくなると大量のパラメータになるがすべてのニューロンの計算が精度に寄与しているわけではない
    - モデルの精度に寄与が少ないニューロンを削減する事でモデルの軽量化、高速化が見込まれる
    - 重みが一定のしきい値以下のニューロンは消してしまい再学習
    

## 4. 応用モデル

### 概要

- MobileNet 画像認識モデルの軽量化、高速化
    - Depth-wise separable convolutions
       - Depthwise Convolution: フィルタを1にして固定
       - Pointwise Convolution 1x1 Convとも呼ばれる

- DenseNet 画像認識モデル(ResNetに近い(skip connection))
    - Dense Block
    - Block内、出力層に前の層の入力を足し合わせる
    - 画像入力データ＋前の計算結果が付け加えられる
    - Transition Layer:チャネルが増えてしまう分、ブロック間でチャネル数を元に戻す
    - DenseBlockでは前方の各層からの出力すべてが後方の層への入力として用いられる
    - (Residual Blockでは前1層の入力のみ後方の層へ入力)
    - ｋチャンネルづつ増える->kを成長率という

- Batch Norm Layer
    - レイヤー間を流れるデータの分布をミニバッチ探知で平均が０、分散が１になるようにする正規化
    - Batch Normalizationはニューラルネットワークにおいて学習時間の短縮や初期値への依存低減、過学習の抑制など効果がある
    - **Batch Normの問題点**
        - Batch Sizeが小さい条件下では学習が収束しない事があり、代わりにLayer Normalizationなどの正規化手法が使われる事が多い
    - ミニバッチのサイズを大きく取れない場合は効果が薄い
　　
- Batch Norm以外の正規化
    - Batch Norm　ミニバッチのサイズの影響を受ける
    - Layer Norm　(**1枚ごと、チャネルまぜて**)それぞれのサンプルのすべてのピクセルが同一分布に従うよう正規化  ミニバッチのサイズの影響を受けない
             - 入力データのスケールに関してロバスト
             - 重み行列のスケールやシフトに関してロバスト
    - Instance Norm　channelも同一分布に従うように正規化
    　             ミニバッチのサイズの影響を受けない
      - Batch Normのバッチサイズが１と等価
      - コントラストの正規化に寄与

- Wavenet 音声認識モデル
    - 生の音声波形を生成する深層学習モデル
    - Pixel CNNを応用したもの
    - **次元間のつながりがあれば畳み込みが使える**
    - Dilated convolution


### 関連事項

いまいち1x1 Convolutionの意味(意義)が分からないので調べてみた

> 入力画像のサイズを変えずに、チャンネルの数を変更する畳み込み操作。
次元数を減らす事で計算の数を減らす事ができる。


## 5. Transformer

### 概要

- Encoder-Decoder Model
    - Transformer(Encoder-DecoderxAttention)
        - BERT
- Seq2seq=Encoder-Decoderモデル
- 入力がEncode(内部状態に変換)され、Decode(系列に変換)する
- 翻訳、音声認識、チャットボット

RNN
  - 系列情報をなめて、内部状態に変換できる
言語モデル
- 単語の並びに確率を与える
- 文章として自然かを確率で評価する
RNNｘ言語モデル
- 各地点で次にどの言語が来れば自然(事後確率最大)かを出力できる
- 自然な文章を生成する事も可能

- Encode+Decoder
    - Decoderのoutput側に正解を当てれば教師あり学習がEnd2Endで行える
    - すべて微分可能
- seq2seqでは文が長くなる場合に不利。一つのベクトルにまとめているため。

**Attention**
辞書オブジェクト

- RNNを使わない
- Attention機構のみを使う

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

Attention(Q, K, V)

Decoder
- Encoderと同じく6層
    - 各層で2種類の注意機構
    - 注意機構の仕組みはEncdoerとほぼ同じ
- 自己注意機構
    - 生成単語列の情報を収集
        - 直下の層の出力へのアテンション
    - 未来の情報を見ないようにマスク
- Encoder-Decoder attention
    - 入力文の情報を収集
        - Encoderの出力へのアテンション
- Add&Norm
    - Add
        - 入出力の差分を学習させる
        - 実装上は出力に入力をそのまま加算するだけ
    - Norm
        - 各層においてバイアスを除く活性化関数への入力を平均０、分散１に正則化
        - 効果：学習の高速化
- Positon Encoding

Attentionの可視化
注意状況を確認すると言語構造を捉えている事が多い

### 実装演習結果

**lecture_chap2_exercise_public.ipynb**


- データセット準備
- 各モジュールの定義(なかなか難しい)
TransformerのモデルもEncoder-Decoderモデルの構造になっています。 EncoderとDecoderは以下のモジュールを定義
  - Positional Encoding: 入出力の単語のEmbedding時に単語の位置情報を埋め込む
  - Scaled Dot-Product Attention: 内積でAttentionを計算し、スケーリングを行う
  - Multi-head Attention: Scaled Dot-Product Attentionを複数のヘッドで並列化する
  - Position-Wise Feed Forward Network: 単語列の位置ごとに独立して処理を行う
- Encoder、Decoder作成
- 学習　約8分　lossが下がってBLEUが上がっている
```python=

Epoch 1 [0.3min]: train_loss: 77.31  train_bleu: 4.66  valid_loss: 41.22  valid_bleu: 10.76
--------------------------------------------------------------------------------
Epoch 2 [0.3min]: train_loss: 39.43  train_bleu: 12.24  valid_loss: 32.17  valid_bleu: 17.49
--------------------------------------------------------------------------------
Epoch 3 [0.3min]: train_loss: 32.04  train_bleu: 18.03  valid_loss: 28.13  valid_bleu: 22.36
--------------------------------------------------------------------------------
Epoch 4 [0.3min]: train_loss: 28.33  train_bleu: 21.61  valid_loss: 25.91  valid_bleu: 24.83
--------------------------------------------------------------------------------
Epoch 5 [0.3min]: train_loss: 25.83  train_bleu: 24.51  valid_loss: 24.41  valid_bleu: 26.70
--------------------------------------------------------------------------------
Epoch 6 [0.3min]: train_loss: 23.99  train_bleu: 26.72  valid_loss: 23.01  valid_bleu: 28.80
--------------------------------------------------------------------------------
Epoch 7 [0.3min]: train_loss: 22.54  train_bleu: 28.55  valid_loss: 22.18  valid_bleu: 30.16
--------------------------------------------------------------------------------
Epoch 8 [0.3min]: train_loss: 21.35  train_bleu: 30.18  valid_loss: 21.53  valid_bleu: 31.01
--------------------------------------------------------------------------------
Epoch 9 [0.3min]: train_loss: 20.34  train_bleu: 31.51  valid_loss: 20.97  valid_bleu: 31.62
--------------------------------------------------------------------------------
Epoch 10 [0.3min]: train_loss: 19.46  train_bleu: 32.80  valid_loss: 20.46  valid_bleu: 32.77
--------------------------------------------------------------------------------
Epoch 11 [0.3min]: train_loss: 18.68  train_bleu: 33.72  valid_loss: 20.01  valid_bleu: 33.63
--------------------------------------------------------------------------------
Epoch 12 [0.3min]: train_loss: 17.93  train_bleu: 34.98  valid_loss: 19.75  valid_bleu: 34.26
--------------------------------------------------------------------------------
Epoch 13 [0.3min]: train_loss: 17.28  train_bleu: 35.93  valid_loss: 19.27  valid_bleu: 34.92
--------------------------------------------------------------------------------
Epoch 14 [0.3min]: train_loss: 16.71  train_bleu: 36.88  valid_loss: 19.27  valid_bleu: 34.98
--------------------------------------------------------------------------------
Epoch 15 [0.3min]: train_loss: 16.17  train_bleu: 37.78  valid_loss: 18.94  valid_bleu: 35.80
--------------------------------------------------------------------------------

```
- Testデータでの評価

```python
src: i should like to see you this afternoon . </S> <PAD> <PAD> <PAD> <PAD>
tgt: 今日 の 午後 お 会 い し た い の で す が 。 </S> <PAD>
out: 今日 の 午後 あなた に 会 う の が 好き で す 。

src: i gave him a call . </S> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD>
tgt: 私 は 彼 に 電話 を し た 。 </S> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD>
out: 彼 に 電話 を かけ た 。

BLEU
25.08018317248158
```

Seq2seq(GRU)の時よりも訳文が自然になっているような気がする


### その他関連事項

TransformerはGoogleで特許が取られている
その他最近のネットワークとモデル。
(GPT-3レベルを自分で学習するのは無理そう。)

#### Google T5(Text-to-Text Transfer Transformer)

#### GPT-3

OpenAIが開発している言語モデルの最新版(2020年)。
約45TBの大規模なテキストデータのコーパスを約1750億個のパラメータを使用して学習するため、高い精度である単語の次にくる単語の予測を可能にした。

#### Vision Transformer

Transformerを画像認識に適用しようという研究

#### Image GPT

GPT-2を画像に適用した例

#### DALL・E

GPT-3とdiscrete VAEを用いて画像を生成

#### gMLP

最近出てきたもの
MLP(多層パーセプトロン)でもTransformerと同程度の精度が出せるよという論文


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

### 概要

物体検知
BoundingBoxで表示

DataSetの種類 
- VOC12
- ILSVRC17
- MS COCO18
- OICOD18


|  | クラス | Train+Val | Box/画像||
| -------- | -------- | -------- | ---- | --- |
| VOC12    | 20    | 11,540    | 2.4 |Instance Annotation|
|ISLVRC17|200|476,668|1.1||
|MS COCO18|80|123,287|7.3|Instance Annotation|
|OICOD18|500|1,743,042|7.0|Instance Annotation|


ILSVRC17　ImageNet(21,841クラス/1400万枚以上)のサブセット
MS COCO18 物体位置推定に対する新たな評価指標を提案
OICID18  Open Images V4のサブセット

画像サイズはそれぞれ

Box/画像の数値が大きい→部分的な重なりがある。日常生活に近い。

#### 評価指標

IoU: Intersection over Union
物体位置の予測精度も評価できる
IoUに対してもしきい値を付ける

AP:Average Precision  PR曲線の積分
ｍAP:mean Average Precision すべてのクラスのAPの平均
FPS:Flames per Second 検出速度

2段階検出器

- 候補領域の検出とクラス推定を別々に行う
- 相対的に精度が高い傾向
- 相対的に計算量が大きく、推論も遅い傾向

1段階検出器
- 候補領域の検出とクラス推定を同時に行う
- 相対的に精度が低い傾向
- 計算量が小さく、推論も早い傾向

#### SSD

1段階検出器

ベースとなるネットワーク：VGG16
マルチスケール特徴マップ

- マップ中に複数のDefault Box
- 複数のDefault Boxを用意した事で生じる問題への対処
    - Non-Maximum Suppression
    - Hard Negative Mining

#### Semantic Segmentation

- 各ピクセルごとのクラス分類
- Upsampling: 元の画像に戻す

代表的なネットワーク
FCN(Fully Convilutional Network)の基本アイディア

アップサンプリングー＞Deconvolution
輪郭情報の補完

U-Net
- Skip-connection

Unpoolingの場合、
poolingした時の位置情報を保持しておく

Dilated Convolution
- Convolutionの段階で受容野を広げる工夫







