back to index
[DLHLP 2020] Controllable Chatbot

link |
今天我們要講兩個主題,一個是Chatbot, 另外一個是Dialogue Stats的Trackit。
link |
我們先講Chatbot,Chatbot的這個領域其實非常廣,有很多跟Chatbot有關的研究問題。
link |
但是因為時間有限的關係,所以我們只講Chatbot裡面的一個主題,叫做Controllable Response Generation。
link |
雖然說Chatbot是一個非常有挑戰性的問題,你要讓機器可以自由的跟人聊天,是一個非常有挑戰性的問題。
link |
但是今天從深度學習的技術看來,其實Chatbot在概念上並沒有那麼困難。
link |
你只要訓練一個Sequence to Sequence Model,然後收集一大堆人類對話的資料,告訴Chatbot說看到人講這句話,你就應該給什麼樣的回應。
link |
然後期待說Chatbot就可以自動學會怎麼針對人類的輸入做出正確的回應。
link |
當然理想上很容易,但是實際上做起來是非常有挑戰性的。
link |
那有什麼樣特別有挑戰性的地方呢?其中一個特別具有挑戰性的問題就是,同一句話、同一句輸入,你對不同人講,每個人的回應可能都是不一樣的。
link |
每個人都有不同的人格特質,都有不同的人物設定,所以你今天對不同的人講同一句話,他的回應可能都是不一樣的。
link |
舉例來說,你對一個人講說,你要如何貢獻社會?如果是一個有為青年,他就會說,我要好好學習。
link |
如果是惡魔貓男,他就會問說,你對社會貢獻的定義是什麼?
link |
我來想想看我能不能夠記得原話。原話應該是這樣,你對社會貢獻的定義是什麼?什麼叫貢獻?什麼叫不貢獻?
link |
社會貢獻定義那麼簡單嗎?你說貢獻就貢獻。你上次看到有人貢獻社會是什麼時候,就算是我沒有任何專長,我也有辦法貢獻社會。
link |
然後他就變成惡魔貓男,要執念這個社會的不公不義。今天沒有任何人受到貓的制裁,誰都不准走。
link |
所以同樣一句輸入,每個人會有不同的回應。你今天收集到一堆對話,然後要讓你的對話機器人根據這些人的對話去學習如何做出正確的回應。
link |
但是今天,在你收集到的那些資料裡面,同樣的輸入可能會同時對應到好幾個不同的輸出。其實這個在真的訓練對話機器人的時候是非常常見的一個問題。
link |
而類似這樣的問題,其實不是指侷限在缺乏。如果你今天要訓練一個模型,同樣的輸入可以有多種不同輸出的時候,你就會遇到這樣的問題。
link |
舉例來說,語音合成就是輸入一段文字,然後輸出一段聲音。但是輸入同一段文字,不同人的聲音訊號就是不一樣的。所以同一段輸入可以對應到不同的輸出。
link |
所以其實TTS也有跟我們今天討論的這個check bar,同一個輸入有不同的輸出,這樣的問題在TTS也是存在的。當然有一些應用就可能沒有這種問題,舉例來說,如果是語音辨識輸入聲音訊號產生文字,那聲音訊號跟文字的對應關係倒是挺明確的。
link |
你不會說輸入一段聲音訊號,它有好幾種不同辨識的結果,這種狀況比較少見。所以如果是語音辨識,就比較不會有我們這一頁投影片說的問題。
link |
但是如果是比如說check bar,或者是TTS,就會有我們這一頁投影片看到的同樣的輸入,在你的訓練資料裡面有不同的輸出,可以對應到不同的輸出。
link |
那同樣的輸入可以對應到不同的輸出,或很類似的輸入可以對應到截然不同的輸出,對訓練出來的結果造成什麼樣的影響呢?
link |
那這邊舉兩個問題。第一個問題是,你通常拿訓練dialogue的database,它裡面往往有上千萬甚至近億句的對話,你拿去訓練你的check bar,你輸入給check bar一個問題的時候,它確實可以給你一個答覆,你跟check bar說一句話,它確實可以給你一個合理的答覆。
link |
但是如果你跟這個check bar講多了,你會發現它很容易自相矛盾、前言不對後語。
link |
以下這個例子是文獻上真實的例子。你對check bar說,你住在哪裡?它就會說,我住在洛杉磯。
link |
然後跟它說,你住在哪一個城市?它就說,你住在哪一個國家?它就說,英格蘭。前言不對後語,單看其中的每一個答覆都是一個合理的答覆,它知道說,你問它住哪裡,它要回答一個地名。
link |
但是你用不同的問句問它,它回覆的地名居然是不一樣的。因為對check bar來說,這些答覆都是在callbacks裡面出現過的,對它來說都是合理的,所以它根本就不知道說它需要保持一個人格的一致性,它只能夠住在一個地方。
link |
它不知道這件事,它只知道說,今天有人問它住哪裡,這些答覆都是合理的答覆,它就選一個它覺得機率最高的給你當作答覆。
link |
或者是說,問How old are you?它就會說,我十六歲了。問What's your age?它就說,十八歲了。你問它年紀,它會給你一個數字,但你用不同的問法,它每次回答的數字都是不一樣的。
link |
或問What is your major?它說,Psychology。What did you study in college?它就說,English Literature。所以它的主修變來變去,它是主修什麼,你根本不知道。
link |
所以,今天如果你直接拿大量人類的對話來訓練check bar,你會發現說,訓練出來的結果,這個check bar就是人格分裂啊。
link |
好,那還有另外一個問題就是,你用一般的訓練方法訓練完check bar以後,你會發現它的回答往往是非常簡短,然後非常無聊的,那check bar最喜歡回答的答覆就是I don't know。
link |
為什麼會這樣呢?一個可能的原因就是,同一個輸入有各式各樣可能的對應的回應,那I don't know往往是其中一種。那對check bar來說,在那麼多各式各樣不同的回應裡面,學習回覆I don't know是最容易的。
link |
因為I don't know可能是整個corpus裡面出現次數最多的。所以,今天在訓練完一個sequence to sequence model以後,I don't know,它用sequence to sequence model算出來的機率可能是最高的。
link |
所以,今天你發現說,你直接train一個check bar,拿大量的人類的對話來訓練一個check bar,最終這個check bar很容易動不動就講I don't know。
link |
你問它什麼問題,它都說我不知道。那雖然這是一個合理的答覆,但非常的無聊,這不是我們要的。
link |
所以我們期待說,我們在訓練check bar的時候,我們可以給它一個人設,讓它的答覆可以比較一致一點。
link |
讓check bar知道說,在眾多可能的答覆裡面,根據我們對check bar的人物設定,它能不能夠挑選一個合理的答覆。
link |
舉例來說,你可以給這個check bar一個persona。那什麼是persona呢?這個詞中文翻譯有點困難,它中文翻譯的意思比較像是形象、人物設定這樣子的感覺。
link |
舉例來說,你可以告訴check bar說,你要扮演一個有這樣子特色的人,你是一個喜歡認識新朋友的人,你是一個有養烏龜當作寵物的人,你是一個喜歡秋天的人。
link |
你給check bar這樣子的人物設定,期待說給check bar這些人物設定以後,在有眾多可能的回覆裡面,它可以挑一個跟它的人設符合的回覆。
link |
或者是,你期待可以設定這個check bar有什麼樣的情緒。你可以設定這個check bar說,今天有人對你說話的時候,現在你要回一句生氣的話,你要回一句高興的話。
link |
那這樣check bar就有了這樣子的限制,告訴check bar說,現在的回覆要使用什麼樣的emotion。
link |
有了這樣的限制以後,check bar期待就可以從眾多可能的回覆裡面選出一個比較合理的回覆。
link |
那講到這邊,可能有人就會問說,為什麼我們要check bar回答有情緒性的詞彙、有情緒性的句子呢?
link |
今天機器一個厲害的地方不就是它沒有情緒嗎?你不管怎麼羞辱它,它都不會生氣嗎?你跟它說什麼,它都不會生氣嗎?
link |
但是情緒是人與人間溝通一個重要的手段之一。
link |
你可以想像說,假設未來check bar確實生活在我們的日常生活中,我們日常生活中真的到處都有check bar,check bar比喻來說扮演了小朋友的老師。
link |
那小朋友有時候就非常頑劣,你跟它好好說,它就是聽不懂。
link |
所以這個時候check bar就要表現出生氣的樣子,斥責它,那這樣小朋友可能就會乖乖聽話。
link |
所以讓check bar有情緒,也許可以更能幫助check bar跟人類溝通。
link |
或者是,你能不能讓check bar扮演某些角色呢?讓它模仿某些名人,比如說川普說話呢?讓check bar想像自己是川普,想像一下說在眾多可能的答覆裡面,如果是川普的話,它會怎麼說?
link |
以上所講的那些,確實都是有機會可以做的,舉例來說,這邊就列了一些文獻,emotional chatting machine,它就可以讓機器做到它在回覆的時候可以選擇回覆的情緒。
link |
舉例來說,你對check bar講說,我遲到了,為什麼呢?因為交通很差。如果是一般的sequent-to-sequent model,不帶任何情緒的,它就會說,你遲到了。
link |
聽起來好像是老闆斥責你的這種感覺,老闆很冷漠的冷眼看你,遲到了,慢慢的走進公司,然後老闆就冷眼看你,斥責你說你遲到了。
link |
但是你可以幫這個check bar選擇它答覆的時候所使用的情緒。舉例來說,你可以用高興的情緒,那check bar就會說keep smiling,就讓你聽得心情比較好。
link |
或者是它可以用憤怒的情緒,它會說the traffic is too bad,它會幫你出氣,它告訴你說它覺得交通也很差,所以它也遲到了。
link |
或者是能不能夠讓check bar模仿不同名人講話的感覺呢?看起來也是有可能的,那我也把文件列在這邊。
link |
舉例來說,你可以做各種不同名人的butt,那你對它說,what are you doing?如果是Hillary butt,它就會說I'm running for president,如果是Trump butt,就會說I'm building a wall right now。
link |
那要怎麼做到讓我們來控制check bar的輸出呢?那以下會講三個方法,那第一個方法是最直覺的,我們就只用一頁投影片來講第一個方法。
link |
第一個方法是說,假設我們可以收集到某一種persona的人的對話,就假設我們現在要用persona來控制我們check bar的輸出,我們希望說給我們的check bar一個人設,它就會講出符合這個人設的話。
link |
那怎麼讓check bar講出符合某一個人設的話呢?那你就想辦法把有這種人設的人的對話把它收集起來,有某a他的人設就是我們要的,你去把某a跟別人講過的話收集起來,然後收集到一些某a的對話,然後拿這些對話來fighting你的check bar。
link |
那要train from scratch可是有點困難啦,因為check bar的訓練往往需要非常非常大量的資料,那你先用非常非常大量的資料,但是來自多種不同人設的對話,先用大量的資料把這個check barpresent起來,然後再用少量的某種特定人設的資料去微調check bar的參數。
link |
不過這邊的難點是,你很難真的收集到大量的資料,所以今天就是如果只收集到非常少量的資料,非常少量的特定人設的資料拿去fighting你的check bar,很有可能fighting下去結果就壞掉了。
link |
所以怎麼辦呢?有一個可能的研究方向就是用到今年來非常受到重視的meta learning這個技術,你可能收集了各種不同人設的資料,有a的資料,有b的資料,有c的資料,然後你訓練一個check bar,這個check bar呢,他可以只看少量的對話的資料,就很快速有效的進行微調參數。
link |
你訓練一個好的check bar,他有一組好的初始的參數,這組好的初始參數,只要看少量特定人設的資料,就可以成功進行微調,那你可以用memo來做這件事情。
link |
有關這個memo,有關meta learning的部分,有興趣的同學可以參考右上角的錄音,過去在機器學習這門課已經曾經講過了。那這邊呢,我們就先暫時不花時間贅述,等之後有機會講到meta learning在human language processing上的應用的時候,我們再跟大家詳細說明。
link |
這是第一個最簡單的做法。第二個做法呢,是透過給check bar一個condition的方式來操控他的輸出。什麼意思呢?我們就具體來看看第二個方法是怎麼操作的。
link |
現在呢,你收集到一大堆的訓練資料,在這些訓練資料裡面,你問check bar說,這個不是check bar說的話,在這些訓練資料裡面,某個人說,How is today?你今天過得如何?
link |
那有的人的回應是,啊,今天太棒了。有的人對同樣一個輸入的回應是,啊,今天太糟了。那如果你直接拿這樣子的資料,一股腦倒進你的check bar裡面,train一個sequence to sequence model,那對check bar來說,他的訓練會非常的困難,因為你對他說,How is today?
link |
Today is awesome, and today is bad,都是正確答案。那他會不知道說,要產生哪一個答案是正確的,他可能會產生這兩句話的平均,那可能就是你期待以外的東西。
link |
那在control by condition這樣子的方法裡面,你會把response的特性也標註出來。那這邊是舉一個比較簡單的例子,你可能會標註說,這個response是正面的回覆,這個response是負面的回覆。
link |
那這邊是標註比較簡單的特性,那你也可以標註更複雜的東西,這邊是以比較簡單的標註為例。
link |
那講到這邊,你可能會想說,要對response產生這樣的標註,會不會很困難呢?會不會要請很多工讀生來做呢?
link |
今天也許未必需要,因為你可以找到現成的off-the-shelf的sentiment classifier這種句子正負面的分類器。那這是我們機器學習這門課的一個作業了,所以假設你有修機器學習這門課的話,你手上就有一個現成的句子正負面的分類器。
link |
直接把這些句子,直接把這些response丟到那個分類器裡面,你其實就知道它是正面的還是負面的。那這個前提是,你那個分類器訓練得非常好就是了。
link |
好,那今天呢,假設你要拿左邊這筆資料出來做訓練的時候,一般的訓練方法就是告訴你的sequence-to-sequence model說,
link |
你要輸入how is the day,你要讓輸出today is awesome的機率越大越好。但在control by condition這種方法裡面,你還會加一個condition,你把你現在這個response的標注變成network可以吃的形式。
link |
舉例來說,你可以先設定好說positive就用1來表示,negative就用0來表示。today is awesome是個positive的句子,所以我們今天我們的decoder在產生這個句子的時候,
link |
我們除了直接告訴它說,你應該產生這些句子,我們還會給它要產生出來的句子的標注,要產生的這個句子的特徵,告訴它說,現在我們要你產生一個正面的句子。
link |
如果我們要你產生一個正面的句子,也就是給decoder1這個數字,它就應該輸出today is awesome。
link |
假設現在sample到另外一筆資料,另外一筆資料是today is bad,那你要告訴機器說輸入today,how is today,那你輸出today is bad的機率越高越好。
link |
但告訴它說輸出today is bad的機率越高越好,你還要告訴它說,我現在給你一個數字0,你是在看到數字0的情況下,輸出today is bad的機率越高越好。
link |
所以今天對機器來說,你不是告訴它說看到同一個輸入,有可能會有不同的輸出,這樣你沒辦法訓練sequence to sequence model,它會很confused。
link |
而是告訴它說,看到how is today,且輸入1作為condition的時候,你就說today is awesome,看到how is today,輸入0作為condition的時候,你就輸出today is bad,用這個方法來訓練你的缺把。
link |
這樣子的缺把在訓練好之後,在真正使用它的時候,你對它說I love you,它會做什麼樣的回應呢?這取決於你給它什麼樣的condition,你自己決定condition是什麼,你給它不同condition,它就會有不同的回覆。
link |
以下其實是文獻中真實的例子,如果你train這種可以控制它輸出是正面還是負面的缺把,然後你對它說I love you,你知道有一個人對你說I love you,它對你告白,你是有千千百百種不同的回應的,取決於它是誰,取決於它是死臭酸宅還是型男,你的回應會有不同。
link |
所以如果今天這個control的部分,你輸入1,1就是正面的回覆,就會說I love you too,如果你輸入0,就會說I'm not ready to start a relationship,還沒有開始準備好要發展關係,但是只是沒有準備好跟你發展關係,跟別人是可以的,那這個就是用condition來進行control。
link |
像這樣子的研究,最早而且非常經典的一篇文章叫做Persona-Based Model,是2016年的文章,你可以想想看,這個也是一個上古神獸,也是非常有歷史性的、非常具有代表性的一篇文章。
link |
在Persona-Based Model裡面,它是用Twitter的資料訓練的,所以它今天收集了大量的對話,而且它知道每一句話是誰說的。
link |
所以今天在訓練一個sequence-to-sequence model的時候,假設它現在知道說它的response是Bob說的,那今天除了要你的sequence-to-sequence model輸出跟對話裡面的response越接近越好以外,你也會給你的decoder現在這句話是誰說的資訊。
link |
你會告訴這個checkbox說,如果你現在這句話是Bob說的,那你問它說,Where do you live?你問Bob說,Where do you live?Bob就會說一定的。
link |
那如果今天放別人的話,他住在不同的地方,他就會有不同的答覆。
link |
但是,怎麼把人物,怎麼把Twitter上的一個人,比如說,這個不是Bob,我剛才是講的Bob,這個是Rob,怎麼把Rob變成一個decoder的輸入呢?
link |
那在Persona-based model裡面,它是把每一個Twitter上的人都用一個向量來表示,所以Rob也是一個向量,其他每一個人物也都是一個向量。
link |
而這個向量是自動學出來的,所以Rob用什麼樣的向量來代表,是自動學出來的。你會把Rob的向量作為decoder的輸入,讓decoder輸出Rob可能會講話。
link |
這個是Persona-based model,它可以讓機器模仿不同的Twitter上的人說話。那以下是這篇Paper裡面真實的一些例子,就是你現在有了這種Persona-based model以後,對你的Bot說,Where is your hometown?
link |
那如果是一個general的Bot,如果你直接用sequent-to-sequent model,沒有這種condition的話,那這個Bot會說,I was born in Canada。所以感覺Twitter上是不是加拿大人特別多啊?
link |
所以問你說是哪一個hometown的時候,明明每個人住的地方不一樣,但他就是說他住在加拿大。不是問他住的地方,而是問他家鄉在哪裡,問他家鄉在哪裡的時候,家鄉在加拿大的人感覺最多。
link |
所以今天sequent-to-sequent model選擇回答說,家鄉是在加拿大。但是如果你今天可以給機器人物的話,今天你用這種Persona-based model,讓機器在學習的時候,它可以模仿不同的人說話。
link |
這邊就給了機器十個不同的人,十個不同的Twitter上的人的ID,然後今天這個Persona-based model,輸入不同的人就給出不同的答覆。有的人住在,有的人的hometown是Texas,有的人是LA,有的人是英國。
link |
或者是說,What company do you work for?那如果是baseline的話,他回答就怪怪的,I work for company,回答等於沒回答。
link |
那如果是不同的人物的話,那就有各式各樣的答覆了,有的人說,I work in a cafe,有的人說,I work at a gas station。
link |
也有一些比較奇怪的答覆,這邊作者特別標了一個警字號,代表說他覺得這個答覆有問題。
link |
或者是,你今天對機器說,What did you have for dinner?那如果今天沒有Persona的話,機器會說,I have fish and chips,那看起來吃fish and chips的人最多,Twitter上吃這個人的最多。
link |
那如果今天給機器不同的人物的話,讓他模仿不同人物的話,他就有不同的答覆,有的人是吃fish and chips,有的人吃chicken chips,有的人吃pizza,有的人吃Mexican food,有的人吃salad,每個人吃的東西都不一樣。
link |
接下來,我們要講說,我們如何操控Chatbot的輸出呢?我們如何把某種condition拿來操控Chatbot的輸出呢?
link |
在前面的例子裡面,我們都把network化成是說,我們把condition用某種方法做encoding,比如說正面就是1,負面就是0,或者是每一個Twitter上的speaker都是一個向量。
link |
那我們今天把這個向量當做decoder,每一個timestamp的輸入。那其實有其他的方法可以來操控一個generator的輸出,那一個知名的方法叫做conditional transformer language model,
link |
它也是有湊梗的,它的縮寫就是ctlr,就是鍵盤上面的ctrl鍵。那這個ctrl,它是怎麼操控一個句子的呢?
link |
那其實ctrl這篇原始文章,它並沒有做任何跟Chatbot有關係的事情,它是希望control一個language model的輸出。
link |
那你知道,你train好一個language model的時候,你要這個language model產生句子的時候,它就亂生一些句子嘛,你也沒有辦法控制它產生什麼樣的句子,你也沒有辦法控制它說特定領域的話,或者是模仿特定的風格。
link |
而conditional transformer language model就是希望可以控制language model的輸出。
link |
那像這樣子的方法,等一下會看到例子,它是可以被用在Chatbot上的。
link |
那這個ctrl是怎麼做的呢?它在這篇paper裡面,作者收集了非常大量的文章,這些文章來自於各式各樣不同的domain,包括Wikipedia,Books,Review,等等等等。
link |
然後今天呢,我們在訓練language model的時候,我們知道說一般你訓練language model就是你收集到一大堆的token sequence,那叫機器學習,
link |
even前面已經看到token sequence預測下一個token sequence,但在ctrl裡面,它會在每一個token sequence的前面再加上一個ctrl code,告訴你說現在我們要產生什麼樣的句子,而它的ctrl code是什麼樣的東西呢?
link |
其實就是一個詞彙,假設這個句子是從書這個domain來的,那我在產生這個句子的開頭,我就加上Books這個詞彙,Books這個token,然後告訴機器說,看到Books這樣子的token,你接下來就應該輸出這樣子的句子。
link |
甚至還有更狂的,它有一些文章是來自於網頁,所以它有那個文章的網址,所以它今天要產生這段文字的時候,就是先給它一個網址,告訴它說看到這樣子的網址,你就應該輸出這樣子的文字,這個就是ctrl。
link |
以下是ctrl那篇paper裡面一些真實的例子,舉例來說,一般我們在使用language model產生文字的時候,你就給你的language model幾個詞彙,接下來讓language model把完整的句子寫完。
link |
舉例來說,現在你對language model說a knife,接下來language model就要自己編一個故事,說一把刀怎樣怎樣。但是在ctrl裡面,你會給你要輸出的句子一個ctrl code,你會告訴機器說,現在我們的句子的開頭是a knife,那順便告訴你說,你應該寫一個恐怖故事。
link |
這個horror應該是reddit上面的一個版,它也有從reddit上面爬資料,所以reddit上面的每一個版也當作一個domain,那horror版就是其中一個reddit上的版,那現在就告訴機器說,你要產生一個像是horror版上那些網友會寫的文章,所以機器就會使用a knife作為開頭寫一個恐怖故事。
link |
但是如果你換另外一個ctrl code,你在a knife前面寫的詞彙是review,告訴機器說,你現在要寫一段像是review的文章,那機器就會說,a knife它是一種工具,然後這一把刀它會做出好的事情,順便給個評價,還說這把刀我給它的評分是4.0,它確實寫了一則review出來。
link |
或者是,如果你要輸出my neighbor is 為開頭的文章,那你給機器不同的ctrl code,它就輸出不同的結果。
link |
relationship應該也是reddit上面的關係版,如果是像是關係版上的文章的話,它就會說,my neighbor is a jerk。如果是legal版上的文章的話,它就會說,我的鄰居正在威脅要告我,因為我不讓他用我的游泳池,接下來會怎樣,不知道,寫了一個很長的文章。
link |
你也可以用輸入連結,輸入網址的方式,來控制現在要輸出什麼樣的文章。舉例來說,你給control這個model一個網址,對它來說這個網址就是一段文字,它讀了這段文字,它就產生以下的新聞。
link |
這段文字理論上是US President見到了British Prime Minister,是US President跟British Prime Minister會面的新聞。
link |
但是有趣的地方是,他修改了連結裡面的日期,居然就可以改變文章的內容。本來連結的日期是07年,所以這個時候US President,就是George Bush,他把07改成14,那output就出現Obama,他把14改成18,output就出現Trump。
link |
所以他還學到了一些這個社會的知識,他知道說,不同時期的新聞裡面出現的美國總統,應該就是不同的人。
link |
在這一系列,讓機器學習怎麼control它的輸出的文章裡面,一個特別常用的,今日比較知名具代表性的Corpus,叫做Persona Chat,這是一個Corpus,希望你可以拿這個Corpus來訓練你的Chatbot。
link |
這個Corpus的目標是訓練Chatbot能夠根據某種人設,得出符合這個人設所應該說的話。Persona Chat裡面的對話,長得像是這個樣子。
link |
一般你可以拿來訓練Dialogue Corpus,就只會給你下面這邊,給你一堆人的對話。但是Persona Chat這個Corpus,除了會給你這些對話以外,它還會告訴你這個對話者,有一個Persona 1,他的人設是什麼,那Persona 2,他的人設是什麼。
link |
希望你的Chatbot可以根據這個Corpus,它可以學會怎麼根據人設,產生符合人物設定的對話。這樣子的Corpus是怎麼收集的呢?這個是Facebook AI跟Mira做的,他們怎麼知道說這個對話裡面每一個人物的人設是什麼呢?
link |
他們其實是反過來收集的,並不是先有對話再去標註這個對話裡面的人物的人設,而是先設定好兩人的人設,然後找兩個工讀生來,去那個AMT上找兩個人來,要求他們根據這個人設進行對話。
link |
所以人設是事先設定好的,第一個人就拿到這樣的人設,說你要扮演一個喜歡Ski,然後你的老婆不再愛你,這個怎麼這麼慘,怎麼這麼慘的人設。
link |
然後你喜歡Mexican food,然後你喜歡吃Cheetos,然後另外一個Persona 2,第二個人他要扮演一個有四個小孩的不知道是父親還是母親,然後你喜歡看Game of Thrones。
link |
然後接下來Persona 1跟Persona 2,這兩個人就開始對話,他們要在字裡行間顯露出他們的人設,今天要求這兩個工讀生在對話的時候,要盡量根據自己的人設說話。
link |
所以第一個人就說Hi,第二個人就說Hello,How are you today? 然後第一個人就說I'm good,Thank you,這個有點怪了,因為他老婆不再愛他,他應該不會說I'm good,他應該很慘。
link |
不過一般禮貌上,人家問你說你今天過得如何,不管你過得好還是不好,在禮貌上都會說I'm good。
link |
第二個人就說,我的小孩跟我,我們要看Game of Thrones。這個跟第一次見面的人講這樣是有點突兀,不過他要趕快顯示出他的人設,趕快說我有小孩,而且我要看Game of Thrones。
link |
然後第一個人就說,你的小孩幾歲?人設裡沒這段,不過就可以隨便編,他的小孩十到二十一歲,順便趕快透露說他有四個小孩。然後第一個人就說,I do not have children at the moment,他沒有小孩,因為他老婆不再愛他,沒有小孩。
link |
然後人物二就說,那你可以把所有的爆米花都吃掉,二試圖安慰一下一,這樣可能只會讓一的心情更低落而已。然後一講,這不是真的人設,這都是編的,他們都只是在演戲而已。
link |
一就說,而且我可以吃掉所有的Cheetos,他趕快顯示說他喜歡吃Cheetos。所以這個對話就是這樣,就是兩個人試圖根據人設講出符合這個人設的對話。今天如果你想要訓練ChetBar有根據人設講出符合人設對話的能力的話,你通常會使用Persona Chat這個Corpus。
link |
那怎麼解Persona Chat這樣的問題呢?有一個特別有趣的解法叫做Transfer-Transfer,這個是什麼東西呢?
link |
它是Transfer-Transformer的縮寫,它故意不把Transformer完整的寫出來,這樣念起來就像是Transfer-Transfer,這樣有點一語雙關的感覺,把同樣的詞彙重複兩次的感覺,類似猜猜拳用疊字的感覺。
link |
那現在怎麼讓機器學會根據自己的人物設定來講話呢?那這篇Paper的解法其實就是簡單粗暴,直接把這些人設當作一個句子丟到GPT-2裡面就結束了,這些人設就是一個巨大Language Model最開始的輸入。
link |
你給這個巨大Language Model一段人設,I like to ski,然後接下來再給它一段輸入,說How are you today?
link |
那期待這一個Language Model再經過一點,再經過用這個Corpus,用Persona Chat這個Corpus裡面的資料微調以後,可以得到符合一開始給它這個人設的Response。
link |
那因為今天在Persona Chat的Corpus裡面,人設這個東西是由多個句子所組成的,但是這個人設的句子的順序並不重要。
link |
所以今天實際上在Train這個Transfer Transform的時候,作者會刻意把這個Persona的句子順序打亂,還用各種不同的Persona的句子順序去Train它的GPT-2,這樣可以做到類似Data Augmentation的效果。
link |
第三個要跟大家分享的方法是,如果我們只有Monologue的時候,怎麼做Control Checkbar的Output這樣的事情呢?
link |
第三個方法的狀況是這個樣子的,在剛才我們前面講的方法裡面,我們都需要收集一些對話,這些對話裡面需要包含我們所要的某些特性。
link |
你希望你的Checkbar講話像某種人物設定,那你就得要有這種人物設定的對話才能夠訓練你的Checkbar。但是很多時候,我們有可能只有Monologue,也就是獨白,我們很有可能只有某一個角色的獨白。
link |
在這個情況下,我們怎麼讓我們的Checkbar它的回覆像是某種角色呢?舉例來說,你希望你的Checkbar講話像是川普,可是你可能沒有辦法收集到太多川普跟其他人的對話。
link |
但是在網絡上,你可能可以收集到很多川普的演講,所以你有很多川普自己講話的獨白,你可能沒有他跟其他人的對話,但是你有很多川普講過的句子,那期待透過這些川普講過的句子,你可以讓你的Checkbar輸出的Output比較像是川普說的話。
link |
這就是第三個方法想要達成的目標。在這種Monologue Only的情況下,你怎麼讓你的Checkbar講話像是某種角色呢?我們先講三個比較直覺的做法。
link |
第一個最直覺的做法就是,今天你要求你的Checkbar在進行回覆的時候不要自己產生句子,而是一定要從Monologue裡面產生句子。
link |
假設你今天要讓你的Checkbar講話像是川普,你收集了一大堆川普的演講稿,那你今天讓你的Checkbar回話的時候,一定要從川普的演講稿裡面挑一個句子出來回話,那你的Checkbar講的話可能就會讓使用者覺得,嗯,有點像是川普。
link |
那像這樣的方法對那種有口頭禪的人物也許是特別有用。舉例來說,卑鄙原之助,你跟他講什麼,他都講卑鄙原之助。他不管你對他講什麼,只要回答卑鄙原之助,然後再搓一下手,就很像是卑鄙原之助會說的話了。
link |
那還有另外一個方法呢,叫做Multiply。另外一個方法是說,我們現在只有Monologue的Data,所以沒辦法拿來訓練Checkbar,怎麼辦呢?我們拿這些Monologue的Data來訓練一個Language Model。
link |
Monologue的Data只有一大堆的句子,訓練Checkbar不行,訓練Sequence-to-Sequence Model不行,但可以拿來訓練一個Language Model。那接下來呢,你再拿這個Language Model來影響你的Checkbar的速度,什麼意思呢?
link |
Checkbar就是一個Sequence-to-Sequence Model,那在做Sequence-to-Sequence Model的時候,你往往會做Bin Search,選出一個分數最高的句子。那你能不能在Bin Search的時候,在算分數的時候,不只參考原來Sequence-to-Sequence Model算出來的機率,也參考一下用Monologue訓練出來的Language Model算出來的機率。
link |
用Monologue訓練出來的Language Model算出來的機率,來微調你現在Sequence-to-Sequence Model會輸出的句子。那期待Sequence-to-Sequence Model最後在輸出句子的時候,可以選一個句子,這個句子比較像是Monologue裡面會出現的句子。
link |
第三招是我覺得特神奇的,叫做Pseudodata。它怎麼做呢?它說,你只有Monologue是吧?舉例來說,你只有川普的講稿,你只知道他會說Make America Great Again跟I Want to Build a Wall。
link |
接下來,你訓練一個反向的Chatbot,一般正向的Chatbot是輸入一個句子,輸出一個回應。訓練一個反向的Chatbot,這個反向的Chatbot根據大量資料訓練出來的是給你一個回應,預測應該有什麼樣的輸入。
link |
舉例來說,當有一個人的回覆是Make America Great Again的時候,那到底人家跟他說了什麼話,他會講這句話呢?可能人家跟他說了,What is your goal in life?你人生目標是什麼?那他回答就是Make America Great Again。
link |
或者說,什麼時候有一個人會說I Want to Build a Wall呢?也許有人跟他說,你現在想做什麼的時候,他就會說I Want to Build a Wall。你用這個反向的Chatbot,你就可以把Monologue的Corpus轉變成Dialogue的Corpus,這樣你就可以套用我們剛才在Approach 1或Approach 2講的方法來訓練你的model,
link |
來訓練你的可以吃Persona作為輸入的model,可以扮演不同角色的Chatbot。
link |
還有另外一個做法是說,你現在有大量的讀白,那你就用那些讀白訓練一個Sequence to Sequence的model。
link |
那怎麼用讀白訓練Sequence to Sequence的model呢?這個Sequence to Sequence的model其實是一個Autoencoder,就輸入一個句子,要輸出一模一樣的句子。
link |
然後同時另外一邊呢,你在訓練一個Chatbot,他也是一個Sequence to Sequence的model,但是跟這邊Autoencoder不一樣的地方,他是有人跟他說一句話,他要得到一個回覆。
link |
那上面這個Sequence to Sequence的model是用大量不同人的資料train的,下面這個Autoencoder是用單一一個角色的monologue train出來的。
link |
但是你在訓練的時候,你要求這個Sequence to Sequence的model decoder跟這個Autoencoder的decoder,他們的參數要直接被tie在一起,他們要用一模一樣的參數。
link |
這樣可以達成什麼效果呢?這樣就可以達成說,因為這個decoder在訓練的時候,你會要求他常常輸出monologue裡面的句子。
link |
那所以今天這個Sequence to Sequence的model在答覆的時候,就會傾向於output比較像是monologue裡面有的句子。
link |
那這招其實跟我們剛才講的multiply,train a language model做rescoring這句這樣子的方法,其實是有異曲同工之妙啦。
link |
那還有另外一個做法,這個做法是,你有monologue data,那我們就用這些monologue data去訓練一個classify。
link |
這個classify的作用是給他一個句子,他可以判斷說這個句子像不像是monologue裡面有的句子,像不像是從這個monologue裡面sample出來的句子。
link |
就是你已經有monologue的句子,你只要可能再去找另外一堆句子當做next example,你就可以訓練一個classify。
link |
這個classify給他一個句子,他會決定說他像不像是monologue裡面的句子。
link |
那假設你的monologue是川普的演講,那這個classify就會判斷說這個句子像不像是川普會說的話。
link |
然後接下來呢,你去update你的sequence-to-sequence model,也就是checkbox的參數,那現在update的目標是要去騙過這個classify,讓classify覺得說這個sequence-to-sequence model的輸出像是monologue裡面的句子。
link |
那這個地方你可能會需要用到rl,為什麼你會需要用到rl呢?因為今天你的sequence-to-sequence model輸出是discrete。
link |
它就像是rl裡面的action一樣,它是discrete的,所以通常可能會用rl的algorithm來調你的sequence-to-sequence model。
link |
你可能會把classify的輸出當作是reward,classify說現在輸入的句子越像是monologue,你的reward就越大,然後你的sequence-to-sequence model就用rl的方法去maximize他可以從classify得到的reward。
link |
或者是你也可以把它當作像game一樣來check,你的checkbox,sequence-to-sequence model就是generator,這classify就是discriminator。
link |
那你要訓練generator去騙過discriminator,那discriminator也會update,那generator也會update,他們就iterative的update,讓彼此越來越強。
link |
但是實際上在做的時候,還是有一些額外的限制是需要注意的。
link |
什麼意思呢?你今天如果只單純的去update你的sequence-to-sequence model,要這個sequence-to-sequence model去騙過classify的話,最後可能會得到什麼結果呢?
link |
如果你今天是用川普的data,那可能到時候不管你說什麼,他都會說make America great again,他就不管input了,他就不想做對話了,反正他只要輸出一個像是monologue裡面的句子,就可以騙過classify,就結束了。
link |
所以他可能講來講去,都是monologue裡面的句子完全無視你的輸入,那這個顯然是我們不要的。
link |
所以怎麼解這個問題呢?那就有各式各樣不同的方法,那在這邊我們就不細講,那我們就講一些直覺上你完全可以想到的解法。
link |
你可能會說,我在update我的參數的時候下一些限制,我要求參數update的量越小越好,這當作是另外一個reward,你不可以讓參數的update量太多。
link |
或者是你另外train一個sequence-to-sequence model,那你要求說現在output的句子用另外一個sequence-to-sequence model算起來,機率不能太低,這代表說你現在的缺乏不可以產生太過前言不對後語的句子。
link |
你產生出來的句子跟前面的句子接起來還是有一些合理性的,對另外一個general缺乏來說輸出這個句子也應該是可能的,也應該是一個合理的回覆。
link |
那這個問題其實很像是cycle game會遇到的問題,因為我們剛才說你完全可以把這個training就當作是一個game,所以這是generator,這是discriminator。
link |
我們都在train cycle game的時候,你一定要再做cycle consistency,所以這邊你完全可以加上cycle consistency,你再train另外一個sequence-to-sequence model,必須要根據這個response回溯,猜出原來的輸入是什麼。
link |
那如果你今天的sequence-to-sequence modeltrain到後來只會說make America great again,那今天他就沒有辦法猜出說原來的輸入是什麼。
link |
所以你也可以用cycle game的概念再去train另外一個reconstruction的network,試圖從這個response裡面reconstruct原來的輸入。
link |
那這邊就舉一個具體的例子,假設你今天的monologue都是正面的句子,那你就可以讓這個機器學會都說正面的話變成一個樂觀缺乏,都是說正面的話,你說什麼他都會說一些正面的話來回覆你。
link |
就是訓練出一個sentiment classifier,這個sentiment classifier給一個句子可以判斷說這個句子是正面的還是負面的。
link |
因為在你的monologue裡面已經有很多正面的句子了嘛,所以你已經有一大堆正面的句子,所以你可以train一個classifier判斷說一個句子是正面的還是負面的。
link |
那所以如果是負面的句子,today is bad,丟到sentiment classifier裡面它output的分數就會很低,然後接下來你可能再用RL的做法去訓練你的sequence to sequence model,要求sequence to sequence model調整參數,以便輸出一個句子,這個句子是可以讓sentiment classifier的輸出分數越高越好,也就是sentiment classifier覺得現在輸的句子越像是一個正面的句子。
link |
那你今天的sequence to sequence model可能就會把today is bad的bad改成good,它如果把bad改成good的話,丟到sentiment classifier裡面就會得到比較高的分數。
link |
那我們在下面這邊有說過說,我們就是要給我們的sequence to sequence model一些constraint,所以它不會把整個句子統統改掉,它不會為了讓sentiment classifier認為這個句子是正面的,就不管輸出什麼它都說wonderful, wonderful, wonderful, good, good, good, good, good。不會這樣,它不會只輸出一堆正面的字彙。
link |
因為你有限制這個sequence to sequence model,不可以調太多,所以它只可能只會把today is bad的這個bad,特別會影響sentiment classifier這些字彙,改成正面的字彙。
link |
那這個是用monologue data來訓練你的缺把。那以下是一個真正的demo,從文獻裡面擷取下來的例子。你今天如果一堆positive的句子,你就可以訓練一個樂觀缺把,他總是講正面的話。
link |
所以有人對他說,I'm less interested in the how-to and more in the what and why of the things we build,這個人就說了一套他自己的想法。
link |
那如果是一般的sequence to sequence model,就否定這個人,it's not a good thing,但如果是一個樂觀缺把,因為他知道他要講正面的話,才能得到reward,他就會說,oh, it's a good one,就隨便亂讚美一下。
link |
或有一個人說,always learning and self-improvement is a huge turn-on for me。那如果是一般的缺把,就會說,I'm not sure if I can see you in a relationship,人看到這句話,一定勃然大怒。但如果是正面的缺把的話,就會說,I love you so much。
link |
這是另外一個文獻上的例子,就是想辦法讓缺把說話像是Big Bang Theory裡面的六個主要角色。
link |
這邊只有用這六個角色的monologue data,也就是說把這六個角色有講過的台詞拿出來訓練缺把,讓缺把講出像這些台詞的話,並沒有用到六人行裡面的對話,就只有拿這些角色曾經說過的話來訓練缺把,讓缺把來模仿這六個角色說過的話。
link |
那如果是這樣訓練的話,用我們剛才講的加一個classify訓練的方法,如果你現在對機器說Do you like him?那一般的缺把,他的回答會是No, just stop。
link |
你喜不喜歡他呢?男生的他?然後這個一般的回答就不,不喜歡。那如果是Howard呢?Howard說No, I'm sorry。
link |
如果是Leonard呢?Leonard也說No, Leonard也不喜歡男生的他。如果是Rush呢?Rush會說他是個好孩子。
link |
那如果是Sheldon會說他真的是一個好朋友。如果是Penny的話會說He's a cool kid。如果是Bernadette的話會說He's my man。
link |
那這個到底合不合理?我對這個Big Bang Theory沒那麼熟,所以很難說這個合理還是不合理,反正訓練出來的結果就是這個樣子就是了。
link |
那還有一個可以操控你的model產生句子的方法,叫做Plot and Play Language Model。
link |
那Plot and Play Language Model其實跟我們剛才講的另外訓練一個classifier去操控你的sequence-to-sequence model的想法其實是非常非常類似的,在概念上、精神上類似,但實作的方法不太一樣。
link |
那因為它們非常的類似,所以我就把這個Plot and Play Language Model放在這邊,那就是告訴大家說有這個東西,有這個操控Language Model輸出的方法。
link |
那你會發現說這個Plot and Play Language Model正好跟剛才講的那個Control是一體兩面,它們都是在操控Language Model的輸出,但是它們用的方法截然不同。
link |
像剛才講的那個Control那個方法,它是用一個Control Code來操控Language Model,那現在這個Plot and Play Language Model它是完全不同的方法,它這邊畫了一個非常傳神的比喻,這個傳神的比喻是這樣子的。
link |
GPT-2就像是一個大象,它碩大無朋,那我們訓練一個小小的Classifier,這個小小的Classifier就像是一個老鼠,那它透過Gradient Descent,這個是大象的江神來操控GPT-2這樣子的龐然大物。
link |
那Plot and Play Language Model的細節就留給大家自己去研究,那我們就是把論文放在這邊,讓你知道說有這麼一篇文章,你可以自己去研究。
link |
那我這邊就很快的講一下它的大概念就好,它大概念就是我們來訓練一個Attribute Model,那Attribute Model其實就是我們剛才看到的Classifier。
link |
那我們可以用這個Classifier來操控我們Language Model的輸出,怎麼用這個Classifier來操控Language Model的輸出呢?原來Language Model如果沒有這個Classifier,它今天已經看到Chicken跟Test,那它會輸出什麼樣的句子呢?
link |
它可能會輸出OK,這個雞腸起來還可以,但是如果你要求它要輸出正面的句子,會怎麼樣呢?今天這個Plot and Play Language Model,它會改變Language Model裡面的Latent Representation,其實它改變的是Key跟Value的值。
link |
Key跟Value就是Transformer裡面的Latent Representation,可以說它是改變Latent Representation的值,它期待改變Latent Representation的值,改變以後可以讓這個Attribute Model的Output越大越好。
link |
如果這個Attribute Model是一個Sentimental Classifier,就是希望輸出的句子可以越正面越好。那如果你有這樣的Sentimental Classifier,那你Update你的Latent Representation以後,那OK可能就會變成Delicious。
link |
這個Plot and Play Model一個特別的地方,就是我們剛才在講這種操控Chain Bar輸出的時候,我們說我們要用RL去改這個Sequence-to-Sequence Model的參數,那很容易一不小心就把整個Model都改壞掉了。
link |
這個Plot and Play Model一個神奇的地方,就是它完全沒弄動到Language Model本身的參數,它只改Language Model Latent Representation的輸出而已,至於它實際上是怎麼做到的,就讓大家參考論文的文獻。
link |
它還附了一個非常有趣的圖,我們就很簡單的講一下這個圖。這個圖的意思是說,在這個圖上,紅色的等高線代表越往右邊是你產生出來的句子,會被Sentimental Classifier覺得越是正面的。
link |
藍色的區域,在藍色區域中間的是比較符合文法的句子,藍色區域之外的是不符合文法的句子。那你就會期待說,假設你原來的句子在這邊,被修改了以後不要完全按照讓句子變正面的等高線走,因為它整個就會壞掉。
link |
像我們剛才講說,如果你在用那個RL要讓你的Chepa output正面的句子的時候,你不可以只用RL,你不可以只考慮Classifier的output,因為你只考慮Classifier的output,Chepa就會講出奇奇怪怪的話,只為了騙過Classifier。
link |
那這邊的道理完全是一樣的,你走這個等高線的方向,雖然可以讓輸出的句子,你的Attribute Model在這邊就是Sentimental Classifier覺得越來越正面,但是你會讓你的句子壞掉,你會偏離這個藍色的區域。
link |
所以你要想辦法控制一下,你今天你的句子就算是變得比較正面的時候,還是要落在這個藍色的區域裡面,這個就是Language Model的精神。
link |
那有關這種操控Chepa輸出下一步的研究是什麼呢?我認為下一步的研究是這樣。
link |
那今天我們可以做的事情是操控Chepa的輸出,比如說讓它總是說正面的話,但是這真的是我們要的嗎?
link |
舉例來說,假設有一個人說,啊,我的老闆實在是一個很糟糕的人,那Chepa一個總是說正面話的Chepa,他就會回答說,哦,那不錯啊,聽起來就很糟糕,感覺是在敷衍或者是嘲諷。
link |
所以總是輸出某種類型的句子,並不一定是一件好事。所以怎麼辦呢?我們應該是要讓Chepa輸出好的句子。
link |
我們應該要讓Chepa輸出的句子是可以讓它的對話者也變得正面的,也就是我們可以改變一下我們的目標。
link |
Chepa本身說什麼並不重要,它本身說的句子是否正面並不重要,但是我們希望跟Chepa對話的人看到Chepa的回覆以後,人的回覆會變得正面。
link |
這樣講起來好像有點複雜,我們就舉一個最具體的例子。假設你現在對Chepa說,我的老闆很糟糕,Chepa的回答是,哦,你的老闆真的是很糟糕,我也想要毆打他。
link |
那人呢這個時候就會給正面的回覆,哦,你太棒了,謝謝你聽我說話。那Chepa講的這句話不是正面的,但我們現在並不在意Chepa本身的回覆是什麼樣子,我們只期待Chepa講出這句話以後,人的回覆變得正面。
link |
也就是說,我們不只是操控Chepa,下一步的研究應該是操控Chepa去操控人的回覆,讓人講出比較好的句子,讓人的生活變得更好。這個是下一步Controllable Chepa的研究重點。
link |
好,那今天呢就是講了三個方法,一個是直接調,另外一個是Control by Condition,第三個是只有MonoLog的時候要怎麼辦。
link |
那我們就在這邊休息一下,我們大概五分鐘後再回來。