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

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

次に、クラウド サーバーからデバイスにデータをダウンロードし、ローカル ファイルを指すように 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 回か 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 で設定)、モデルの仕様(ステップ 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 で問題なく動作します。モデルに関するメタデータがモデルに埋め込まれ、Android Studio がそのメタデータを読み取ることができるためです。

このメタデータには、モデルが認識する単語を表すトークンの辞書が含まれるため、非常に重要です。前に説明したように、単語がトークンになり、そのトークンに感情を表すベクトルが与えられると説明しました。モバイルアプリはこれらのトークンを認識する必要があります。たとえば "犬" は42 にトークン化され、ユーザーは「dog」と入力されました。場合、アプリは「dog」を文に変換する必要があります。42 ~ 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 アプリを編集する方法を学びます。