深層学習 Day3

動画講義の要約

RNN,LSTM、自然言語の処理について

Section1: 再帰ニューラルネットワークの概念

RNNとは

時間に依存したニューラルネットワークの事。RNNと略される。

f:id:foino74:20210102010100p:plain
rnn

中間層への入力が、出力層の他に、前層からの中間層がある。

数学的記述

中間層入力 = 入力層の重み演算 + 前層の重み演算 + バイアス $$ u ^ t = W _ (in) x ^ t + Wz ^ {t-1} + b $$

活性化関数の演算で、中間層の値を出力 $$ z ^ t = f(W _ (in) x ^ t + Wz ^ {t-1} + b) $$

出力層入力 = 中間層の重み演算 + バイアス $$ v ^ t = W _ (out) z ^ t + c $$

活性化関数の演算で、出力層の値を出力

$$ y ^ t = g(W _ (out) z ^ t + c) $$

BPTTとは

RNNにおける誤差逆伝搬法の事。

数学的記述

 W _ {in} の勾配は 中間層入力の勾配をδとすると、δと入力層の値の転置、との積である。 $$ \dfrac{\partial E}{\partial w _ {in}} = \dfrac{\partial E}{\partial u ^ {t}}[\dfrac{\partial u ^ {t}}{\partial W _ {in}}] ^ {T} = \delta ^ {t} [x ^ {t}] ^ {T} $$

対応するソースコード

np.dot(X.T, delta[:,t].reshape(1,-1))

↑ delta[:,t]・・・t列目の抜き取り。これが1次元で、.reshape(1,-1))で2次元行列になる模様

 W _ {out} の勾配は 出力層へ入力の勾配を δ ^ {out}とすると、δ outと,中間層出力の転置、との積である。 $$ \dfrac{\partial E}{\partial w _ {out}} = \dfrac{\partial E}{\partial v ^ {t}}[\dfrac{\partial v ^ {t}}{\partial W _ {out}}] ^ {T} = \delta ^ {out,t} [z ^ {t}] ^ {T} $$

対応するソースコード

