ゼロから作るDeep Learning2(その3)seq2seq

「7章 RNNによる文章生成」のメモ。

この章では、seq2seqと呼ばれる、時系列データから別の時系列データへ変換するニューラルネットワークを扱う。自然言語処理だと、翻訳や予約等に使われ、Encoder-Decoderモデルとも言う。

 

Encoder

 単語列の分散表現から文章の分散表現を生成する。

 

Decoder

 これまで与えられた単語から、次に出現する単語の確率分布を出力する。

 

確率分布から一番高いものを必ず選択することを決定的選択という。
(同じデータであれば、確率も同じなので、次に選択する単語は一意に決まる)

それに対して、確率的選択は、確率分布を使って、サンプリングして次に採用する単語を決める。
「1%の確率の単語でも、100回やれば1回ぐらいは選択される。毎回結果が変わる。(変わらない場合もある。)」

基本的に決定的なアルゴリズムを使ってしまうと、結果が一意に決まってしまうので、学習させにくい気がする。

のちに出てくるAttentionのキーからバリューを引く一連の処理は、決定的なのか確率的なのか。

 

ソースコードリーディング時によく出る単語

predict(): 単語のスコアを出す
choice(): スコアからサンプリングする

 

「7.2.2 時系列データ変換用のトイ・プロブレム」では、足し算をseq2seqで解く。

 

実際に足し算を計算しているわけではなく、数字の単語の分散表現の値でパターンを予測して出力している。

ある数字の次に「+」がきて、その次にある数字の単語がくるという文章の分散表現がEncoderで作られる。
※このネットワークでは、1桁ずつの数字がそれぞれ単語になる。

このネットワークの学習のポイントは、
数字の分散表現が実際計算する足し算と同じようなベクトルにうまくなるように学習されるはず。
(Embedding層の学習)

LSTMの重み付けがどう学習されていくかは、イメージがつきにくい。
数字と+記号の違いがうまく伝搬するように学習されていくのかもしれないが、
数字の列の大きさが固定ではないので、そうもいかない。
数字列 「+」 数字列 の並びでくるので、最初の数字単語の分散表現を最後までちゃんと
伝搬させた方がよいのだろうからそういう重み付けになるのかな。
で、「入力データの反転」で数字の桁を判定させている。
出力に近い方が(同じ重みつけなら)伝搬に有利なので、桁が大きい方を優先させた方がよいので
そのようになるのであろう。


例えば、人間なら、791305 + 3462 を計算する場合に、
なんとなく、 790000 + 3500 ぐらいの数になるだろうと予測して計算しているのに似ている。

 

■RNNの学習と推論の違い

RNNで文章生成を行う場合に、学習時と推論時ではデータの与え方が違う。
学習時は正解がわかっているため、時系列方向のデータをまとめて与えることができる。(なので、Decoderで正解データの単語列からLSTMの重みを学習させることができる。)
しかし、推論時には、次にくる未来のデータ(次の単語の確率)はわからないため、
次に出現する単語のサンプリングを次々に行っていく必要がある。

 

Attentionでは、時系列ではなく、まとめて与えるため、未来のデータがわからないようにMaskする。