#### [更新2017-03-14]
- 升級到TensorFlow V1.0.0,由於TensorFlow發生了很大變化,因此沒有向後兼容。
- 添加了帶有Twitter語料庫的預訓練的模型,僅為
./go_example聊天! (或預覽我的聊天示例)- 您可以從跟踪此
go_example腳本開始以了解事情的工作方式!
這是從TensorFlow示例修改的SEQ2SEQ模型。
app.py包括為Facebook Messenger應用後端。 我在此處解釋了一些有關功能和一些實現技巧的細節。
git clone github.com/Marsan-Ma/tf_chatbot_seq2seq_antilm.git
您可能會從我的聊天語料庫存儲庫中找到諸如Twitter聊天,打開電影字幕或PTT論壇之類的語料庫。您需要將其放在以下路徑之下:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/train/chat.txt
並手工製作一些測試句子(每行每句話):
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/test/test_set.txt
python3 main.py --mode train --model_name <MODEL_NAME>
訓練模型直到50歲以下的困惑之後,您可以做:
python3 main.py --mode test --model_name <MODEL_NAME>
[注意!!!]如果您將任何參數覆蓋在此Main.py Command中,請確保同時應用訓練和測試,或者只是在lib/config.py中修改FOLSAFE。
python3 app.py --model_name <MODEL_NAME>
您可能會看到此最小fb_messenger示例,以獲取更多詳細信息,例如為已知錯誤設置SSL,Webhook和Work-Arounds。
這是一個有趣的比較:左對話啟用了橫梁= 10,響應比往常“我不知道”好。正確的對話還使用了光束搜索,並啟用了抗語言模型。這應該抑制通用的響應,並且反應似乎更好。
[更新2017-03-09]鋼筋學習現在不起作用,等待修復。
如果您希望有機會進一步改進模型,那麼在這裡,我實現了一個受強化學習體系結構,靈感來自Li et al。 ,2016年。只需在config.py中啟用readforce_learn選項,您可能需要在lib/seq2seq_mode.py中的step_rf()函數中添加自己的規則。
請注意,您應該在正常模式下訓練,以便首先獲得體面的模型! ,由於強化學習將通過這種預訓練的模型探索勇敢的新世界。如果您從不良的模型開始,它將永遠需要自己的改善。
Seq2Seq是Cho等人,2014年發布的出色模型。起初它用於進行機器翻譯,很快人們發現Seq2Seq模型也可以實現有關將某物映射到另一件事的任何內容。聊天機器人是這些奇蹟之一,我們認為連續的對話是某種“映射”關係。
這是經典的介紹圖片顯示SEQ2SEQ模型體系結構,該博客文章引用了有關Gmail Auto-Reply功能的報價。
問題是,到目前為止,我們還沒有為聊天機器人找到更好的目標功能。我們仍在使用MLE(最大可能的估計),這對機器翻譯非常有用,但始終會產生像“我也是我”,“我認為”,“我愛你”的通用響應。
這些反應不是信息豐富的,但是它們確實具有很大的概率 - 因為它們往往在培訓語料庫中出現很多次。我們不會聊天機器人總是回复這些非污點,因此我們需要找到一些方法來使我們的機器人更加“有趣”,以增加依據的“困惑”。
在這裡,我們重現了李的工作。等人,2016年嘗試解決這個問題。主要思想是將相同的SEQ2SEQ模型作為語言模型,以使每個解碼時間戳中的候選單詞作為反模型,然後我們將這些單詞始終是任何輸入的概率很高。通過這種反模型,我們可以得到更多特殊,非傳播,內容豐富的回應。
李的原始作品。等人將MERT(OCH,2003)與BLEU用作指標,以找到相應抗語言模型的最佳概率加權(分數(T)= P (T)= P(T)= P(T | S)-λU(T) +γnt )。但是我發現聊天語料庫中的BLEU得分往往總是為零,因此在這裡無法獲得有意義的結果。如果有人對此有任何想法,請給我留言,謝謝!
在lib/config.py中,有一些模型培訓和預測的選項。基本上,它們是自我解釋的,並且可以在大多數情況下使用默認值。在這裡,我們僅列出您需要配置的內容:
關於環境
| 姓名 | 類型 | 描述 |
|---|---|---|
| 模式 | 細繩 | 工作模式:火車/測試/聊天 |
| model_name | 細繩 | 模型名稱,會影響您的工作路徑(存儲數據,nn_model,結果文件夾) |
| scope_name | 細繩 | 在TensorFlow中,如果您需要同時加載兩個圖,則需要將它們保存/加載它們在不同的名稱空間中。 (如果僅需要一個SEQ2SEQ模型,請將其保留為默認模型) |
| vocab_size | 整數 | 取決於您的語言語言:對於英語,60000足夠好。對於中文,您至少需要100000或200000。 |
| gpu_usage | 漂浮 | 使用TensorFlow GPU內存分數,默認值為1,TensorFlow將佔用您的GPU的100%。如果您有共享GPU資源的多個工作,則將其用於2或3個工作,將其設置為0.5或0.3。 |
| REANFORCE_LEARN | int | 設置1以啟用加固學習模式 |
關於解碼
| 姓名 | 類型 | 預設 | 描述 |
|---|---|---|---|
| beam_size | int | 10 | 梁搜索尺寸,設置1等於貪婪的搜索 |
| 安提姆 | 漂浮 | 0(禁用) | 懲罰反語言模型的重量 |
| n_bonus | 漂浮 | 0(禁用) | 句子長度的獎勵重量 |
默認情況下,抗LM函數是禁用的,您可以從設置Antilm = 0.5〜0.7和N_BONUS = 0.05開始,以查看您是否喜歡結果的差異。
對於培訓,建議使用GPU,因為SEQ2SEQ是一個大型型號,因此您需要某些計算能力來進行訓練並有效預測,尤其是在設置大型梁搜索尺寸時。
由於我們正在做隨機梯度不錯,因此DRAM要求並不是嚴格的CPU/GPU。
如果您是深度學習的新手,設置諸如GPU之類的東西,Python環境對您來說很煩人,這裡有我的機器學習環境的碼頭機:
(非GPU版本Docker) /(GPU版本Docker)
Seq2Seq是一個有許多預賽的模型,我花了很多時間進行調查,這裡有一些最佳材料,使我受益匪淺:
解釋RNN,LSTM,GRU和SEQ2SEQ模型的最佳博客文章:Christopher Olah的LSTM網絡。
這項工作Sherjilozair/char-rnn-TensorFlow可以幫助我在TensorFlow中了解很多有關語言模型和實現圖的知識。
如果您對RNN更感興趣,這是Andrej Karpathy的重複神經網絡的不合理效果。
Vanilla版本SEQ2SEQ+注意:Nicolas-ivanov/tf_seq2seq_chatbot。這將幫助您弄清楚香草Seq2Seq模型的主要流程,並且我根據這項工作構建了此存儲庫。
目前,我從圖形中構建了橫梁搜索,這意味著 - - 非常慢。在這里和那裡進行了有關建造壁畫的討論。但是不幸的是,如果您想添加比橫梁搜索更多的東西,例如這種反LM工作,那麼您不僅需要光束搜索才能成為內在。
我還沒有弄清楚使用BLEU的MERT如何優化抗LM模型的重量,因為當前BLEU通常為零。