コメントスパムの機械学習モデルを構築する

1. 始める前に

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

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

前提条件

  • この Codelab は、機械学習に慣れていないデベロッパーを対象にしています。
  • この Codelab は、モバイル向けのテキスト分類を使ってみるパスウェイの一部です。前のアクティビティをまだ完了していない場合は、ここで停止して、前のアクティビティを完了してください。

学習内容

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

必要なもの

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. データをダウンロードする

次に、Cloud サーバーからデバイスにデータをダウンロードし、ローカル ファイルを参照するように 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 の基本原理はパターン マッチングの一種です。最初は、単語の事前トレーニング済みの重みを読み込み、スパムを示している単語とそうでない単語を予測してグループ化を行います。最初の段階では、モデルが開始されたばかりなので、おそらく 50:50 に近い値になります。

b94b00f0b155db3d.png

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

85f1d21c0b64d654.png

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

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

5be7967ec70e4302.png

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

トレーニングが完了したら、モデルをエクスポートできます。

TensorFlow は独自の形式でモデルをトレーニングします。このモデルをモバイルアプリ内で使用するには、TFLITE 形式に変換する必要があります。Model Maker はこの複雑さを処理します。

ディレクトリを指定してモデルをエクスポートするだけです。

model.export(export_dir='/mm_spam')

このディレクトリに model.tflite ファイルがあります。ダウンロードしたり、次の Codelab で Android アプリに追加する際に必要になります。

iOS に関する考慮事項

エクスポートした .tflite モデルは、モデルに関するメタデータが埋め込まれており、Android Studio がそのメタデータを読み取ることができるため、Android でうまく機能します。

このメタデータには、モデルが認識する単語を表すトークンの辞書が含まれているため、非常に重要です。単語がトークンになり、これらのトークンに感情のベクトルが与えられることを思い出してください。モバイルアプリはこれらのトークンを認識する必要があります。たとえば、「dog」が 42 にトークン化され、ユーザーが文中に「dog」と入力した場合、モデルが理解できるように、アプリは「dog」を 42 に変換する必要があります。Android デベロッパーは、この処理を簡単に行うための「TensorFlow Lite Task Library」を利用できますが、iOS では語彙を処理する必要があるため、語彙を利用できるようにする必要があります。Model Maker では、export_format パラメータを指定することで、これをエクスポートできます。モデルのラベルと語彙を取得するには、次のようにします。

model.export(export_dir='/mm_spam/', 
             export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])

9. 完了

この Codelab では、モデルを構築してエクスポートするための Python コードについて説明しました。最後に .tflite ファイルが生成されます。

次の Codelab では、このモデルを使用するように Android アプリを編集して、スパムコメントの分類を開始する方法について説明します。