回帰結合型ニューラルネットワーク(RNN)について (E資格対策)


RNNについて。


#RNNとは
RNNには

再帰型ニューラルネットワーク
回帰結合型ニューラルネットワーク

の2種類あります。RNNと表記されたときは主に後者でを指します。




##再帰型ニューラルネットワークとは
木構造のNNです。
英語ではRecursive neural networkといいます。

例：文脈のポジティブネガティブ判定
<img width="897" alt="Recursivenrt.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/c6a60e6b-6e3d-bcb7-f55a-0acc9645ca0c.png">



#教師強制・回帰結合型ニューラルネットワークとは
教師強制とは教師データを次の入力データに入れる手法です。
https://qiita.com/20731057hh/items/2427c237fd2871202ea0

で分かりやすい説明があります。


回帰結合型ニューラルネットワークとは、出力が入力に戻るループ構造のネットワークです。
英語ではRecurrent neural networkといい略称はRNNです。
下図でいう左側に当たります。



![Recurrent_neural_network_unfold.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/b2819fa5-5b27-f0c7-c298-6d6ff297460c.png)


引用：https://www.wikiwand.com/ja/%E5%9B%9E%E5%B8%B0%E5%9E%8B%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF


##Back Propagation Though Time(BPTT)
ではこの構造で誤差逆伝播法はできるのでしょうか、できます。
その手法をBack Propagation Though Time(BPTT)と呼びます。


![Recurrent_neural_network_unfold.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/b2819fa5-5b27-f0c7-c298-6d6ff297460c.png)

引用：https://www.wikiwand.com/ja/%E5%9B%9E%E5%B8%B0%E5%9E%8B%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF

先ほど用いた図の右側に該当します。時系列データ$x$を$x_{t-1}$,$x_{t}$,$x_{t+1}$のように分解すれば巨大なニューラルネットワークととらえられ、ループがなくなります。
なので正解データに対し出力がどれぐらい異なるか調べられ、学習ができます。




#双方向RNN
過去から未来へのRNN＋未来から過去へのRNNの2つを用意して両方から出力を予測する手法です。


![1_6QnPUSv_t9BY9Fv8_aLb-Q.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/ee011ad7-019a-1f48-95cb-bc2f9a70fcbd.png)


引用：https://towardsdatascience.com/understanding-bidirectional-rnn-in-pytorch-5bd25a5dd66


#長期依存性の課題
RNNにはいくつか問題点があります。

・ネットワークが大きくなりすぎる（対策；データをある程度の長さで打ち切る）
・最初の情報が消える
・勾配が消える、発散



##スキップ接続
そこで接続を隣より前の出力に接続し、より前の情報を保持します。
![dilated-rnn-12-638.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/47d37e78-eed0-dc1d-0767-85aadfc9720b.jpeg)



引用：https://www.slideshare.net/naotomoriyama/dilated-rnn


##接続の削除
接続の削除は短いリンクを削除し、パラメータを削って学習速度を上げた手法。
主に隣接するリンクを削除します。


##LSTM
情報を保持できない問題を忘却ゲート、入出力ゲート、メモリを搭載し、解決した手法。
![lstm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/2816b42f-aa07-12b5-696a-396484c77ebd.png)

それぞれ以下の役割を持っています。

![lstmkaisetu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/28078a60-1ccf-0034-78ed-989065872349.png)

ここE検定にとても出るらしいです。


##GRU
メモリセルをなくして忘却ゲートと入力ゲートを合体させたモデル。

![grun.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/f0939ffd-30aa-4d9f-0769-bb9054c57c72.png)


##勾配クリッピング
LSTMは勾配消失問題に対応できましたが、爆発問題には対応できませんでした。そこで勾配に対して一定の制約値を以内に収まるよう調節し、勾配爆発に対応しました。
これを勾配クリッピングといいます。


#深層回帰結合型ニューラルネットワーク

RNNの状態を複数の層に分解する手法です。
![deeplearning-10-27-638.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/ccdbc60a-b5ae-622a-58fc-b3219b594f0e.jpeg)



引用：https://www.slideshare.net/hironokawashima/deeplearning-10


#Encorder-DecorderとSeq2Seq
入力系列と出力系列で別のRNNを構築する手法。

Encorder:入力を中間表現に変換
Decorder:中間表現から出力に変換

Seq2Seqは入力系列と出力系列が可変長でもよい手法です。

![ed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/bcfc1501-4b3d-bad3-5a19-8bdd7394cc51.png)


#Attention
時間方向にも重みを用意し、情報の取捨選択をやりやすくした手法です、これにより過去の情報も参照できるようになります。

![attentino.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/3465fa54-0e17-c869-ad86-5cd002729fe7.png)


参考文献
https://qiita.com/20731057hh/items/2427c237fd2871202ea0