TensorFlow.js: エッジケースを処理するコメントスパム検出モデルを再トレーニングする

1. 始める前に

この Codelab は、TensorFlow.js を使用したコメントスパム検出に関するこのシリーズの前の Codelab の最終結果をベースに構築するように設計されています。

前回の Codelab では、架空の動画ブログの完全に機能するウェブページを作成しました。TensorFlow.js を使用してブラウザで動作する事前トレーニング済みのコメントスパム検出モデルを使用して、コメントがサーバーに送信されて保存されたり、他の接続されたクライアントに送信されたりする前に、スパムのコメントをフィルタリングできました。

この Codelab の最終結果は次のようになります。

a4511e5d445706b1.gif

この方法は非常に有効でしたが、検出できないエッジケースがありました。モデルを再トレーニングして、処理できなかった状況に対応できます。

この Codelab では、自然言語処理(コンピュータで人間の言語を理解する技術)の使用に焦点を当て、作成した既存のウェブアプリを変更して(Codelab を順番に受講することを強くおすすめします)、多くのウェブ デベロッパーが今日存在する人気のあるウェブアプリのいずれかで作業する際に必ず遭遇するコメント スパムという非常に現実的な問題に取り組む方法を説明します。

この Codelab では、現在のトレンドや人気のトピックに基づいて、時間の経過とともに変化する可能性のあるスパム メッセージのコンテンツの変化を考慮して ML モデルを再トレーニングし、モデルを最新の状態に保ち、そのような変化に対応します。

前提条件

  • このシリーズの最初の Codelab を完了している。
  • HTML、CSS、JavaScript などのウェブ技術に関する基本的な知識。

作成するアプリの概要

以前に作成した、リアルタイムのコメント セクションを備えた架空のビデオブログのウェブサイトを再利用し、TensorFlow.js を使用してスパム検出モデルのカスタム トレーニング バージョンを読み込むようにアップグレードします。これにより、以前は失敗していたエッジケースでパフォーマンスが向上します。もちろん、ウェブ デベロッパーやエンジニアであれば、この仮説上の UX を変更して、日々の業務で取り組んでいるウェブサイトで再利用したり、クライアントのユースケースに合わせてソリューションを調整したりできます。たとえば、ブログ、フォーラム、Drupal などの CMS などです。

ハッキングを始めましょう。

学習内容

次のことを行います。

  • 事前トレーニング済みモデルが失敗したエッジケースを特定する
  • モデルメーカーを使用して作成されたスパム分類モデルを再トレーニングします。
  • この Python ベースのモデルをブラウザで使用するために TensorFlow.js 形式にエクスポートします。
  • 新しくトレーニングしたモデルとその辞書でホストされているモデルを更新し、結果を確認する

このラボでは、HTML5、CSS、JavaScript の知識があることを前提としています。また、「co lab」ノートブックで Python コードを実行して、Model Maker を使用して作成されたモデルを再トレーニングしますが、これを行うために Python の知識は必要ありません。

2. コーディングの準備をする

今回も Glitch.com を使用してウェブ アプリケーションをホストし、変更します。前提条件の Codelab をまだ完了していない場合は、こちらから最終結果を複製して開始点として使用できます。コードの仕組みについて疑問がある場合は、先にこの動作するウェブアプリの作成手順を説明した前の Codelab を完了してから、この Codelab に進むことを強くおすすめします。

Glitch では、[remix this] ボタンをクリックするだけで、フォークして編集可能な新しいファイルセットを作成できます。

3. 以前のソリューションのエッジケースを検出する

クローンを作成したウェブサイトを開いてコメントを入力してみると、ほとんどの場合、意図したとおりに動作し、スパムのようなコメントはブロックされ、正当な返信は許可されます。

ただし、モデルを壊すような言い回しを試すと、いつかは成功する可能性があります。試行錯誤を繰り返せば、以下のような例を手動で作成できます。既存のウェブアプリに次のコードを貼り付け、コンソールを確認して、コメントがスパムである確率を確認します。

問題なく投稿された正当なコメント(真陰性):

  1. 「この動画は素晴らしいですね。素晴らしい作品です。」Probability Spam: 47.91854%
  2. 「これらのデモは本当に素晴らしかったです。詳細を教えていただけますか?」Probability Spam: 47.15898%
  3. 「詳細を確認できるウェブサイトはありますか?」Probability Spam: 15.32495%

