深層学習 day3 RNN・day4 強化学習【ラビットチャレンジ】

# 概要
本記事は「JDLA E資格」の取得に必要なJDLA認定プログラムのひとつであるラビットチャレンジの受講レポートとして投稿したものです。

E資格について
https://www.jdla.org/certificate/engineer/

# 目次
day3 RNN
[Section1：再帰型ニューラルネットワークの概念](#Section1：再帰型ニューラルネットワークの概念)
[Section2：LSTM](#Section2：LSTM)
[Section3：GRU](#Section3：GRU)
[Section4：双方向RNN](#Section4：双方向RNN)
[Section5：Seq2Seq](#Section5：Seq2Seq)
[Section6：Word2vec](#Section6：Word2vec)
[Section7：AttentionMechanism](#Section7：AttentionMechanism)
[day3実装](#day3実装)

day4 強化学習
[Section1：強化学習](#Section1：強化学習)
[Section2：Alpha Go](#Section2：Alpha Go)
[Section3：軽量化・高速化技術](#Section3：軽量化・高速化技術)
[Section4：応用技術](#Section4：応用技術)
[Section5：Seq2seq](#Section5：Seq2seq)
[Section6：Transformer](#Section6：Transformer)
[Section7：物体検知](#Section7：物体検知)
[Section8：セグメンテーション](#Section8：セグメンテーション)

# day3
# Section1：再帰型ニューラルネットワークの概念
### RNN
RNNは、時系列データに対応可能なニューラルネットワークである。

時系列データ：時間的順序を追って一定間隔ごとに観察され，しかも相互に統計的依存関係が認められるようなデータの系列
（音声データやテキストデータなど）

### RNNの特徴
時系列モデルを扱うには、初期の状態と過去の時間t-1の状態を保持し、
そこから次の時間でのtを再帰的に求める再帰構造が必要になる。

### RNNの数学的記述
![rnn1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/d673f410-445c-d1c3-7d54-ee11285b4469.png)
![rnn2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/446b37ba-e4f7-7865-ba06-80f905abea8f.png)

入力に入力用の重みをかけ、前の中間層からの出力に前の中間層からの重みをかけ、バイアスと共に足し合わせる(u)。
uを活性化関数に通し(z)、更に重みをかけてバイアスを足す(v)。それを更に活性化関数に通すことでその時点の出力とする。
前回の中間層の情報を使うのが肝となる。

### BPTT
時間方向に展開したRNNは誤差逆伝播法が使える。
これをBPTT(Backpropagation Through Time)という。


# Section1：再帰型ニューラルネットワークの概念・確認テスト
・サイズ5×5の入力画像を、サイズ3×3のフィルタで畳み込んだ時の出力画像のサイズを答えよ。なおストライドは2、パディングは1とする。
→3×3

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/2b8976a8-1fd5-30de-bd4b-f96faa6246ad.png" width=50%>
→中間層から中間層の重み（前の中間層からの重み）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/edc318c8-5d18-e3d4-f4b4-f71d33cac39e.png" width=50%>

```math
\frac{dz}{dt} = 2t \\
\frac{dt}{dx} = 1 \\
\begin{align}
\frac{dz}{dx} &= \frac{dz}{dt}  \frac{dt}{dx} \\
&= 2t \\
&= 2(x + y)
\end{align}
```

![rnn_test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/118c7253-a582-5f2b-0cfe-85d4f0a33b2b.png)

```math
S_1 = f(W_{in} x_1 + W S_0 + b) \\
y_{1} = g( W_{out} S_{1} + c )
```

# Section1：再帰型ニューラルネットワークの概念・例題チャレンジ

![rnn_ex1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/47beb9da-8576-5ab9-ed64-e75c831c104f.png)
→2
隣接単語（表現ベクトル）から表現ベクトルを作るという処理は、隣接している表現leftとrightを合わせたものを特徴量としてそこに重みを掛けることで実現する。

![rnn_ex2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/9d072c12-d05f-bb69-a7e8-8db2e83afd9b.png)
→2
RNNでは中間層出力が過去の中間層出力に依存する。
RNNにおいて損失関数を重み$W$や$U$に関して偏微分するときはそれを考慮する必要があり、
$dh_{t}/dh_{t-1} = U$であることに注意すると、過去に遡るたびに$U$が掛けられる。
つまり、delta_t = delta_t.dot(U)となる。

# Section2：LSTM
### CEC
勾配消失および勾配爆発の解決方法として、勾配が、1であれば解決できる

CECの課題：入力データについて、時間依存度に関係なく重みが一律である。
　　　　　　→ニューラルネットワークの学習特性が無い

### 入力・出力ゲート
入力・出力ゲートの役割：入力・出力ゲートを追加することで、それぞれのゲートへの入力値の重みを、重み行列W,Uで可変可能とする。
→CECの課題を解決

### 忘却ゲート
過去の情報が要らなくなった場合、そのタイミングで情報を忘却する機能。
CECは過去の情報が要らなくなった場合、削除することはできず、保管され続けることから生まれた。

### 覗き穴結合
EC自身の値に、重み行列を介して伝播可能にした構造。
CECの保存されている過去の情報を、任意のタイミングで他のノードに伝播させたり、
あるいは任意のタイミングで忘却させたいという課題から生まれた。


# Section2：LSTM・確認テスト
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/7aedae6e-9adb-7129-561e-0a9e0c5b0e9a.png" width=50%>
→0.25

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/58485732-ce0a-689d-4f70-5050686eab38.png" width=50%>
→忘却ゲート
判断材料としてはなくてもいい言葉

# Section2：LSTM・例題チャレンジ
![rnn_ex3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/73a92725-9169-b407-e420-82aef94d2a05.png)
→1
勾配のノルムがしきい値より大きいときは、勾配のノルムをしきい値に正規化するので、クリッピングした勾配は、勾配×(しきい値/勾配のノルム)と計算される。

![rnn_ex4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/8e9d00e0-59ba-fb27-7aa3-c5b1f2cc0624.png)
→3
新しいセルの状態は、計算されたセルへの入力と1ステップ前のセルの状態に入力ゲート、忘却ゲートを掛けて足し合わせたものと表現される。

# Section3：GRU
GRUは、パラメータを大幅に削減しつつ精度は同等またはLSTM以上に望める様になった構造。
従来のLSTMではパラメーター数が多すぎたために計算負荷が大きかった。

# Section3：GRU・確認テスト
・LSTMとCECが抱える課題について、それぞれ簡潔に述べよ。
→
LSTM：パラメーター数が非常に多くなり、計算量が多くなる
CEC：勾配が1で学習能力がない。学習機能を持たせるため複雑になり計算量が多くなった。

・LSTMとGRUの違いを簡潔に述べよ。
→
LSTM：入力ゲート、出力ゲート、忘却ゲートの3つのゲートがあり、CECがある。パラメーターが多い。
GRU：CECがない。更新ゲートとリセットゲートを持つ。パラメーターが少ない。

# Section3：GRU・例題チャレンジ
![rnn_ex5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/37dc6ca6-5cab-81c8-52df-dffe14a5b559.png)
→4
新しい中間状態は、1ステップ前の中間表現と計算された中間表現の線形和で表現される。

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

実用例：文章の推敲や、機械翻訳 等

# Section4：双方向RNN・例題チャレンジ
![rnn_ex6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/07ad409c-47fb-5e17-8286-59941ba9bf43.png)
→4
双方向RNNでは、順方向と逆方向に伝播したときの中間層表現をあわせたものが特徴量となるため。

# Section5：Seq2Seq
2つのネットワークがドッキングして作られている自然言語処理用のネットワーク。
保持された文脈の情報をもうひとつのNNに渡し、別の出力に作り変える。
前者の入力を取る方をエンコーダー、後者の出力を生成する方をデコーダーという。

### Encoder RNN
ユーザーがインプットしたテキストデータを、単語等のトークンに区切って渡す構造。

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

### HRED
seq2seqと比較して、HREDは前の単語の流れに即して応答するためより人間らしい文章が生成される。

### VHRED
VHREDはHREDの課題を、VAEの潜在変数の概念を追加することで解決した構造。

### オートエンコーダ
教師なし学習。エンコーダーとデコーダーから成るモデル。
入力データからzという潜在変数を作り出し、それをデコーダーで戻すという処理をする。

### VAE
・通常のオートエンコーダとの違い
正則化を行う。分散が1の確率分布に従うように潜在変数を作り出す。

# Section5：Seq2Seq・確認テスト
![rnn_5_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/35693586-c9a1-26a2-3575-d8919dd43735.png)
→2
1は双方向RNN、3は構文木、4はLSTMについての説明

・seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ。
→seq2seqと比較して、HREDは前の単語の流れに即して応答するためより人間らしい文章が生成される。
　VHREDはHREDの課題を、VAEの潜在変数の概念を追加することで解決した構造。
seq2seq：一文の一問一答に対して処理ができる、ある時系列データからある時系列データを作り出すネットワーク
HRED：seq2seqの機構に文脈の意味ベクトルを加えられるようにすることで、
　　　文脈の意味を汲み取った文の変換をできるようにしたもの。
VHRED：HREDが文脈に対して当たり障りのない回答しか作れなくなったことへの解決策。
　　　 VAEの考え方を取り入れて改良を施したモデル。

VAEに関する下記の説明文中の空欄に当てはまる言葉を答えよ。自己符号化器の潜在変数に____を導入したもの。
→確率分布

# Section5：Seq2Seq・例題チャレンジ
![rnn_ex7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/842404/490a1d2f-af4d-9715-ae79-42a8cc213e46.png)
→1
単語wはone-hotベクトルであり、それを単語埋め込みにより別の特徴量に変換する。

# Section6：Word2vec
単語をベクトル表現する手法。embedding表現を得る手法のひとつ。
単語のone-hotベクトルからembedding表現（ひとつひとつの単語で意味同士が近くなるようなベクトル）を見つける。

# Section7：AttentionMechanism
「入力と出力のどの単語が関連しているのか」の関連度を学習する仕組み。
seq2seqが長い文章に対応できないことへの解決策。
seq2seqの構造では、文章の長短に関わらず中間層（隠れ層）の大きさが決まっている。
そのため、文章が長くなるほどそのシーケンスの内部表現の次元も大きくなっていく仕組みになっている。

# Section7：AttentionMechanism・確認テスト
RNNとword2vec、seq2seqとAttentionの違いを簡潔に述べよ。
→
RNN：時系列データを処理するのに適したNN
word2vec：単語の分散表現ベクトルを得る手法
seq2seq：1つの時系列データから別の時系列データを得るネットワーク
Attention：時系列データの中身のそれぞれの関連性について重みをつける手法

# day3実装
https://github.com/kyo-git/rabbit-challenge/blob/main/3_1_simple_RNN.ipynb
https://github.com/kyo-git/rabbit-challenge/blob/main/3_1_simple_RNN_after.ipynb
https://github.com/kyo-git/rabbit-challenge/blob/main/3_3_predict_sin.ipynb

# day4
# Section1：強化学習
教師あり学習、教師なし学習、強化学習の分類のひとつ。
これまでの教師あり学習、教師なし学習はデータの特徴を見つけようとしてきた。
強化学習では、目標を設定してその目標を達成できるように自力で機械学習モデルを訓練する。

強化学習の枠組みでは、「エージェント」が「環境」の状況に応じて行動を選択し、
その選択によって環境が変化する。環境の変化によってエージェントは報酬を得る。
強化学習での目的は、より良い報酬が得られるようにエージェントの行動指針を決めることである。

# Section2：Alpha Go
Alpha Goが囲碁のチャンピオンを破ったことで強化学習が非常に注目を集めた。
Alpha Goには「AlphaGo (Lee)」と「AlphaGo Zero」の二種類がある。

### AlphaGo (Lee)
Policy Net：方策関数
Value Net：価値関数
両者とも畳み込みニューラルネットワーク

■学習ステップ
1. 教師あり学習によるRollOutPolicyとPolicyNetの学習
2. 強化学習によるPolicyNetの学習
3. 強化学習によるValueNetの学習
いきなり強化学習をすると上手くいかないので、最初に工夫として教師あり学習を入れる。

RollOutPolicy：高速化のために用いる。Policy Netの1000倍早い。
モンテカルロ木探索：強化学習で価値関数を学習するときに用いる手法。

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

■学習ステップ
1. 自己対局による教師データの作成
2. 学習
3. ネットワークの更

# Section3：軽量化・高速化技術
深層学習に必要な計算量の増加に対してハードウェアの性能向上が追いついていないため、
複数の計算資源(ワーカー)を使用し、並列的にニューラルネットを構成することで、効率の良い学習を行いたい。

### データ並列化
親モデルを各ワーカーに子モデルとしてコピーし、
分割したデータを各ワーカーごとに計算させる。
データ並列化は各モデルのパラメータの合わせ方で、同期型か非同期型か決まる。

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

■非同期型
各ワーカーはお互いの計算を待たず、各子モデルごとに更新を行う。

処理スピードは非同期型の方が早いが、最新のモデルのパラメータを利用できないので学習が不安定になりやすい。
現在は同期型の方が精度が良いことが多いので、主流となっている。
データセンターなどでハードウェアを自前で用意するような場合は同期型、
世界中の端末の計算資源を利用して学習する場合は非同期型などの使い分けがされる。

### モデル並列化
親モデルを各ワーカーに分割し、それぞれのモデルを学習させる。
全てのデータで学習が終わった後で、一つのモデルに復元。
モデルのパラメータ数が多いほど、スピードアップの効率も向上する。

### GPUによる高速化
簡単な並列処理が得意なGPUはNNとの相性が良いため高速化が可能

### 量子化(Quantization)
巨大なネットワークは大量のパラメーターが必要になり、大量のメモリや処理能力が必要になる。
メモリを多く使う原因となっているのは重みの情報。重みの情報は浮動小数点で表される。
そこで、64 bit 浮動小数点を32 bit など下位の精度に落とすことでメモリと演算処理の削減を行い、
高速化を図る。ただし欠点として精度は落ちる。

倍精度演算(64 bit)と単精度演算(32 bit)は演算性能が大きく違うため、
量子化により精度を落とすことによりより多くの計算をすることができる

### 蒸留(Distillation)
精度の高いモデルはニューロンの規模も大きく、多くの計算資源が必要となる。
そのため、規模の大きなモデルを基に近しい性能の軽量なモデルを作成する。
蒸留は教師モデルと生徒モデルの2つで構成される。

教師モデル：精度の高いモデル
生徒モデル：教師モデルをもとに作られる軽量なモデル

教師モデルの重みを固定しつつ、両者の誤差を使って生徒モデルの重みを更新していく。

### プルーニング（Pruning）
ネットワークが大きくなるとパラメーターが大量になるが、
全てのニューロンの計算が役に立っているわけではない。
そのため、役に立っていないニューロンを削除して高速化・軽量化を図る。
手法として、重みが閾値以下の場合(0に近い)ニューロンを削減し、再学習を行う。

# Section4：応用技術
畳み込みレイヤーは計算量が多いため、高速化のための工夫が考案されている

### MobileNet
画像認識用のネットワーク
通常の畳み込みレイヤーは以下の計算量が必要になる
H × W × K × K × C × M

Depthwise ConvolutionとPointwise Convolutionの組み合わせで軽量化を実現している

■Depthwise Convolution
・フィルター数は1で固定
・1チャンネル毎にしか畳み込みをしない
そのことによって以下の計算量に減る
H × W × C × K × K

■Pointwise Convolution
・カーネルのサイズを1×1で固定
そのことによって以下の計算量に減る
H × W × C × M

両者を足し合わせたものが最終的な計算量となる

### DenseNet
画像認識用のネットワーク
Denseブロックにはいくつかのレイヤーが存在し、レイヤーを通過する毎にチャンネルが増える（growth rate）
Denseブロックに入力されると前のレイヤーでの計算結果が後ろに付け加えられる
そこに対してバッチ正規化→Relu関数→畳み込みを行う
各々のDenseブロック間にTransition Layerがあり、ConvolutionとPoolingの処理を行っている
出力のレイヤー数を前のDenseブロックの入力に合わせる(チャンネル数を減らす)

似たものにResNetがあり、DenseBlockでは前方の各層からの出力全てが後方の層への入力として用いられるが、
RessidualBlockでは前1層の入力のみ後方の層へ入力として用いる

### Batch正規化/Layer正規化/Instance正規化
ミニバッチ単位で正規化する
BatchNorm/LayerNorm/InstanceNormの三種類が用いられる

■BatchNorm
バッチ単位なのでバッチサイズに影響を受ける
利用するハードウェアによってバッチサイズを変えざるを得ないため、できれば使いたくない
デバイスによってバッチサイズが変わると効果が追えず、実験として成り立たない
BatchNormでは、あるチャンネルのデータに対して全部のバッチサイズで平均0・分散1になるように調整する。
H x W x CのsampleがN個あった場合に、N個の同一チャネルが正規化の単位
ミニバッチのサイズを大きく取れない場合には、効果が薄くなってしまう。

■LayerNorm
LayerNormでは、1つの画像に対して平均0・分散1になるように調整する。
N個のsampleのうち一つに注目。H x W x Cの全てのpixelが正規化の単位
ミニバッチの数に依存しないので、BatchNormの問題を解消可能

■InstanceNorm
InstanceNormでは、1枚の画像中の1つのチャンネルに対して正規化をかける。
BatchNormでバッチサイズが1の場合

### Wavenet
音声生成モデル
次元間での繋がりがあるため畳み込みニューラルネットワークを利用
飛ばし飛ばしで畳み込み処理を行う
情報量を一定に保ちつつ、時間的に幅広い範囲のデータを用いながら出力を得られる

（あ）Dilated causal convolution
（い）パラメータ数に対する受容野が広い

# Section5：Seq2seq
・系列（Sequence）を入力として、系列を出力するもの
・時系列データを別の時系列データに変換するモデル
・Encoder-Decoderモデルとも呼ばれる
翻訳（英語→日本語）、音声認識（波形→テキスト）、チャットボットなど

EncoderはRNNを利用して時系列データを隠れ状態ベクトルに変換する。
エンコードでは任意の長さの文章などを固定長のベクトル（最後の隠れ状態）に変換する。
Decoderでは言語モデルを使った文章生成のLSTMが固定長のベクトルを受け取る。

# Section6：Transformer
seq2SeqのEncoderの出力は、入力文の長さに関わらず固定長ベクトルに変換しなければならない。
そのため長い文章の処理が課題となっており、Attentionが考案された。

Encoderでは最後の隠れ状態だけでなく、各時刻のLSTMレイヤの隠れ状態ベクトルを全て利用する。
DecoderではAffineレイヤで「コンテキストベクトル（単語ベクトルの重み付き和）」と
「隠れ状態ベクトル」の2つのベクトルを入力として取る。

# Section7：物体検知
画像中から物体の位置を特定してクラス分類する。
画像認識では物体が写っているかいないかだけ識別できればよかったが、
物体検知では物体の位置まで特定（クラス分類）しなければならない。
出力に応じて大きく以下の4つがある

分類(Classification)：画像に対するクラスラベル
物体検知(Object Detection)：Bounding Box [bbox/BB]（どこに物体があるか）
意味領域分割(Semantic Segmentation)：各ピクセル毎に単一のクラスラベル
個体領域分割(Instance Segmentation)：各ピクセル毎に単一のクラスラベル（それぞれの物体の区別がつく）

# Section8：セグメンテーション
画像に対してピクセル毎にクラス分類を行う。
ピクセル単位でオブジェクトごとに色付けされた教師データを用いて学習を行う。

ピクセル毎に推論処理を行うとピクセル数だけfoward処理を行う必要があるため、
FCN(Fully Convolutional Network: 1回のforward処理で全てのピクセルに対してクラス分類を行う)
という処理が考案された。
一般的なCNNが全結合層を含むのに対して、FCNでは全結合層を「同じ働きをする畳み込み層」に置き換える。

# 参考図書
・斎藤 康毅『ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装』オライリー・ジャパン