使用Nemo訓練來擴充Intent模式
NVIDIA Nemo是NVIDIA專為建立對話式AI應用程式所打造的工具套件。此工具套件包含預先訓練的ASR、NLP和TS模組集合、可讓研究人員和資料科學家輕鬆建立複雜的神經網路架構、並將更多焦點放在設計自己的應用程式上。
如上例所示、Nara只能處理有限類型的問題。這是因為預先訓練的NLP模式只會訓練這些類型的問題。如果我們想要讓Nara能夠處理更廣泛的問題、就必須重新訓練自己的資料集。因此、我們在此示範如何使用Nemo來延伸NLP模式、以滿足需求。首先、我們會將從Nara收集的記錄轉換成Nemo格式、然後與資料集一起訓練、以強化NLP模式。
模型
我們的目標是讓Nara根據使用者偏好來排序項目。例如、我們可能會請Nara推薦評價最高的壽司餐廳、或是想要Nara以最低價格尋找這款牛仔褲。為此、我們使用Nemo提供的意向偵測和插槽填滿模式做為訓練模式。此模式可讓Nara瞭解搜尋偏好的意圖。
資料準備
為了訓練模型、我們會收集此類問題的資料集、並將其轉換為Nemo格式。在此列出我們用來訓練模型的檔案。
dict.intents.csv
此檔案列出我們希望Nemo瞭解的所有目標。在此、我們有兩個主要目的和一個意圖、只用於將不符合任何主要目的的問題分類。
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中列出的Intent類別之後的問題。從零開始列舉標籤。
訓練插槽.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(GPU ID = 1)、因為這是輕量化的訓練練習。我們也會將本機工作區/Works/nemo/對應至Container /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目錄可讓您設定儲存檢查點檔案的位置。
cd examples/nlp/intent_detection_slot_tagging/ python joint_intent_slot_with_bert.py \ --data_dir /nemo/training_data\ --work_dir /nemo/log
如果我們有新的訓練資料集、而且想要改善先前的模式、我們可以使用下列命令、從停止點繼續進行。Checkpoint目錄會將路徑移至先前的檢查點資料夾。
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
推斷模型
我們需要在經過一定次數的時間後、驗證受過訓練的模型的效能。下列命令可讓我們逐一測試查詢。舉例來說、在這個命令中、我們想要檢查我們的模式是否能正確識別查詢「哪裡可以找到最好的義大利麵」的意圖。
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
接著、以下是推斷的輸出。在輸出中、我們可以看到我們訓練過的模型能夠正確預測future_the_store的意圖、並傳回我們感興趣的關鍵字。有了這些關鍵字、我們就能讓Nara搜尋使用者想要的內容、並進行更精確的搜尋。
[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