KiyuHub

メシと寝所と呼吸と

このエントリーをはてなブックマークに追加

これもある意味Deep Learning,Recurrent Neural Network Language Modelの話 [MLAC2013_9日目]

この投稿は Machine Learning Advent Calendar 2013 の9日目の記事です.

本日は,Neural Network(NN)を利用したLanguage Model(LM),つまりNeural Network Language Model(NNLM)の一種であり, Recurrent Neural Network(RNN)を使ったRecurrent Neural Network Language Model(RNNLM)について説明します.

RNNLMに行く前置きとしてざっくりいくつか用意したので,知ってそうな人は先へ進んでください. 前置きを入れているうちに長くなりすぎた....

しかも,そもそもNNの説明し忘れたことに気づいて戦慄しました. とりあえず手前味噌関連リンクを貼っておきます.A yet another brief introduction to neural networks

はじめに

RNNLMを提案したのはThomas Mikolovと言うひとです.

最近話題になったword2vecの人でもあります.

ただしword2vecはRNNLMを実装したものでは無いので今日は本題ではありません. 今日の本題は,彼らがword2vecの前に公開している rnnlmというツール の中身の話になります.

“ある意味deep learning”と言うのは, 後にでてくるBPTTで \(\tau\) を大きな値をとると,時間的に深く層を見ている形になるためです, そのため多層ニューラルネットの問題にあったように, vanishing gradient problemが起きてしまうことがわかっています. が,今回はその辺の学習の難しさや対策は踏み込みません,あんまり調べてないので.

前置き1: Recurrent Neural Network

  • RNNはNNで時系列解析を行うためのもので,80年代に提案されました
  • ある時刻tにおける隠れ層の状態を,次の時刻t+1の入力に使う.そのため,時刻t+1では,その時刻における入力+前回の履歴を時間的文脈として利用する.
  • RNNを言語モデルとして応用したものがRNNLMです
../../../_images/rnn_intro.png

最初にRNNついて図を書いてみました,今後は右のシンプルなやつっぽい図のみを使います.

赤い部分が普通のNNと違うところで,前回の隠れ層の状態を保持して次回の入力に加える事で, 過去の履歴を利用します.

このRNNの特徴である赤と緑の部分を取り除くと, モデルの形はシンプルなNNと同じになり, 同じようにBackpropagationによってパラメータ( \(CONTEXT(t)\) の前後の矢印)を学習することができます.

しかし,やはりRNNに特化した学習アルゴリズムであるBackpropagation Through Time (BPTT)という ものもあり,後に説明します.

前置き2: Distributed Word RepresentationあるいはWord Embeddings

計算機で単語を扱う際に,単語をどう表現するかという話(表現方法はいくつかありますが,ニューラル言語モデル界隈だでの話です)

単語に連続値ベクトルを割り当てます.

で,ベクトルの中身がその単語の特徴をよしなに表現し,似た単語同士は似たベクトルになるよう学習します. どんなベクトル空間になっているかの分析は後の Analysis で紹介する論文とかでされてます.

../../../_images/word_embeddings.png

えんどう豆やカエルの卵やらに見えるものはベクトルです.

学習は,次のNeural Language Modelによって行われます.

その結果得られたDistributedなWordのRepresentationはWord Embeddingsと言われたりします.

前置き3: Neural Language Model

  • Y.Bengioが2003年に発表したNeural Languageベースのn-gram言語モデルです

  • 言語モデル,n-gram言語モデルの説明は長くなるので,以下の二つの目的があることだけ示して進めます
    • 過去の文脈(n-1個の単語)から,次に辞書中の各単語がどのくらいの確率で出てくるかを出力するモデル
    • 単語の特徴を表現した単語ベクトルの学習

上の論文の中に,以下の図が出てきます.

../../../_images/nnlm_bengio.png

この図を,先に作ってしまった 前置き2 の図にあわせて書き換えて説明すると,以下のようになります. 対応がわかりづらかったので,双方の対応する箇所にa.-e.という記号を付けました.

上の画像を右に90度回転させて,緑の四角をそれぞれの単語として見ます. 上の図は文脈が3単語(n=4)で,下の図は2単語(n=3)です.

../../../_images/neural_language_model.png

