TensorFlowのチュートリアルである「映画レビューのテキスト分類」から2クラス分類(二値分類とも呼ばれる)について勉強したことをメモします。これから学習する人の参考になれば幸いです。
- 2クラス分類について
- 2クラス分類(二値分類)とは
- 多クラス分類とは
- 2クラス分類と多クラス分類の違い
- チュートリアル
- データの準備
- モデルの構築
- モデルの訓練と検証
2クラス分類について
2クラス分類(二値分類)とは
2クラス分類とは、任意のオブジェクトを二つのオブジェクトに分類することです。例えば、TensorFlowのチュートリアルでは「映画のレビュー」を「肯定的レビュー」か「否定的レビュー」のどちらかに分類しています。
多クラス分類とは
チュートリアルとは関係ないですが、2クラス分類の理解をより深めるために多クラス分類についても学んでおきます。
二つよりも多いオブジェクトに分類する場合は多クラス分類と呼ばれます。例えば、フルーツの写真を「りんご」「バナナ」「いちご」に分類する場合は多クラス分類です。
2クラス分類と多クラス分類の違い
チュートリアルとは関係ないですが、ここで2クラス分類との違いについて学んでおきます。
2クラス分類の大きな特徴は、出力層のニューロンが一つであることです。出力結果を0~1の範囲にして、二つのオブジェクトのパーセンテージを表すことが多いです。TensorFlowのチュートリアルでは、0が「否定的レビュー」、1が「肯定的レビュー」として表現しています。2クラス分類の出力結果にはシグモイド関数が利用されます。
一方、多クラス分類はカテゴリ毎に出力層のニューロンが存在します。フルーツの写真の例だと「りんご」「バナナ」「いちご」毎にニューロンがあり、それぞれ0~1の範囲で出力します。ここで重要なのは、出力結果の合計が必ず1になることです。ソフトマックス関数が利用され、「りんごである確率60%」「バナナである確率10%」「いちごである確率20%」といったように、出力の合計が1になります。

チュートリアル
チュートリアルは、大きく以下の流れで進みます。
- データの準備
- モデルの構築
- モデルの訓練と検証
データの準備
レビューデータについては、Internet Movie Databaseから抽出した整形済みの IMDB datasetをダウンロードして利用しています。利用時には全てのレビューを同じデータ長にしています。
モデルの構築
モデルの各層の説明については、以下の通りチュートリアルに詳しく記載されているので、割愛します。
- 最初の層は
Embedding
(埋め込み)層です。この層は、整数にエンコードされた語彙を受け取り、それぞれの単語インデックスに対応する埋め込みベクトルを検索します。埋め込みベクトルは、モデルの訓練の中で学習されます。ベクトル化のために、出力行列には次元が1つ追加されます。その結果、次元は、(batch, sequence, embedding)
となります。- 次は、
GlobalAveragePooling1D
(1次元のグローバル平均プーリング)層です。この層は、それぞれのサンプルについて、シーケンスの次元方向に平均値をもとめ、固定長のベクトルを返します。この結果、モデルは最も単純な形で、可変長の入力を扱うことができるようになります。- この固定長の出力ベクトルは、16個の隠れユニットを持つ全結合(
Dense
)層に受け渡されます。- 最後の層は、1個の出力ノードに全結合されます。シグモイド(
sigmoid
)活性化関数を使うことで、値は確率あるいは確信度を表す0と1の間の浮動小数点数となります。映画レビューのテキスト分類より抜粋
compile関数を使って上記のモデルをコンパイルしています。
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
各引数の説明は以下の通りです。
- optimizer・・・重みの修正を行うアルゴリズムを指定します。指定できるアルゴリズムの詳細についてはこちら。
- loss・・・予測データと正解データの誤差を表す損失関数を指定します。指定できる損失関数の詳細についてはこちら。
- metrics・・・モデル全体の評価を行う関数を指定します。accuracyの場合は正解率で評価します。指定できる関数についての詳細はこちら。
ニューラルネットワークのモデルを訓練する時は、予測データと正解データの誤差に従って層間の重みを修正していきます。上記のcompile関数における引数の役割を図示しました。

モデルの訓練と検証
本チュートリアルでは、上記で作成したモデルの訓練と検証まで実施しています。
訓練と検証の結果をエポック数と損失、エポック数と正解率のグラフで図示しています。エポック数は、一つの訓練データの学習回数を示します。

訓練中にエポック数が増える度に損失が減少し、正解率が上昇していることがわかります。しかし、検証では20エポック過ぎた辺りから損失も正解率も横ばいになります。
ニューラルネットワークはモデルを訓練すればするほど精度が上がるというわけではありません。学習して欲しくないパターンもあるからです。学習して欲しくないパターンを学習することによって、訓練用データでの正解率が上がる一方で、検証用データでの正解率が上がらない現象が発生します(過学習またはオーバーフッティングと呼びます)。チュートリアルでは、最適なエポック数が20程度で、それ以降は過学習ということがグラフからわかります。
以上です。