PythonライブラリKerasを用いたAI(ディープラーニング)による文書分類とモデルの評価

python活用 python

深層学習(ディープラーニング)手法を用いて自然言語処理してみたいです。

このような要望にお応えします。

今回は自然言語処理タスクの文書分類にフォーカスします。
PythonライブラリKerasを使用します。
Kerasは、ニューラルネットワークモデルの構築をサポートしてくれます。
このライブラリを用いて、文書分類モデルの構築と評価を行います。

分析対象は、Tensorflowに組み込まれているIMDB datasetを使用します。

文書分類モデルは、入力層にEmbedding層を用いたNN(Neural Network)を使用します。
また、Embedding層のパラメータを一から学習する方法とGloVeの単語埋め込み情報を組み込んで学習するモデルを構築します。

Pythonの実行環境は、Anacondaをベースにjupyter notebookを利用しました。
Anacondaでの開発環境については、下記の記事にまとめています。

今回使用するライブラリのバージョンは以下になります。

  • python 3.6.9
  • tensorflow 2.2.0
  • Keras 2.3.1

文書分類をはじめていきます。手順は、大きく以下のようになります。

  • 文書データの準備
  • モデルの定義
  • モデルの学習/評価

文書データの準備

今回使用するIMDBデータセットは、映画のレビューデータです。各レビューに対して否定的レビューと肯定的なレビューといったラベルが付与されています。各レビューの文書情報がすでに前処理済みの状態になっており、出現単語を数値列に変換されたかたちで参照することができます。今回の問題は、与えられたレビュー文書が肯定的なのか、あるいは否定的なのかを分類する2値分類の問題となります。

num_wordsは、文書に出現した単語のうち、最も頻繁に出現する10000個を保持するためのものです。
このため、稀に出現するのみの単語は破棄されます。

次に以下の処理で数値と単語の対応付け情報を取得します。

ベクトルに変換する方法は、大きく2つあります。

  • 文書を単語の出現に応じて0と1のベクトルに変換するone-shot表現で扱う。ただし、この方法では文書に出現しない単語を0として扱うため、無駄な情報を多く含む傾向にあります。
  • 文書を表現する配列をパディングにより同一の長さに揃え、文書データ数*パディング長のテンソル(行列)にします。Kerasでは、この処理を簡単に行うことができます。

今回は、文書を表現する配列をパディングにより同一の長さに揃える方法でデータの準備をします。
そのために、pad_sequencesメソッドを使用します。パディング長の長さを500に設定しています。

次に学習用データを用いて、モデル学習とパラメータチューニングを行うためにデータを分割します。

これでデータの準備は完了です。

モデルの定義

次は学習モデルを定義していきます。モデルは、NN(Neural Network)を使用します。
モデル構造は、以下のように設定します。

モデルの構造は、summary()を用いることで確認することができます。

最初のEmbedding層は、ベクトルに変換した文書を受け取り、各単語に対する埋め込みベクトルを返します。
埋め込みベクトルは、モデルの学習の中で獲得します。
この結果、(文書数, シーケンス長, embedding_size)の次元となります。

次は、GlobalAveragePooling1D層です。この層は、各文書データについて、シーケンスの次元方向に平均値を算出し、固定長のベクトルを返します。この層では、Embedding層からの情報を圧縮する役割があります。
GlobalAveragePooling1Dにより、各文書をembedding_size次元のベクトルに変換されます。

次にGlobalAveragePooling1D層からの情報を隠れユニット数16のDense(全結合)層に渡します。

今回は2値分類を行うタスクとなりますので、隠れ層ユニット1、活性化関数sigmoid関数を指定したDense層に渡します。

モデルの学習には、損失関数と最適化関数が必要です。
今回は2値分類タスクで出力は確率となりますので、損失関数としてbinary_crossentropy関数を使用します。binary_crossentropyは、確率分布間の距離を測定することができますので、今回の問題では真の分布と予測分布の距離を近づけることを目指しますのでこちらの損失関数を使用しています。最適化関数はadamを使用します。

これでモデル定義は完了です。

GloVeの単語埋め込み情報を組み込んで学習するモデルの構成は以下になります。

GloVeの学習済みパラメータを読み出し、embedding_matrixに格納します。
Embedding層のweightsにembedding_matrixを指定することでGloVeの学習済みのパラメータを組み込みます。

GloVeの学習済みパラメータは、こちら(http://nlp.stanford.edu/data/glove.6B.zip)からダウンロードして使用しています。

モデルの構造は、summary()を用いることで確認することができます。

これでモデル定義は完了です。

モデルの学習/評価

モデルを学習し、検証用データでモデルを評価してみます。
512個のサンプルからなるミニバッチを用いて各々40エポック、モデルを学習させます。
この結果、x_train, y_trainに格納した学習用の文書データを40回繰り返すことになります。
学習中は検証用データの10000サンプルを用いて、モデルの損失と正解率を確認します。

[Embedding層に対するGloVe単語埋め込み情報なしモデルの学習]

[Embedding層に対するGloVe単語埋め込み情報ありモデルの学習]

モデルを評価します。評価指標は、損失率、正解率です。

[Embedding層に対するGloVe単語埋め込み情報なしモデルの評価結果]

[Embedding層に対するGloVe単語埋め込み情報ありモデルの評価結果]

このように、Kerasを使用すれば比較的簡単にディープラーニングモデルを構築できます。また、モデルの学習/評価も簡単にできます。
今回は、映画レビュー文書の分類を行いましたが、自前の文書を用意して試すこともできますので活用してみてはいかがでしょうか。

ソースコード全体を載せます。

[Embedding層に対するGloVe単語埋め込み情報なしモデル]

[Embedding層に対するGloVe単語埋め込み情報ありモデル]

タイトルとURLをコピーしました