TensorFlow Lite Model Maker を使用してコメントスパム検出モデルをトレーニングする

1. 始める前に

この Codelab では、TensorFlow と TensorFlow Lite Model Maker で作成されたコードを確認し、コメントスパムに基づいたデータセットを使用してモデルを作成します。元のデータは Kaggle で入手できます。これは 1 つの CSV ファイルにまとめられ、壊れたテキスト、マークアップ、繰り返しの単語などが削除されています。これにより、テキストではなくモデルに集中しやすくなります。

ここではレビュー用のコードを提供しますが、Colaboratory のコードを使用することを強くおすすめします。

前提条件

学習内容

  • Colab を使用して TensorFlow Lite Model Maker をインストールする方法。
  • Colab サーバーからデバイスにデータをダウンロードする方法。
  • データローダの使用方法。
  • モデルの作成方法。

必要なもの

  • Colab へのアクセス権

2. TensorFlow Lite Model Maker をインストールする

  • Colab を開きます。ノートブックの最初のセルを実行すると、TensorFLow Lite Model Maker がインストールされます。
!pip install -q tflite-model-maker

完了したら、次のセルに進みます。

3. コードをインポートする

次のセルでは、ノートブックのコードで使用する必要があるいくつかのインポートを行います。

import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

また、Model Maker の使用条件要件である TensorFlow 2.x が実行されたかどうかも確認します。

4.データをダウンロードする

次に、Colab サーバーからデバイスにデータをダウンロードし、ローカル ファイルを参照するように data_file 変数を設定します。

data_file = tf.keras.utils.get_file(fname='comment-spam.csv',
  origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv',
  extract=False)

Model Maker では、このようなシンプルな CSV ファイルからモデルをトレーニングできます。テキストの列とラベルの列を指定するだけでかまいません。この方法については、この Codelab の後半で説明します。

5. 事前に学習したエンベディング

通常、Model Maker ではモデルをゼロから作成する必要はありません。既存のモデルをニーズに合わせてカスタマイズします。

このような言語モデルでは、事前に学習したエンベディングを使用します。エンベディングの背後には、コーパス全体の各単語に数値を割り当て、単語を数値に変換するという考えがあります。エンベディングは、単語の「方向」を確立して、その単語の感情を判断するために使用されるベクトルです。たとえば、コメントスパム メッセージで頻繁に使用される単語のベクトルは類似の方向を指し、そうでない単語のベクトルは逆方向を指します。

事前に学習されたエンベディングを使用すると、大量のテキストから感情を学習した単語のコーパス(コレクション)から始めることができるため、ゼロから始めるよりもはるかに迅速に解を得ることができます。

Model Maker には、事前に学習されたエンベディングがいくつか用意されていますが、最も簡単で迅速なエンベディングは average_word_vec オプションです。

コードは次のとおりです。

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

num_words パラメータ

モデルで使用する単語数も指定します。

「多いほうが良い」と思うかもしれませんが、一般的には、各単語の使用頻度に応じて適切な数字があります。コーパスのすべての単語を使用すると、モデルは 1 回しか使用されない単語の方向を学習して確立しようとします。どのテキスト コーパスでも、多くの単語は 1 回か 2 回しか使用されません。全体的な感情にほとんど影響がないため、モデルで使用しても意味はありません。

num_words パラメータを使用すると、必要な単語数に基づいてモデルを調整できます。数値が小さいほどモデルが小さく、処理も速くなりますが、認識される単語が少ないため、精度が低くなる可能性があります。逆に、数値が大きいほど、モデルが大規模になり、処理が遅くなる可能性があります。スイート スポットを見つけることが重要になります。

wordvec_dim パラメータ

wordved_dim パラメータは、各単語のベクトルに使用する次元数です。調査から判断した経験則では、単語数の 4 乗根がよい出発点です。たとえば、2,000 単語を使用する場合は 7 から始めるとよいでしょう。使用する単語の数を変更する場合は、この値も変更できます。

seq_len パラメータ

