深層学習 Day 3 Deep Learning Day 3


Day 3:

Day 3のまとめ->Day 3の問題演習->Day 3の実装演習のサマリーの考察という順番

【再帰型ニューラルネットワークの概念】
RNNとは?:時系列データに対応可能な、ニューラルネットワークである

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

例:音声データ・テキストデータ

RNNの記述

u[:,t+1] = np.dot(X, W_in) + np.dot(z[:,t].reshape(1, -1), W)z[:,t+1] = functions.sigmoid(u[:,t+1])
z[:,t+1] = functions.sigmoid(u[:,t+1])
np.dot(z[:,t+1].reshape(1, -1), W_out)
y[:,t] = functions.sigmoid(np.dot(z[:,t+1].reshape(1, -1), W_out))

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

【BPTT】Backpropagation Through Time
・状態変動の履歴を全時刻について保持し,時刻を串刺しにして計算する
・RNNの誤差逆伝搬法

参考: 
Back Propagation through time – RNN

【LSTM】Long short-term memory
RNNの課題時系列を遡れば遡るほど、勾配が消失していく。長い時系列の学習が困難。構造自体を変えて解決したものがLSTM。長期と短期の時間記憶を効果的に活用できる。パラメータ負荷が大きくて、計算負荷がかかる。RNNの一種であり、単純なRNNにおいて問題となる勾配消失問題をCECとゲートの概念を導入することで解決したものである。

【CEC】Constant Error Carousel
勾配消失および勾配爆発の解決方法として、勾配が1であれば解決できる。誤差を記憶する。

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

入力・出力ゲート:入力・出力ゲートを追加することで、それぞれのゲートへの入力値の重みを、重み行列W,Uで可変可能とする。CECの課題を解決。重み衝突を解消。

LSTMブロックの課題: CECは、過去の情報が要らなくなった場合、削除することはできず、保管され続ける。解決策過去の情報が要らなくなった場合、そのタイミングで情報を忘却する機能が必要。忘却ゲートの誕生

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

【忘却ゲート】forget gate
過去の情報を削除する機能 

【覗き穴結合】peephole connections
ゲート制御の結合を増やしてモデルの柔軟性を高める。ゲートにより遮断された情報を再度活用する

【GRU】gated recurrent unit (ゲート付き回帰型ユニット)
GRUとは?従来のLSTMでは、パラメータが多数存在していたため、計算負荷が大きかった。しかし、GRUでは、そのパラメータを大幅に削減し、精度は同等またはそれ以上が望める様になった構造。メリットは計算負荷が低い。

【双方向RNN】bidirectional RNN
過去の情報だけでなく、未来の情報を加味することで、精度を向上させるためのモデル。時刻に関して順方向と逆方向のRNNを構成し、それら2つの中間層表現を特徴量として利用する。
実用例: 文章の推敲や、機械翻訳等

【Seq2seq】
RNNを用いたEncoder-Decoderモデルの一種を指す。機械対話や、機械翻訳などに使用されている。一問一答しかできない。問に対して文脈も何もなく、ただ応答が行われる続ける。
入力系列をRNNで固定長のベクトルに変換(= Encode)し、そのベクトルを用いて系列を出力(= Decode)する。RNNの代わりにLSTMやGRUでも可能。

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

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

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

【HRED】Hierarchical Recurrent Encoder-Decoder
HRED = Seq2Seq+ Context RNN (Encoder のまとめた各文章の系列をまとめて、これまでの会話コンテキスト全体を表すベクトルに変換する構造。)過去の発話の履歴を加味した返答をできる。

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

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

【VHRED】Latent Variable Hierarchical Recurrent Encoder-Decoder
HREDに、VAEの潜在変数の概念を追加したもの。HREDの課題を、VAEの潜在変数の概念を追加することで解決した構造。

【オートエンコーダ】
教師なし学習の一つ。そのため学習時の入力データは訓練データのみで教師データは利用しない。次元削減が行えること。

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

【word2vec】
word embeddingの一種。
大量のテキストデータを解析し、各単語の意味をベクトル表現化する手法。RNNでは、単語のような可変長の文字列をNNに与えることはできない。固定長形式で単語を表す必要がある。大規模データの分散表現の学習が、現実的な計算速度とメモリ量で実現可能にした。ボキャブラリ×任意の単語ベクトル次元で重み行列が誕生。skip-gramとCBOWから成る。
word2vec VS one-hot vectors
デンス : スパース

分散表現(埋め込み表現)は、単語を低次元の実数値ベクトルで表す表現

参考: 
Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力

