【ラビットチャレンジ】深層学習day3

#Section1:再帰型ニューラルネットワークの概念
●RNN
　・時系列データに対応可能なニューラルネットワーク

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

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

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

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

[実装確認演習]
![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1895575/94a2aeca-1f05-3ef0-c10a-cdfd28cf4d02.png)

[演習チャレンジ]
●(<)にあてはまるのはどれか。
　・W.dot(np.concatenate([left, right]))

[確認テスト]
●y1をx,s0,s1,win,w,woutを用いて数式で表せ。
　また中間層の出力にシグモイド関数g(x)を作用させよ。
　・y1=g(wout・S1+C), s1=f(win・x1+w・s0+b)

#Section2:LSTM
●CEC
　・記憶機能だけを持つもの。
　・勾配消失および勾配爆発の解決方法として、勾配が1であれば解決できる。

●CECの課題
　・ニューラルネットワークの学習特性が無い。
　　→入力ゲートと出力ゲートを導入する。

●入力ゲート
　・入力情報をこんな感じで覚えておいてねという覚えさせ方を覚える。

●出力ゲート
　・どんな感じにCECに出力を利用するかを決める。

●LSTMブロックの課題
　・CECは過去の情報が全て保管されている。
　・過去の情報が入らなくなった場合、
　　削除することはできず、保管され続ける。
　・過去の情報が入らなくなった場合、そのタイミングで情報を忘却する機能が必要。

●忘却ゲート
　・CECの記憶を留めたり、忘れたりする。　　

[演習チャレンジ]
●RNNや深いモデルでは勾配の消失または爆発が起こる傾向がある。
　勾配爆発を防ぐために勾配のクリッピングを行うという手法がある。
　具体的には勾配のノルムがしきい値を超えたら、
　勾配のノルムをしきい値に正規化するというものである。
　以下は勾配のクリッピングを行う関数である。
　・gradient * rate

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

[確認テスト]
●LSTMに入力し空欄に当てはまる単語を予測したいとする。
　どのゲートが作業すると考えられるか。
　・忘却ゲート

[演習チャレンジ]
●sigmoid関数は要素ごとにシグモイド関数を作用させる関数である。
　・input_gate * a + forget_gate * c

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

[演習チャレンジ]
●(こ)にあてはまるのはどれか。
　・(1-z) * h + z * h_bar

[確認テスト]
●LSTMとGRUの違いを簡潔に述べよ。
　・GRUのほうが計算量が少ない。

#Section4:双方向RNN
●双方向RNN
　・過去の情報だけでなく、未来の情報を加味することで、
　　精度を向上させるためのモデル。
　　→実用例：文章の推敲、機械翻訳など。

[演習チャレンジ]
●(か)にあてはまるのはどれか。
　・np.concatenate([h_f, h_b[::-1]], axis=1)

#Section5:Seq2Seq
●Seq2Seqとは
　・Encoder-Decoderモデルの一種を指す。
　・具体的な用途：械対話や機械翻訳など。

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

●Encoder RNN処理手順
　・vec1をRNNに入力し、hidden stateを出力。
　　このhidden stateと次の入力vec2を
　　またRNNに入力してきたhidden stateを出力という流れを繰り返す。
　・最後のvecを入れたときのhidden stateをfinal stateとしてとっておく
　　このfinal stateがthought vectorと呼ばれ、
　　入力した文の意味を表すベクトルとなる。

●Decoder RNN
　・システムがアウトプットデータを単語等のトークンごとに生成する構造。
　
●Decoder RNNの処理
　①Decoder RNN: Encoder RNNのfinal stateから、
　　各tokenの生成確率を出力していきますfinal stateを
　　Decoder RNNのinitial stateとして設定し、Embeddingを入力。
　②Smapling: 生成確率に基づいてtokenをランダムに選択。
　③Embedding: ②で選ばれたtokenをEmbeddingして
　　Decoder RNNへの次の入力とする。
　④Detokenize: ①〜③を繰り返し、②で得られたtokenを文字列に直す。

●Seq2Seqの課題
　・一問一答しかできない。
　　問いに対して文脈も何もなく、ただ応答が行われ続ける。

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

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

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

●オートエンコーダ
　・教師なし学習の一つ。
　・そのため学習時の入力データは訓練データのみで教師データを利用しない。
　・MNISTの場合、28x28の数字の画像を入れて、
　　同じ画像を出力するニューラルネットワークということになる。

●オートエンコーダ構造
　・入力データから潜在変数zに変換するニューラルネットワークをEncoder。
　　逆に潜在変数zをインプットとして元画像を復元するニューラルネットワークをDecoder。
　・メリットは次元削減が行えること。
　　※zの次元が入力データより小さい場合、次元削減とみなすことができる。

●VAE
　・通常のオートエンコーダーの場合、
　　何かしら潜在変数zにデータを押し込めているものの、
　　その構造がどのような状態かわからない。
　・VAEはこの潜在変数zに確率分布z-N(0,1)を仮定したもの。
　・VAEは、データを潜在変数zの確率分布という構造に押し込めることを可能にする。

[確認テスト]
●seq2seqについて説明しているものを選べ。
　・(2)

[演習チャレンジ]
●(き)にあてはまるのはどれか。
　・E.dot(w) ※ドット積でEmbedding表現が取り出せる。

[確認テスト]
●seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ。
　・ある時系列データをつくるのがseq2seqで、
　　意味を与えられるようになったのが、HRED。
　・HREDが当たり障りのない回答しか作れなくなったことの解決策がVHRED。

#Section6:Word2Vec
●word2vec
　・課題:RNNでは、単語のような可変長の文字列をNNに与えることはできない。
　　→固定長形式で単語を表す必要がある。
　・学習データからボキャブラリを作成。
　　※わかりやすく7語のボキャブラリを作成したら
　　　本来は、辞書の単語数だけできあがる。
　・メリットは、大規模データの分散表現の学習が、
　　現実的な計算速度とメモリ量で実現可能となったこと。
　　　χ:ボキャブラリxボキャブラリだけの重み行列が誕生。
　　　o:ボキャブラリx任意の単語ベクトル次元で重み行列が誕生。

#Section7:Attention Mechanism
●seq2seqの課題
　・長い文章への対応が難しい。
　　seq2seqでは、2単語でも、10単語でも、固定次元ベクトルの中に入力しなければならない。
　　→文章が長くなるほどそのシーケンスの内部表現の次元も大きくなっていく、
　　　仕組みが必要となる。

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