這項工作試圖重現神經對話模型(又稱Google聊天機器人)的結果。它使用 RNN(seq2seq 模型)進行句子預測。它是使用 python 和 TensorFlow 完成的。
該程式的載入語料庫部分受到 macournoyer 的 Torch Neuralconvo 的啟發。
目前,DeepQA 支援以下對話語料庫:
--corpus opensubs
。--corpus scotus
。請參閱安裝說明。--corpus ubuntu
可用。請參閱安裝說明。為了加速訓練,也可以使用預先訓練的單字嵌入(感謝 Eschnou)。更多資訊請點這裡。
程式需要以下相依性(使用 pip 即可輕鬆安裝: pip3 install -r requirements.txt
):
您可能還需要下載其他資料才能使 nltk 運作。
python3 -m nltk.downloader punkt
康乃爾大學資料集已包含在內。對於其他資料集,請查看各自資料夾中的自述文件(位於data/
內)。
Web 介面需要一些額外的套件:
也可以使用 Docker 安裝。更詳細的說明請參閱此處。
要訓練模型,只需執行main.py
。訓練完成後,您可以使用main.py --test
(在「save/model/samples_predictions.txt」中產生的結果)或main.py --test interactive
(更有趣)來測試結果。
這裡有一些可能有用的標誌。如需更多協助和選項,請使用python main.py -h
:
--modelTag
:允許為目前模型命名,以便在測試/訓練時區分它們。--keepAll
:如果在測試時想要查看不同步驟的預測,則在訓練時使用此標誌(看到程式隨著訓練進度更改其名稱和年齡可能很有趣)。警告:如果不增加--saveEvery
選項,它會很快佔用大量儲存空間。--filterVocab 20
或--vocabularySize 30000
:限制詞彙表大小並最佳化效能和記憶體使用。將使用次數少於 20 次的單字替換為
標記,並設定最大詞彙量。--verbose
:測試時,將列印計算出的句子。--playDataset
:顯示資料集中的一些對話樣本(如果這是您想要執行的唯一操作,可以與--createDataset
結合使用)。要使用 TensorBoard 視覺化計算圖和成本,只需執行tensorboard --logdir save/
。
預設情況下,網路架構是標準編碼器/解碼器,具有兩個 LSTM 層(隱藏大小為 256),詞彙表嵌入大小為 32。最大句子長度設定為 10 個單詞,但可以增加。
一旦接受培訓,就可以使用更用戶友好的介面與其聊天。伺服器將查看複製到save/model-server/model.ckpt
模型。第一次使用它時,您需要進行以下配置:
export CHATBOT_SECRET_KEY= " my-secret-key "
cd chatbot_website/
python manage.py makemigrations
python manage.py migrate
然後,要在本機啟動伺服器,請使用下列命令:
cd chatbot_website/
redis-server & # Launch Redis in background
python manage.py runserver
啟動後,介面應在 http://localhost:8000/ 上可用。如果要將程式部署在伺服器上,請改用python manage.py runserver 0.0.0.0
。更多資訊請點這裡。
令人驚訝的是,只需 1 或 2 小時的訓練(在 GeForce GT 740M 上)就可以獲得一些結果,方法是將輸入序列大幅減少到 5 個單詞,輸出到 3 個單字(加上go
和eos
令牌)並使用一個小的嵌入大小(大約 25)。從那時起,我修改了程式碼,現在輸出長度必須與輸入長度匹配,但您仍然可以使用此版本重現原始結果。當然,網路不會真的很閒聊:
Q: Hi
A: Hi.
Q: What is your name ?
A: Laura.
Q: What does that mean ?
A: I dunno.
Q: How old are you ?
A: thirty-five.
Q: Will Google hire me ?
A: No.
Q: Tell me the alphabet
A: Fuck you.
Q: That's not nice
A: Yeah.
這是一些失敗的情況:
Q: Who is Laura ?
A: My brother.
Q: Say 'goodbye'
A: Alright.
Q: What is cooking ?
A: A channel.
Q: Can you say no ?
A: No.
Q: Two plus two
A: Manny...
對於較長的句子,網路的訓練速度要慢得多。在 maxLength=10 的 250000 次迭代之後,網路仍然主要給出迴避的答案(透過「我不知道」回答大多數開放式問題),但它似乎整合了一些基本語義:
Q: When are the fireworks ?
A: Tomorrow.
Q: What color ?
A: Gray.
Q: Which apple ?
A: That's the first one.
Q: What time is it ?
A: Eleven o'clock.
Q: Who is Skywalker ?
A: She's a freelance bio-exorcist.
Q: Who is John ?
A: The old man.
Q: Who is Jenny ?
A: The man who killed herself.
Q: When were you born ?
A: Soon.
正如最後一個問題所示,網路在性別和現在/未來之間仍然存在一些混淆。我也嘗試了一些更深層的哲學問題,或多或少取得了成功。
Q: What is the purpose of being intelligent ?
A: The man are obsolete.
Q: What is immoral ?
A: The truth.
Q: What is morality ?
A: The worst.
Q: What is the purpose of existence ?
A: It 's private.
Q: What happens if machines can think ?
A: I think I'll just lie with you.
我訓練的模型受到我放置的嵌入大小及其大小以及訓練語料庫大小的很大限制。它的「思想向量」也可能太小,無法回答以下問題:
Q: My name is David. What is my name ?
A: Debbie.
Q: My name is John. What is my name ?
A: Carl Smith.
Q: How many legs does a cat have ?
A: Four.
Q: How many legs does a spider have ?
A: Four.
Q: Do you prefer football or soccer ?
A: Whiskey.
它似乎也過度擬合,因為有時它只會從訓練集中彈出與問題無關的句子。添加一些 dropout 應該可以減少這個問題。
Q: I play tennis. What do I play ?
A: I'm going to get laid.
Q: What color is the sky ?
A: One of the deputies is everywhere.
注意:連結不再有效。
您可以在這裡找到預先訓練的模型,預設語料庫的訓練。使用方法:
DeepQA/save/
中的 zip 文件save/model-pretrainedv2/dataset-cornell-old-lenght10-filter0-vocabSize0.pkl
複製到data/samples/
。./main.py --modelTag pretrainedv2 --test interactive
。感謝 Nicholas C.,這裡(原始)是一些針對不同資料集的額外預訓練模型(與 TF 1.2 相容)。該資料夾還包含 Cornell、OpenSubtitles、Ubuntu 和 Scotus 的預處理資料集(移至data/samples/
內部)。如果您不想自己處理資料集,則需要這些。
如果您擁有高階 GPU,請毫不猶豫地使用超參數/語料庫來訓練更好的模型。從我的實驗來看,學習率和 dropout 率對結果的影響最大。另外,如果您想分享您的模型,請隨時與我聯繫,我會將其添加到此處。
除了嘗試更大/更深的模型之外,還有很多可以測試的小改進。如果您實現了其中之一,請毫不猶豫地發送拉取請求。以下是一些想法:
tf.nn.seq2seq.rnn_decoder
的loop_function
參數結合,添加起來應該不會太困難。之後,應該可以使用 SoftMax 溫度來獲得更保守或奇怪的預測。model.py
上將embedding_rnn_seq2seq
替換為embedding_attention_seq2seq
應該很簡單。Q:Sentence 1. Sentence 2. => A:Sentence X. Sentence Y.
我們可以產生 3新樣本: Q:Sentence 1. Sentence 2. => A:Sentence X.
, Q:Sentence 2. => A:Sentence X. Sentence Y.
和Q:Sentence 2. => A:Sentence X.
警告:其他組合,例如Q:Sentence 1. => A:Sentence X.
將不起作用,因為它會破壞將問題與答案連結起來的轉換2 => X
)
和
,以便編碼器知道對話者何時發生變化。但我不確定簡單的 seq2seq 模型是否足以捕捉句子之間的長期依賴關係。添加桶系統將相似的輸入長度分組在一起可以大大提高訓練速度。