rnnlmを作ってみる その1 定義とか

深層学習による自然言語処理 の本によれば、

"言語モデル(Language model: LM)あるいは確率的言語モデル (probabilistic language model)とは、人間が扱う自然言語で書かれた文や文書が生成される確率をモデル化したものです"

となっています。

例えば、"今日はいい天気ですね"という文はよくある表現ですが、"今日はいい確率モデルですね"とは文脈によっては言うことは無いとは言えませんが最初の例よりは生成されにくいでしょうし、"カレーライスがいい確率モデルですね"などはわけがわからないですね。

このように、"文の自然さ"とか"文がよくありそうか"みたいなものはそれぞれ異なるのでそういったものを"文や文書が生成される確率"として表すのが言語モデルなんだと思います。

この場合、 P(今日はいい天気ですね) > P(今日はいい確率モデルですね) > P(レーライスがいい確率モデルですね) みたいな感じになるのだと思います。

{ \displaystyle {\bf y_t} } を単語とし、 { \displaystyle {\bf Y = \left( y_0, y_1, y_2, ... , y_T, y_{T+1} \right) } } が文を表すものとします。

{ \displaystyle {\bf y_t} } はone-hot ベクトルで表されているとします。

また、{ \displaystyle {\bf y_0} } { \displaystyle {\bf y_{T+1}} } はそれぞれ文頭と文末を表す擬似的な単語(BOSとEOS)とします。

再帰ニューラルネットワークを利用した言語モデル(recurrent neural network language model; rnnlm)は下記の様に表せます。

{ \displaystyle P_{rnnlm} ({\bf Y}) = \prod_{t=1}^{T+1} P(  {\bf y}_t | {\bf Y}_{\lbrack 0, t-1 \rbrack }) }

ここで { \displaystyle {\bf Y}_{\lbrack 0, t-1 \rbrack }   }{ \displaystyle {\bf Y = \left( y_0, y_1, y_2, ... , y_{t-1} \right) } } を表すものとします。

{ \displaystyle  P(  {\bf y}_t | {\bf Y}_{\lbrack 0, t-1 \rbrack }) } の計算は下記で行うとのことです。 (1層、活性化関数はtanhとした場合)

埋め込みベクトルの取得

{ \displaystyle \overline{{\bf y}}_t = {\bf E y}_{t-1} }

隠れ層の計算

{ \displaystyle {\bf h}_t = \tanh \left( {\bf W}^{(l)}  \begin{bmatrix}   \overline{{\bf y}}_t  \\  {\bf h}_{t-1}  \end{bmatrix}  + {\bf b}^{(l)}  \right)       }

出力層の計算

{ \displaystyle {\bf o}_t = {\bf W}^{(o)} {\bf h}_t + {\bf b}^{(o)}   }

確率化

{ \displaystyle {\bf p}_t = softmax ({\bf o}_t) }

確率の抽出

{ \displaystyle P(  {\bf y}_t | {\bf Y}_{\lbrack 0, t-1 \rbrack }) = {\bf p}_t \cdot {\bf y}_t  }

単語を入力するたびに、 { \displaystyle P(  {\bf y}_t | {\bf Y}_{\lbrack 0, t-1 \rbrack })   } を計算していき、その結果をすべてかけ合わせたものが { \displaystyle P_{rnnlm} ({\bf Y}) } となります

この出力からなんらかの誤差関数を評価してそれを最小化するようにEとかWを調整していくことになるのですが、それは次回書きます。