レポート_深層学習(後編1)


確認テスト(3-1)
サイズ5×5の入力画像を、サイズ3×3のフィルタで畳み込んだ時の出力画像のサイズを答えよ。
なおストライドは2、パディングは1とする。

答え
出力画像(縦サイズ) = (入力画像(縦サイズ) ＋　2×パディング －　フィルタ(縦サイズ) / ストライド)　＋　１　より
　　　　　　　　　　 (５＋２×１－３/２) ＋　１　＝　３
 
出力画像(横サイズ) = (入力画像(横サイズ) ＋　2×パディング －　フィルタ(横サイズ) / ストライド)　＋　１　より
　　　　　　　　　　 (５＋２×１－３/２) ＋　１　＝　３

よって、出力画像のサイズは3×3のサイズとなる。

#再帰型ニューラルネットワーク(RNN)

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

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

答え
過去(1つ前)の中間層から現在(今)の中間層にかけられる重み。

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

演習(3-3,4)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/e893c25c-2b4a-d455-b133-e4d79d7c98ab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/20a265dc-0aeb-19e4-5cae-167c08dc5fe0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/96da8d04-ff8d-6a1e-9e19-78e7ad9b3495.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/997e96b0-7bf0-f3f0-a6c0-dac0c06496a8.png)

コード実行結果、2000回までは、誤差が発生し、徐々に誤差の収束している。
tryとして、 hidden_layer_size(隠れ層)を100に変更した。
結果として、隠れ層を過剰に増やすことで、結果が収束するのに、かなりの計算が発生していることがわかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/2733c760-4444-8686-ac29-b8723834770d.png)

次に、weight_init_std(重みの初期値)を0.1に変更した。
重みの初期値を小さくしたことで、誤差の収束が起きていないことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/5e13e04e-0548-01f0-7275-d6e4d86df3db.png)

最後に、learning_rate(学習率)を0.5に変更した。
学習率を上げることで、誤差収束が早くなっていることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/0b4abace-f3ab-ce8e-54b7-dc909cfda5f8.png)

重みの初期値にXavierを用いる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/34fe57a2-68e8-b197-2fd6-8d35e4f7a955.png)
初期値を変更し、実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/3375c984-1b70-4468-3a25-20190b2571aa.png)
次に、Heで重みの初期値を設定し、実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/ae66b12e-f814-3565-c3f0-fc6313593b00.png)
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/8cbe5a3c-a676-7751-08cd-9149fb5e45e2.png)

活性化関数をReLU関数に変更し、勾配爆発を確認する。
(勾配爆発：勾配消失の逆で逆伝播するごとに指数関数的に大きくなり、収束しないこと。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/5251f6cd-d491-385d-ba4e-63277155c0a3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/08986ab8-1652-5475-369c-9851c45b76ff.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/14e5496f-14b4-4265-051d-7a26b0c2a487.png)
結果は勾配爆発しており、収束しないことがわかった。

tanhを用いて実行。
tanhの導関数を定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/d6de47c4-dfc5-d952-309c-d056ee96b4a9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/b47e7342-dca0-5e80-68bd-6b872e7b3617.png)
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/bd9e0702-74d1-3df1-9416-b71f90bdbc64.png)
ReLU関数同様に勾配爆発していることがわかる。

#BPTT
BackproPagation Through Timeの略で、誤差逆伝播法の一つである。

復習
誤差逆伝播法は、計算結果(出力)から
確認テスト(3-5)
連鎖律の原理を使いdx/dzを求めよ。
z=t^2   t=x+y

dx/dz = az/dt * dt/dx

az/dt = 2t
dt/dx = 1  より

dx/dz = 2t =2(x+y)

確認テスト(3-6)
下図のy1をx,s0,s1,Win,W,Woutを用いて数式で表せ。
※バイアスは任意の文字で定義し、中間層の出力にシグモイド関数g(x)を作用させよ。

RNNの課題：時系列をさかのぼれば遡るほど勾配が消失していくので長い時系列の学習が困難。

復習
勾配消失問題は、誤差逆伝播法で下位層に伝播していくにつれ、勾配がゆるやかになっていくこと。そのため、
下位層ではパラメータの更新がほとんど起こらず、最適値に収束しない。

確認テスト(3-9)
シグモイド関数を微分したとき、入力値が0のときに最大値をとる。
その値として正しいものをえらべ。

答え
0.25
シグモイド関数を微分すると、
(1-sigmoid(x)) * sugmoid(x)となり、xに0を代入し計算すると0.25となる。

勾配爆発
上記の演習で確認したように逆伝播するごとに勾配が指数関数的に大きくなり、収束しないこと。

#LSTMモデル

CEC：勾配消失及び勾配爆発の解決方法として勾配が1であれば解決できる。
　　 課題として、入力データについえ、時間依存度に関係なく重みが一律であること。

重みが一律になることに関しては、入力・出力デートで重みを可変して解決する。

LSTMモデルの課題
CECには、過去の情報すべてが保管される。そのため、過去の情報が不必要になった場合でも削除できず
保管し続けてしまう。

解決策として、過去の情報が不必要になった場合に、そのタイミングで情報を削除する機能を設ける→忘却ゲート

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

答え
「とても」が予測においてなくても影響を及ぼさないため忘却ゲートが作用すると思われる。

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

#GRU

LSTMモデルでは、パラメータの数が多く、計算負荷が高くなる問題がある。
それを解決するためにGRUが考案された。
パラメータの数を大幅に削減し、精度は同党またはそれ以上が望めるようになった。(実務では場合場合によるので必ずしも上位互換ではない)

