机器人--寒暄库(4)
?
目前智能QA系統(tǒng)都是基于seq2seq模型來開發(fā)(如google),seq2seq模型基于one-hot的詞嵌入,每個(gè)詞用一個(gè)數(shù)字代替不足以表示詞與詞之間的關(guān)系,word2vec通過多維向量來做詞嵌入,能夠表示出詞之間的關(guān)系,比如:男-女≈王子-公主。基于seq2seq的思想,利用多維詞向量來實(shí)現(xiàn)模型,預(yù)期會有更高的準(zhǔn)確性。(~~說人話:就是把每個(gè)漢字按照一定的規(guī)則轉(zhuǎn)換為一個(gè)多維矩陣表示,聯(lián)系越緊密的詞,在空間上距離越近,那么我們就可以得到各種近義詞,如 高興=開心 等)
?
so 為什么要基于seq2seq模型來做智能問答,其他模型不行嗎?
?
答案 是yes。其他模型也可以完成一個(gè)比較好的QA模型,業(yè)界流行2大方法論:1、基于文法規(guī)則的NLP,2、基于統(tǒng)計(jì)學(xué)的NLP。只是這2種方式的實(shí)現(xiàn)的代價(jià)不一樣。基于文法規(guī)則的來做NLP,優(yōu)勢是準(zhǔn)確率會非常高,你想想,每個(gè)組詞規(guī)則、每句話的主謂賓都給你標(biāo)出來,這樣的NLP如果做出來了是接近完美的;劣勢也很明顯,工作量太巨大,漢語光漢字就有幾萬個(gè),組詞規(guī)則會更多,很難做到完全統(tǒng)計(jì),難以快速迭代應(yīng)用。相反基于統(tǒng)計(jì)學(xué)的NLP(seq2seq是統(tǒng)計(jì)學(xué)模型),他的準(zhǔn)確率未必會有前者高,但是他的兌現(xiàn)速度快,可以在實(shí)際應(yīng)用過程不斷迭代,提高準(zhǔn)確率。這種方法的思路就是基于一批有限規(guī)模的語料庫,做機(jī)器學(xué)習(xí),讓機(jī)器不斷學(xué)習(xí)文法規(guī)則,以適用于某一特定領(lǐng)域,達(dá)到智能交互的目的。當(dāng)前比較大廠商的QA都是基于第2中方法的思路來做,比如:京東、圖靈、百度等。
?
接著談什么是seq2seq,為什么在統(tǒng)計(jì)學(xué)的諸多模型中,要選用他?
?
在網(wǎng)上找的一個(gè)簡潔的說明,主要參考《Sequence to Sequence Learning with Neural Networks》這篇論文,核心思想如下圖:
ABC是輸入語句,WXYZ是輸出語句,EOS是標(biāo)識一句話結(jié)束,圖中的訓(xùn)練單元是lstm,lstm的特點(diǎn)是有長短時(shí)記憶,所以能夠根據(jù)輸入的多個(gè)字來確定后面的多個(gè)字,有關(guān)lstm的知識可以參考《http://deeplearning.net/tutorial/lstm.html》
上面的模型中編碼器和解碼器共用了同一個(gè)lstm層,也就是共享了參數(shù),牛人們嘗試把他們分開像https://github.com/farizrahman4u/seq2seq中提到的樣子:
其中綠色是編碼器,黃色是解碼器,橙色的箭頭傳遞的是lstm層的狀態(tài)信息也就是記憶信息,編碼器唯一傳給解碼器的就是這個(gè)狀態(tài)信息
我們看到解碼器每一時(shí)序的輸入都是前一個(gè)時(shí)序的輸出,從整體上來看就是:我通過不同時(shí)序輸入"How are you <EOL>",模型就能自動一個(gè)字一個(gè)字的輸出"W I am fine <EOL>",這里的W是一個(gè)特殊的標(biāo)識,它既是編碼器最后的輸出,同時(shí)又是解碼器的一個(gè)觸發(fā)信號
那么我們訓(xùn)練的時(shí)候輸入的X,Y應(yīng)該是什么呢?X="How are you <EOL>",Y="W I am fine <EOL>"?
這是不行的,因?yàn)樵诮獯a器還沒有訓(xùn)練出靠譜的參數(shù)之前,我們無法保證第一個(gè)時(shí)序的輸出就是"I",那么傳給第二個(gè)時(shí)序的輸入就不一定是I,同樣第三、四個(gè)時(shí)序的輸入就無法保證是am和fine,那么是無法訓(xùn)練出想要的模型的
我們要這樣來做:我們直接把解碼器中每一時(shí)序的輸入強(qiáng)制改為"W I am fine",也就是把這部分從我們訓(xùn)練樣本的輸入X中傳過來,而Y依然是預(yù)測輸出的"W I am fine <EOL>",這樣訓(xùn)練出來的模型就是我們設(shè)計(jì)的編碼器解碼器模型了
那么在使用訓(xùn)練好的模型做預(yù)測的時(shí)候,我們改變處理方式:在解碼時(shí)以前一時(shí)序的輸出為輸入做預(yù)測,這樣就能輸出我們希望輸出的"W I am fine <EOL>"了
?
我們采用seq2seq模型的最主要原因就是模型擁有長時(shí)記憶能力,而且記憶能力可以根據(jù)我們的需求進(jìn)行控制,這種特性在我們漢語處理中至關(guān)重要。有時(shí)候一句話的意思需要頭和尾加在一起我們才能完全理解,這個(gè)道理同樣適用機(jī)器。
?
下次再談基于seq2seq模型怎么做寒暄庫。經(jīng)典模型代碼
https://github.com/warmheartli/ChatBotCourse/blob/master/chatbotv2/my_seq2seq_v2.py
?
文獻(xiàn)資料:
http://cn.arxiv.org/pdf/1409.3215.pdf
轉(zhuǎn)載于:https://www.cnblogs.com/xulele/p/6973917.html
總結(jié)
以上是生活随笔為你收集整理的机器人--寒暄库(4)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转发活动】Hey, 是你吗? | 寻粉
- 下一篇: [LeetCode]15. 3Sum