天天看點

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

引子

問&答 是人和人之間非常重要的溝通方式,其關鍵在于:我們要了解對方的問題,并給出他想要的答案。設想這樣一個場景,當你的女朋友or老婆大人在七夕前一晚,含情脈脈地跟你說

親愛的,七夕快到了,可以給我換個新手機嗎?

而此時沉迷王者峽谷的你,也許會不假思索地回答

好啊親愛的~ 昨天剛看到拼多多九塊九包郵買一送一可便宜呢~ 多買幾個哦一個殼容易壞呀

你話音未落,一記絕殺撲面而來

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

(王大錘,卒,享年28)

是以,對于生活中這種随處可見的送命題,隻要我們惜命&稍微上點心,是不會輕易丢分的。但對于機器來說,這卻是個莫大的挑戰,因為機器對相似文本的誤解非常常見,是以我們的AI也常常被使用者戲谑為人工智障(一個聽上去很缺AI的稱呼)。作為AI背後的男人,我們一直緻力于提升AI的能力,讓機器早日擺脫智商困境。具體地,針對這種問答場景,我們提出了一套新的方法論和殺手級模型,進而讓AI更懂你,遠離送命題~

背景

在日常生活中,我們會經常詢問我們的語音助手 (小微/Siri/Alexa/小愛/小度 等等)各種各樣的問題,其中有一類問題的問法相對嚴謹,傳回的答案需要精準,比如

『姚明的老婆的身高是多少』、『周傑倫的稻香是哪一年發行的?收錄在哪張專輯?』

這類問題我們稱其為 精準問答,可以借助知識圖譜技術,解析問題裡的各個成分(實體/實體關系 等等),進行嚴謹的推理,并傳回答案。(我們在圖譜問答方面也有積累,有機會再分享,本文先不表)也有一類問題,要麼問法多樣,要麼答案開放,比如

『蛋包飯怎麼做』、『評價下cxk的籃球水準』、『酒精到底多少度才能燒起來啊』

對于這類問題的問答,我們将其稱為 開放域問答。這類問題要麼難以嚴謹地分析句子成分進行推理、要麼無法給出精準的答案,是以一般通過尋找相似問題,來曲線救國。大緻的流程如下

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

首先我們需要維護一個海量且高品質的問答庫。然後對于使用者的問題(Query),我們從問答庫裡先粗略地檢索出比較相似的問題 (Questions),對于這些候選問題,再進一步進行『語義比對』,找出最比對的那個問題,然後将它所對應的答案,傳回給使用者,進而完成『開放域問答』我們可以看到,粗略檢索出來的 Question,裡面噪音很多,跟我們的 Query 相比,很多都是 形似而神不似。是以最最最核心的子產品,便是Query-Question 的語義比對,用來從一堆形似的候選問題中,找出跟 Query神似的 Question。而一旦比對錯誤,便可能陷入 手機 和 手機殼 的險境,輕則使用者流失,重則機毀AI亡。

挑戰&目前解

解決開放域的語義比對并非易事,其挑戰主要來自以下兩方面:

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

對于第二點,問題對關鍵資訊敏感,我們可以來看一些 case。下面 False Positive 的 case形似但神不似、被模型錯分了,而 Fasle Negative 的 case 是神似但形不似,也被模型錯分了。

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

藍色加粗的詞代表模型自以為比對上的關鍵資訊,紅色代表實際要比對的關鍵資訊、但模型失配了為了解決開放域語義比對的問題,工業界學術界可謂是八仙過海,各顯神通。總的來說,可以看成從資料和模型兩個次元去解決問題。

資料次元

訓練資料的正樣本(也就是 相似問題對兒)一般通過人工标注而來,而負樣本(也就是 不相似問題對兒) 的生成政策則各有巧妙不同。最簡單粗暴的就是随機負采樣,即 給一個問題,從海量的其他問題裡随便找個問題,跟它組合在一起,構成一個負樣本。但這種負樣本對模型來說顯然 so easy,并不能很好地訓練模型。是以要去找到真正難以區分的負樣本(我們稱為 混淆樣本),進而提升模型的能力。

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

可以看出,目前并沒有一種最優政策來得到這樣高品質的資料,或多或少都要加入人工。從本質上來說,語義比對模型都嚴重依賴資料的标注,這其實是一種 資料痛點。

模型次元

更為大家所熟知的改進,是從模型上入手。學術界工業界每年都有層出不窮、花樣翻新的語義比對模型,也确實解決了它們所宣稱的某些問題,這裡我們列舉了一部分:

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

這些模型雖然種類繁多,但從模型結構上看,無非兩大類:基于表示和基于互動。基于表示的模型是先對 query-question 分别進行底層表示,然後 high-level 層面進行互動,代表作DSSM、ArcI,基于互動的模型則是讓query-question在底層就互相互動,代表作 Bert、ArcII、MIX。不同模型的差異性無非就是内部子產品的不同(RNN, CNN, Transformer...),大架構上無外乎此。

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

本文無意探讨兩大類模型的優劣,此方面讨論早有珠玉在前。我們重點讨論的,是:

