Keyword-BERT——问答系统中语义匹配的杀手锏
?
引子
問&答 是人和人之間非常重要的溝通方式,其關鍵在于:我們要理解對方的問題,并給出他想要的答案。設想這樣一個場景,當你的女朋友or老婆大人在七夕前一晚,含情脈脈地跟你說
親愛的,七夕快到了,可以給我換個新手機嗎?
而此時沉迷王者峽谷的你,也許會不假思索地回答
好啊親愛的~ 昨天剛看到拼多多九塊九包郵買一送一可便宜呢~ 多買幾個哦一個殼容易壞呀
?
你話音未落,一記絕殺撲面而來
(王大錘,卒,享年28)
所以,對于生活中這種隨處可見的送命題,只要我們惜命&稍微上點心,是不會輕易丟分的。但對于機器來說,這卻是個莫大的挑戰,因為機器對相似文本的誤解非常常見,所以我們的AI也常常被用戶戲謔為人工智障(一個聽上去很缺AI的稱呼)。作為AI背后的男人,我們一直致力于提升AI的能力,讓機器早日擺脫智商困境。具體地,針對這種問答場景,我們提出了一套新的方法論和殺手級模型,從而讓AI更懂你,遠離送命題~
背景
在日常生活中,我們會經常詢問我們的語音助手 (小微/Siri/Alexa/小愛/小度 等等)各種各樣的問題,其中有一類問題的問法相對嚴謹,返回的答案需要精準,比如
『姚明的老婆的身高是多少』、『周杰倫的稻香是哪一年發行的?收錄在哪張專輯?』
這類問題我們稱其為 精準問答,可以借助知識圖譜技術,解析問題里的各個成分(實體/實體關系 等等),進行嚴謹的推理,并返回答案。(我們在圖譜問答方面也有積累,有機會再分享,本文先不表)也有一類問題,要么問法多樣,要么答案開放,比如
『蛋包飯怎么做』、『評價下cxk的籃球水平』、『酒精到底多少度才能燒起來啊』
對于這類問題的問答,我們將其稱為 開放域問答。這類問題要么難以嚴謹地分析句子成分進行推理、要么無法給出精準的答案,所以一般通過尋找相似問題,來曲線救國。大致的流程如下
首先我們需要維護一個海量且高質量的問答庫。然后對于用戶的問題(Query),我們從問答庫里先粗略地檢索出比較相似的問題 (Questions),對于這些候選問題,再進一步進行『語義匹配』,找出最匹配的那個問題,然后將它所對應的答案,返回給用戶,從而完成『開放域問答』我們可以看到,粗略檢索出來的 Question,里面噪音很多,跟我們的 Query 相比,很多都是 形似而神不似。所以最最最核心的模塊,便是Query-Question 的語義匹配,用來從一堆形似的候選問題中,找出跟 Query神似的 Question。而一旦匹配錯誤,便可能陷入 手機 和 手機殼 的險境,輕則用戶流失,重則機毀AI亡。
挑戰&當前解
解決開放域的語義匹配并非易事,其挑戰主要來自以下兩方面:
對于第二點,問題對關鍵信息敏感,我們可以來看一些 case。下面 False Positive 的 case形似但神不似、被模型錯分了,而 Fasle Negative 的 case 是神似但形不似,也被模型錯分了。
藍色加粗的詞代表模型自以為匹配上的關鍵信息,紅色代表實際要匹配的關鍵信息、但模型失配了為了解決開放域語義匹配的問題,工業界學術界可謂是八仙過海,各顯神通。總的來說,可以看成從數據和模型兩個維度去解決問題。
數據維度
訓練數據的正樣本(也就是 相似問題對兒)一般通過人工標注而來,而負樣本(也就是 不相似問題對兒) 的生成策略則各有巧妙不同。最簡單粗暴的就是隨機負采樣,即 給一個問題,從海量的其他問題里隨便找個問題,跟它組合在一起,構成一個負樣本。但這種負樣本對模型來說顯然 so easy,并不能很好地訓練模型。所以要去找到真正難以區分的負樣本(我們稱為 混淆樣本),從而提升模型的能力。
可以看出,當前并沒有一種最優策略來得到這樣高質量的數據,或多或少都要加入人工。從本質上來說,語義匹配模型都嚴重依賴數據的標注,這其實是一種 數據痛點。
模型維度
更為大家所熟知的改進,是從模型上入手。學術界工業界每年都有層出不窮、花樣翻新的語義匹配模型,也確實解決了它們所宣稱的某些問題,這里我們列舉了一部分:
這些模型雖然種類繁多,但從模型結構上看,無非兩大類:基于表示和基于交互。基于表示的模型是先對 query-question 分別進行底層表示,然后 high-level 層面進行交互,代表作DSSM、ArcI,基于交互的模型則是讓query-question在底層就相互交互,代表作 Bert、ArcII、MIX。不同模型的差異性無非就是內部模塊的不同(RNN, CNN, Transformer...),大框架上無外乎此。
本文無意探討兩大類模型的優劣,此方面討論早有珠玉在前。我們重點討論的,是:
這些模型,能否真正解決開放域問答的兩大挑戰:覆蓋面廣和關鍵信息敏感?
從我們對這些模型的評測結果上看,答案是:不能。
至于深層次的解釋,我認為還是受制于數據的制約,所謂 數據決定上限,模型只是逼近這個上限的程度。如果我們不能提供足夠的訓練樣本,去教會模型分辨出關鍵信息,光憑模型自身的花式 CNN/RNN/Attention,縱使使出渾身解數,在一些很難分辨的 case 上也未必work。而在預測階段,鑒于開放域的問題覆蓋面很廣,很容易出現在訓練樣本中沒出現過的問題對兒(即 Out-Of-Vocabulary, OOV問題),主要問題里的關鍵信息(相似/不相似 的詞對兒)沒出現過,此時模型只能抓瞎。
痛點總結
綜上,盡管工業界學術界的諸位大神在這個領域持續發光發熱筆耕不輟,但我們在開放域的語義匹配場景下,依然面臨著兩大痛點:
-
數據痛點: 模型依賴高質量數據標注
-
模型痛點:
-
模型對難分樣本的關鍵信息捕獲無力
-
模型對 OOV 的相似/不相似詞對兒無能為力
-
道: 方法論
為了從根本上解決這兩大痛點,我們不再只拘泥于術的層面,去做一些數據采樣、模型方面的小改進,而是先深入思考問題的根源,從道的層面提出一套方法論,如下所示:
我們對傳統語義匹配模型的框架做了兩處改進,一處是加入了 關鍵詞系統,從海量的開放域中提取關鍵詞/詞組,然后給訓練樣本/預測樣本中出現的關鍵詞,額外添加一個標注。另一處,是對模型做相應改進,去增強模型對這種關鍵信息的捕獲。這兩處改動的核心,是為數據和模型 顯式地引入關鍵信息,這樣我們便能從根本上解決我們所面臨的數據和模型的痛點,不再只是隔靴搔癢。
為何如此一來,便能解決問題?且聽分解。
釋道
為了方便大家理解,我們將結合具體 case,來逐條闡釋我們的道。
1. 改進的模型:強化模型對關鍵信息的捕獲
這一點很好理解,我們在模型中,額外增加了對關鍵詞詞對兒的處理,相當于增加了額外的 feature,給模型提供更多信息,加強模型對問題對兒的區分能力。至于具體的改進細節,我們將會在下節提到,這里先不表。
2. 帶關鍵詞的樣本:減少對標注數據依賴
我們舉個例子,也是我們在引子部分提到的一個負樣本:怎么掃碼加微信和怎么掃碼進微信群。這兩個問題不相似的根源,在于微信和微信群的含義不同。但模型一開始學出來的可能是加和進這兩個動詞的差異(因為微信和微信群的embedding可能非常接近),只有我們提供了額外的樣本,比如告訴模型怎么加豆瓣小組和怎么進豆瓣小組這兩個問題是相似的,模型才可能學出進和加不是關鍵,繼而學到真正的關鍵信息。所以如果我們一開始就標注出關鍵詞,相當于告訴模型,這些是候選的、可能的關鍵信息,模型(經過我們改進后的)就會有意識地針對這部分進行學習,而不需要自行通過更多的樣本去判別,從而從根本上解決對標組數據的依賴。我們的結果也佐證了這一點,先提前貼出來,下圖是傳統的bert模型和經過我們改造的keyword-bert模型,在達到相似準確率上所需要的數據量,具體的我們會在下節闡述。
3. 帶關鍵詞的樣本:開放領域的先驗信息,減少訓練集OOV
我們依然舉一個例子,一個待預測的樣本如何掃碼加QQ群和如何掃碼進微信群,在訓練樣本里,QQ群可能從來沒跟微信群一起出現在一個問題對兒里(也就是所謂的 OOV),但如果在預測的時候,我們額外標注出QQ群和微信群都是關鍵詞,相當于給出一個 先驗信息,模型(經過我們改進的)便能通過自身的關鍵詞模塊,專門學習這兩個詞的異/同,得到一個更好的分類結果,減少OOV帶來的負面影響。
術: 實現
道的層面闡釋清楚之后,一切就豁然開朗,剩下的實現都是很自然而然的,無非就是圍繞我們對傳統框架做的兩處改進:
-
如何構造一個 關鍵詞系統?
-
如何 改進模型?
在具體實現方法上 并沒有標準答案,比如關鍵詞系統,只要能抽取出開放域海量高質量的關鍵詞,就是好系統;再比如模型改進,也不只局限在我們所改進的 Fastpair 和 BERT 上,相似的思想其實可以遷移到目前學術界/工業界大部分已知模型上不過我們還是會毫無保留地給大家展示我們的具體實現,以供參考,拋磚引玉。
關鍵詞系統
如上面所說,一個好的關鍵詞系統,要能抽取出多又好的關鍵詞——即:數量多、質量高。
為了達成這個目標,我們引入了領域的概念,正好契合我們開放域問答的特點——涉及領域多、覆蓋面廣所以我們先獲取了海量的、帶有領域標簽的新聞/文章,通過各種手段從里面提取出候選的關鍵詞。然后 設計了一個 diff-idf 分值,去衡量這個關鍵詞的領域特性,直觀來說,就是這個關鍵詞在自己領域出現的文檔頻次,遠高于其他領域。通過這個分值排序截斷后,再進行后處理,去除噪音、實體歸一化等等,最后與一些公開詞條一起,構成一個龐大的關鍵詞詞典。具體的流程如下(比較細碎 但缺一不可)。
這個流程每天都在運行和更新,我們目前的關鍵詞數量達到數百萬級,人工評測的質量也不錯。下面是一些 case 展示:
模型演化
同樣的,模型也要進行相應的升級。我們的模型演化路線如下所示
首先是我們針對之前線上 run 的 Fastpair,做了關鍵詞方面的改進,接著我們鳥槍換炮,升級到 BERT,以應對更復雜的業務場景,并同樣對 BERT 做了改進,我們稱之為 Keyword-BERT, 從指標上看,這是一個殺手級模型,一下子實現了匹配的質量的質的飛躍,接下來我們將詳細闡述。
改進Fastpair
Fastpair 的模型結構如下:
它其實是改造了 Fasttext 以適配文本對兒分類的場景。因為 Fasttext 是針對單文本分類,而要對文本對兒分類,僅用兩個文本各自的 n-gram 特征顯然是不夠的,所以很自然而然地加入兩個文本里 各自的詞組合在一起形成的 pair-wise 交互特征,這種思想其實跟我們在文章開頭提到的,那些『基于交互』的模型的思路很像,先對兩個文本的信息進行充分交互融合,再做分類那么我們的問題就是,如何改造 Fastpair 模型,使得它能額外去『關注』關鍵信息呢?我們的改動非常直觀,就是給包含了關鍵詞的 pair-wise 特征,額外加上一個可學的權重,如下所示:
這里我們借鑒了 FM 中參數分解的思想,將孤立的 Wkq 分解成兩個詞的 embedding 內積,這樣既能減少參數量,又能刻畫含有相似關鍵詞的 pair-wise 特征之間的共性我們構建了 60w 左右的百度知道問題對兒(正負樣本比例 1:1)用來訓練,然后人工標注了2k個難分的正負樣本用來預測,從預測指標上看,提升非常顯著。
然而由于 Fasttext 模型層數淺的固有問題,Fastpair 精度并不高,而且對于 OOV 的 pair-wise 特征也無能為力,當業務場景面臨更大挑戰時,我們便需要考慮升級我們的武器庫了。
Keyword-BERT
BERT 相比其他已知的深度模型,是核彈級別的改進,所以我們理所當然地選擇了它 (事實上我們也做了線下實驗,結果都在意料之中)鑒于 BERT 的結構已家喻戶曉,我們就不細述了,我們重點思考的,是如何給 BERT 增加額外的關鍵信息捕捉模塊?我們的思路跟 Fastpair 的改進一脈相承,只不過將這種 pair-wise 的交互,變成了 attention 機制,具體細節如下:
一方面,我們在最上層引入一個額外的 keyword layer,通過 attention 和 mask ,專門對兩個文本之間的關鍵詞信息進行互相之間的 attention, 增強他們之間的互信息,另一方面,對于輸出的兩個文本的表示,我們借鑒了機器閱讀理解里 fusion 的思想進行融合,然后將融合后的結果和 CLS 一起,輸出到分類層通過這樣的改造,Keyword-BERT 在不同 layer 數目下的指標都優于原始 BERT。
我們發現, layer 數越少,Keyword-BERT 相比原始 BERT 提升越明顯。這也很好理解,因為 layer 數越少, BERT 所能學到的句子級別的信息越少,而關鍵詞相當于對這種句子級別信息進行了補充我們最后上線的是 6 layer 的 Keyword-BERT,因為它的性能跟原始 12 layer BERT 非常相似,而推斷速度要快很多(在我們內部自研的 BERT 加速框架下)。
延伸
模型結構嘗試
正文中給出的 Keyword-BERT 的結構是我們在多次試錯上的最優實踐,我們還嘗試過:
直接用 keyword attention layer 取代原始 BERT 第12層layer:效果不好,原因在于,關鍵詞只能作為額外的補充信息,而不是取代原來的語義信息。
將 Keyword attention layer 加在模型的底層:效果不好,原因在于,底層信息向上層『傳播』過程中,關鍵詞信息被逐漸弱化。
未來工作
關鍵詞僅僅提供了一個維度的信息,我們還可以加入更豐富的信息 (如 詞的詞性、詞的圖譜屬性 等等) 來增強模型的區分能力,模型框架依然可以用我們現有的結構。
論文原文和源碼可見:https://github.com/DataTerminatorX/Keyword-BERT
總結
以上是生活随笔為你收集整理的Keyword-BERT——问答系统中语义匹配的杀手锏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【社招/实习】百度大搜索招聘NLP、搜索
- 下一篇: 全栈深度学习第4期: 机器学习岗位区别与