【Attention Mechanism】
長いシーケンスでの学習の精度を上げる。入力と出力のどの単語が関連しているのかの関連度を学習する仕組み。

確認テスト

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

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


(答)(2)W.dot(np.concatenate([left, right]) 隣接単語から表現ベクトルを作るためには、隣接している表現leftとrightを合わせたものを特徴量としてそこに重みを掛ける。

(問題)連鎖律の原理を使い、dz/dxを求めよ。$z=t^{2}$, $t = x + y$
(答)$dz/dx = ∂z/∂t∂t/∂x = 2t = 2(x+y)$

(問題)下図のy1をx, $s_{0}$, $s_{1}$, win, w, woutを用いて数式で表せ。※バイアスは任意の文字で定義せよ。※また中間層の出力にシグモイド関数g(x)を作用させよ。
(答)$z_{1}$=sigmoid($s_{0}W+x_{1}W_{(in)}+b$)
$y_{1}$=sigmoid($z_{1}W_{(out)}+C$)


(問)図はBPTTを行うプログラムである。なお簡単化のため活性化関数は恒等関数であるとする。また、calculate_dout関数は損失関数を出力に関して偏微分した値を返す関数であるとする。(お)にあてはまるのはどれか。
(1)delta_t.dot(W)(2)delta_t.dot(U)(3)delta_t.dot(V)(4)delta_t* V
(答)(2) 、dh_{t}/dh_{t-1} = Uであることに注意する。

(問題)シグモイド関数を微分した時、入力値が0の時に最大値 をとる。その値として正しいものを選択肢から選べ。
(答)(2)0.25


(答)(1) 勾配のノルムを||g||、threasholdをTとすると、もし ||g|| > Tなら、
g/||g|| * Tをgと更新する。

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

(答)(3) これは定義どおり。

(問題)LSTMとCECが抱える課題について、それぞれ簡潔に述べよ。
(答)LSTM


(答)(4)定義のまま。

LSTM: パラメータ負荷が多くて、計算負荷がかかる。
CEC: 勾配が常に1で渡され続けるため、重みという概念がなくなる。

(問題)LSTMとGRUの違いを簡潔に述べよ。
(答)GRUはLSTMに比べ、ゲートの数やパラメータの数が少ない。


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

(問題)下記の選択肢から、seq2seqについて説明しているものを選べ。
(答)(2)RNNを用いたEncoder-Decoderモデルの一種であり、機械翻訳などのモデルに使われる。


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

(問題)seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ。
(答)
seq2seq: 一問一答しかできない(質問単位)。問に対して文脈も何もなく、ただ応答が行われる続ける
HREAD: 過去の発話の履歴を加味した返答をできる。会話の「流れ」のような多様性が無い。
VHREAD: HREDにVAEの潜在変数の概念を追加することで、会話に多様性を生む。

seq2seq->HRED->VHREDの順で、進化していった。

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

(問題)RNNとword2vec、seq2seqとAttentionの違いを簡潔に述べよ。
(答)RNNで分散表現を使うと、コストが大きくなるので、それを解決したのが、word2vec。

seq2seqでは、長い文章への対応が難しいが、Attentionでは、長い文章での学習の精度を上げる。

3_1_simple_RNN_after.ipynb

2ビットの足し算をRNNでやる。weight_init_stdを1.00 から1.01に変更したところ、lossが下がり、安定した。
learning rate 0.1から0.01に変えると、誤差が急激に上がった。これは、学習が遅いのでまだ全然進んでいないためだろう。逆に0.1から0.5に上げると、誤差は更に小さくなった。これは学習が速いため、さらに誤差が小さくなったためだと思われる。hidden_layer_sizeを64まで増やすと、誤差が小さくなった。

XavierかHeでの重み初期化を行うと、誤差が小さくなった。Heの方がXavierより精度が良かった。XavierもHeも以前見たように、学習を速く進める効果があったので、そのためであろう。活性化関数をシグモイド関数からReLU関数に変更すると、勾配爆発が見られた。活性化関数をtanhに変更すると、Heの初期化を伴い、誤差は小さくなった。XavierもHeも使わないと、誤差は大きかった。

3_3_predict_sin.ipynb

maxlenを3->5->10と変えると、maxlenが長くなると、学習に時間がかかり、誤差が大きくなる傾向が分かった。iters_numを100->500->3000に増やしたが、sin波の近い波形を出力できている。100回では、sin波の平均をとるような事しか出来ていない。誤差もiters_numを増やしていくと、小さくなる傾向があるが、ある程度下がるとそれ以降はそれほど下がらない。