一般に、入力値に対してモデルは非常に厳格です。言語モデルの場合、特定の静的な長さの文を分類します。これは、seq_len パラメータまたはシーケンス長によって決まります。

単語を数字またはトークンに変換すると、文がこれらのトークンのシーケンスになります。この場合、モデルは 20 個のトークンで文の分類と認識を行うようにトレーニングされています。これより長い文は切り捨てられます。また、短い場合は、パディングが行われます。コーパスには、この目的で使用される専用の <PAD> トークンがあります。

6. データローダを使用する

先ほど CSV ファイルをダウンロードしました。次に、データローダを使用してトレーニング データに変換し、モデルが認識できるようにします。

data = DataLoader.from_csv(
    filename=data_file,
    text_column='commenttext',
    label_column='spam',
    model_spec=spec,
    delimiter=',',
    shuffle=True,
    is_training=True)

train_data, test_data = data.split(0.9)

この CSV ファイルをエディタで開くと、各行には 2 つの値のみが表示され、その説明がファイルの先頭行に記述されています。通常、各エントリは列と見なされます。

最初の列の記述子は commenttext になっています。これは、各行の最初のエントリがコメントのテキストであることを示します。同様に、2 列目の記述子は spam であり、各行の 2 つ目のエントリは True または False, です。これは、そのテキストがコメントスパムかどうかを示します。他のプロパティには、先ほど作成した model_spec 変数と区切り文字を指定します。この場合は、ファイルがカンマ区切りなのでカンマになります。このデータをモデルのトレーニングに使用するため、is_TrainingTrue に設定します。

モデルのテストに使用するため、データの一部を残しておきます。データを 90% をトレーニング用、残りの 10% をテスト / 評価用に使用します。ここでは、テストデータをランダムに選択し、データセットの「最後」の 10% はテストに使用しないため、データを読み込むときに shuffle=True を使用してランダム化します。

7. モデルを構築する

次のセルは、単にモデルを構築するためのもので、1 行のコードです。

# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50,
                               validation_data=test_data)

このコードは、Model Maker でテキスト分類モデルを作成します。4 番目のステップで設定したように、使用するトレーニング データとモデル仕様を指定し、エポック数を指定します(この場合 50)。

ML の基本原理はパターン マッチングの一種です。最初は、単語の事前トレーニング済みの重みを読み込み、スパムを示している単語とそうでない単語を予測してグループ化を行います。最初の段階では、モデルが開始されたばかりなので、おそらく均等に分割されます。

c42755151d511ce.png

その後、このエポックの結果を測定し、最適化コードを実行して予測を微調整してから再試行します。これがエポックです。このため、epochs=50 を指定すると、その「ループ」が 50 回繰り返されます。

7d0ee06a5246b58d.png

モデルは、50 エポックに達するまでに、非常に高い精度を報告します。この場合は 99% と表示されています。

検証精度の値は、モデルが初めて処理したデータの分類結果を示しているため、通常はトレーニングの精度より少し低い値になります。先ほど残しておいた 10% のテストデータを使用します。

f063ff6e1d2add67.png

8. モデルをエクスポートする

  1. 次のセルを実行し、ディレクトリを指定してモデルをエクスポートします。
model.export(export_dire='/mm_spam_savedmodel', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB, ExportFormat.SAVED_MODEL])
  1. /mm_spam_savedmodel フォルダ全体を圧縮し、生成された mm_spam_savedmodel.zip ファイルをダウンロードします。これは次の Codelab で必要になります。
# Rename the SavedModel subfolder to a version number
!mv /mm_spam_savedmodel/saved_model /mm_spam_savedmodel/123
!zip -r mm_spam_savedmodel.zip /mm_spam_savedmodel/

9. 完了

この Codelab では、モデルを構築してエクスポートするための Python コードについて説明しました。これで、SavedModel に加えて、末尾にラベルと語彙が追加されました。次の Codelab では、このモデルを使用してスパムコメントの分類を開始する方法について説明します。

詳細