Chapter7-12_Controllable Chatbot
文章目錄
- 1 Chatbot面臨的問題
- 2 控制Chatbot的輸出
- 2.1 直接Finetune
- 2.2 輸入添加控制特征
- 2.3 只有獨(dú)白
- 3 展望
本文為李弘毅老師【Controllable Chatbot】的課程筆記,課程視頻youtube地址,點(diǎn)這里👈(需翻墻)。
下文中用到的圖片均來(lái)自于李宏毅老師的PPT,若有侵權(quán),必定刪除。
文章索引:
上篇 - 7-11 Deep Learning for Question Answering (2/2)
下篇 - 7-13 Dialogue State Tracking (as Question Answering)
總目錄
1 Chatbot面臨的問題
什么是Chatbot這里就不多說(shuō)了,顧名思義,就是聊天機(jī)器人。Chatbot是一個(gè)很難的問題,但我們其實(shí)可以先把它抽象得很簡(jiǎn)單,認(rèn)為這就是一個(gè)seq2seq的問題。訓(xùn)練的時(shí)候,就找一大堆語(yǔ)料,分別是一個(gè)人說(shuō)的前一句,和另一個(gè)人接的下一句,然后直接train。這樣會(huì)有一個(gè)非常致命的問題,就是同一個(gè)句子,不同人說(shuō)出來(lái)是不一樣的,這也就導(dǎo)致了找來(lái)的語(yǔ)料當(dāng)中,同樣的輸入,對(duì)應(yīng)的輸出有非常多種。比如問年齡的時(shí)候,不同年齡的人的回答必然是不一樣的。
直接用seq2seq的方法train出來(lái)的模型產(chǎn)生的對(duì)話會(huì)長(zhǎng)下面這個(gè)樣子,同樣的問題,換一個(gè)方式問,出來(lái)的結(jié)果就自相矛盾了。
除此之外,這樣train出來(lái)的模型會(huì)偏向于用比較單調(diào)和無(wú)聊的句子來(lái)回答問題,比如"I don’t know"是一個(gè)高頻的回答,因?yàn)檫@樣的結(jié)果是合理的,但這并不是我們希望模型回答的。
總結(jié)一下,有兩個(gè)問題:
- 回答的結(jié)果前后矛盾
- 回答的結(jié)果太過單調(diào)
2 控制Chatbot的輸出
要控制Chatbot的輸出,我們可以給Chatbot增加一些限定條件。限定條件可以是人物設(shè)定,可以是人物的情緒,也可以是某個(gè)特定的人物。
限定了之后,機(jī)器的回答會(huì)變成下面這樣。下圖的上半是限定情緒的結(jié)果,下半是限定了特定人物的結(jié)果,都是模型跑出來(lái)的真實(shí)例子。
那么如何訓(xùn)練出可以限定條件的Chatbot呢?有三種方法,下面來(lái)逐個(gè)講述。
2.1 直接Finetune
最直接的方法就是,先用一大堆語(yǔ)料來(lái)預(yù)訓(xùn)練Chatbot,然后再找限定條件的語(yǔ)料來(lái)finetune。這樣的問題是,我們一般沒法找到大量的限定條件的語(yǔ)料,這會(huì)導(dǎo)致模型很容易過擬合。要解決這個(gè)問題的話可以參考元學(xué)習(xí)的方法,這不是本文的重點(diǎn),不多做介紹。
2.2 輸入添加控制特征
我們也可以在輸入句子的結(jié)尾加一個(gè)控制輸出的特征。舉個(gè)例子,可以對(duì)同一個(gè)問題的不同回答進(jìn)行一個(gè)分類,然后在輸入的時(shí)候,把這個(gè)類別作為一個(gè)特征也輸入進(jìn)去。這樣train出來(lái)的模型,就可以通過控制這個(gè)輸入的特征來(lái)控制輸出了。這樣的語(yǔ)料數(shù)據(jù)可以是其他模型跑出來(lái)的,也可以是人標(biāo)注的。A Persona-Based Neural Conversation Model就是這種方法的一個(gè)經(jīng)典例子。
有一篇叫做CTRL: A Conditional Transformer Language Model for Controllable Generation的文章就是用的這種方法來(lái)訓(xùn)練一個(gè)language model。一般的language model在訓(xùn)練的時(shí)候,我們會(huì)找一大堆語(yǔ)料,然后讓模型在看到給定的tokens的情況下,預(yù)測(cè)出接下來(lái)的tokens是什么。CTRL這篇文章會(huì)在句子的最前面加上這個(gè)語(yǔ)料的來(lái)源,來(lái)源可以是Wikipedia,可以是Books,甚至是一個(gè)網(wǎng)址等等。不同的來(lái)源,句子的風(fēng)格是不一樣的。
然后我們用這樣訓(xùn)練得到的模型來(lái)進(jìn)行句子的生成,發(fā)現(xiàn)模型竟然知道哪一年的美國(guó)總統(tǒng)是哪位。
在Chatbot的訓(xùn)練中,有這樣給定了條件的公開數(shù)據(jù)集,比如Persona-Chat。這個(gè)就是facebook找了一堆人,然后告訴他們自己的人設(shè)是什么,然后讓他們對(duì)話得到的語(yǔ)料庫(kù)。
訓(xùn)練的方法也出奇地簡(jiǎn)單,直接把對(duì)人設(shè)的形容文字加到句子的開頭,放進(jìn)BERT去訓(xùn)練就可以了。TransferTransfo就是這樣做的,作者在訓(xùn)練的時(shí)候,還會(huì)去故意打亂描述人設(shè)的句子,因?yàn)檫@些句子間是無(wú)序的。
2.3 只有獨(dú)白
有些時(shí)候,我們只能拿到某個(gè)人設(shè)的個(gè)人獨(dú)白,沒法獲取到他的對(duì)話。這個(gè)時(shí)候,我們也是可以訓(xùn)練一個(gè)Chatbot來(lái)模仿該人設(shè)對(duì)話的。方法有很多種,下面依此介紹
(1)從已有的獨(dú)白當(dāng)中選取最有可能的回復(fù)。這種方法就保證了,回復(fù)必然是該人設(shè)說(shuō)過的某句話。
(2)用獨(dú)白訓(xùn)練一個(gè)language model,然后用這個(gè)language model來(lái)影響 Chatbot的輸出.
(3)用一個(gè)反向的模型來(lái)預(yù)測(cè)獨(dú)白中的某句話,是需要問話人說(shuō)怎樣的句子才會(huì)說(shuō)來(lái)的。用這種方法來(lái)制造數(shù)據(jù)。
(4)用有問有答的語(yǔ)料訓(xùn)練一個(gè)seq2seq模型,同時(shí)用獨(dú)白訓(xùn)練一個(gè)auto encoder。然后在訓(xùn)練的時(shí)候,兩個(gè)模型的decoder用的是同一個(gè)。這樣可以保證輸出與獨(dú)白的風(fēng)格類似。
(5)用Reinforce Learning或者GAN的方法,訓(xùn)練一個(gè)classifier來(lái)判斷輸出的句子和獨(dú)白的風(fēng)格是否相似。
3 展望
有時(shí)候,Chatbot說(shuō)出來(lái)了一個(gè)positive的句子,但在整個(gè)對(duì)話中可能是諷刺的意思。我們下一步的目標(biāo)應(yīng)該是如果希望Chatbot的對(duì)話是positive的,那Chatbot的整個(gè)對(duì)話給人的感覺應(yīng)該是postive的,而與Chatbot本身說(shuō)的話是positive還是negative無(wú)關(guān)。
總結(jié)
以上是生活随笔為你收集整理的Chapter7-12_Controllable Chatbot的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyCharm集成Anaconda3环境
- 下一篇: 论文阅读 - Jukebox: A Ge