ディープラーニングで文書分類(2)

はじめに

前回ディープラーニング(CNN)を使って、文書分類を行う方法を示した。
今回は、前回示した方法を使って、Livedoor Newsコーパスをカテゴリー分類する分類器をTensorflowで実装していく。

全体像おさらい

今回作成するモデルの全体像は以下の図の通り。
詳細は前回の記事参照。

インプットデータの作成

Livedoor Newsコーパスの各文書を以下の図のような行列にする。
行=各文書の単語。行数を合わせる為に、500単語で区切っている。
列=各単語をWord2Vecで変換した100次元のベクトル。

models[‘文書名’]で、当該文書の行列が取得できるように事前準備をしておく。
Word2Vecモデル作成時に存在しなかった未知語については、[0,0,0,…0]のベクトルで置き換えておく。
500単語に満たない文章については[0,0,0,…0]でパディングし、また500単語を超える文書については、500単語で切ることで、行数を合わせている。

定数・変数の準備

Tensorflowで利用する定数・変数を用意しておく。

ドロップアウト変数は、出力層の計算をする際にプーリング層の結果を当変数の割合でランダムに間引いて行う為のもの。
過学習を防ぐ為に設定をする。
トレーニングの際は0.5、評価の際は1.0(間引かない)を設定する。

“x_expanded”は、インプット変数の次元を1つ増やしたもの。
TensorFlowのconv2d関数は、4次元のテンソル(バッチ、幅、高さ、チャネル)を入力とする為、ここでインプット変数の次元を1つ増やしている。チャネルとは画像であれば、RGBと3つの値を使うことができ、文書であれば「Word2Vec」「GloVe」などエンベディングの方法別にチャネルを設定することができる。今回は、「Word2Vec」のみを使う為、チャネルは1つとする。

畳み込み層・プーリング層

畳み込み層では、Tensorflowのconv2d関数を使って畳み込みの処理を行う。
フィルタのサイズとしては、3単語、4単語、5単語の3種類で、それぞれ128個のフィルタを使う。
フィルタは、各次元に1つずつスライドさせている。

Pooling層では、畳み込み層の結果をMax-poolingにてプーリング処理を行う。
その後、各フィルタの処理結果をプーリングした値をつなげて、1つにしている。

出力層

最後は、プーリング層の結果をインプットにカテゴリへの分類を行う。
DOC_CLASS_DEFで定義されているカテゴリのうち、predictionsで”1″が立っている場所のカテゴリが分類結果となる。

トレーニング及びテスト

コスト関数の定義とAdamオプティマイザーによる各パラメータの最適化を行う為の定義をする。

ここまでで各処理の定義ができた為、いよいよトレーニング及びテスト(評価)を行っていく。
前回のニューラルネットワークと同様ミニバッチにて、100件ずつランダムにピックアップしたデータをトレーニングデータとして使っている。
イテレーション回数は、14,000回とした。

最終結果としては、評価用データで92%の正答率となり、ニューラルネットワークでの分類結果とほぼ同程度の値となった。
ニューラルネットワークよりもトレーニングの時間が多くかかり、今回入力データやハイパーパラメータの調整までを行うことができたなかった。この辺りをもう少し調整することで、より高い正答率は出せるものと考えられる。

ディープラーニングで文書分類(1)

はじめに

前回前々回とSVM、ニューラルネットワークを使ったLivedoor Newsコーパス文書分類器を作成してきた。
今回からは、いよいよディープラーニングを使った文書分類器を作成してみたいと思う。ディープラーニングの中でも、畳み込みニューラルネットワーク (Convolutional Neural Networks: CNN) を使って、実装を行っていきたい。CNNと言うと、画像分類を思い浮かべる人が多いかと思われるが、最近はCNNを使った自然言語処理に関する研究も盛んになってきている。
まずは、文書分類に対してどのようにCNNを適用するのかを見ていきたい。
尚、CNN自体の説明は、ここでは行わない。

全体像

今回作成するモデルの全体像は、(いくらか省略はしているが)以下の図のようになる。
Livedoor Corpusの各文書をインプットに、畳み込み層(Convolution Layer)、プーリング層(Pooling Layer)と続き、9つのカテゴリーに分類する出力層へとつながっている。

入力層

これまで行ってきた分類問題では、インプットにBag of Wordsを利用してきた。これは、出現する単語全てを1つの袋に入れて、単語の出現回数を1つずつ数えるようなもので、文書のどの位置に単語が出現してきたのかは考慮されない。
それに対して、今回使うインプットは、以下の図のようになる。

行(縦)は、各文書の単語の並びだが、全文書で行数を合わせるために、最初の500単語で切っている。500単語に満たない文書の場合は、足りない部分を0でパディングしている。
列(横)は、以前作成した100次元のWord2Vecのモデルを利用する。
よって、500 x 100の行列がインプットとなる。

フィルタ

畳み込みを行う為のフィルタには、3単語、4単語、5単語の3種類を使うこととした。これにより、文書内に出てくる前後数単語を考慮した特徴量が抽出されることとなる。
またそれぞれの種類に対して128個のフィルタを使うので、合計384個のフィルタを利用することとなる。

畳み込み層

上述のインプットに対して、フィルタを1単語づつスライドさせながら掛け合わせることで畳み込みを行う。
また活性化関数にはReLU関数(ランプ関数)を使う。
結果、384個の特徴量が抽出できる。

プーリング層

畳み込み層で、それぞれのフィルタから計算された特徴量ベクトルからMax Poolingにより副次標本を取り、全ての副次標本をつなげて、ひとつのベクトルとする。

出力層

最後は、プーリング層の結果をインプットにソフトマックス関数を使って9つのカテゴリーに分類させる。

まとめ

今回は、Livedoor Corpusをカテゴリ分けする問題を、ディープラーニング(CNN)を使って行う方法について纏めてみた。
次回は、今回纏めた手法を、実際にTensorflowを用いて実装・テストを行っていきたい。