這些模型,能否真正解決開放域問答的兩大挑戰:覆寫面廣和關鍵資訊敏感?

從我們對這些模型的評測結果上看,答案是:不能。

至于深層次的解釋,我認為還是受制于資料的制約,所謂 資料決定上限,模型隻是逼近這個上限的程度。如果我們不能提供足夠的訓練樣本,去教會模型分辨出關鍵資訊,光憑模型自身的花式 CNN/RNN/Attention,縱使使出渾身解數,在一些很難分辨的 case 上也未必work。而在預測階段,鑒于開放域的問題覆寫面很廣,很容易出現在訓練樣本中沒出現過的問題對兒(即 Out-Of-Vocabulary, OOV問題),主要問題裡的關鍵資訊(相似/不相似 的詞對兒)沒出現過,此時模型隻能抓瞎。

痛點總結

綜上,盡管工業界學術界的諸位大神在這個領域持續發光發熱筆耕不辍,但我們在開放域的語義比對場景下,依然面臨着兩大痛點:

  • 資料痛點: 模型依賴高品質資料标注
  • 模型痛點:
    • 模型對難分樣本的關鍵資訊捕獲無力
    • 模型對 OOV 的相似/不相似詞對兒無能為力

道: 方法論

為了從根本上解決這兩大痛點,我們不再隻拘泥于術的層面,去做一些資料采樣、模型方面的小改進,而是先深入思考問題的根源,從道的層面提出一套方法論,如下所示:

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

我們對傳統語義比對模型的架構做了兩處改進,一處是加入了 關鍵詞系統,從海量的開放域中提取關鍵詞/詞組,然後給訓練樣本/預測樣本中出現的關鍵詞,額外添加一個标注。另一處,是對模型做相應改進,去增強模型對這種關鍵資訊的捕獲。這兩處改動的核心,是為資料和模型 顯式地引入關鍵資訊,這樣我們便能從根本上解決我們所面臨的資料和模型的痛點,不再隻是隔靴搔癢。

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

為何如此一來,便能解決問題?且聽分解。

釋道

為了友善大家了解,我們将結合具體 case,來逐條闡釋我們的道。

1. 改進的模型:強化模型對關鍵資訊的捕獲

這一點很好了解,我們在模型中,額外增加了對關鍵詞詞對兒的處理,相當于增加了額外的 feature,給模型提供更多資訊,加強模型對問題對兒的區分能力。至于具體的改進細節,我們将會在下節提到,這裡先不表。

2. 帶關鍵詞的樣本:減少對标注資料依賴

我們舉個例子,也是我們在引子部分提到的一個負樣本:怎麼掃碼加微信和怎麼掃碼進微信群。這兩個問題不相似的根源,在于微信和微信群的含義不同。但模型一開始學出來的可能是加和進這兩個動詞的差異(因為微信和微信群的embedding可能非常接近),隻有我們提供了額外的樣本,比如告訴模型怎麼加豆瓣小組和怎麼進豆瓣小組這兩個問題是相似的,模型才可能學出進和加不是關鍵,繼而學到真正的關鍵資訊。是以如果我們一開始就标注出關鍵詞,相當于告訴模型,這些是候選的、可能的關鍵資訊,模型(經過我們改進後的)就會有意識地針對這部分進行學習,而不需要自行通過更多的樣本去判别,進而從根本上解決對标組資料的依賴。我們的結果也佐證了這一點,先提前貼出來,下圖是傳統的bert模型和經過我們改造的keyword-bert模型,在達到相似準确率上所需要的資料量,具體的我們會在下節闡述。

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

3. 帶關鍵詞的樣本:開放領域的先驗資訊,減少訓練集OOV

我們依然舉一個例子,一個待預測的樣本如何掃碼加QQ群和如何掃碼進微信群,在訓練樣本裡,QQ群可能從來沒跟微信群一起出現在一個問題對兒裡(也就是所謂的 OOV),但如果在預測的時候,我們額外标注出QQ群和微信群都是關鍵詞,相當于給出一個 先驗資訊,模型(經過我們改進的)便能通過自身的關鍵詞子產品,專門學習這兩個詞的異/同,得到一個更好的分類結果,減少OOV帶來的負面影響。

術: 實作

道的層面闡釋清楚之後,一切就豁然開朗,剩下的實作都是很自然而然的,無非就是圍繞我們對傳統架構做的兩處改進:

  • 如何構造一個 關鍵詞系統?
  • 如何 改進模型?

在具體實作方法上 并沒有标準答案,比如關鍵詞系統,隻要能抽取出開放域海量高品質的關鍵詞,就是好系統;再比如模型改進,也不隻局限在我們所改進的 Fastpair 和 BERT 上,相似的思想其實可以遷移到目前學術界/工業界大部分已知模型上不過我們還是會毫無保留地給大家展示我們的具體實作,以供參考,抛磚引玉。

關鍵詞系統

如上面所說,一個好的關鍵詞系統,要能抽取出多又好的關鍵詞——即:數量多、品質高。