確認テスト(3-12)
LSTMとCECが抱える問題を簡潔に述べよ。
LSTM：パラメータの数が多く計算負荷が重くなり結果算出まで時間がかかる。
CEC：過去の情報がすべて保存されてしまうため、不必要になった過去の情報を削除することができない。

確認テスト(3-13)
LSTMとGRUの違いを簡潔に述べよ。
LSTMとGRUの差分はパラメータの数がGRUが少なく、計算負荷が軽いこと。
(実務では両モデルを走らせたりして適切なモデルを選択している。)

#双方向RNN
過去の情報に加え未来の情報を加えることで精度を向上させるモデル。
実例：文章予測や、機械翻訳で用いられている。

#seq2seq
Encoder-Decoderモデルの一種で機械対話や機械翻訳などに利用される。

Encoder-RNN
ユーザーがインプットしたテキストデータを単語ごとにトークンに区切って渡す構造。
トークンごとに分割、トークンごとにID分解する。
Embedding
IDからそのトークンを表す分散表現ベクトルに変換する。

処理の流れ
ベクトル1をRNNに入力し、hidden-stateを出力。このhidden-stateと次のベクトル2をRNNに入力しhidden-stateを
出力する流れを繰り返す。最後のベクトルを入力したときのhidden-stateをfinal-stateとし、このfinal-stateが
thought-vectorと呼ばれ、入力した文の意味を表すベクトルとなる。

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

処理の流れ
Encoder-RNNのfinal-stateから、各トークンの生成確率を出力する。final-stateをDecoder-RNNのinstall-stateとして
設定しEmbeddingに入力する。
次に、生成確率に基づいてトークンをランダムに選択する(Sampling)。samplingで選択したトークンをEmbeddingして
Decoder-RNNの次の入力とする。上記を繰り返し、トークンを文字列に直す。

確認テスト(3-15)
下記の選択肢からseq2seqについて説明しているものを選べ。

答え
2：RNNを用いたEncoder-Decoderモデルの一種であり、機械翻訳などのモデルに使われる。

HRED
seq2seq + Context-RNNで構成される。
Context-RNNha
Encoderのまとめた各文章の系列をまとめて、これまでの会話コンテキスト全体を表すベクトルに変換する構造。これにより
過去の会話の履歴を加味した返答ができるようになる。

seq2seqの課題
　一問一答しかできない。問いに対して文脈も何もなく、ただ応答が行われる。より人間らしい発言を行うように考案されたので
　HREDである。

HREDは、過去のn-1個の発話から次の発話を生成する。これにより前の単語の流れに即して応答されるため、より人間らしい文章が
生成される。

HREDの課題
・確率的な多様性が字面しかなく、会話のような「流れる」多様性はない。同じ対話リストを与えられても、答えの内容が毎回同じものしか
　だせない。
・短く情報量に乏しい。短く良くある答えを学ぶ傾向がある。

VHRED
 HREDに、VAEの潜在変数の概念を追加した構造。VAEの追加によりHREDの課題を解決する。

確認テスト(3-16)
seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ。
seq2seqとHREDの違い
　seq2seqは、Encoder-Decoderモデルの一種で、HREDは、seq2seqにContext-RNNを合わせた構造である。
　seq2seqは一問一答であるがHREDは過去の対話から次の対話を生成する。

HREDとVHREDの違い
　HREDにVAEの潜在変数を追加した構造がVHREDである。HREDの課題である。情報量の乏しさなどを解消するために考案された。

AE(Auto-Encoder)
　教師無し学習の一つ。具体例MNISTの場合、28×28の数字の画像を入力すると、同じ画像を出力するニューラルネットワーク。

Auto-Encoder構造
　入力データから潜在関数zに変換するニューラルネットワークをEncoderといい、潜在変数zをインプットとして元画像を復元する
　ニューラルネットワークをDecoderという。メリットとして、次元削減が行える。
処理の流れ　
　入力データ→Encoder→潜在変数z→Decoder→出力データの順に処理を行う。

VAE
　通常のAuto-Encoderでは何かしら潜在変数zにデータをいれているが、その構造の状態がわからない。
　そのため、この潜在変数zに確率分布z～N(0,1)を仮定したものがVAEである。

確認テスト(3-19)
VAEに関する下記の説明文中の空欄に当てはまる言葉を答えよ。
「自己符号化器の潜在変数に____を導入したもの。」

答え
　確率分布

#Word2Vec
　RNNでは、単語のような可変長の文字列をNNに与えることができない。そこで、学習データからボキャブラリを作成する。
　例えば7語のボキャブラリを作成したら本来は、ディクショナリの単語数だけできあがる。

メリット
　大規模データの分散表現の学習が、現実的の計算速度とメモリ量で実現可能になった。
　従来：ボキャブラリ×ボキャブラリだけ重み行列ができる
　今回：ボキャブラリ×任意の単語ベクトル次元での重みベクトルができる。

Attention Mechanism
　seq2seqは、長文の対応が困難である。2単語でも、100単語でも、固定次元ベクトル内に入力しなければならない。
　解決策として、長文になっていくほど、シーケンスの内部表現の次元も大きくする必要がありAttention Machanismが考案された。
　入力と出力のどの単語が関連しているのか。関連度を学習する構造。

確認テスト(3-20)
RNNとWord2Vec、seq2seqとAttentionの違いを述べよ。
RNNとWord2Vecの違い
　RNNはボキャブラリ×ボキャブラリだけ重み行列が生成されるがWord2Vecはボキャブラリ×任意の単語解区取る次元の重みベクトルを生成する。
　これにより、Word2Vecを用いることで現実的な計算速度とメモリ量で計算可能となった。

seq2seqとAttentionの違い
　seq2seqでは長文の対応が困難で固定長の対応しかできないがAttentionでは、入力と出力の関連度を学習することで可変長の対応も可能となった。