上記の確率はすべてかなり低く、アクションが実行される前にデフォルトの SPAM_THRESHOLD(最小確率 75%)をクリアしています(前の Codelab の script.js コードで定義されています)。

では、スパムではないのにスパムとしてマークされるような、もっと過激なコメントを書いてみましょう。

正当なコメントがスパムとしてマークされる(誤検出):

  1. 「彼が着けているマスクのウェブサイトを教えてください」Probability Spam: 98.46466%
  2. 「この曲を Spotify で購入できますか?どなたか教えてください。」Probability Spam: 94.40953%
  3. 「TensorFlow.js のダウンロード方法について、どなたかご連絡いただけますか?」Probability Spam: 83.20084%

残念ながらこれらの正当なコメントは、許可されるべきなのにスパムとしてマークされているようです。この問題を解決するにはどうすればよいですか?

簡単な方法の 1 つは、SPAM_THRESHOLD を 98.5% を超える信頼度になるように増やすことです。その場合、誤分類されたコメントが投稿されます。この点を踏まえて、以下にその他の考えられる結果について説明します。

スパム コメントがスパムとしてマークされた(真陽性):

  1. 「これはすごいけど、私のウェブサイトにあるダウンロード リンクの方がもっといいよ!」Probability Spam: 99.77873%
  2. 「薬を入手できる人を知っています。詳しくは私のプロフィールをご覧ください」スパムの可能性: 98.46955%
  3. 「私のプロフィールを見て、さらに素晴らしい動画をダウンロードしてください。http://example.com」 スパムの可能性: 96.26383%

元の 75% のしきい値では想定どおりに動作していますが、前のステップで SPAM_THRESHOLD を 98.5% を超える信頼度に変更したため、ここでは 2 つの例が通過することになります。したがって、しきい値が高すぎる可能性があります。96% の方が良いかもしれません。ただし、この方法では、前のセクションのコメント(偽陽性)の 1 つが 98.46466% と評価されたため、正当なコメントであるにもかかわらずスパムとしてマークされます。

この場合は、これらの実際のスパム コメントをすべてキャプチャし、上記の失敗に対して再トレーニングするのが最善です。しきい値を 96% に設定すると、すべての真陽性がキャプチャされ、上記の偽陽性のうち 2 つが除外されます。1 つの数値を変更しただけにしては、悪くない結果です。

続けます。

投稿が許可されたスパムコメント(偽陰性):

  1. 「プロフィールにアクセスして、さらに素晴らしい動画をダウンロードしましょう!」スパムの可能性: 7.54926%
  2. ジムのトレーニング クラスが割引になります。プロフィールをご覧ください。」スパムの確率: 17.49849%
  3. 「GOOG 株が急騰した!お早めにご利用ください。」Probability Spam: 20.42894%

これらのコメントについては、SPAM_THRESHOLD 値をさらに変更しても何もできません。スパムのしきい値を 96% から約 9% に引き下げると、正当なコメントがスパムとしてマークされることになります。正当なコメントの 1 つは 58% の評価を受けています。このようなコメントに対処する唯一の方法は、このようなエッジケースをトレーニング データに含めてモデルを再トレーニングし、スパムかどうかについて世界観を調整することを学習させることです。

現時点ではモデルの再トレーニングしか選択肢がありませんが、スパムと判定するしきい値を調整してパフォーマンスを改善する方法も説明しました。人間にとっては 75% はかなり自信があるように見えますが、このモデルでは、例の入力でより効果的に機能させるために、81.5% 近くまで引き上げる必要がありました。

さまざまなモデルでうまく機能する魔法のような値は存在しません。このしきい値は、実際のデータでテストしてうまく機能する値を確認した後、モデルごとに設定する必要があります。

誤検出(または誤検出)が重大な結果を招く可能性がある状況(医療業界など)では、しきい値を非常に高く調整し、しきい値を満たさないものについては手動審査をさらにリクエストすることがあります。これはデベロッパーの選択であり、ある程度のテストが必要です。

4. コメントスパム検出モデルを再トレーニングする

前のセクションでは、モデルで失敗するエッジケースを特定しました。これらの状況に対処するには、モデルを再トレーニングするしかありません。本番環境では、スパムとして報告されたコメントをモデレーターが確認し、実際にはスパムではないと判断して再トレーニング用にマークすることで、このようなコメントが徐々に見つかる可能性があります。これらのエッジケースの新しいデータが多数収集されているとします(可能な場合は、これらの新しい文のバリエーションを用意することをおすすめします)。ここでは、これらのエッジケースを考慮してモデルを再トレーニングする方法について説明します。

