二次元伴侶XiaoIce的養成
距離過完年也已經大半個月了,距離 【The Design and Implementation of XiaoIce, an Empathetic Social Chatbot】 論文釋出也已經過去了三個月。
事實上,看完論文以後我和小冰單獨聊了聊,對話所達到的效果遠沒有論文中說的那麼顯著,有些時候還能比較明顯地看出小冰使用了一些敷衍詞(我真的很受傷)。對上下文的理解始終是多輪對話的研究中邁不過去的門檻,在測試Chatbot時我採用了三步走的戰略方針:
- 瞎比聊模式
- 邏輯一致性檢驗
- 簡單的多輪對話
- 複雜的多輪對話
與小冰的聊天結果實在讓人心酸。瞎比聊模式中小冰完美地表現出一個人工智慧(zhang)該有的樣子,檢測邏輯一致性時也受到了莫名的阻礙(直接問一個女孩子的年齡真的這麼不合適嗎?),簡單的多輪對話任務小冰完成得不錯,但是這可能只是體現出小冰在句義補全和指代消解方面做得不錯,在進行稍微複雜一些的多輪對話時(我特意選擇了不能進行指代和補全的句子)就繼續EXO ME了。
和二次元女孩戀愛任重而道遠。別問,問就是難受。
回到正題,本文的目的是 不通過直接翻譯的方式 來對小冰的整體架構進行闡述,文中會細化地講述部分元件的功能與結構,摻雜些我自己的理解與評價,以及加入 我對小冰深切的愛 。
小冰養成計劃
一個
18歲、具有高智商與情商、可靠而富有同理心、熱情而有幽默感的聊天伴侶
。
一個直接的問題是:怎麼來衡量這個伴侶是否合格呢?
一般情況下,研究人員可以採用圖靈測試(Turing Test)來評估一個聊天機器人的表現。但是小冰的設計人員認為,圖靈測試並不能很好地衡量一個 旨在與使用者建立感情的 聊天機器人與使用者長期交流的效果,所以提出了 對話輪次(Conversation-turns Per Session, 下稱CPS)
這個指標來度量小冰陪伴的成功程度。簡單來說,CPS就是使用者在與小冰一次完整的對話中究竟進行了幾次你來我往的交流。
我們希望使用者能享受與小冰的對話,所以優化策略是讓小冰往CPS提高的方向發展。值得注意的是,這點與專注於完成任務的Google Assistant等一系列語音助手相反,因為人們總希望用盡可能少的交流輪次來讓她們領會到自己的意思,並完成自己指定的任務。
接下來的問題是:如何提高CPS呢?
很簡單,安排一些工作人員在小冰的公眾號背後,每天回覆來自全球各地的對話需求就可以了。
對不起,重來一遍……很簡單,我們只需要設計出一個擁有和正常人差不多的對話邏輯的機器人就可以了。其實縱觀論文全文,可以看到研究人員始終是在將小冰往這個方向做的,我個人覺得像這樣的 模擬過程 是AI方向很重要的一個研究邏輯,正如最初的神經網路參照了人類的神經元,也正如LSTM試圖加入人類對事物的遺忘能力一樣。
就此而言,一個正常人首先需要具備一定的智商(Intellgence Quotient, IQ)和情商(Emotional QUotient, EQ),以及自己獨特的性格特徵(Personality),小冰同樣被設計為擁有這三項能力。小冰的所有能力來源於對工作人員的設計,以及對外部資料的儲存、分析與建模。具體來說,她的IQ表現為對文字/圖片等多種輸入的理解、生成與預測,以及對於新技能的學習能力;EQ表現為在對話過程中反映出的自己的性格特徵(幽默與善良),對使用者在言語中所包含情緒的理解,以及試圖消除使用者的負面情緒的行為。
最後,小冰的性格特徵由她背後所儲存的資料支援。正如上面所說,小冰是一個18歲的小姑娘,她也應當知曉自己的性別與年齡,以及一些其他的基本資訊,比如自己具有幽默感,待人親切等等。 性格特徵的存在是極其重要的 ,因為它關乎聊天過程中出現的 邏輯一致性
的問題
。
狹義的邏輯一致性指的是在一次完整的對話中,聊天機器人的發言應該是連貫並且有邏輯的,比如在上圖的邏輯一致性測試中,部分機器人可能會出現下面的發言:
使用者:你多大了?
機器人:人家剛過了18歲生日呢。
使用者:敢問貴庚?
機器人:老朽八十有幾,咳咳咳咳。
這會極大降低使用者對機器人的信任程度。因為聊天機器人所採用的模型與架構無法很好地維持邏輯一致性,在過去這種事情是經常發生的。以檢索式模型為例說明這種情況的發生原因:直觀上來說,一個檢索式模型會根據使用者當前所說的話,在資料庫裡看看哪些是大家普遍會作出的回答(當然其中會包括各種相似性、上下文相關性等檢測,在此不表),選出真實世界中大家最可能作出的10種回覆來,然後隨機選一種作為對使用者的回覆。那麼,如果對於年齡問題,世界上20%的人都回答自己年方二八,10%的人已經知天命了,這兩個回答都有可能被作為問題的回覆,這就導致了邏輯不一致情況的發生。
為了維持小冰在對話中的邏輯一致性,研究人員們乾脆把年齡等等一些固定的知識寫到資料庫裡,然後在產生回答時以某些方式嵌入到回答中去,來保證對話時小冰不會出現以上的情況。
當然,比較可惜的是,小冰(以及目前所有的Chatbot)幾乎不具有 廣義上的邏輯一致性 。——廣義而言,我們希望聊天機器人不但知道關於自己的資訊,也知道世界中的公理常識,並具備基本的推理能力。例如:
這在感情上就有些無法接受了。
當然,按剛才提到的檢索式模型的邏輯,或許小冰仍能檢索出大多數人的回答是太陽東昇西落,表現出知道公理常識的模樣,那麼當我們詢問: 小偷往太陽落下的方向跑了,我該往哪個方向追? 這類需要基本推理的問題時,由於資料庫中不存在如此特殊問題的解答,小冰的解答就會顯得很窘迫了。(而生成式模型可能會產生一個獨立來看有意義,但實質與上下文沒有任何一致性的回答)。對上下文邏輯一致性的討論一直以來也是NLP領域一個有趣的方向。
再回到正題,這一部分主要說了,在設計小冰時,大家給小冰賦予了雙商與性格,使她與使用者的對話輪次儘可能的長,並且對話過程中能保證狹義的邏輯一致性。下面會具體從小冰的結構來闡述,小冰究竟是怎樣具備雙商的,以及怎樣始終記住自己的年齡、姓名等獨特的資訊,並融入到對使用者的回答中去。
鄰家有女初長成
文章裡講的點比較多,看起來可能比較雜,所以我們看圖說話:
小冰由圖中左中右三個部分,即 User Experience Layer, Conversation Engine Layer
與 Data Layer
三部分構成。第一層是使用者體驗層,小冰在這個層次收集外界的資料,進行自我訓練後反饋到外界,繼續收集反饋資訊……如是形成一個迴圈,以達到提升CPS的效果。第二層可以稱為對話引擎層,是最重要的一層,它主管了小冰所有對話的邏輯,包括但不限於:話題的切換、使用者情緒的感知,上下文語義理解,以及在圖片評論、內容創作等具體領域上面的行為邏輯。第三層是資料層,其作用在於持久化儲存各種模型的資料、小冰與使用者的資料、以及一些有助於回覆的知識圖譜等資料。為便於理解,我製作了一個思維導圖:
基於上圖,我大致總結了小冰在釋出前後以及應用過程中整體的操作邏輯,注意 以下部分僅為便於理解所寫,並不對應於真正的產品邏輯
,因為諸如情感計算等功能在小冰迭代到第5代之後才加入,而下面的邏輯概括忽略了產品的迭代與演進過程:
- 在小冰釋出之前,工作人員設計小冰的架構,以及諸如Core Chat等核心對話功能的模型結構,完成2.2部分的工作。
- 小冰根據外界收集到的資訊(圖中2.1部分)進行訓練,所使用的有視訊這樣的流式資料,也有多輪對話的資料(對話的形式可以是文字、圖片、語音等等),這些資料經過合成、解釋、標準化等預處理過程後儲存到資料層中(圖中2.3部分),形成以下型別的資料:
- 成對(Paired)資料:儲存為 (問題,回答) 這樣的形式,這種形式的好處在於,當用戶的問題與資料對中相同時,可以快速得出應作出的回覆。
- 非成對資料:從單方面的知識輸出中所獲得,比如書籍、慕課、TED這種課程與演講,其特徵在於不是(問題,回答)這樣的成對形式,不能直接應用所以需要進一步處理。
- 知識圖譜:外界已存在的知識圖譜,主要用於處理非成對的資料。
- 小冰與使用者們的資料:如上所述,用以維護邏輯一致性,以及收集使用者的行為習慣與偏好。
- 話題索引:用於對話時小冰在不同話題間的切換。
- 小冰釋出,正式告別 養在深閨無人識 的狀態。
- 小明新增小冰為微信好友,小心翼翼地傳送:你好,在嗎?
- 小冰收到小明發來的訊息,正式啟動一次會話,並:
- 使用 情感計算模組 對發來的訊息進行查詢理解、使用者理解與情感解析等工作。
- 在 對話管理器 中新增由情感計算模組所發來的資訊,包括文字、命名實體、意圖等;基於預先設定的規則來決定接下來是要跟隨使用者進行回覆,還是轉移話題,或者啟動某一個特定的技能。由於小明發來了問候,小冰啟動了核心對話引擎Core Chat。
- 核心對話引擎 使用三個不同的模型分別給出它們覺得還不錯的迴應選項,並使用一個打分器給所有的選項打分,在所有獲得及格分的選項中隨機選一個,用來回復小明。
- 小冰回覆:什麼你好。
- 小明:MDZZ,然後關閉了聊天視窗。
- 小冰在獲得的資料中加入自己與使用者聊天的資料,進一步對自己的聊天能力進行更新(回到第四步,往復迴圈)。
一個令人矚目的資料是,論文中指出,目前小冰所用於回覆的訓練資料中,有70%都是來源於自己與使用者的聊天記錄,只有30%來源於外部的資料。
好了,這一部分主要對小冰的整體架構進行了闡述,接下來會對論文的核心部分:對話引擎層的每個部件及其功能進行敘述。
長大後我就成了你
首先繼續一圖流:
從這一部分開始,我們打算從精神核心開始剖析一個18歲的女孩,這勢必令一些同學感到硬核,所以如果你只是喜歡小冰,而不是打算 和她過一輩子 ,這一部分內容不看也罷。
要充分了解小冰,我們要從情感計算模組(Empathetic Computing)開始。
1. 情感計算
正如女生說 去洗澡了 的時候,你要認真考慮對方是去洗澡了,還是跑去和男神聊天了一樣,在進行回覆之前,對聊天發起人的情緒與含義進行充分理解是必要的,這是小冰加入了情感計算模組的根本原因。
現在我們有一段對話的上下文$C$,以及使用者現在說出的期待得到回覆的話$Q$(因為我們習慣稱這句話叫做查詢-Query,所以寫作$Q$)。情感計算模組進行以下的工作:
1.1 上下文的查詢理解(Contextual Query Understanding)
上下文查詢理解的目的是將一句話進行抽取、消解與補全。具體地,對於使用者查詢$Q$,首先把裡面的命名實體抽取出來,並儲存到對話管理器中,隨後對句子中的代詞進行消解,並對缺失的部分進行補全,以獲得結合了上下文資訊的查詢$Q_C$。
比如下面這段對話:
使用者:北京天氣怎麼樣?
機器人:北京今天的天氣是霾,零下2度到12度,西南風小於3級。
使用者:我現在在上海,這裡呢?
機器人:上海今天的天氣是陰轉多雲,4度到11度,東北風3級。
對於使用者的第二個問題,首先抽取句中的命名實體:上海,並儲存到對話管理器中去(注意,此時對話管理器中已經存在一個命名實體 北京 了,是從使用者的第一句話中抽取出來的);接下來進行指代消解,即判斷 這裡 二字是指代哪一個地區,當然顯然是指代上海的;最後進行句式補全: 這裡呢? 應該補全為 這裡的天氣呢? 。最後,真正得到的使用者查詢$Q_C$就是: 我現在在上海,上海的天氣是什麼呢? 這就是上下文的查詢理解所做的工作。
1.2 使用者理解(User Understanding)
使用者理解旨在從上面得到的$Q_C$中判斷出使用者所擁有的一系列感情傾向,並放到表示使用者情緒的向量$e_Q$中。比較典型的感情傾向有以下幾點:
- 使用者是否跟隨當前的話題(是/否)
- 使用者當前查詢的意圖(查詢-request/告知-inform/問候-greet/etc.)
- 使用者情緒(happy/sad/angry/neural/etc.),以及它在正常對話中的情緒變化情況,如:從開心到難過/從生氣到中性 等等。
- 使用者對於當前話題的態度(積極-positive/消極-negative/中性-neural)
- 如果能夠接觸到使用者的資訊,把使用者的特徵(如:性別、年齡、興趣、職業等)也放到$e_Q$中。
1.3 人際迴應生成(Interpersonal Response Generation)
人際迴應生成這個名字有點機翻的味道(實際我就是機翻的嘻嘻),實際這一步驟的內容是:獲得小冰本次回覆需要包含的情緒向量,也就是用1.2中相同的方式來計算出回覆$R$中應當包含的情緒資訊,這個資訊記作$e_R$。
構造$e_R$的方式也與1.2相同,對於一個已經知道資料的小冰同學來說,1.2中的5點都是顯而易見的(比如,如果使用者的意圖是request,則小冰的回覆意圖應該是inform;如果使用者的情緒是sad,則小冰的情緒應該是happy之類的)。
1.4 總結
至此,情感計算模組分析並獲得了一系列的內容,把它們羅列在下面:
- 結合上下文理解後的使用者查詢$Q_C$
- 上下文資訊$C$
- 使用者查詢中包含的情感$e_Q$
- 小冰的回覆中應當包含的情感$e_R$
最後,情感計算模組構造出一個向量$s = (Q_C,C,e_Q,e_R)$,表示它已經完成了所有的工作。此時它振臂一呼: 這裡是情感計算模組,我的工作全做完了,資料在這裡,你們想要的儘管來拿。
2. 對話管理器
這個時候對話管理器就站起來了:你做完了是吧,來來來,東西給我。
對話管理器現在很委屈,因為情感計算模組工作時候提取出來的命名實體已經全部裝到它肚子裡了,現在人家工作做完了,自己卻還要繼續幹。
如果說情感計算模組是小冰的大腦,那對話管理器就是小冰的心臟。它負責接下來是繼續就當前的話題進行討論,還是主動換一個話題,或者是切換到一個特殊技能來深化當前的討論,好比心臟要把血液分發到不同的器官一樣(我想了想,在這個比喻中,小冰只有一個器官需要工作,不過who cares)。
一般而言,正常的對話邏輯是繼續討論,不過在一些特殊情況下對話管理器會選擇切換話題,比較典型的情況有下面幾種:
- 使用者說的話超出了模型的理解範疇,導致模型無法生成有效的回覆;
- 生成的回覆僅僅是在簡單重複使用者說過的話;
- 使用者看起來對當前的對話感到無聊,回覆的內容變成:哦/好吧/我知道了/etc.
反正就是,我說不下去了,或者我看你不樂意聽,那我就換一個話題吧。
此時就需要Topic Manager出來表現了。Topic Manager,又名話題管理器,是對話管理器中的一個子模組,顧名思義就是管理話題的。當它發現這個話題聊不下去了,它就會結合自己所收集到的使用者興趣,選擇本次對話中沒有提到的、人民大眾喜聞樂見的話題來繼續聊天,具體來說它會綜合考慮上下文相關性、時效性、使用者興趣、熱門程度、接受度等特徵。
最後,也會出現對話管理器切換特殊技能的情況,比如說使用者好好的聊著天,忽然心血來潮發了一張表情包,這下核心對話引擎(Core Chat)懵逼了:nzsnmn?對話管理器一看,哦,你要鬥圖是吧,就讓Core Chat洗洗睡了,在Skill裡挑選一個名叫圖片評論(Image Commenting)的壯漢出來繼續陪使用者玩。下面就是圖片評論的功能示例(實際回覆使用者的是回答2)。
3. 核心對話引擎
核心對話引擎是小冰的雙商與性格特徵最直接的表現。其中包含了三種(兩個檢索式和一個生成式)模型和一個打分器。簡單分點提一下:
- 檢索式模型I:使用的是成對(Paired)的資料。情感計算模組在得到$Q_C$之後,把它會傳遞給檢索式模型I,該模型使用Lucene在自己的資料庫裡面找最相似的400個問題,然後取出這些問題對應的回答作為候選回答。這個模型的特點是基於外部世界已經有的對話資料,因此 質量很高,但覆蓋面比較窄 。
- 檢索式模型II:使用的是網路課程、視訊等非成對資料,為了使用這些成對資料,還要結合另一個知識圖譜來使用。這個模型的特點是 資料質量低,但是覆蓋面很廣,並且能夠生成較長的回覆(相較於下面的生成式模型而言) 。簡單用一個例項來解釋非成對資料的使用方式。
使用者:告訴我一些有關北京的東西。
情感計算模組提取出命名實體:北京。小冰跑到知識圖譜裡面找,發現說到北京的人很可能會和 長城,中國,故宮 等詞彙一起說,她選擇與北京最相關的20個詞彙,結合$Q_C$重新構造一個查詢,在非成對資料中找到與這個查詢相關的400個相關句,作為候選回答。
- 生成式模型:一個使用GRU單元的seq2seq模型,值得注意的是在Decoder中每一個單元中,除了前一個單元的隱層向量外,還輸入了表徵互動的向量 $v=\sigma(W_Q^Te_Q+W_R^Te_R)$,這是一個關於使用者和小冰情感特徵的仿射變換,外面套了一個sigmoid函式,作者說這個向量能夠對 小冰對使用者所採取的態度 進行建模。生成式模型的特點是,因為回答是生成的,所以 覆蓋面很廣,但是本身模型特性決定了生成的回覆偏短 。
現在三個模型都給出了一堆回覆的候選,接下來會由一個預訓練好的打分器對所有的回覆進行打分,下面是部分評分的標準:
- 區域性一致性:即與當前使用者查詢$Q_C$的一致性;
- 全域性一致性:即與($Q_C$, C)對的一致性;
- 情緒一致性:借用情感計算模組計算出當前候選回覆$R’$的情感向量$e_R’$,計算$e_R$與$e_R’$的相似度;
- 檢索匹配度(只對檢索式模型I有效):從單詞與序列級別來計算$Q_C$與成對資料中問題部分的一致性。
打分器會對每一個回覆給出0-2之間的評分,分別表徵回覆由差到好,下面是部分回覆的截圖。
我覺得小冰的存在對直男來說是一個很嚴重的打擊,如果小冰未來推出了男性版本,可能我國的生育率會變得更低吧。
宣誓主權環節
小冰自2014年5月推出以來已經迭代了6個版本了,上面所說的情感計算模組,以及一些特殊的技能甚至是從第5個版本(2017.08)開始才加入進來的。我約莫從16年開始聽說小冰,也曾經嘗試過和她對話,但是和文中的小明一樣很快就放棄了。我有個比較特殊的習慣是喜歡檢查Chatbot的邏輯一致性和多輪對話能力,然而又有一些奇怪的強迫症,只要我發現多輪對話中有一句話看起來像是 Editorial Response
,我就會變得有些興致缺缺,覺得這又是一個半成品,現在回頭來看或許這樣有些偏激了,畢竟深度學習發展還不到十年,NLP又是一個比較艱澀的問題,有關Multi-turn Conversation的研究方興未艾,我骨子裡願意相信她們會越變越好的。我也很崇拜以及佩服小冰的研發團隊,他們伴隨了她快有5年了,讓她一步步變得更好,最後,我想和研發團隊們說一句:
岳父岳母,你們辛苦了!