深層学習-RNN

#深層学習-RNN
- RNN
- LSTM
- GRU
- 双方向RNN
- Seq2Seq
- HRED
- Word2Vec
- Attention Mechanism
- 確認テスト

##RNN
RNNは時系列データに対応可能なニューラルネットワークである。
時系列データとは、時間的順序を追って一定間隔ごとに観察され、しかも相互に統計的依存関係が認められるようなデータの系列である。
ex)音声データ、テキストデータetc.

###RNNの重み
- 入力から現在の中間層を定義する際の重み
- 中間層から出力を定義する際にかけられる重み
- 現在の中間層から次の中間層を定義する際の重み

###RNNの全体像
![スクリーンショット 2020-12-26 15.38.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/0951a0a7-ffff-414d-2850-b3a6fb98871e.png)

###BPTT
誤差逆伝播の一種である。
→計算結果（誤差）から微分を逆算することで不要な再帰的計算を避けて微分を逆算できる。

RNNにおいてのパラメータ調整方法の一種

###RNNの課題
- 長い時系列の学習が困難→時系列を遡れば遡るほど、勾配が消失していく

##LSTM
長期的な依存関係を学習することができるRNNの一種である。
LSTMを用いることで、長い時系列の学習が困難であるというRNNの課題を克服することができる。

#####課題
パラメータ数が多く計算負荷が高い。

###全体図
![スクリーンショット 2020-12-24 16.44.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/f03d1a3f-6e87-3a39-c3ff-9d4afedc0aee.png)


####勾配消失問題
勾配が消失することで学習が進まなくなる技術的な問題である。
誤差逆伝播が階層に進んでいくにつれて勾配がどんどん緩やかになっていく。
そのため、勾配降下法による更新では下位層のパラメータはほとんど変わらず、訓練は最適値に収束しなくなる。

####勾配爆発
勾配が層を逆伝播するごとに指数関数的に大きくなっていくこと。

####勾配クリッピング
RNNや深いモデルでは勾配が消失したり爆発が起こる傾向がある。それらを防ぐために勾配のクリッピングを行うという手法がある。
具体的には、購買のノルムがしきい値を超えたら勾配のノルムをしきい値に正規化するというものである。
それを勾配クリッピングという。

###CEC
勾配消失、勾配爆発の解決方法として勾配が１であれば解決できる。
#####課題
入力データについて時間依存度に関係なく重みが一律である。
→ニューラルネットワークの学習特性がないということ。
###入力・出力ゲート
それぞれのゲートへの入力値の重みを重み行列W,Uで可変可能とする。
それによって、重みが一律であるというCECの課題を解決する。

###忘却ゲート
LSTMでは、隠れ層がブロック構造になっており、メモリセル、入力ゲート、出力ゲート、忘却ゲートを有している。
現状、CECでは過去の情報が全て保存されている。
そのため、過去の情報が要らなくなった場合、削除することはできず保管され続けるという課題がある。過去の情報が入らなくなった場合、そのタイミングで情報を忘却する機能が必要である。
→忘却ゲートの誕生

###のぞき穴結合
CEC自身の値に重み行列を介して伝播可能にした構造。
LSTMはCECに保存されている情報を他のノードに伝播させたり、忘却させたりすることができる。しかし、CEC自身の値はゲート制御に影響を与えていない。
これらを任意のタイミングで行い、ゲート制御に影響を与えるため、のぞき穴結合が必要である。

##GRU
多数あるパラメータを大幅に削減し、精度はLSTMと同等またはそれ以上が望めるようになった構造。LSTMでは、パラメータ数が多く、計算負荷が高くなる問題があったので、それを解決するために計算負荷の低いGRUを用いる。

###全体像
![スクリーンショット 2020-12-25 18.23.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/9f0ee1bf-3375-1e92-c752-aba94ba1a8e4.png)

###LSTMとの違い
LSTMに比べ変数やゲートの数が少なく、より単純なモデル。
タスクによっては、LSTMより良い性能を発揮することもある。

##双方向RNN
過去の情報だけでなく、未来の情報を加味することで精度を向上させるためのモデル。
ex)文章の推敲、機械翻訳etc
![スクリーンショット 2020-12-26 17.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/6c4d5e61-87e2-74c7-3225-e44845da1eb6.png)

##Seq2Seq
Encoder-Decoderモデルの一種を指す。
Encoder-Decoderモデルとは、ソース系列をEncoderと呼ばれるLSTMを用いて固定長のベクトルに変換し、Decoderと呼ばれる別のLSTMを用いて、ターゲット系列に近くなるように系列を生成するモデル。
ex)機械対話、機械翻訳etc

###Encoder RNN
ユーザーがインプットしたテキストデータを単語等のトークンに区切って渡す構造。
![スクリーンショット 2020-12-26 17.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/6433abb2-cba8-1704-c51b-4b7006908c34.png)

Taking:文章を単語等のトークン毎に分割し、トークンごとのIDに分割する
→Embedding:IDからそのトークンを表す分類表現ベクトルに変換
→Encoder RNN:ベクトルを順番にRNNに入力していく

####処理手順
vec1をRNNに入力→hiddenstate①出力→hidden stateとvec2をRNNに入力→hiddenstate②出力
上記の処理を繰り返していき、最後に出力されたhiddenstateをfinalstateと呼ぶ。finalstateはthought vectorと呼ばれ、入力した文の意味を表すベクトルとなる。

###Decoder RNN
システムがアウトプットデータを単語等のトークンごとに生成する構造
![スクリーンショット 2020-12-26 17.47.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/30fe5fce-38b3-e0aa-8d8c-648b7eb2d7c1.png)

