ディープラーニングで文書分類(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%の正答率となり、ニューラルネットワークでの分類結果とほぼ同程度の値となった。
ニューラルネットワークよりもトレーニングの時間が多くかかり、今回入力データやハイパーパラメータの調整までを行うことができたなかった。この辺りをもう少し調整することで、より高い正答率は出せるものと考えられる。

コメントを残す

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