【ラビットチャレンジ（E資格）】深層学習Day3

#はじめに
本記事は、E資格の受験資格の取得を目的としたラビットチャレンジを
受講した際の勉強記録およびレポート記事である。

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

■時系列データとは
時間的順序を追って一定間隔ごとに観察され、しかも相互に統計的依存関係が
認められるようなデータの系列。

■具体的な時系列データとは
・音声データ
・テキストデータ...etc

■RNNの全体像
![スクリーンショット (198).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/0e8d61d7-9007-22b7-2055-d26280bb51a4.png)

・数式
![スクリーンショット (199).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/aea434c6-c5e4-4b5b-16d9-de99087b8e57.png)

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

・解答
中間層から中間層への重み

■演習
バイナリ加算
初期値
・learning_rate = 0.1
・hidden_layer_size = 16
・weight_init_std = 1

□learning_rate = 0.1、hidden_layer_size = 16でweight_init_std値を変更する場合
weight_init_std = 1の場合は、うまく学習が進んでいくことが確認されたが
weight_init_std = 3、5の場合は、勾配爆発が起きている。

![スクリーンショット (201).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/51d50a3b-4d69-132a-727f-123e1946418c.png)
![スクリーンショット (202).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/97aa8ca3-2782-a839-a07e-b0597039650d.png)
![スクリーンショット (203).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/4c1e3ea6-09f5-669d-ac42-6fe00b82152e.png)

□learning_rate = 0.1、weight_init_std = 1でhidden_layer_size値を変更する場合
初期値では、学習6000回ほどでlossが0に収束するのに対し本条件では、
学習4000回ほどでlossが0に収束することが確認された。
![スクリーンショット (204).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/c35b6dd9-cd5d-7bfc-ad30-b1ac8656d6f9.png)

□weight_init_std = 1、hidden_layer_size = 16でlearning_rate値を変更する場合
学習率が高い方が、速くlossが0に収束することが確認された。
またあまりにも学習率が小さいと (learnig_rate = 0.01) 勾配爆発を起こすことが
確認された。

![スクリーンショット (205).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/06415198-983c-ab38-a683-3f6d3383eb89.png)
![スクリーンショット (206).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/bd044515-adac-e808-1d49-be35c12cb7c0.png)

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

・数式
![スクリーンショット (207).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/9f5b9d89-97fd-1d7f-9d6e-079e6d00c25d.png)

・パラメータの更新式
![スクリーンショット (208).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/de212ba2-b130-1036-1636-34b44ce4f650.png)

・BPTTの全体像
![スクリーンショット (209).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/d3edb644-d385-de83-febe-b5bce8835b22.png)

##Section2)LSTM
RNNの課題として時系列を遡るほど勾配が消失していくことがある。
RNNは長い時系列の学習が困難であった。
LSTMとは上記問題を構造自体を変えて解決したもの。

・LSTMの全体図
![スクリーンショット (210).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/636281ab-4814-ff5b-f6f8-541bdbbc9c81.png)

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

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

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

■忘却ゲート
・LSTMの現状
CECは過去の情報をすべて保管されている。

・LSTMの課題
過去の情報が要らなくなった場合、削除することはできず、保管され続ける

・解決策
過去の情報が要らなくなった場合、そのタイミングで情報を忘却する機能が必要
⇒忘却ゲートの誕生

■覗き穴結合
・課題
CECの保存されている過去の情報を、任意のタイミングで他のノードに伝搬させたり
あるいは任意のタイミングで忘却させたい。
CEC自身の値は、ゲートの制御に影響を与えていない。

・覗き穴結合とは
CEC自身の値に、重み行列を介して伝搬可能にした構造

■確認テスト
シグモイド関数を微分したとき、入力値が0のときに最大値をとる。
その値として正しいものを選択肢から選べ。
(1)0.15
(2)0.25
(3)0.35
(4)0.45

・解答
(2)。
![IMG_20201226_132837.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/4af90deb-a426-afe1-5cc4-a8fa62dc844c.jpeg)

■演習チャレンジ
![スクリーンショット (213).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/62ed067f-7fa6-1595-ab2c-c9f932206016.png)

・解答
(1)。
勾配のノルムが閾値より大きいときは、勾配のノルムを閾値に正規化するので、
クリッピングした勾配は、勾配×(閾値/勾配のノルム)と計算される。
つまり、解答は、gradient*rateである。

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

「映画おもしろかったね。ところで、とてもお腹が空いたから何か．．．。」

・解答
忘却ゲート

