BoW+ニューラルネットワークで文書分類

はじめに

前回、SVMを使い、Livedoor Corpusのカテゴリ分類を行った。
今回は、シンプルな2層ニューラルネットワークを使って文書分類器を作成してみる。
実装は、Python3、TensorFlowを利用して行った。

データの準備

前回作成したBoWモデルを学習用データ、テスト用データとして利用するため、特にデータの準備は必要ない。
Livedoor Corpusの各文章は、300次元のベクトルになっており、正解ラベル(カテゴリ)が付与されている状態である。

今回作成するニューラルネットワークイメージ

以下のような隠れ層1層+出力層の2層ニューラルネットワークを使う。

隠れ層の活性化関数にはシグモイド関数を利用して、出力層にはソフトマックス関数を利用する。
入力(文書ベクトル)に対して、正しい正解(カテゴリー)が得られるように、Weight、Biasの値を学習していく。

TensorFlowでの実装

まずは各種変数の準備。

隠れ層の活性化関数にはシグモイド関数を使い、出力層はソフトマックス関数を使う。
それぞれTensorFlowに用意されている関数を利用する。

これで、予測カテゴリー(y)が求められ、実際のカテゴリー(y_)との差分がコスト(予測との乖離)となる。
このコストを最小化するような最適なWeight、Biasを学習させることで分類器ができあがる。
尚、ここでは、コスト関数に「y – y_」の二乗誤差ではなく、交差エントロピーを使う。
また、過学習を防ぐために、L2正則化も行っておく。

さて、後は、上記コスト関数を最適化するよう勾配下降法を使う。
TensorFlowで用意されているGradientDescentOptimizer関数を使えば良い。
尚、学習率は、当関数のパラメータとして渡す。
今回は、0.001とした。

最後に、正答率を計算する式も定義しておく。

これで準備はできたので、後は実際の学習用データを使ってトレーニングを行い、テストデータでの正解率を見てみる。

結果

ここまでの内容を実行してみたところ、トレーニングデータに対しては97%くらいの正解率が出るが、テストデータに対しては87%と、典型的な過学習の状態になっていた。
その後、正則化パラメータのlambdaや隠れ層の数などを調整して、最終的な結果としては以下の通りまずまずの結果となった。