showという単語のベクトルと,meという単語のベクトルを辞書から取り出して(b), ふつうのNNと同じように,隠れ層(c),出力層(d)と計算していきます. (d)は後述のsoftmax関数により辞書と同じサイズの確率分布になっていて,各次元が,そこに対応する単語が次に出てくる確率になります. 今回の場合,正解はyourなので,yourの所の確率を取り出してみます(e)

これが,この節の冒頭でいったふたつの目的の一つ目の処理です.

学習の際は,

  • NNのパラメータ(太い三つの矢印)
  • 単語辞書中のベクトルの値(カエルの卵みたいな行列,厳密にはその時出てきている赤と緑の部分)

を同時に修正し,正しい予測ができるよう訓練します. 単語ベクトル(の辞書)も修正対象なので,正しい予測ができるようになった暁には,単語ベクトルも文脈が予測できるようななんか表現が得られていることが期待されます.

後半の2層Neural Networkから見ると,Backpropagationにおいて, 入力データにまで誤差が伝播していき修正されるイメージです.

Recurrent Neural Network Language Model

さて,本題のRNNLMです. ちょっと前置きだけで長くなりすぎた感がありますが, そのおかげでここの説明が最小限で済んで(いると信じて)います.

上のモデルが,固定長(n-1)な文脈を考えていたのに対し, 使う文脈に明確な境目を付けない という特徴があります.

Model Architecture

../../../_images/rnnlm_org.png

これまでに出てきた要素や例に合わせて書くとこんなかんじです.

../../../_images/rnnlm.png

入力される単語は,一つずつですが. \(s(\cdot)\) に,過去の文脈が保存されているという理屈です.

式(1),(2)について説明しますが,疲れてきたので箇条書きで行きます.

\[\begin{split}s(t) =& f(Uw(t) + Ws(t-1)) \\ y(t) =& g(Vs(t))\end{split}\]

まず上の式(1)ですが,

  • \(Uw(t)\) が, 前置き2 の図の真ん中の処理(辞書からfalconの単語ベクトルを引く)です

  • \(Ws(t-1)\) が,t-1番目の単語のときの隠れ層sを行列Wで写像しています.
    • イメージ的に説明すると,過去の文脈(s)と,その文脈が予測に与える影響(W)といった感じでしょうかね.
  • \(f(\cdot)\) は,ベクトル” \(\cdot\) “の各要素に独立にsigmoid関数を書けます(上図の式(3)左)
    • sigmoid関数によって,ベクトルの各要素は,0~1に非線形に変換されます,NNが非線形モデルな所以です.
  • \(f(Uw(t) + Ws(t-1))\) は,今回の単語ベクトルと,過去の文脈を両方詰め込んだ隠れ層ベクトル \(s(t)\) の計算ということになります.

次に下の式(2)

  • \(Vs(t)\) は,式(1)な感じで現在の単語w(t)と過去の文脈の情報s(t-1)が詰め込まれたs(t)から,t+1番目の単語を予測するための写像
    • 行列Vの各行は,辞書中の各単語に対応づいていて,その行と \(s(t)\) の内積を取り,その単語のスコアが決まります.
  • \(g(\cdot)\) は,ベクトル” \(\cdot\) “にsoftmax関数を書けます(上図の式(3)右)
    • 式を見ると,入力の各次元mを指数関数で0以上の値に変換したあと,0~1の範囲に正則化しています.
    • つまり,softmax関数によってベクトルがその要素の確率分布に変換されています.
    • その次元は辞書と同じサイズなので,各次元が,次に各単語が来る確率となっています.
  • \(g(Vs(t))\) :つまり,この式で上記の情報が詰まった \(s(t)\) から,次にどの単語が来るか予想するわけです.

RNNLMの構造と各式の説明はこんなところです.

Back Propagation Through Time (BPTT)

BackpropagationはNNにおける,ネットワークパラメータの学習法です. 普通のBPでは,時間を考慮せずに,その時の入力,出力,教師信号だけでモデルを修正します.

BTTTでは,それに加え過去の時間も考慮した修正を行います. 時刻tの隠れ層は,時刻tの入力時刻t-1の隠れ層,だけでなく,時刻t-2以前の隠れ層の値も影響しているため, もっと時間を遡って修正しようということです.

../../../_images/bptt.png

