Convolutional Neural Networks for Sentence Classificationを読んだ

仕事で研究しているときはもちろん論文を読むわけだけど、どういう論文読んでいるかが分かるとどういう研究をしようとしているか分かってしまうという問題(?)があり、学生の頃と比較するとほとんど書けていなかった*1。転職後、技術的な内容をブログなど通じて社外へのアウトプットが推奨されているということもあるので、またちまちまと読んだ論文のメモを書いていきたいと思います。周りに研究をやっている人が減ったというのもあるので、ブログに書くことで社外の人からのフィードバックが得られやすくなるといいな、というのもあります。

NLPは音声や画像のようにDNNの進撃を受けて様変わりしたわけでないと思いますが、そろそろ全く触っていないというのもどうなのかと思いました。ちまたに転がっているtensorflowのサンプルを理解するためにCNNを使ったsentence classificationの論文を読みました。

というわけであとはたんたんと論文を読んだメモ。文のsentiment analysisやsubjectivityを分類するようなタスクに対してCNNを使って実験してみました、という調査報告っぽいもの。

モデル

かなり簡単。文中の単語をword2vecのようにembedingするところから始める。すでにあるやつを利用してもいいし、randomから始めてもよい。embedingしたベクトルを横に(?)連結して行列の形式にする。その行列に対してあるwindow幅を持ってfilterをかます。filterというのは例えば部分行列である1-3行目に対して非線形な変換をかけ、スカラーに落す、というようなもの。

このwindowをどんどんずらしていき、1文に対して1つのベクトルを作る(cというベクトル)。そのcに対してmax-over-time poolingをかまして、スカラーにする。max-over-time poolingの操作により、長さが異なるものに対しても対応できるようにしている。filterをいくつか用意しておけば、そのfilter毎にpoolingの操作ができるので、それでまたベクトルを作る。そのベクトルに対し、softmaxで文のラベルを吐くというのが概要。簡単なことしかやっていなかった。

正則化

  • dropout
  • wのL2ノルムを閾値s越えていたら、sになるようにrescalingする

結果

7つの文の分類タスクのうち4つでstate-of-the-artな結果が出た(別にそこには興味があるわけではない)。いくつか設定があるけど、一番聞いてるのは初期値をword2vecの埋め込みにしているかどうか。ここで割とよくなってるのは半教師ありっぽいことがきいてて、低頻度語や未知語に対してマシになっているってことだろう。

*1:仕事に全く関係しないものは書いて問題ないと思うけど、線引きを考えると書くのがおっくうになる。あと社内の研究者に話していると書こうという欲求も満足されてしまう、などなど