這是一個透過seq2seq和強化學習訓練的聊天機器人。
序列到序列
Seq2seq是結構化學習的經典模型,它的輸入和輸出都是序列
NIPS '14 論文 Sequence to Sequence Learning with Neural Networks 中描述了普通的 seq2seq 模型,編碼器和解碼器是分開的
該儲存庫中的 seq2seq 模型由 2 個 LSTM 構建,類似於 ICCV '15 論文 Sequence to Sequence -- Video to Text 中描述的模型,編碼器和解碼器共享相同的權重
RL
在用足夠的 epoch 訓練聊天機器人後,我使用稱為策略梯度的 RL 技術來進一步改進聊天機器人
透過這樣做,聊天機器人可以針對獎勵函數產生更有趣的回應
我的獎勵函數類似於 EMNLP '16 論文 Deep Reinforcement Learning for Dialogue Generation 中所描述的函數
讓我向您展示一些聊天機器人的結果:
結果 1 (A 和 B 都是經過訓練的聊天機器人)
A:你能幫我一個忙嗎?
乙:什麼都可以。
A:我要你讓一個父親屈服。
乙:當然。
A:我很抱歉,我不是故意無禮的。
B:不明白,至少我已經盡力了。
結果 2 (A 和 B 都是經過訓練的聊天機器人)
答:我沒有做!我沒有槍!
乙:你這個騙子。你還是想拿回你的錢。
答:事實有些錯誤。
B:我不要任何錢,只是一點點我不能從中拿走。
答:怎麼了。
乙:聽我說。我現在很害怕。
A:啊,你需要所有的錢,我需要你的幫助。
結果 3 (A 和 B 都是經過訓練的聊天機器人)
A:我忘記買可口可樂了。
B:我的頭被東西卡住了。
A:沒關係,我想這在很多狗屎中很常見。
B:我的意思是我們從小時候就一直在一起。
答:更有道理。
B:不是他,是他的錯,他是因為上帝才瞎的。
答:這是一個奇怪的故事。
您可以在此目錄中找到更多聊天機器人的結果
這些結果的神經網路配置在檔案名稱中描述
您對聊天機器人的結果感到驚訝嗎? :D
您可以自己產生那些令人驚嘆的對話框!
只需按照以下說明操作即可:
pip install -r 要求.txt
./腳本/下載.sh
./script/simulate.sh <模型路徑> <模擬類型> <輸入檔> <輸出檔>
<模型路徑>
若要產生 seq2seq 對話框,請輸入“ model/Seq2Seq/model-77 ”
若要產生 RL 對話框,請輸入“ model/RL/model-56-3000 ”
<模擬類型>
可以是 1 或 2
這個數字代表聊天機器人考慮的前一句的數量
如果您選擇 1,聊天機器人僅考慮最後一句話
如果您選擇 2,聊天機器人將考慮最後兩句話(一句話來自用戶,另一句來自聊天機器人本身)
<輸入檔>
來看看 result/sample_input_new.txt
這是聊天機器人的輸入格式,每一行都是對話方塊的開始句。
為了方便起見,您可以僅使用範例文件。
<輸出檔>
輸出文件,輸入您想要的任何文件名
如果您希望聊天機器人為每個問題僅產生一個回應
請按照以下說明操作:
pip install -r 要求.txt
./腳本/下載.sh
./script/run.sh <類型> <輸入檔> <輸出檔>
<類型>
若要產生 seq2seq 回應,請輸入“ S2S ”
若要產生強化學習反應,請輸入“ RL ”
<輸入檔>
來看看 result/sample_input_new.txt
這是聊天機器人的輸入格式,每一行都是對話方塊的開始句。
為了方便起見,您可以僅使用範例文件。
<輸出檔>
輸出文件,輸入您想要的任何文件名
我用 python2.7 訓練了我的聊天機器人。
如果您想從頭開始訓練聊天機器人
您可以按照以下說明操作:
看看 python/config.py,這裡描述了所有訓練配置。
您可以更改一些訓練超參數,或只保留原始參數。
我使用康乃爾電影對話語料庫
您需要下載它,解壓縮它,並將所有 *.txt 檔案移至 data/ 目錄中
然後用pip下載一些函式庫:
pip install -r 要求.txt
./腳本/parse.sh
./腳本/train.sh
讓我們來展示一下 seq2seq 模型的一些結果:)
./script/test.sh <模型路徑> <輸入檔> <輸出檔>
並顯示 seq2seq 模型的一些對話結果!
./script/simulate.sh <模型路徑> <模擬類型> <輸入檔> <輸出檔>
<模擬類型>
可以是 1 或 2
這個數字代表聊天機器人考慮的前一句的數量
如果您選擇 1,聊天機器人將只考慮使用者的話語
如果您選擇 2,聊天機器人將考慮使用者的話語和聊天機器人的最後一句話
您需要更改 python/config.py 中的training_type參數
'normal' 用於 seq2seq 訓練,'pg' 用於策略梯度
您需要先使用「正常」訓練一些時期直到穩定(強烈建議至少 30 個時期)
然後將方法更改為“pg”以優化獎勵函數
./script/train_RL.sh
使用策略梯度訓練時(pg)
你可能需要一個反向模型
反向模型也由康乃爾電影對話資料集訓練,但來源和目標相反。
您可以透過下載預先訓練的反向模型
./script/download_reversed.sh
或者你可以自己訓練
如果您使用預先訓練的反向模型,則不需要更改有關反向模型的任何設置
讓我們產生一些 RL 模型的結果,並找出與 seq2seq 模型的差異:)
./script/test_RL.sh <模型路徑> <輸入檔> <輸出檔>
並顯示 RL 模型的一些對話結果!
./script/simulate.sh <模型路徑> <模擬類型> <輸入檔> <輸出檔>
<模擬類型>
可以是 1 或 2
這個數字代表聊天機器人考慮的前一句的數量
如果您選擇 1,聊天機器人僅考慮最後一句話
如果您選擇 2,聊天機器人將考慮最後兩句話(一句話來自用戶,另一句來自聊天機器人本身)
作業系統:CentOS Linux 版本 7.3.1611(核心)
CPU:Intel(R) Xeon(R) CPU E3-1230 v3 @ 3.30GHz
顯示卡:GeForce GTX 1070 8GB
記憶體:16GB DDR3
Python3(對於data_parser.py)和Python2.7(對於其他)
黃博志 / @pochih