####処理手順
１.Encoder RNNのfinalstateをDecoder RNNのinitial stateととして設定し、Embeddingを入力する。
2.Sampling:生成確率に基づいてtokenをランダムに選ぶ。
3.Embedding:Samplingで選ばれたtokenをEmbeddingしてDecoder RNNへの次の入力をする。
4.Detokenize:1~3を繰り返し、2で得られたtokenを文字列に直す。

#####課題
問いに対して何も文脈なく、ただ応答が行われ続ける。つまり、一問一答しかできない。
→HRED

##HRED
過去n-1の発話から次の発話を生成する。Seq2Seqは会話の文脈無視で応答するのに対し、HREDは前の会話の流れに即して応答するので、より人間らしい文章が生成される。
<b>HRED = Seq2Seq + Context RNN</b>
####Context RNN
Encoderのまとめた各文章の系列をまとめて、これまでの会話のコンテキスト全体を表すベクトルに変換する構造
→過去の発話の履歴を加味した返答をできる
#####課題
- 確率的な多様性が字面にしかなく、会話の流れのような多様性がない。→同じコンテキストを与えられても、答えの内容は毎回会話の流れとしては同じものしか出せない。
- 短く、情報量が乏しい答えをしがち→短くてよくある答えを選択する傾向にある。ex)うん、そうだね、etc

###VHRED
HREDにVAEの潜在変数の概念を追加したもの。HREDは前の会話の流れに即して応答するが同じ内容を出力するのに対し、VHREDは違う内容を出力する。

####AE（オートエンコーダー）
入力データから潜在変数zに変換するニューラルネットワークをEncoder
潜在変数zをインプットして元画像を復元するニューラルネットワークをDecoder
これら二つを統合したものがAEである。

#####メリット
次元削減をすること。zの次元が入力データより小さい場合、次元削減とみなすことができる。

#####課題
通常のAEの場合、何かしら潜在変数zにデータを押し込められているものの、そのデータがどのような状態かわからない。→データを潜在変数zの確率分布という構造に押し込めることを可能にするVAEを用いる。

####VAE
自己符号化器(AE)の潜在変数に確率分布を導入したもの。
AEの課題を解決するため、潜在変数zに確率分布z〜n（０,1)を仮定する。

##Word2Vec
分散表現を作成し、言語をベクトル化することができるツール。
RNNでは、固定長形式で単語を表す必要がある。つまり、単語のような可変長の文字列をNNに与えることはできない。それを解決するための、Word2Vecである。

#####メリット
大規模データの分散表現の学習が現実的な計算速度とメモリ量で実現可能にした。

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

###Seq2Seqの課題
Seq2Seqは長い文章への対応が難しいという問題がある。つまり、２単語でも１００単語でも固定次元ベクトルに中に入力しなければならない。その問題を解決するためにAttention Mechanismを用いる。

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

```math 
OH = \frac{H+2P - FH}{S}+1 = \frac{5+2*1-3}{2}+1 = 3\\
OW = \frac{W+2P - FW}{S}+1 = \frac{5+2*1-3}{2}+1 = 3
```
3×3

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

中間層から次の中間層を定義する際の重み
#####Q3
連鎖律の原理を使い、dz/dxを求めよ。
z = t2
t = x +y

```math 
\frac{dz}{dx} = \frac{dz}{dt}\frac{dt}{dx} = 2t*1 = 2(x+y)
```
#####Q4
下図のy1をx・s0・s1・win・w・woutを用いて数式で表せ。
※バイアスは任意の文字で定義せよ。※また中間層の出力にシグモイド関数g(x)を作用させよ。

```math 
z_1 = sigmoid(w_{in}x_1 + s_0w + b)\\
y_1 = sigmoid(zw_{out} + c)\\
\\
sigmoid(sigmoid(w_{in}x_1 + s_0w + b)w_{out} + c)
```
#####Q5
シグモイド関数を微分した時、入力値が0の時に最大値をとる。その値として正しいものは？
0.25

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

忘却ゲート！

#####Q7
LSTMとCECが抱える課題について、それぞれ簡潔に述べよ。
LSTM：パラメータ数が多く、計算負荷が高い。
CEC:重みが一律である。

#####Q8
LSTMとGRUの違いを簡潔に述べよ。
LSTMはパラメータ数が多いのに対し、GRUは変数やゲートの数が少ないためパラメータ数も少なく、計算負荷がLSTMに比べて低い。

#####Q9
下記の選択肢から、seq2seqについて説明しているものを選べ。
（1）時刻に関して順方向と逆方向のRNNを構成し、それら2つの中間層表現を特徴量として利用するものである。
<b>（2）RNNを用いたEncoder-Decoderモデルの一種であり、機械翻訳などのモデルに使われる。</b>
（3）構文木などの木構造に対して、隣接単語から表現ベクトル（フレーズ）を作るという演算を再帰的に行い（重みは共通）、文全体の表現ベクトルを得るニューラルネットワークである。
（4）RNNの一種であり、単純なRNNにおいて問題となる勾配消失問題をCECとゲートの概念を導入することで解決したものである。

#####Q10
seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ。
seq2seq:会話の文脈を無視して応答
HRED:前の会話の流れに即して応答、しかし内容が同じ
VHRED:前の会話の流れに即して応答、内容は違う

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

A.確率分布

#####Q12
RNNとword2vec、seq2seqとAttention Machineの違いを簡潔に述べよ。
RNNとword2vec：
RNNでは単語のような可変長の文字列をNNに与えることはできないが、word2vecは分散表現を作成し言語をベクトル化することができる。

seq2seqとAttention　Machine：
seq2seqはなんでも固定次元ベクトルの中に入力しなければいけないため長い文章への対応が困難である。一方、Attention Machineは入力と出力のどの単語が関連しているかを調べることができるため長い文章への対応が可能である。