chainerで自然言語処理できるかマン

chainerで自然言語処理を勉強していくブログ

Zaremba et al., Recurrent Neural Network Regularization, ICLR 2015メモ

examplesにあるRNNLMのコードのベースになっている論文がコメントにあるようなので、読んだメモ。

[1409.2329] Recurrent Neural Network Regularization

概要

  • LSTMを使ったRNNsの場合、単純なDropoutがうまくいかない
    • また、実用的な応用では、大きなRNNだと過学習してしまうため、しばしば(かなり)小さいモデルが使われる
  • うまく適用する方法を紹介する

RNNとLSTM

  • RNNを h^{l-1}_{t}, h^{l}_{t-1} \to h^{l}_{t}とする
    • 「時刻tのひとつ前のレイヤーl-1」と「時刻t-1のレイヤーl」の隠れ層から「時刻tのレイヤーl」の隠れ層の値が決まる
    • よくあるRNNsの場合は、 h^{l}_{t} = f(T_{n,n}h^{l-1}_{t}+T_{n,n}h^{l}_{t-1})で計算
  • LSTMはこの時間の遅れによる影響を「memorize」できるようにすることで拡張している
    • だいたいは明示的に「メモリセル」を明示的に持つ
    • ここで考えるLSTMは、Input gate, Input modulation gate, Forget gate, Output gateを持つ
    •  h^{l-1}_{t}, h^{l}_{t-1}, c^{l}_{t-1} \to h^{l}_{t},c^{l}_{t}

提案手法

  • main ideaは、「non-recurrentな接続に対してのみドロップアウト操作を適用する」こと
    • BPTT(Backpropagation through time)な感じに時間展開したネットワークで考えると、現時刻tでの遷移にのみ適用
  • 各gateへの入力 h^{l-1}_{t}, h^{l}_{t-1}のうち、 h^{l-1}_{t}に対してランダムに値を0にする(dropout)
  • 考え
    • ユニットが過去に起きたイベントを覚えておくことは重要
    • しかし、すべての接続関係にDropoutを適用してしまうと、recurrentしている接続をしているところを混乱させることになってしまう
    • これはLSTMに長期記憶を格納することを難しくさせてしまう
    • そこで、recurrentしている接続にはドロップアウトを適用しないことで、過去の記憶能力をそのまま発揮できるようになる

実験

ネットワークの作り方とかやってみないとわからなそうなので、実験は後から見る。