自己動手寫個聊天機器人吧

學習來源于Sirajology的視頻 Build a Chatbot

昨天寫LSTM的時候提到了聊天機器人,今天放松一下哑姚,來看看chatrobot是如何實現(xiàn)的。

前天和一個小伙伴聊,如果一個機器人知道在它通過圖靈測試后可能會被限制,那它假裝自己不能通過然后逃過一劫削祈,從此過上自由的生活會怎樣。

Retrieval based model

以前很多聊天機器人是以 Retrieval based model 模型來進行對話的脑漫,這個模型就是程序員事先寫好一些回答髓抑,然后機器人在接收到一個問題的時候,就去搜索并選擇相關的答案优幸。

Machine Learning Classfier

最近吨拍,大家開始使用機器學習的分類器,例如 Facebook 的 chatbot API网杆。

你可以提前設定一些問題和答案羹饰,然后系統(tǒng)會把詞語進行分類,進一步來識別出用戶的意圖跛璧,這樣你在問兩句不一樣的話時严里,機器人可以識別出它們的意圖是一樣的。

Generative Model

最難的就是在沒有預先設定問答數據時就能自動生成答案的機器人追城,下面這篇Google的論文就是研究這樣的機器人的刹碾。

他們在兩個數據集上訓練一個神經網絡模型,一個是電影對話座柱,一個是IT support對話記錄迷帜,這樣就有日常對話和專業(yè)領域知識了物舒。

這個模型不需要寫很多代碼,但是需要很多數據戏锹。

結果是還不錯:

接下來要用 Torch 和 Lua 重建一下論文里的 Neural Network 模型冠胯。

第一步,輸入數據锦针,定義變量

-- Data
print("-- Loading dataset")
dataset = neuralconvo.DataSet(neuralconvo.CornellMovieDialogs("data/cornell_movie_dialogs"),
                    {
                      loadFirst = options.dataset,              -- 定義要用多少數據
                      minWordFreq = options.minWordFreq         -- 想要保持在詞匯表里的單詞的最小頻率
                    })

第二步荠察,建模

-- Model
-- options.hiddenSize:隱藏層數
-- dataset.wordsCount: 數據集的詞數
model = neuralconvo.Seq2Seq(dataset.wordsCount, options.hiddenSize)
model.goToken = dataset.goToken
model.eosToken = dataset.eosToken

這里用到的模型是 seq2seq,它包含兩個 LSTM 遞歸神經網絡奈搜,第一個是 encoder 負責處理 input悉盆,第二個是 decoder 負責生成 output。

為什么要用 seq2seq馋吗?
DNN需要 inputs 和 outputs 的維度是固定的蛛勉,而我們接收的是一句話中姜,輸出的也是一句話址貌,都是一串單詞骂因。
所以需要一個模型可以保持一定長度的記憶。

LSTM 可以將可變長度的inputs轉化為固定維度的向量表達绍哎。所以在給了足夠多的數據后来农,模型可以將兩個相似的問題識別成同一個 thought vector 表達出來。在學習模型之后蛇摸,不僅可以得到權重备图,還有 thought vectors。

第三步赶袄,加一些 hyperparameters

要用到 NLL Criterion 揽涮,NLL 就是 Negative Log Likelihood,可以改進句子的預測饿肺。

-- Training parameters
model.criterion = nn.SequencerCriterion(nn.ClassNLLCriterion())    -- 改進句子的預測
model.learningRate = options.learningRate
model.momentum = options.momentum
local decayFactor = (options.minLR - options.learningRate) / options.saturateEpoch    -- 改進 learning rate
local minMeanError = nil      -- 改進 learning rate

接下來就是用 Backpropagation 來訓練模型:

-- Enabled CUDA
if options.cuda then
  require 'cutorch'
  require 'cunn'
  model:cuda()
elseif options.opencl then
  require 'cltorch'
  require 'clnn'
  model:cl()
end

訓練的目標是讓error越來越小蒋困,每個例子有一個輸入句子和一個目標句子。

local err = model:train(input, target)

最后把好的model存下來敬辣。

-- Save the model if it improved.

if minMeanError == nil or errors:mean() < minMeanError then

print("\n(Saving model ...)")

torch.save("data/model.t7", model)

minMeanError = errors:mean()

end

model.learningRate = model.learningRate + decayFactor

model.learningRate = math.max(options.minLR, model.learningRate)

end

現(xiàn)在可以去 AWS 訓練你的機器人了雪标,投入的數據越多,聊得越開心溉跃。


其他資料:
The code for this video is here

Here's the Neural Conversational Model paper
check out the machine-generated support conversations, they're mind-blowingly good

You should train this baby in the cloud using AWS. See ML for Hackers #4 for a tutorial on how to use AWS

Some great info on LSTM architecture

Link to Facebook's Chatbot API if you're curious

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末村刨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子撰茎,更是在濱河造成了極大的恐慌嵌牺,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逆粹,居然都是意外死亡募疮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門僻弹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阿浓,“玉大人,你說我怎么就攤上這事蹋绽“疟校” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵蟋字,是天一觀的道長稿蹲。 經常有香客問我扭勉,道長鹊奖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任涂炎,我火速辦了婚禮忠聚,結果婚禮上,老公的妹妹穿的比我還像新娘唱捣。我一直安慰自己两蟀,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布震缭。 她就那樣靜靜地躺著赂毯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拣宰。 梳的紋絲不亂的頭發(fā)上党涕,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音巡社,去河邊找鬼膛堤。 笑死,一個胖子當著我的面吹牛晌该,可吹牛的內容都是我干的肥荔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼朝群,長吁一口氣:“原來是場噩夢啊……” “哼燕耿!你這毒婦竟也來了?” 一聲冷哼從身側響起姜胖,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤誉帅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體堵第,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡吧凉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了踏志。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阀捅。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖针余,靈堂內的尸體忽然破棺而出饲鄙,到底是詐尸還是另有隱情,我是刑警寧澤圆雁,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布忍级,位于F島的核電站,受9級特大地震影響伪朽,放射性物質發(fā)生泄漏轴咱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一烈涮、第九天 我趴在偏房一處隱蔽的房頂上張望朴肺。 院中可真熱鬧,春花似錦坚洽、人聲如沸戈稿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鞍盗。三九已至,卻和暖如春跳昼,著一層夾襖步出監(jiān)牢的瞬間般甲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工庐舟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欣除,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓挪略,卻偏偏與公主長得像历帚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子杠娱,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容

  • CREATING BASEBALL CARDS 制作棒球卡 Even after we werearmed wit...
    李子心誠閱讀 2,529評論 0 0
  • 2018.10.28 星期日 晴 (29日補寫) 下午倆點公公婆婆回家了挽牢。二老在家種地上班都很辛苦,忙完了特...
    廈門路小學邵藝馨媽媽閱讀 107評論 0 0
  • 2liio2liio 著 薄霧緩緩的流動在人行道摊求。消防栓閃耀著陳舊泛紅的陳年往事禽拔。 來往的汽車有節(jié)奏的低聲轟鳴,在...
    2llio2llio閱讀 167評論 0 1
  • 文 若雨可嵐 磨難被悄悄的掛在枝頭,大雨沖刷后睹栖,被晾曬成了堅強硫惕。——題記 時光匆匆流逝野来,放下天真恼除,放下執(zhí)著,放下你...
    若雨可嵐閱讀 604評論 5 10