為了達成這個目标,我們引入了領域的概念,正好契合我們開放域問答的特點——涉及領域多、覆寫面廣是以我們先擷取了海量的、帶有領域标簽的新聞/文章,通過各種手段從裡面提取出候選的關鍵詞。然後 設計了一個 diff-idf 分值,去衡量這個關鍵詞的領域特性,直覺來說,就是這個關鍵詞在自己領域出現的文檔頻次,遠高于其他領域。通過這個分值排序截斷後,再進行後處理,去除噪音、實體歸一化等等,最後與一些公開詞條一起,構成一個龐大的關鍵詞詞典。具體的流程如下(比較細碎 但缺一不可)。

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

這個流程每天都在運作和更新,我們目前的關鍵詞數量達到數百萬級,人工評測的品質也不錯。下面是一些 case 展示:

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

模型演化

同樣的,模型也要進行相應的更新。我們的模型演化路線如下所示

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

首先是我們針對之前線上 run 的 Fastpair,做了關鍵詞方面的改進,接着我們鳥槍換炮,更新到 BERT,以應對更複雜的業務場景,并同樣對 BERT 做了改進,我們稱之為 Keyword-BERT, 從名額上看,這是一個殺手級模型,一下子實作了比對的品質的質的飛躍,接下來我們将詳細闡述。

改進Fastpair

Fastpair 的模型結構如下:

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

它其實是改造了 Fasttext 以适配文本對兒分類的場景。因為 Fasttext 是針對單文本分類,而要對文本對兒分類,僅用兩個文本各自的 n-gram 特征顯然是不夠的,是以很自然而然地加入兩個文本裡 各自的詞組合在一起形成的 pair-wise 互動特征,這種思想其實跟我們在文章開頭提到的,那些『基于互動』的模型的思路很像,先對兩個文本的資訊進行充分互動融合,再做分類那麼我們的問題就是,如何改造 Fastpair 模型,使得它能額外去『關注』關鍵資訊呢?我們的改動非常直覺,就是給包含了關鍵詞的 pair-wise 特征,額外加上一個可學的權重,如下所示:

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

這裡我們借鑒了 FM 中參數分解的思想,将孤立的 Wkq 分解成兩個詞的 embedding 内積,這樣既能減少參數量,又能刻畫含有相似關鍵詞的 pair-wise 特征之間的共性我們建構了 60w 左右的百度知道問題對兒(正負樣本比例 1:1)用來訓練,然後人工标注了2k個難分的正負樣本用來預測,從預測名額上看,提升非常顯著。

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

然而由于 Fasttext 模型層數淺的固有問題,Fastpair 精度并不高,而且對于 OOV 的 pair-wise 特征也無能為力,當業務場景面臨更大挑戰時,我們便需要考慮更新我們的武器庫了。

Keyword-BERT

BERT 相比其他已知的深度模型,是核彈級别的改進,是以我們理所當然地選擇了它 (事實上我們也做了線下實驗,結果都在意料之中)鑒于 BERT 的結構已家喻戶曉,我們就不細述了,我們重點思考的,是如何給 BERT 增加額外的關鍵資訊捕捉子產品?我們的思路跟 Fastpair 的改進一脈相承,隻不過将這種 pair-wise 的互動,變成了 attention 機制,具體細節如下:

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

一方面,我們在最上層引入一個額外的 keyword layer,通過 attention 和 mask ,專門對兩個文本之間的關鍵詞資訊進行互相之間的 attention, 增強他們之間的互資訊,另一方面,對于輸出的兩個文本的表示,我們借鑒了機器閱讀了解裡 fusion 的思想進行融合,然後将融合後的結果和 CLS 一起,輸出到分類層通過這樣的改造,Keyword-BERT 在不同 layer 數目下的名額都優于原始 BERT。

Keyword-BERT——問答系統中語義比對的殺手锏引子背景挑戰&目前解道: 方法論術: 實作延伸

我們發現, layer 數越少,Keyword-BERT 相比原始 BERT 提升越明顯。這也很好了解,因為 layer 數越少, BERT 所能學到的句子級别的資訊越少,而關鍵詞相當于對這種句子級别資訊進行了補充我們最後上線的是 6 layer 的 Keyword-BERT,因為它的性能跟原始 12 layer BERT 非常相似,而推斷速度要快很多(在我們内部自研的 BERT 加速架構下)。

延伸

模型結構嘗試

正文中給出的 Keyword-BERT 的結構是我們在多次試錯上的最優實踐,我們還嘗試過:

  1. 直接用 keyword attention layer 取代原始 BERT 第12層layer:效果不好,原因在于,關鍵詞隻能作為額外的補充資訊,而不是取代原來的語義資訊。
  2. 将 Keyword attention layer 加在模型的底層:效果不好,原因在于,底層資訊向上層『傳播』過程中,關鍵詞資訊被逐漸弱化。

未來工作

關鍵詞僅僅提供了一個次元的資訊,我們還可以加入更豐富的資訊 (如 詞的詞性、詞的圖譜屬性 等等) 來增強模型的區分能力,模型架構依然可以用我們現有的結構。

論文原文和源碼可見:

https://github.com/DataTerminatorX/Keyword-BERT

繼續閱讀