事前作成済みモデルの概要

使用した事前作成モデルは、Model Maker を介してサードパーティによって作成されたモデルで、「平均単語エンベディング」モデルを使用して機能します。

モデルは Model Maker で構築されているため、モデルを再トレーニングするために Python に切り替えてから、作成したモデルを TensorFlow.js 形式でエクスポートしてブラウザで使用する必要があります。幸いなことに、Model Maker を使用するとモデルを非常に簡単に使用できるため、この手順は簡単に理解できます。プロセスについてはこちらでご案内しますので、Python を使用したことがない場合でもご安心ください。

Colabs

この Codelab では、さまざまな Python ユーティリティがインストールされた Linux サーバーの設定はあまり重要ではないため、「Colab ノートブック」を使用してウェブブラウザからコードを実行するだけでかまいません。これらのノートブックは「バックエンド」に接続できます。これは、いくつかのものがプリインストールされたサーバーにすぎません。そこから、ウェブブラウザ内で任意のコードを実行して結果を確認できます。これは、迅速なプロトタイピングや、このようなチュートリアルでの使用に非常に役立ちます。

colab.research.google.com にアクセスすると、次のようなウェルカム画面が表示されます。

6b82258445885c50.png

ポップアップ ウィンドウの右下にある [新しいノートブック] ボタンをクリックすると、次のような空白の Colab が表示されます。

2d52c8f7afa88564.png

これで、次のステップでは、フロントエンドの Colab をバックエンド サーバーに接続して、記述する Python コードを実行できるようにします。右上にある [接続] をクリックし、[ホストされているランタイムに接続] を選択します。

fa5f578a1a3d352b.png

接続すると、次のように RAM とディスクのアイコンが表示されます。

541c9894fb39d4cb.png

よくできました!これで、Python でコーディングして Model Maker モデルを再トレーニングできるようになりました。手順は次のとおりです。

ステップ 1

現在空の最初のセルに、次のコードをコピーします。このコマンドを実行すると、Python のパッケージ マネージャー「pip」を使用して TensorFlow Lite Model Maker がインストールされます(このコードラボの読者の多くは、JS エコシステムでよく知られている npm に似ていることをご存じでしょう)。

!apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0
!pip install -q tflite-model-maker

ただし、コードをセルに貼り付けても実行されません。次に、上記のコードを貼り付けたグレーのセルにカーソルを合わせると、次の図のように、セルの左側に小さな「再生」アイコンが表示されます。

7ac5e3516bed6335.png 再生ボタンをクリックして、セルに入力したコードを実行します。

Model Maker がインストールされていることがわかります。

651f21b04fb648cc.png

このセルの実行が完了したら、次の手順に進みます。

ステップ 2

次に、最初のセルの後にさらにコードを貼り付けて個別に実行できるように、次のように新しいコードセルを追加します。

869904a9d774c455.png

次に実行されるセルには、ノートブックの残りの部分のコードで使用する必要があるいくつかのインポートが含まれています。作成した新しいセルに以下をコピーして貼り付けます。

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')

Python に詳しくなくても、かなり標準的な内容です。ここでは、スパム分類子に必要なユーティリティと Model Maker 関数をインポートしています。また、Model Maker の使用条件要件である TensorFlow 2.x が実行されているかどうかも確認します。

最後に、前と同様に、セルにカーソルを合わせたときに再生アイコンを押してセルを実行し、次のステップのために新しいコードセルを追加します。

ステップ 3

次に、リモート サーバーからデバイスにデータをダウンロードし、ダウンロードしたローカル ファイルのパスになるように training_data 変数を設定します。

data_file = tf.keras.utils.get_file(fname='comment-spam-extras.csv', origin='https://storage.googleapis.com/jmstore/TensorFlowJS/EdX/code/6.5/jm_blog_comments_extras.csv', extract=False)

Model Maker では、ダウンロードしたようなシンプルな CSV ファイルからモデルをトレーニングできます。テキストの列とラベルの列を指定するだけでかまいません。その方法はステップ 5 で説明します。必要に応じて、CSV ファイルを直接ダウンロードして内容をご確認ください。

