CNN、RNNで文章分類を実装してみた



深層学習において文脈情報を学習させる方法としては、再帰的ニューラルネットワーク(RNN)を用いる方法と畳み込みニューラルネットワーク(CNN)を用いる方法があります。

今回はそれぞれの方法で、文章を学習させてラベル分類を行うモデルを、Chainerを使って実装しました。

RNNによる文章分類モデル

RNNは系列データを学習させることに適したニューラルネットワークです。

文章データは、文字や単語の時系列とみなすことができますので、文字や単語を値として捉えて文章の順番にしたがって入力することで、文脈情報を学習させることができます。

今回はネットから適当に拝借した英語の短文を用意し、それが質問かそうでないかを分類するモデルを実装してみました。

ここで、トリミングで記号を削除することで、「?」も削除することで、文脈情報のみから分類してみます。

実装は下記になります。

今回は無難にLSTMを用いて、出力した隠れ層ベクトルから分類判断してみるようにネットワークを構成してみました。

GitHub: https://github.com/Gin04gh/nlp/blob/master/LSTM_SentenceClassifier.ipynb

テストデータに対して、正解率0.75程度まで学習できました。

思いっきり過学習していますが笑

このようにして、文章をベクトルとして覚えさせることは、自然言語処理における深層学習の常套手段のようです。

CNNによる文章分類モデル

次にCNNによる文章分類を実装してみます。

仕組みとしては、下記の論文で提案されています。

https://arxiv.org/abs/1408.5882

実は今回はこちらの実装を試してみたくて、やってみた次第です。

イメージとしては下記のように計算します。

文章は一文字ずつ語彙数分のベクトルのBoWなどに変換をし、縦が文章の単語数、横が語彙数の行列として変換します。

これを畳み込みを行うのですが、フィルター(カーネル)サイズを、縦はN-gram分、横を語彙数分とすることで、N文字ずつBoWベクトルを畳み込みするようなイメージで計算を行います。

このN-gram、つまり何文字ずつ同時に読み込むかを複数パターン配列で渡し、それぞれ畳み込みのベクトルを計算し、分類の時に連結して使うことで、複数のN-gramで読み込んだベクトルを分類の情報に使えるという仕組みのようです。

実装が下記になります。

GitHub: https://github.com/Gin04gh/nlp/blob/master/CNN_SentenceClassifier.ipynb

こちらも、テストデータに対する正解度は0.75程度まで上がりました。

LSTMの時と同様、過学習してしまっているようですが、ひとまず、文章分類のアルゴリズムが理解できました。

まとめ

以上、LSTMとCNNでの文章分類をそれぞれ実装し、違いを確認してみました。

LSTMは単純な単方向でしたが、双方向にしたり、Attentionを追加するなどして、精度を向上させたりすることが考えられます。

CNNでも、今回はN-gramを1,2,3としましたが、もっと増やしみたり、またAttentionを追加してみるなども考えられます。

究極的には、両方合わせるとかも考えられなくはないでしょうけど、計算とかやばそう。

しかし今回のタスクでは、どちらにしても有効みたいですので、どのようなタスクにおいて、どちらが有効なのかといったところも気になりました。



 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です