この図では,過去の歴史としてt-1,t-2の状態を保持しておいて誤差や修正に加えます.

  • 緑で,計算した各ベクトル \(s(\cdot), y(t)\) がどの位間違っているかを計算
  • 次にオレンジで,その間違いをもたらした原因であるパラメータ \(U,W,V\) を修正

という流れです,BPTTだと,過去の状態まで見て修正を行います 実際には,計算量的に過去の履歴を見るのは \(\tau\) までと決める,truncated BPTT が使われたりします.図では \(\tau = 3\) ということになります.

\(e_o, e_h\)

  • \(e_o(t)\) : \(y(t)\) は次の単語 \(w(t+1)\) を予測するための確率分布でした,なので \(w(t+1)\) との差が誤差になります.

  • \(e_h(t)\) : 隠れ層の誤差です.自分の先の誤差( \(e_o(t)\) )が重み( \(V\) )付きで逆向きに流れてきています.

  • \(e_h(t - \tau - 1)\) : 過去の隠れ層の誤差です.自分の先の誤差( \(e_h(t-\tau)\) )が重み( \(W\) )付きで逆向きに流れてきています.
    • 関数dは,隠れ層を計算する際に使ったシグモイド関数の微分をかけることを意味しています

\(U, V, W\)

まず,共通の形がありますが,これは具体的な更新の処理です.

  • \(X(t+1) = X(t) + なんたら\alpha - X(t)\beta\)

この \(なんたら\) の部分が勾配です.\(\alpha\) が学習率, \(\beta\) がL2正則化の係数です.

また,行列の勾配は,よく見るとその行列の”出力側の誤差”と”行列への入力”の直積( \(XY^T\) )だということがわかると思います

  • V: \(s(t)e_o(t)^T\)
  • U: \(\sum_{z=0}^{T} w(t-z)e_h(t-z)^T\)
  • W: \(\sum_{z=0}^{T} s(t-z-1)e_h(t-z)^T\)

U,Wについては,過去の分も合わせて足し合わせています.

以上が,BPTTの説明の一回の修正についての説明です. これを訓練データで回してモデルを学習します.

最終的に,

  • モデル全体を言語モデルとして使う
  • \(U\) を取り出して,単語の特徴ベクトルとして他のタスクの素性として使う

などのことができます.

モデルの拡張版も幾つか提案されていますが,ここでは割愛

Analysis

このモデルで学習されたベクトルについて興味深い分析が行われています. 論文のタイトルと概要だけしょうかいします.

word2vecでも有名な分析だと思いますが,

“King” - “Man” + “Woman” と,三つのベクトルを足し引きしてできたベクトルと一番近い辞書中の単語を調べると,”Queen”が出てきましたよというもの.

男女,国と首都,複数形と単数形など,”関係”というものがoffsetという形で埋め込まれていることを示しました.

同じ意味合いの形容詞でも,その強さは異なります.

okay < good < excellent

こんな感じに,

学習された単語ベクトル空間上に,名詞と同じように,形容詞にもなんらかのなにかがないのか?ということに焦点を当てて分析を行なった論文です.

実験設定がユニークで面白いです. こちら の著者スライドが分かりやすいと思います.

RNNLMをとりあげた資料たち

まだ軽く調べただけですが,rnnlmについて他に日本語で資料を探すと,

  • rnnlm - slideshare

    まさにrnnlmをメインに取り上げたスライドです.被ってしまいましたが記事は書き始めてしまってたので強行しましたw

  • ⾃然⾔語処理分野におけるディープラーニングの現状

    IBIS2013のdeep learningに関する企画セッションのうちの一つ,rnnlmだけでなくnlpにおける網羅的なスライドで分かりやすいです. IBISは残念ながら行けなかったけど, 企画セッションのページ に他のスライドも上がっているので良かったです.

  • deep learningの技術と未来

    過去のpfiセミナーの資料でdropout,curriculum learningなど,deep learningに装備することで成功している技術などにも触れてくれています. 最後の付録として,rnnlmによる研究が紹介されています.

あたりがあります.

まとめ

時系列を扱うNNであるRecurrent Neural Networkを利用したニューラル言語モデル, RNNLMについて記事を書きました.

nn,rnn,nnlm,rnnlmあたりのイメージがざっくりできてもらえればと思います.

このエントリーをはてなブックマークに追加