このファイルの名前は jm_blog_comments_extras.csv です。このファイルは、最初のコメントスパム モデルの生成に使用した元のトレーニング データと、検出した新しいエッジケース データを組み合わせたものです。学習する新しい文に加えて、モデルのトレーニングに使用した元のトレーニング データも必要です。

省略可: この CSV ファイルをダウンロードして最後の数行を確認すると、以前は正しく動作していなかったエッジケースの例が表示されます。これらは、事前作成モデルが自己トレーニングに使用した既存のトレーニング データの末尾に追加されたばかりです。

このセルを実行し、実行が完了したら新しいセルを追加して、ステップ 4 に進みます。

ステップ 4

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

Model Maker には、事前に学習されたモデル エンベディングがいくつか用意されていますが、最も簡単で迅速なエンベディングは average_word_vec です。これは、前の Codelab でウェブサイトの構築に使用したものです。以下にコードを示します。

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 パラメータを使用すると、必要な単語数に基づいてモデルを調整できます。数値を小さくすると、モデルが小さく、処理も速くなりますが、認識される単語が少ないため、精度が低くなる可能性があります。この数値を大きくすると、モデルが大規模になり、処理が遅くなる可能性があります。最適なバランスを見つけることが重要です。ユースケースに最適な方法を見つけるのは、ML エンジニアの役割です。

理解する

wordvec_dim

パラメータ

wordvec_dim パラメータは、各単語のベクトルに使用する次元数です。これらのディメンションは、本質的には、任意の単語を測定できるさまざまな特性(トレーニング時に ML アルゴリズムによって作成される)であり、プログラムはこれを使用して、意味のある方法で類似した単語を最適に関連付けようとします。

たとえば、単語の「医療」度合いを示すディメンションがある場合、「pills」のような単語はこのディメンションで高いスコアを獲得し、「xray」のような他の高いスコアの単語と関連付けられますが、「cat」はこのディメンションで低いスコアを獲得します。「医療ディメンション」は、スパムを判断するうえで、他の潜在的なディメンションと組み合わせると有用であることが判明する可能性があります。その場合、重要なディメンションとして使用される可能性があります。

「医療」の次元でスコアが高い単語の場合、単語と人体を関連付ける 2 番目の次元が役立つ可能性があります。「脚」、「腕」、「首」などの単語は、ここで高いスコアを獲得する可能性があり、医療分野でもかなり高いスコアを獲得する可能性があります。

モデルはこれらのディメンションを使用して、スパムに関連付けられる可能性の高い単語を検出できます。スパムメールには、医療と人体の両方に関連する単語が含まれている可能性が高いかもしれません。

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

理解する

seq_len

パラメータ

一般に、入力値に対してモデルは非常に厳格です。言語モデルの場合、特定の静的な長さの文を分類します。これは、seq_len パラメータによって決まります。ここで、これは「シーケンス長」を表します。単語を数字(またはトークン)に変換すると、文がこれらのトークンのシーケンスになります。そのため、モデルは(この場合)20 個のトークンを含む文の分類と認識を行うようにトレーニングされます。これより長い文は切り捨てられます。短い場合は、このシリーズの最初の Codelab と同様にパディングされます。

ステップ 5 - トレーニング データを読み込む

先ほど 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 です。これは、そのテキストがコメントスパムかどうかを示します。他のプロパティには、手順 4 で作成したモデル仕様と区切り文字を指定します。この場合は、ファイルがカンマ区切りなのでカンマになります。また、シャッフル パラメータを設定して、トレーニング データをランダムに並べ替え、類似している可能性のあるものや一緒に収集されたものがデータセット全体にランダムに分散されるようにします。

次に、data.split() を使用して、データをトレーニング データとテストデータに分割します。.9 は、データセットの 90% がトレーニングに使用され、残りがテストに使用されることを示します。

ステップ 6 - モデルを構築する

モデルをビルドするコードを追加する別のセルを追加します。

model = text_classifier.create(train_data, model_spec=spec, epochs=50)

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

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

bbe4b896d8060bc4.png

その後、この結果を測定し、モデルの重みを変更して予測を微調整してから再試行します。これがエポックです。このため、epochs=50 を指定すると、次のように「ループ」が 50 回繰り返されます。

4ed286d114960ca.png

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

ステップ 7 - モデルをエクスポートする

トレーニングが完了したら、モデルをエクスポートできます。TensorFlow は独自の形式でモデルをトレーニングします。このモデルをウェブページで使用するには、TensorFlow.js 形式に変換する必要があります。次のコードを新しいセルに貼り付けて実行します。

