本文將介紹一套『獨創』的語義匹配方法論和一個殺手級模型
本文受衆:
自然語言處理/問答系統/智能助手/搜索/推薦 等相關行業從業者
對自然語言處理/智能助手感興趣的普通讀者
1. 引子
『問&答』是人和人之間非常重要的溝通方式,其關鍵在於:我們要理解對方的『問題』,並給出他想要的『答案』
設想這樣一個場景,當你的女朋友or老婆大人在七夕前一晚,含情脈脈地跟你說
親愛的,七夕快到了,可以給我換個新手機嗎?
而此時沉迷王者峽谷的你,也許會不假思索地回答
好啊親愛的~ 昨天剛看到拼多多九塊九包郵買一送一可便宜呢~ 多買幾個哦一個殼容易壞呀
你話音未落,一記絕殺撲面而來
(王大錘,卒,享年28)
所以,對於生活中這種隨處可見的送命題,只要我們惜命&稍微上點心,是不會輕易丟分的
但對於機器來說,這卻是個莫大的挑戰,因爲機器對相似文本的『誤解』非常常見,所以我們的AI也常常被用戶戲謔爲『人工智障』(一個聽上去很缺AI的稱呼)
作爲AI背後的男人,我們一直致力於提升AI的能力,讓機器早日擺脫智商困境。具體地,針對這種『問答』場景,我們提出了一套新的方法論和殺手級模型,從而讓AI更懂你,遠離送命題~
2. 背景
在日常生活中,我們會經常詢問我們的語音助手 (小微/Siri/Alexa/小愛/小度 等等)各種各樣的問題,其中有一類問題的問法相對嚴謹,返回的答案需要精準,比如
『姚明的老婆的身高是多少』、『周杰倫的稻香是哪一年發行的?收錄在哪張專輯?』
這類問題我們稱其爲『精準問答』,可以藉助知識圖譜技術,解析問題裏的各個成分(實體/實體關係 等等),進行嚴謹的推理,並返回答案。(我們在圖譜問答方面也有積累,有機會再分享,本文先不表)
也有一類問題,要麼問法多樣,要麼答案開放,比如
『蛋包飯怎麼做』、『評價下cxk的籃球水平』、『酒精到底多少度才能燒起來啊』
對於這類問題的問答,我們將其稱爲『開放域問答』。這類問題要麼難以嚴謹地分析句子成分進行推理、要麼無法給出精準的答案,所以一般通過尋找相似問題,來曲線救國。大致的流程如下
首先我們需要維護一個海量且高質量的問答庫。然後對於用戶的問題(Query),我們從問答庫裏先粗略地檢索出比較相似的問題 (Questions),對於這些候選問題,再進一步進行『語義匹配』,找出最匹配的那個問題,然後將它所對應的答案,返回給用戶,從而完成『開放域問答』
我們可以看到,粗略檢索出來的 Question,裏面噪音很多,跟我們的 Query 相比,很多都是『形似』而『神不似』。所以最最最核心的模塊,便是 『Query-Question 的語義匹配』,用來從一堆『形似』的候選問題中,找出跟 Query 『神似』的 Question。而一旦匹配錯誤,便可能陷入 手機 和 手機殼 的險境,輕則用戶流失,重則機毀AI亡
3. 挑戰&當前解
解決開放域的語義匹配並非易事,其挑戰主要來自以下兩方面
對於第二點,『問題對關鍵信息敏感』,我們可以來看一些 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問題),主要問題裏的關鍵信息(相似/不相似 的詞對兒)沒出現過,此時模型只能『抓瞎』
痛點總結
綜上,儘管工業界學術界的諸位大神在這個領域持續發光發熱筆耕不輟,但我們在開放域的語義匹配場景下,依然面臨着兩大痛點:
數據痛點: 模型依賴高質量數據標註
模型痛點: 1) 模型對難分樣本的關鍵信息捕獲無力
2) 模型對 OOV 的相似/不相似詞對兒無能爲力
4. 道: 方法論
爲了從根本上解決這兩大痛點,我們不再只拘泥於『術』的層面,去做一些數據採樣、模型方面的小改進,而是先深入思考問題的根源,從『道』的層面提出一套方法論,如下所示:
我們對傳統語義匹配模型的框架做了兩處改進,一處是加入了『關鍵詞系統』,從海量的開放域中提取關鍵詞/詞組,然後給訓練樣本/預測樣本中出現的關鍵詞,額外添加一個標註。另一處,是對模型做相應改進,去增強模型對這種關鍵信息的捕獲。
這兩處改動的核心,是爲數據和模型 顯式地引入關鍵信息,這樣我們便能從根本上解決我們所面臨的數據和模型的痛點,不再只是隔靴搔癢
爲何如此一來,便能解決問題?且聽分解
釋道
爲了方便大家理解,我們將結合具體 case,來逐條闡釋我們的『道』
1. 改進的模型:強化模型對『關鍵信息』的捕獲
這一點很好理解,我們在模型中,額外增加了對關鍵詞詞對兒的處理,相當於增加了額外的 feature,給模型提供更多信息,加強模型對問題對兒的區分能力。至於具體的改進細節,我們將會在下節提到,這裏先不表
2. 帶關鍵詞的樣本:減少對標註數據依賴
我們舉個例子,也是我們在引子部分提到的一個負樣本:『怎麼掃碼加微信』和『怎麼掃碼進微信羣』。這兩個問題不相似的根源,在於『微信』和『微信羣』的含義不同。但模型一開始學出來的可能是 『加』和『進』這兩個動詞的差異(因爲『微信』和『微信羣』的embedding可能非常接近),只有我們提供了額外的樣本,比如告訴模型 『怎麼加豆瓣小組』和『怎麼進豆瓣小組』這兩個問題是相似的,模型纔可能學出『進』和『加』不是關鍵,繼而學到真正的關鍵信息。
所以如果我們一開始就標註出關鍵詞,相當於告訴模型,這些是候選的、可能的關鍵信息,模型(經過我們改進後的)就會有意識地針對這部分進行學習,而不需要自行通過更多的樣本去判別,從而從根本上解決對標組數據的依賴。我們的結果也佐證了這一點,先提前貼出來,下圖是傳統的bert模型和經過我們改造的keyword-bert模型,在達到相似準確率上所需要的數據量,具體的我們會在下節闡述
3. 帶關鍵詞的樣本:開放領域的先驗信息,減少訓練集OOV
我們依然舉一個例子,一個待預測的樣本 『如何掃碼加QQ羣』和『如何掃碼進微信羣』,在訓練樣本里,『QQ羣』可能從來沒跟『微信羣』一起出現在一個問題對兒裏(也就是所謂的 OOV),但如果在預測的時候,我們額外標註出『QQ羣』和『微信羣』都是關鍵詞,相當於給出一個『先驗信息』,模型(經過我們改進的)便能通過自身的關鍵詞模塊,專門學習這兩個詞的異/同,得到一個更好的分類結果,減少OOV帶來的負面影響
5. 術: 實現
『道』的層面闡釋清楚之後,一切就豁然開朗,剩下的實現都是很自然而然的,無非就是圍繞我們對傳統框架做的兩處改進:
如何構造一個『關鍵詞系統』? 如何『改進模型』?
在具體實現方法上 並沒有標準答案,比如關鍵詞系統,只要能抽取出開放域海量高質量的關鍵詞,就是『好系統』;再比如模型改進,也不只侷限在我們所改進的 Fastpair 和 BERT 上,相似的思想其實可以遷移到目前學術界/工業界大部分已知模型上
不過我們還是會毫無保留地給大家展示我們的具體實現,以供參考,拋磚引玉
4.1. 關鍵詞系統
如上面所說,一個『好』的關鍵詞系統,要能抽取出即『多』又『好』的關鍵詞 ——即 數量多、質量高
爲了達成這個目標,我們引入了『領域』的概念,正好契合我們開放域問答的特點——涉及領域多、覆蓋面廣
所以我們先獲取了海量的、帶有領域標籤的新聞/文章,通過各種手段從裏面提取出候選的關鍵詞。然後 設計了一個 diff-idf 分值,去衡量這個關鍵詞的『領域』特性,直觀來說,就是這個關鍵詞在自己領域出現的文檔頻次,遠高於其他領域。通過這個分值排序截斷後,再進行後處理,去除噪音、實體歸一化等等,最後與一些公開詞條一起,構成一個龐大的關鍵詞詞典。具體的流程如下(比較細碎 但缺一不可)
這個流程每天都在運行和更新,我們目前的關鍵詞數量達到數百萬級,人工評測的質量也不錯。下面是一些 case 展示
4.2. 模型演化
同樣的,模型也要進行相應的升級。我們的模型演化路線如下所示
首先是我們針對之前線上 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 加速框架下)
5. 延伸
開源: 論文和代碼
我們將論文和代碼都開源出來了(公衆號後臺發送 送命題 三個字即可獲取論文和源碼鏈接),對文中沒有詳細闡明的地方,比如
關鍵詞系統的實現細節
Keyword-BERT 的改進細節
負採樣策略
可以參考我們的論文或源碼進行細究,歡迎大家使用和拍磚
說個題外話,本工作其實早在19年上半年就已展開,並於19年9月份將成果投遞了 AAAI2020,拿到了7 7 5 5的評分(兩個accept 兩個weakly reject),challenge的點主要在於我們沒有在公開數據集上評測。無奈本人一如既往的懶癌發作,再加上內部數據不能輕易公開,所以只能作罷。但我相信真理是經得起檢驗的,相比在一些小規模公開數據上刷榜,我更希望模型能在更多的業務場景下被驗證,各位讀者朋友可以不妨一試哦~
模型結構嘗試
正文中給出的 Keyword-BERT 的結構是我們在多次試錯上的最優實踐,我們還嘗試過
-
直接用 keyword attention layer 取代原始 BERT 第12層layer
-
效果不好,原因在於,關鍵詞只能作爲額外的補充信息,而不是取代原來的語義信息
-
-
將 Keyword attention layer 加在模型的底層
-
效果不好,原因在於,底層信息向上層『傳播』過程中,關鍵詞信息被逐漸弱化
-
v.s. 百度 ERNIE
百度在19年上半年,針對 BERT 在中文預訓練的任務,提出將實體詞進行 mask 的做法。從思想層面看,跟本文有些許相似:都是通過標註數據中的詞,顯式地告訴模型有關詞邊界的信息
但還是有很大不同,在於
-
我們的工作並不是受 ERNIE 啓發,而是來自於我們對業務的深刻理解。這是兩個完全平行的工作,模型提出時間上也相仿,只不過我們爲了投 AAAI 沒有急於公開我們的想法
-
ERNIE 主要針對預訓練任務,ERNIE1.0 只是根據中文的特性對數據做了簡單處理(mask一個完整的詞),但模型結構並無太大創新, ERNIE2.0 纔對模型訓練方式有較大改動。我們則是針對語義匹配任務,除了數據預處理之外,還對模型做了相應改造
-
我們的模型源碼是基於 Google 開源的 tensorflow 版的 BERT,而 ERNIE 則是基於百度自研的 paddle paddle
未來工作
關鍵詞僅僅提供了一個維度的信息,我們還可以加入更豐富的信息 (如 詞的詞性、詞的圖譜屬性 等等) 來增強模型的區分能力,模型框架依然可以用我們現有的結構