もちもちしている

おらんなの気まぐれブログ

Recurrent NNで文書のポジネガ判定する(モデル考案編)

この記事はDeep Learning Advent Calendar 7日目の記事です.

準備が大変なので前後半にわけてやりたいと思います.前半はモデルの考案と考えてる応用先について書きます.

はじめに

Deep Learningは画像認識や音声認識で多大な成果を挙げていますが,自然言語処理の分野でも大きな変化をもたらしたと思っています.現に,評判分析や機械翻訳などでDeep Learningを用いた手法は他を圧倒する成果を挙げています.

そのため,機械学習自然言語処理に取り組んでいる私にとっても,Deep Learningによる自然言語処理がとても熱いです.

今回は実験として,Deep Learningの一つであるRecurrent NNを使い,文書が肯定的(Positive)なのか,否定的(Negative)なのかを分類する感情分析をやってみたいと思います.

感情分析ではRecursive NN*1やParagraph Vectorのほうが有名な気がしますが,あえてRecurrent NN-LSTMで挑戦してみたいと思います.

Recurrent Neural Networks

通常のフィードフォワードニューラルネットワークは入出力は固定長で,文書などの可変長の入力に対応させるためには何かしらの方法で文書の特徴ベクトルを固定長にするが必要です.文書の特徴ベクトルを固定長にする手法は以下が一般的でしょう.

  • Bag-of-Wards
    文書中の単語の出現回数を素性とする

  • Binary
    文書中に単語が出現したか否かを1,0で表現して素性とする

  • TF-IDF
    TF:Term Frequency -> 単語の出現頻度,IDF:Inverse Document Frequency -> 単語の文書頻度であるdf(document frequency)の逆数*2

しかし,これら手法は「単語数がそのまま次元数になるので超高次元になりやすい」「語の順序が失われる」という問題があります*3

そこでRecurrent Neural Networks(RNN)の考え方です.

RNNは時系列を扱えるニューラルネットワークで,ある時刻tにおける隠れ層の状態を,次の時刻t+1の入力に使うものです.

これにより,文書や音声など,可変長の入力に対応しています.

f:id:olanleed:20151207231516p:plain

Long Short-Term Memory(LSTM)

RNNで可変長の入出力に対応できるようになったので無敵か!?と思うかもしれませんが,素朴なRNNには問題があります.

RNNの勾配計算にはBack Propagation Through Time(BPTT)という方法が使われています.RNNは時間方向に展開すると,非常に長いニューラルネットワークと見なすことができます.

これをBackPropagationして勾配を計算していくのですが,誤差信号が長い時間を遡っていくと,誤差信号が消失したり,非常に大きくなったりしたりします.

誤差信号が大きくなるのは正規化することで対処可能ですが,消失するのはどうにもなりません.

この問題に取り組んだのがLSTMです.LSTMは,この誤差信号をトラップして,うまいこと伝搬させる仕組みを設けることで,長期依存を学習させることを可能にしました.

LSTMはnishioさんのスライドで詳しく書かれています.

www.slideshare.net

ポジネガ判定で使うために考案したモデル

RNN-LSTMで以下の図のようなモデルをdeeplearning.netを参考に考えました.

f:id:olanleed:20151207214940p:plain

参考にしたモデルの改良点として

  • LSTMを多層化

  • Meam PoolingをMax Poolingに変更

  • 分類器にAROWを採用

が挙げられます.

Meam PoolingをMax Poolingにした理由として,Max poolingで得られる特徴ベクトルは識別性能が高いこと,線形分類器との相性が良いことです.その根拠は以下の論文で述べられています.

http://www.di.ens.fr/willow/pdfs/icml2010b.pdf

分類器にAROW*4を採用した理由としては,調整すべきハイパパラメータが少なく,識別性能が高いことから,個人的に使い勝手がいいという理由です.ギリギリまで精度が欲しい場合はSCW*5などを利用するといいかもしれません.

応用先

現在,私は修士論文とは別に,卒業までにやっておきたいとDeep Learningによるマルウェア検出に取り組んでいます.

構想としてはマルウェアを静的解析して得た素性(Hexdump,逆アセンブル)と動的解析して得た素性(APIの呼び出しなど)を,それぞれこのモデルで学習させ,アンサンブルさせることでうまいこと検出精度を高めることができないかと考えています.

おわりに

次回はこのモデルを実装し,文書のポジネガ判定をやってみたいと思います.お楽しみに.

*1:Recursive Neural Networks:http://www.iro.umontreal.ca/~bengioy/talks/gss2012-YB6-NLP-recursive.pdf

*2:TF-IDF:http://www.cse.kyoto-su.ac.jp/~g0846020/keywords/tf-idf.html

*3:この問題を解決している方法としてParagraph Vectorもあります

*4:Adaptive Regularization of Weight Vectors:http://www.cs.jhu.edu/~mdredze/publications/nips09_arow.pdf

*5:Exact Soft Confidence-Weighted Learning:http://icml.cc/2012/papers/86.pdf