深層学習「BRNNーSeq2Seq-Word2Vec」


#1. 双方向RNN（B-RNN)

普通のRNNは過去の情報だけ使っていたが、未来の情報も使って学習しようとするのが、双方向RNN(Bidirectional RNN)である。
文章処理で使う。


![BRNN.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/ce5a67c2-75a0-46f3-22fb-99dab7bc8880.png)


#2. Seq2Seq

##2.1. Seq2Seq構造（エンコーダ、デコーダモデル）

Seq2Seqは、機械翻訳に使う2つのNNモデルを連結したモデルになる。

エンコーダのNNモデル：文章の単語が順番に入る。つまり、文脈の情報が保持される。
デコーダのNNモデル　：文脈の情報を別の表現へ作り変える。

※英語を日本語に翻訳する動きである。

![Seq2Seq.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/e1314a42-3bb1-6616-3cd7-27342029842e.png)


##2.2. エンコーダRNN

エンコーダRNNの動きはざっくり以下。

1. エンコーダRNNは、インプットした文章を単語（トークン）に区切る。
1. それぞれの単語（トークン）をベクトル表現に変換する。
1. それぞれの単語（トークン）のベクトル表現を連結し、最終的に文章を表すベクトルになる。

例）
単語           :[私] [は] [、] [野球] [が] [好き] [。]
one hot vector :[1,0,.,.0] [0,1,.,.0] [0,0,.1,.0] [0,0,.,.1] [0,0,.,.0]
embedding      :[0.3,0.1,,0.2] [0.1,0.1,,0.5] [0.2,0.3,,0.2] [0.1,0.1,,0.1] 

One-hot ベクトルとは、(0,1,0,0,0,0) のように、1つの成分が1で残りの成分が全て0であるようなベクトルのことである。しかし、これは1万から数十万の大きさのベクトルになり、ものすごいメモリを無駄に使用する。
そこで、embedding表現を使って、数百の大きさにまで圧縮する。

ここで、embedding表現は、同じような単語は、同じようなベクトルになるようにする。特徴量として似たものにする必要がある。これは、BERTのようなMasked Language Model（MLM)で学習させる。
MLMは、ラベル付けをする必要が無い教師無し学習なので、モデルの進化のためにとても強力である。


##2.3. デコーダーRNN

デコーダーRNNは、エンコーダーRNNがとらえた文脈に対した回答を、単語（トークン）で出力を生成する。
日本語を英語に翻訳するとか、質問に対する回答をするとか、会話の応答とか。

動きとしては下記

1. 一単語目を生成確率に基づいて予測
1. 二単語目予測の入力に一単語目を入れる
1. 二単語目を予測
1. 上記を繰り返して文字列生成


##2.4. embedding表現：wrod2vec

![Word2vec.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/82556e62-2985-91ce-b989-f93e2016b539.png)


入力層では文字列が入ってくるわけだが、そのままNNへインプットすることは出来ない。単語に分解して、それを固定長ベクトルに変換する必要がある。
Word2vecは、この分解された単語をベクトル表現する手法である。Word2vecでは、意味が違い単語は、似たベクトルになる。

入力単語を、one-hot vectorに変換し、それをembedding表現に変換する。この時、埋め込み行列（embedded matrix)と呼ばれる重み行列が使われる。

~~~math

W_{embedding}=
\left[
\begin{matrix} 
w_{11} & w_{12} & \cdots & w_{1m} \\ 
\vdots & \vdots & \cdots & \vdots \\
w_{i1} & w_{i2} & \cdots & w_{im} \\
\vdots & \vdots & \cdots & \vdots \\
w_{n1} & w_{n2} & \cdots & w_{nm} \\
\end{matrix}
\right]

~~~

ここで、入力単語の【野球】のone-hot vector表現が34の時、34番目だけが1のベクトルになる。これと、上の埋め込み行列の内積を取ると、embedding表現となる。

~~~math

OneHotVecotr *W_{embedding}=

\left[
\begin{matrix} 
0 \\ 
\vdots \\
1 \\
\vdots  \\
0 \\
\end{matrix}
\right]

\left[
\begin{matrix} 
w_{11} & w_{12} & \cdots & w_{1m} \\ 
\vdots & \vdots & \cdots & \vdots \\
w_{i1} & w_{i2} & \cdots & w_{im} \\
\vdots & \vdots & \cdots & \vdots \\
w_{n1} & w_{n2} & \cdots & w_{nm} \\
\end{matrix}
\right]

=
\left[
\begin{matrix} 
0.3 \\ 
\vdots \\
0.1 \\
\vdots  \\
0.5 \\
\end{matrix}
\right]
~~~


#3. HRED

前節のSeq2Seqでは、一つの文章を入力して、一つの文章を出力する一問一答形式であった。
しかしそれだと広がりが無いので、文脈全体を扱えるようにしたものがHREDである。
HREDは、一つの文章（センテンス）だけではなく、過去の複数の文章から、回答文章を出力する。

#3.1. HREDの構造

HREDの構造は、Seq2Seq2を複数段接続した形になる。
Seq2Seqのエンコーダ出力のコンテキストを、次のSeq2Seqのコンテキストへ入力して、過去の文章を含めてエンコーダ出力を得るようにする。

![HRED.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/c75ec8b9-c0ea-f1ca-cdcd-01af044b3ac6.png)



#3.2. HREDの課題

HREDは、会話の流れのような多様性のある回答を出力出来ない。使えない。文脈を意識した応答はするが、「はい」とか「いいえ」みたいな応答しか出来ない。


#4. VHRED

HREDの問題を解決するのが、VHREDである。
VHREDは、HREDにVAEの潜在変数の概念を追加する事で、会話のバリエーションという問題を解決している。

#5. VAE
#5.1. オートエンコーダ

まずオートエンコーダに関して。

オートエンコーダは、教師無し学習の一つであり、次元削減を行うことが出来る。
これもエンコーダ、デコーダ構造である。
エンコーダで、潜在変数zを出力し、それを入力に、デコーダで元画像より次元の低い画像に復元する。
例えば28×28=784の画像を100の数字列に変換し、それをもとにオートエンコーダーは、似て非なる28×28=784の画像を出力する。

![オートエンコーダ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/5978a560-e6c6-8769-243b-209e8507f588.png)


##5.2. VAE

オートエンコーダでは、潜在変数zがどんな構造になるか分からない。下手すると、やたら簡単な数字列になってしまって、ただの分類器になっているかもしれない。例えば、「１」と「７」は形として似ているから、潜在変数zも似たようなベクトルであってほしいが、まったく異なるベクトル値になっているかもしれない。

そこで、VAE。

VAEは、オートエンコーダが、潜在変数zを作る際に、正則化を行うエンコーダである。これで、ｚを、確率分布（平均が０で分散が１）に従うような潜在変数ｚにする。

具体的なモデルは、潜在変数ｚの前後で、ノイズを与える。これにより、元データが毎回同じでも、ちょっとずつ違うデータとなるため、汎用性の高いモデルを学習しようとする。

![VAE.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/cb970d32-ac24-e8a3-58f1-cf9a543a4190.png)


#6. Attention Mechanism

Seq2Seqでは、文章が短くても長くても、固定次元ベクトルの中に入力しないといけないという制約があった。この解決には、文章長に応じて内部表現の次元を変化させる仕組みが必要である。
この仕組みがAttention Mechanism。
これは、文章の中で重要な単語を選び出すことが出来る。「私は野球が好き。」という文書であれば、「野球」。

最近の自然言語処理には全部入っているくらい強力である。