model.export(export_dir="/js_export/", export_format=[ExportFormat.TFJS, ExportFormat.LABEL, ExportFormat.VOCAB])
!zip -r /js_export/ModelFiles.zip /js_export/

このコードを実行した後、Colab の左側にある小さなフォルダ アイコンをクリックすると、上記でエクスポートしたフォルダ(ルート ディレクトリ内 - 1 つ上のレベルに移動する必要がある場合があります)に移動し、ModelFiles.zip に含まれるエクスポートされたファイルの ZIP バンドルを見つけることができます。

この zip ファイルをパソコンにダウンロードします。これらのファイルは、最初の Codelab と同じように使用します。

cda3c681ebf144b4.png

これで、Python の部分は終わりです。おなじみの JavaScript の世界に戻りましょう。さて、

5. 新しい ML モデルのサービング

これで、モデルを読み込む準備がほぼ整いました。ただし、その前に、この Codelab の前半でダウンロードした新しいモデルファイルをアップロードして、コード内でホストされ、使用できるようにする必要があります。

まず、まだ行っていない場合は、先ほど実行した Model Maker Colab ノートブックからダウンロードしたモデルのファイルを解凍します。さまざまなフォルダに次のファイルが含まれていることがわかります。

3ace87c57b98cfbc.png

ここには何がありますか?

  • model.json - トレーニング済みの TensorFlow.js モデルを構成するファイルの 1 つです。この特定のファイルは、JS コードで参照します。
  • group1-shard1of1.bin - エクスポートされた TensorFlow.js モデルの保存データの多くを含むバイナリ ファイルです。上記の model.json と同じディレクトリにダウンロードするため、サーバーのどこかにホストする必要があります。
  • vocab - 拡張子のないこの奇妙なファイルは、Model Maker のもので、文中の単語をエンコードしてモデルがそれらの単語の使い方を理解できるようにする方法を示しています。これについては、次のセクションで詳しく説明します。
  • labels.txt - モデルが予測する結果のクラス名が含まれます。このモデルの場合、テキスト エディタでこのファイルを開くと、「false」と「true」がリスト表示され、予測出力として「スパムではない」または「スパム」が示されます。

TensorFlow.js モデルファイルをホストする

まず、生成された model.json ファイルと *.bin ファイルをウェブサーバーに配置して、ウェブページからアクセスできるようにします。

既存のモデルファイルを削除する

このシリーズの最初の Codelab の最終結果を基に構築するため、まずアップロード済みの既存のモデルファイルを削除する必要があります。Glitch.com を使用している場合は、左側のファイル パネルで model.jsongroup1-shard1of1.bin を確認し、各ファイルのその他メニュー プルダウンをクリックして、次のように [delete] を選択します。

c72bfdc5a0db4d0d.png

Glitch に新しいファイルをアップロードする

これで、新しいファイルをアップロードします。

  1. Glitch プロジェクトの左側のパネルで assets フォルダを開き、アップロードされた古いアセットが同じ名前の場合は削除します。
  2. [アセットをアップロード] をクリックし、このフォルダにアップロードする group1-shard1of1.bin を選択します。アップロードすると、次のようになります。

c6739dd30e6df977.png

  1. これで、model.json ファイルについても同様に処理します。アセット フォルダには次の 2 つのファイルが格納されます。

b7858eb08bea9ac3.png

  1. アップロードした group1-shard1of1.bin ファイルをクリックすると、その場所の URL をコピーできます。次のように、このパスをコピーします。

19999f6644f61153.png

  1. 画面の左下にある [ツール] > [ターミナル] をクリックします。ターミナル ウィンドウが読み込まれるまで待ちます。
  2. 読み込まれたら、次のコマンドを入力して Enter キーを押し、ディレクトリを www フォルダに変更します。

terminal:

cd www
  1. 次に、wget を使用して、アップロードした 2 つのファイルをダウンロードします。以下の URL を、Glitch のアセット フォルダにあるファイルの生成済み URL に置き換えます(各ファイルのカスタム URL については、アセット フォルダを確認してください)。

2 つの URL の間にスペースがあること、使用する必要がある URL は表示されている URL とは異なるが、見た目は似ていることに注意してください。

ターミナル