■演習チャレンジ
![スクリーンショット (214).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/455af5e0-cc22-7b77-604a-e95b0d47707e.png)

・解答
新しいセルの状態は、計算されたセルへの入力と1ステップ前のセルの状態に
入力ゲート、忘却ゲートを掛けて足し合わせたものと表現される。
つまり解答は、input_gate*a + forget_gate*cである。

##Section3)GRU
■GRUとは
従来のLSTMでは、パラメータが多数存在していたため、計算負荷が大きかった。
しかし、GRUでは、そのパラメータを大幅に削減し、精度は同等またはそれ以上が
望める様になった構造。

・メリット
計算負荷が低い

■GRUの全体像
![スクリーンショット (211).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/741f79e2-fb02-af05-f7ba-d8d7f5d9506c.png)

■確認テスト
LSTMとCECが抱える課題について、それぞれ簡潔に述べよ。

・解答
LSTM問題：パラメータ数が非常に多くなり計算量が多くなる
CEC問題：勾配が1で学習能力がない

■演習チャレンジ
![スクリーンショット (215).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/a63cdf86-449c-e91a-97e1-a2ed7082da99.png)

・解答
(4)。
新しい中間状態は、1ステップ前の中間表現と計算された中間表現の線形和で
表現される。つまり更新ゲートzを用いて、(1-z)*h + h_barと書ける。

■確認テスト
LSTMとGRUの違いを簡潔に述べよ。

・解答
LSTMは、計算量が多いのに対し、GRUは計算量が少ない。

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

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

■演習チャレンジ
![スクリーンショット (217).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/38971d82-4c8d-f999-a44c-f0a5e7e726f2.png)

・解答
(4)。
双方向RNNでは、順方向と逆方向に伝搬したときの中間層表現をあわせたものが特徴量と
なるのでnp.concatenate([h_f,h_b[::-1]],axis=1)である。

##Section5)Seq2Seq
■Seq2Seqとは
Encoder-Decoderモデルの一種を指す

・用途
機械対話や機械翻訳などに使用されている

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

□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と呼ばれ、入力した文の意味を表すベクトルとなる。

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

■HREDとは
過去n-1個の発話から次の発話を生成する。
Seq2Seq + Context RNN

■HREDの課題
・HREDは確率的な多様性が字面にしかなく、会話の「流れ」のような多様性がない
・HREDは短く情報量に乏しい答えをしがちである

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

■オートエンコーダとは
教師なし学習の一つ。
そのため学習時の入力データは、訓練データのみで教師データは利用しない。

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

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

・メリット
次元削減が行えること

・オートエンコーダの構造図
![スクリーンショット (212).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/b8dee159-1844-01ee-1202-ec6738173bcd.png)

■VAE
VAEはこの潜在変数zに確率分布z-N(0,1)を仮定したもの。

■確認テスト
![スクリーンショット (218).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/32e0ae20-0c89-dad1-19a8-3b9ec62e674e.png)

・解答
(2)。

■演習チャレンジ
![スクリーンショット (219).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791052/d17368bd-03fb-207d-0f7b-d9603fc55773.png)

・解答
(1)。
単語wはone-hotベクトルであり、それを単語埋め込みにより別の特徴量に
変換する。これは埋め込み行列Eを用いてE.dot(w)と書ける。

■確認テスト
seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ。

・解答
seq2seqとHREDの違い：seq2seqは、ある時系列データからある時系列データを作り出すネットワークで文脈無視でただ応答が行われるのに対し
HREDは、文脈の意味をくみ取った変換ができるようにしたもの。

HREDとVHREDの違い：VHREDはHREDにVAEの潜在変数の概念を追加したもの。

##Section6)Word2vec
ニューラルネットワークの学習を通して、単語の分散表現を得るための
ツールとしてword2vecがある。
word2vecには、単語の分散表現を学習する方法としてContinuous Bag-of-Words(CBOW)と
skip-gramの2つのニューラルネットワークが実装されている。

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

・課題
Seq2Seqの問題は長い文章への対応が難しい。
Seq2Seqでは、2単語でも100単語でも固定次元ベクトルの中に入力しなければ
ならない。

・解決策
文章が長くなるほどそのシーケンスの内部表現の次元も大きくなっていく
仕組みが必要となる。
この仕組みをAttention Mechanismという。


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

・解答
RNN：時系列データを処理するのに適したニューラルネットワーク
word2vec：単語の分散表現ベクトルを得る手法
seq2seq：ある時系列データから別の時系列データを得るネットワーク
Attention：時系列データの中身に対してそれぞれの関連性に重みをつける手法