np.dot(z[:,t+1].reshape(-1,1), delta_out[:,t].reshape(-1,1)

 W の勾配は 中間層へ入力の勾配を δ とすると、δと,前奏の中間層出力の転置、との積である。 $$ \dfrac{\partial E}{\partial w} = \dfrac{\partial E}{\partial u ^ {t}}[\dfrac{\partial v ^ {t}}{\partial W }] ^ {T} = \delta ^ {t} [z ^ {t - 1}] ^ {T} $$

対応するソースコード

np.dot(z[:,t].reshape(-1,1), delta[:,t].reshape(1,-1))

Section2: LSTM

RNNの課題時系列を遡れば遡るほど、勾配が消失もしくは爆発していく事がある。 この問題を解決するために、構造自体を変えて対応したものがLSTM。

CEC

RNNの今までの中間層の役割は、 * 前層までの値を保持する * 学習する

だったが、値を保持する役割のみをCEC(記憶セル)という機構に任す。

入力ゲート

CECのどのようの値を保持させるかを、この入力ゲートが学習する。(値の保持はしない。) この学習が進むと、CECが効率よく、精度があがるようの前層までの情報を記憶、保持する事が出来る。

出力ゲート

CECの値をどのように使うかを、この入力ゲートが学習する。(値の保持はしない。) この学習が進むと、CECが効率よく、精度があがるように次層へ情報を記憶、保持する事が出来る。

忘却ゲート

CECにとってあまり必要でない情報を忘れさせるゲート。 たとえば、今日はとても天気が暑い。=> 単語としては、「今日」 「は」 「とても」 「天気」 「が」 「暑い」 「。」

暑いを推論したい時、「とても」はあまり重要ではない。 こういった前層からの情報は、捨てて良い。そのためのゲート。

覗き穴結合

ゲートにCEC状態を見させること。CECの状態もそれぞれのゲートの判断材料に使おうという話。 大した改善はなかったらしい。

LSTMの課題

計算負荷が高い。パラメータが非常に多いため。

Section3: GRU

パラメータを減らして、計算負荷を下げたい。

LSTMからCEC,入力ゲート、忘却ゲートがいなくなる。 代わりに、リセットゲート、更新ゲートを設置する。

Section4: 双方向RNN

過去の情報だけでなく、未来の情報を加味することで、精度を向上させるためのモデル。 文章の推敲や、機械翻訳等に使用される。

Section5: Seq2Seq

時系列データからある時系列データを生成する。エンコードして、デコードする。 翻訳などがSeq2Seqモデルである。

f:id:foino74:20200412203425j:plain
seq2seq

エンコード

入力時系列データを何らかの意味のあるベクトル表現に変換する事。 具体的には最後の隠れ層の事。 最後の隠れ層は、今までの情報をすべて保持しているので、文脈の特徴を表したベクトルとなっている。

デコード

何らかの意味のあるベクトル表現から新たな時系列データを出力する事。

embedding表現

具体例

単語 単語ID one hot 表現 embedding
1 [1,0,0,0,0・・・・] [0.2,0.4,0.6,・・・]
2 [0,1,0,0,0・・・・] [・・・・・・・・]
刺身 3 [0,0,1,0,0・・・・] [・・・・・・・・]
昨日 4 [0,0,0,1,0・・・・] [・・・・・・・・]

one-hot表現からサイズを減らしてembedding表現を作成する。 どのようにサイズを減らすか。deep learnigを使う。 単語の意味に着目。単語の意味が似ているものは、embeddingの行列の値が似るように学習させる。 embedding表現とは、単語の意味である。これをRNNの入力値として設定する。

Maked Langage Model

単語 単語ID one hot 表現 embedding
1 [1,0,0,0,0,0,0・・・・] [....]
2 [0,1,0,0,0,0,0・・・・] [....]
昨日 3 [0,0,1,0,0,0,0・・・・] [....]
ラーメン 4 [0,0,0,1,0,0,0・・・・] [....]
5 [0,0,0,0,1,0,0・・・・] [....]
食べ 6 [0,0,0,0,0,1,0・・・・] [....]
ました 7 [0,0,0,0,0,0,1・・・・] [....]

ベクトルを得たあと、モデルを学習する時に、ある一箇所を見えなくする。例えば、「昨日」 前後の単語から、どんな単語が入れば自然なのか。を学習させる。 「昨日」を出させるように学習させる。このような学習で、同じような意味が同じようなベクトル表現になる。らしい。

Seq2Seqの課題

一つの文に対して、一つの回答しか出来ない。

HRED

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

HREDの課題

文脈は読み取れるが、ありがちな答えしか返さない。「うん」とか「そうだね」とか

VHRED

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

オートエンコーダ

教師なし学習の一つ。つまり入力データは訓練データのみで教師データは使わない。 具体例として、28ピクセル * 28ピクセルの数字の画像を入れて、何か特徴を表したベクトルを生成。 そのベクトルから同じ画像を出力するニューラルネットワーク

オートエンコーダの構造

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

VAE

潜在変数zに正則化を行った構造のエンコーダ。(正則化の際の平均は0, 分散は1)

元のデータの類似度が、そのまま潜在変数に類似度に繋がって欲しいわけだが、 それを行ってくれるのが、VAE、とのこと。 エンコーダに少しノイズを加える事でデコーダに汎用性を持たす。

Section6: Word2vec

各単語の意味をベクトル表現で表す手法。具体例を以下に表す。

単語 単語ID one hot 表現 embedding
1 [1,0,0,0,0・・・・] [0.1,0.2,0.3]
2 [0,1,0,0,0・・・・] [0.4,0.5,0.6]
刺身 3 [0,0,1,0,0・・・・] [0.7,0.8,0.9]
昨日 4 [0,0,0,1,0・・・・] [1.0,1.1,1.2]

embeddingとは重み行列の、one hot表現に対応する特定の行の抜き出しの事。

単語のone-hot表現と 重みの演算について(重みは3列とする)

$$ W = np.array([[0.1,0.2,0.3][0.4,0.5,0.6] [0.7,0.8,0.9][1.0,1.1,1.2]・・・・]) $$ の場合、単語id 1のembedding表現は以下

[1,0,0,0,0・・・・] * W = [0.1,0.2,0.3]

one-hot表現よりembedding表現にした方が次元数が削減され、パフォーマンスが良くなる。

Section7: AttensionMechanism

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

文章が長くなるほどそのシーケンスの内部表現の次元も大きくなっていく、仕組みが必要になる。 これがAttention Mechanismで、「入力と出力のどの単語が関連しているのか」の関連度を学習する仕組みのことである。

確認テスト

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

(ans) 前層の中間層から現在の中間層を定義する際にかけられる重み

P45 下図のy1を1x・s0・s1・win・w・woutを用いて数式で表せ。 ※バイアスは任意の文字で定義せよ。 ※また中間層の出力にシグモイド関数g(x)を作用させよ。

(ans) $$ y _{1} = g(W _ {out} * S _ {1} + c) $$

$$ S _{1} = x _ {1} * W _ {in} + S _ {0} * W + b $$

P78 (ans) 忘却ゲート

「とても」はあまり影響を及ぼさない。このゲートは忘却ゲートで作用させる。

P88 LSTMとCECが抱える課題について、それぞれ簡潔に述べよ

(ans) 複雑で計算量が多くなった。

P92 LSTMとGRUの違いを簡潔に述べよ。

(ans) LSTM はGRUよりパラメータが多いので、GRUの方が計算量が少ない。

P109 (ans) 2

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

P119  

seq2seqとHRED、HREDとVHREDの違いを簡潔に述べよ。 (ans)

  • seq2seq・・・一文の一問一答に対して処理が出来る、ある時系列データからある時系列データを作り出すネットワークの事。
  • HRED・・・seq2seqの機構に、それまでの文脈の意味ベクトルを解釈に加える事で、文脈の意味を汲み取った文の変換(encode ,decode)が出来るようにしたもの。
  • VHRED・・・HREDが文脈に対して当たり障りのない回答(はい。とか、うん。とか。) しか出来なくなった対する解決策。VAEの考え方を取り入れて、当たり障りのない回答以上の出力を出せるように改良したもの。

P128 VAEに関する説明・・・自己符号化器の潜在変数に確率分布を導入したもの。

P137 (ans)

  • RNN・・・時系列データを処理するのに適したニューラルネットワーク
  • Word2Vec・・・単語の分散表現ベクトルを得る手法
  • seq2seq・・・一つの時系列データから別の時系列データを得るネットワーク
  • Attension・・・時系列データの中身に大して、関連性に重みをつける手法

演習チャレンジ

P26 (ans) 2

隣接単語(表現ベクトル)から表現ベクトルを作るという処理は、隣接している表現leftとrightを合わせたものを特徴量としてそこに重みを掛けることで実現する。つまり、W.dot(np.concatenate([left, right]))である。

P53 (ans) 2

RNNでは中間層出力h{t}が過去の中間層出力h{t-1},.., h{1}に依存する。RNNにおいて損失関数を重みWやUに関して偏微分するときは、それを考慮する必要があり、dh{t}/dh_{t-1} = Uであることに注意すると、過去に遡るたびにUが掛けられる。つまり、delta_t= delta_t.dot(U)となる。

P64 (ans) 1

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

P79 (ans) 3

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

input_gate* a + forget_gate* c

P90 (ans) 4

(1-z) * h + z * h_bar

更新ゲート、前層の隠れ層から新しい隠れ層の値が算出される模様。

P95 (ans) 4

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

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