###好好###遠離送命題: 問答系統中語義匹配的『殺手鐗』

本文將介紹一套『獨創』的語義匹配方法論和一個殺手級模型

本文受衆:

  1. 自然語言處理/問答系統/智能助手/搜索/推薦 等相關行業從業者

  2. 對自然語言處理/智能助手感興趣的普通讀者

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 的結構是我們在多次試錯上的最優實踐,我們還嘗試過

  1. 直接用 keyword attention layer 取代原始 BERT 第12層layer

    • 效果不好,原因在於,關鍵詞只能作爲額外的補充信息,而不是取代原來的語義信息

  2. 將 Keyword attention layer 加在模型的底層

    • 效果不好,原因在於,底層信息向上層『傳播』過程中,關鍵詞信息被逐漸弱化

v.s. 百度 ERNIE

百度在19年上半年,針對 BERT 在中文預訓練的任務,提出將實體詞進行 mask 的做法。從思想層面看,跟本文有些許相似:都是通過標註數據中的詞,顯式地告訴模型有關詞邊界的信息

但還是有很大不同,在於

  1. 我們的工作並不是受 ERNIE 啓發,而是來自於我們對業務的深刻理解。這是兩個完全平行的工作,模型提出時間上也相仿,只不過我們爲了投 AAAI 沒有急於公開我們的想法

  2. ERNIE 主要針對預訓練任務,ERNIE1.0 只是根據中文的特性對數據做了簡單處理(mask一個完整的詞),但模型結構並無太大創新, ERNIE2.0 纔對模型訓練方式有較大改動。我們則是針對語義匹配任務,除了數據預處理之外,還對模型做了相應改造

  3. 我們的模型源碼是基於 Google 開源的 tensorflow 版的 BERT,而 ERNIE 則是基於百度自研的 paddle paddle

未來工作

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章