wget https://cdn.glitch.com/1cb82939-a5dd-42a2-9db9-0c42cab7e407%2Fmodel.json?v=1616111344958 https://cdn.glitch.com/1cb82939-a5dd-42a2-9db9-0c42cab7e407%2Fgroup1-shard1of1.bin?v=1616017964562

すばらしいです。これで、www フォルダにアップロードされたファイルのコピーが作成されました。

ただし、現時点では、ダウンロードされるファイルには奇妙な名前が付けられます。ターミナルで ls と入力して Enter キーを押すと、次のように表示されます。

6c417fdfc64762f1.png

  1. mv コマンドを使用してファイルの名前を変更します。コンソールに次のように入力し、各行の後に Enter キーを押します。

terminal:

mv *group1-shard1of1.bin* group1-shard1of1.bin
mv *model.json* model.json
  1. 最後に、ターミナルで「refresh」と入力して Enter キーを押し、Glitch プロジェクトを更新します。

terminal:

refresh

更新すると、ユーザー インターフェースの www フォルダに model.jsongroup1-shard1of1.bin が表示されます。

530bb651f4dbac64.png

これで、最後の手順は、dictionary.js ファイルを更新することです。

  1. 新しくダウンロードした語彙ファイルを、テキスト エディタを使用して手動で、またはこのツールを使用して正しい JS 形式に変換し、結果の出力を www フォルダ内の dictionary.js として保存します。dictionary.js ファイルがすでにある場合は、新しいコンテンツをコピーして貼り付け、ファイルを保存するだけです。

おめでとうございます!変更されたファイルがすべて正常に更新されました。ウェブサイトを使用すると、再トレーニングされたモデルが、検出されて学習されたエッジケースを考慮できるようになっていることがわかります。

64e5cf6f6e158d6c.gif

最初の 6 つは迷惑メールではないと正しく分類され、2 番目の 6 つはすべて迷惑メールとして識別されています。正解です。

いくつかのバリエーションも試して、一般化がうまくいっているかどうかを確認しましょう。元々は次のような文が失敗していました。

GOOG 株が急騰した!手遅れになる前にゲットしましょう!

これは現在、迷惑メールとして正しく分類されていますが、次のように変更するとどうなりますか?

XYZ 株の価値が上昇しました。お早めにご購入ください。

株価記号と文言を少し変更しても、98% の確率でスパムであるという正しい予測が得られます。

もちろん、この新しいモデルを実際に壊そうとすれば、壊すことは可能です。オンラインで遭遇する可能性の高い一般的な状況について、より多くの独自のバリエーションを捉えるために、さらに多くのトレーニング データを収集することが重要になります。今後の Codelab では、フラグが設定されたライブデータを使用してモデルを継続的に改善する方法について説明します。

6. 完了

おめでとうございます。これで、既存の機械学習モデルを再トレーニングして、見つかったエッジケースに対応するように更新し、TensorFlow.js を使用してそれらの変更をブラウザにデプロイして、実際のアプリケーションに適用することができました。

内容のまとめ

この Codelab では次のことを学びました。

  1. 作成済みのコメントスパム モデルを使用する際に機能していなかったエッジケースを発見しました
  2. 検出したエッジケースを考慮するように Model Maker モデルを再トレーニングした
  3. 新しいトレーニング済みモデルを TensorFlow.js 形式でエクスポートしました
  4. 新しいファイルを使用するようにウェブアプリを更新した

次のステップ

この更新はうまく機能しますが、他のウェブアプリと同様に、時間の経過とともに変更が生じます。アプリが毎回手動で更新するのではなく、時間とともに継続的に改善される方がはるかに優れています。たとえば、100 件の新しいコメントが誤って分類されたとマークされた後に、モデルを自動的に再トレーニングする手順を自動化するにはどうすればよいでしょうか?通常のウェブ エンジニアリングの知識があれば、これを自動的に行うパイプラインを作成する方法を理解できるでしょう。まだ作成していない場合は、このシリーズの次の Codelab で作成方法をご確認ください。

作成したものを共有する

本日作成したものを他のクリエイティブなユースケースに簡単に拡張することもできます。ぜひ、既成概念にとらわれずにハッキングを続けてください。

ソーシャル メディアで #MadeWithTFJS ハッシュタグを使用すると、作成したプロジェクトが TensorFlow ブログ今後のイベントで取り上げられる可能性があります。皆様の作品をぜひお見せください。

理解を深めるための TensorFlow.js のその他の Codelab

参考になるウェブサイト