Nemo トレーニングを使用してインテントモデルを拡張する
NVIDIA Nemo は、会話型 AI アプリケーションを作成するために NVIDIA が開発したツールキットです。このツールキットには、 ASR 、 NLP 、 TTS 用のトレーニング済みモジュールのコレクションが含まれています。これにより、研究者やデータサイエンティストは複雑なニューラルネットワークアーキテクチャを簡単に構築し、独自のアプリケーションの設計に集中できるようになります。
前の例で示したように、奈良は限られたタイプの質問しか処理できない。これは、トレーニング済みの NLP モデルでは、これらのタイプの質問についてのみトレーニングを受けているためです。奈良がより幅広い質問に対応できるようにするには、独自のデータセットを使って再トレーニングする必要があります。ここでは、 Nemo を使用して NLP モデルを拡張し、要件を満たす方法を示します。まず、奈良から収集したログを Nemo の形式に変換し、 NLP モデルを強化するためのデータセットを使って学習します。
モデル
私たちの目標は、ユーザーの好みに基づいてアイテムを並べ替えることです。たとえば、奈良に最高級の寿司レストランを提案したり、奈良に最も安い価格のジーンズを探してもらうようにしたりすることができます。このためには、 Nemo で提供されているインテント検出とスロット充填モデルをトレーニングモデルとして使用します。このモデルにより、奈良は検索の好みを理解することができる。
データの準備
モデルをトレーニングするには、このタイプの質問のデータセットを収集し、 Nemo 形式に変換します。ここでは、モデルのトレーニングに使用するファイルをリストしました。
dict.intents.csv
このファイルには、 Nemo に理解してもらいたいすべてのインテントが一覧表示されます。ここでは、主なインテントが 2 つあり、 1 つのインテントは、主なインテントのどれにも当てはまらない質問を分類するために使用されます。
price_check find_the_store unknown
dict.slots.csv
このファイルには、トレーニングの質問にラベルを付けることができるすべてのスロットが記載されています。
B-store.type B-store.name B-store.status B-store.hour.start B-store.hour.end B-store.hour.day B-item.type B-item.name B-item.color B-item.size B-item.quantity B-location B-cost.high B-cost.average B-cost.low B-time.period_of_time B-rating.high B-rating.average B-rating.low B-interrogative.location B-interrogative.manner B-interrogative.time B-interrogative.personal B-interrogative B-verb B-article I-store.type I-store.name I-store.status I-store.hour.start I-store.hour.end I-store.hour.day I-item.type I-item.name I-item.color I-item.size I-item.quantity I-location I-cost.high I-cost.average I-cost.low I-time.period_of_time I-rating.high I-rating.average I-rating.low I-interrogative.location I-interrogative.manner I-interrogative.time I-interrogative.personal I-interrogative I-verb I-article O
鉄道 .tsv
これが主なトレーニングデータセットです。各行は、 dict.intent.csv ファイルのインテントカテゴリのリストに続く質問から始まります。ラベルはゼロから列挙されます。
train slots.tsv
20 46 24 25 6 32 6 52 52 24 6 23 52 14 40 52 25 6 32 6 …
モデルのトレーニング
docker pull nvcr.io/nvidia/nemo:v0.10
次に、次のコマンドを使用してコンテナを起動します。このコマンドでは、軽量なトレーニング用の演習であるため、コンテナで使用する GPU は 1 つに制限されます( GPU ID = 1 )。また、ローカルワークスペース / ワークスペース /Nemo/ をコンテナ /Nemo 内のフォルダにマッピングします。
NV_GPU='1' docker run --runtime=nvidia -it --shm-size=16g \ --network=host --ulimit memlock=-1 --ulimit stack=67108864 \ -v /workspace/nemo:/nemo\ --rm nvcr.io/nvidia/nemo:v0.10
コンテナ内では、事前にトレーニングされたオリジナルの BERT モデルから開始する場合、次のコマンドを使用してトレーニング手順を開始できます。data_dir は、トレーニングデータのパスを設定する引数です。work_dir では ' チェックポイント・ファイルを保存する場所を設定できます
cd examples/nlp/intent_detection_slot_tagging/ python joint_intent_slot_with_bert.py \ --data_dir /nemo/training_data\ --work_dir /nemo/log
新しいトレーニングデータセットがあり、以前のモデルを改善したい場合は、次のコマンドを使用して停止した時点から続行できます。checkpoint_dir は ' 前のチェックポイント・フォルダへのパスを取得します
cd examples/nlp/intent_detection_slot_tagging/ python joint_intent_slot_infer.py \ --data_dir /nemo/training_data \ --checkpoint_dir /nemo/log/2020-05-04_18-34-20/checkpoints/ \ --eval_file_prefix test
モデルを推論します
トレーニング済みモデルのパフォーマンスは、一定の期間の経過後に検証する必要があります。次のコマンドを使用すると、 1 つずつクエリをテストできます。たとえば、このコマンドでは、モデルがクエリの意図を正しく識別できるかどうかを確認します。クエリの目的は、「ここで最高のパスタを取得できる」です。
cd examples/nlp/intent_detection_slot_tagging/ python joint_intent_slot_infer_b1.py \ --checkpoint_dir /nemo/log/2020-05-29_23-50-58/checkpoints/ \ --query "where can i get the best pasta" \ --data_dir /nemo/training_data/ \ --num_epochs=50
次に、推論からの出力を示します。出力では、トレーニング済みモデルが意図を正しく予測し、関心のあるキーワードを返すことができます。これらのキーワードを使うことで、奈良はユーザが欲しいものを検索し、より正確な検索を行うことができるようになります。
[NeMo I 2020-05-30 00:06:54 actions:728] Evaluating batch 0 out of 1 [NeMo I 2020-05-30 00:06:55 inference_utils:34] Query: where can i get the best pasta [NeMo I 2020-05-30 00:06:55 inference_utils:36] Predicted intent: 1 find_the_store [NeMo I 2020-05-30 00:06:55 inference_utils:50] where B-interrogative.location [NeMo I 2020-05-30 00:06:55 inference_utils:50] can O [NeMo I 2020-05-30 00:06:55 inference_utils:50] i O [NeMo I 2020-05-30 00:06:55 inference_utils:50] get B-verb [NeMo I 2020-05-30 00:06:55 inference_utils:50] the B-article [NeMo I 2020-05-30 00:06:55 inference_utils:50] best B-rating.high [NeMo I 2020-05-30 00:06:55 inference_utils:50] pasta B-item.type