導讀:本文将分享領域知識增強的預訓練語言模型在藥電商搜尋領域的實踐。包括以下三大部分:
- 業務背景
- 技術背景
- 方法介紹
分享嘉賓|劉克松博士 阿裡健康 算法專家
編輯整理|許連明 中國科學院大學
出品社群|DataFun
01
業務背景
首先介紹一下業務背景。
電商場景下藥品搜尋,是一種垂直搜尋(vertical search),使用搜尋技術,連接配接使用者用藥需求和電商平台的藥品供給。
相對一般電商搜尋,藥電商搜尋具有以下特點:
- 用藥場景的嚴謹性,客戶搜尋後應當推出準确的藥物;
- 搜尋結果的相關度高,病症和藥品應該是比對的,包含專業醫學知識;
- 識别使用者搜尋的用藥意圖,要求達到高精準,當然普通使用者搜尋中,由于自身醫學知識不夠多,在搜尋詞 Query 中可能有不規範的表達,這種 Query 詞和專業醫學知識是存在偏差的;
- 藥品的專業知識性強,比如藥品說明書、藥典,一些外部資源需要利用起來。
--
02
技術背景
接下來簡單介紹一些技術背景,包括預訓練語言模型和領域知識增強。
1. 預訓練語言模型(Pretrained Language Model)
預訓練語言模型是一種主流的 NLP 範式:主要是使用預訓練+微調的方式,從大量的文本資料中通過自監督、自學習的方式來學習文本的表征(Embedding)。現在有一些特定領域的預訓練模型可供使用,例如:醫學領域、司法領域等。
那麼在電商場景下能否直接使用一個開源的(比如中文 Bert)、别人訓練好的模型呢?
經過對比,我們發現還是使用電商場景的一些自有知識資料來增強語言模型效果會更好,我們有 3 個具體的應用場景:
- 搜尋詞的實體識别(NER),主要識别 Query 中的品牌、藥品主要成分、藥品劑型等 28 類;
- 搜尋詞的意圖分類,擷取 Query 中搜尋的意圖,包括藥品名、疾病、症狀、問診、醫院等 22 類;
- 搜尋詞和藥品标題的文本相關性,是否相關做二分類。
通過這 3 個場景,證明了領域知識增強預訓練模型效果好于一般的開源的中文預訓練模型。
下圖是 3 個場景的具體例子,左邊是 Query 詞實體識别(搜尋的是感冒靈顆粒,感冒靈是藥品名,顆粒是劑型,對此進行準确地實體識别);中間是 Query 詞意圖分類(HPV 疫苗,搜尋的是疫苗,而且是 HPV 疫苗,這裡有醫院、體檢、醫生、疫苗等分類);右邊是 Query-Title 的相關性(比如搜尋“脂溢性脫發”,推出的藥品應該是能夠治療脫發,并且和脂溢性脫發是比對的)。
2. 領域知識增強
領域知識增強的常見做法包括:
- 在特定領域内對搜集的語料進行重頭預訓練、繼續預訓練,仍然複用 Bert 或者 Xlnet 語言模型重頭做一遍;
- 把知識圖譜(Knowledge Graph,KG)應用進來,方式也比較多,比如添加預訓練實體向量 ERNIE(Informative Entities),QAGNN/GreaseLM;也可以在語言模型(LM)條件機率中引入圖譜上的實體向量 KGLM;還可以修改訓練資料(語料),比如将維基百科中的實體做随機的替換,這樣就可以構造正負樣本這就是 WKLM(replace mentions);也可以在 masking 階段遮蓋力度更大,這樣語言模型訓練過程中可以導入一些知識,這就是 Salient span masking, ERNIE(Knowledge Integration);還有聯合訓練的一些方法,比如KEPLER(KE+MLM)。
我們自己的方法是,采取重頭預訓練,語料包含一般領域語料(比如維基知識)和醫學領域語料。另外有效利用藥品的屬性、結構化資料。
--
03
方法介紹
下面講一下我們的方法。
預訓練模型(PLM):一般領域模型,例如 BERT, oBERTa, XLNET, GPT, ELECTRA 等等。生物醫學領域 PLM 模型,例如 BioBERT, PubMedBERT, BioMedBERT 等等。
我們的動機是将 PLM 應用在醫藥産品垂直搜尋,以解決 Query 了解和Query-Title 相關性兩個任務。
我們的目标:将領域産品知識注入 PLM 中。
領域知識(藥品資訊)的特點是:
- 通常存放在結構化關系型資料庫中;
- 傳統的 PLM 集中于處理自然語言句子中的文本。
使用者在藥品垂直搜尋中的行為:除了會搜尋藥品名字也會搜尋藥品的相關屬性,比如藥品相關的疾病症狀,這些資料在關系型資料庫中是有存放的。
是以我們直接在結構化資訊上訓練語言模型。
上圖是模型的整體架構,使用的是聯合訓練的思想,主要有兩部分任務:
一部分是 RTD,這裡面做了一個改進就是 Entity Masking,後面的 Generator 和Discriminator 是複用的别人的網絡結構。
第二部分是 PAP,這是我們主要的創新點,利用自有的電商平台藥品知識庫(Medicinal Product Database),主要使用了标題(Title,比如三九感冒靈顆粒)、屬性、症狀(頭痛,流鼻涕),加入一些胃疼、腰疼等作為負樣本,參考的也是對比學習的思路,這樣構造一個 PAP 任務。
下面具體介紹這兩部分。
RTD 模型,沿用了 ELECTRA 的 RTD 訓練任務,把通用語料、一些網站上的醫學問答相關的語料用進來。選用 ELECTRA 的原因是考慮到訓練任務樣本利用的有效性,并且其 base 版本在英文上驗證過,相當于 BERT-large 的效果。
我們在實體遮蓋上進行了改進,不僅對中文分詞的詞級别遮蓋,還有一些醫學實體詞,這樣就可以有效的把我們在真實業務場景中積累的藥品名、疾病名、症狀名都應用進來,輸入 input 為 ABCD,其中 BC 是一個藥品名,把它給遮蓋了,輔助網絡 Generator 會生成一些遮蓋掉的詞 BE,然後用第二個網絡 Discriminator預測它有沒有改變,這裡的 Main Transformer 參數在下面的 PAP 任務中是共享的。
PAP 任務,在自有的屬性資料上做訓練,主要做了一個負樣本的采樣,就是對屬性資料生成它的負樣本,與正樣本一起放在 Main Transformer,Encoder 對各種文本片段編碼,主要有 3 個部分,分别是 t(Title),n(Attribute Name),v(Attribute Value),我們的想法是希望 t 和 n 做一次拼接,然後進行投影(全連接配接是一個投影),希望 t 和 n 拼接後與正樣本 v 盡可能接近,與随機的負樣本(紅色v’)盡可能遠離。
整體的 Loss 就是上述兩個任務 Loss 的和:
整個訓練在上面兩個任務中進行交替學習,其中一個超參數是控制兩個任務互相學習的比例。整體算法流程:
① 模型參數随機初始化;
② 标記實體邊界以便後面好做實體遮蓋;
③ 從藥品資料庫中收集藥品标題、屬性名、屬性值的三元組;
④ 依據 Loss 進行訓練。
下面介紹具體的實驗結論。
前期實驗準備:為了驗證上述 Loss 的有效性,需要構造訓練集,這裡使用的是通用領域和醫藥領域的資料集,句子和 oken 規模如圖左側所示。右側是藥品實際搜尋場景每次被召回的藥品庫,主要是商品标題、屬性等。其中屬性分類主要是疾病和症狀。
在訓練模型時對比了兩個模型驗證想法的有效性,一個是基于一般語料和醫學語料訓練一個非常強的 baseline:ELECTRA+EM,之是以這麼做是為了對比 PAP Loss 的貢獻。第二個是使用了醫學産品的知識庫做了一個多任務學習,其語料包括第一個方法的語料,及特有的語料(右邊資料)。
評估資料集:主要使用開源的 ChineseBLUE 資料集,是中文醫學相關的資料,為了友善對比使用的是第一版,涉及到的任務有 NER、問答、句對、檢索、文本分類、意圖識别,資料集規模如上圖左側所示。也使用了自己的資料集(上圖右側),Query 和 Title 的相關性任務,分為 easy 和 hard,差別是 easy 對搜尋日志資料沒有限制,hard 是人為構造的比較難的 pair 對,把 Query 中的詞(某個實體)在藥品名标題裡面出現過這種情況排除掉,這就要求 Query 和 Title 沒有實體級别的重合。QIC 是意圖分類,QNER 是 Query 中實體分類。
上圖展示了實驗效果,本文方法能夠在大部分資料集取得最好的效果,有的是比較接近于最佳。其中做了很多對比,第一個是 ChineseBLUE 論文的方法,後面 10K,20K 等是加入實體遮蓋、短語遮蓋的效果,後面三個是自己跑的效果,BERT-base是跑的哈工大的中文開源資料集,ELECTRA 隻跑了 fine-tune 階段。可以看到實體遮蓋對我們的效果提升還是很明顯的。我們的目的就是找到一個比較強的 baseline,直接與通用領域 BERT 對比可能不太合适,是以先驗證一下實體遮蓋的效果比較強,後面實驗的方法對比主要是跟後面方法做對比。
超參數調整:加上 PAP 的 Loss 之後,調整 PAP task 訓練比例 ρ,還有前面提到的三元組 margin 參數 γ。實驗中也做了 Grid Search 設定一些參數,考慮到商品的屬性、規模,跟維基百科等語料相比還是比較小,在自己的任務中稍微控制一下,ρ:[1%,5%,10%,15%],γ:[2,4,6,8],結果表明在我們自己的資料集上 γ=4,ρ=5% 效果比較好,ρ 比較敏感,對結果影響比較大。
在消融實驗中,如果 PAP Loss 真有效果的話,嘗試把它去掉,去掉以後名額都有所下降,hard 資料集下降的比較多,達 1.9%。是以有猜測,對于産品相關概念了解任務上使用屬性預測任務會比較有效,加入的知識幫助更大。對于 NER 的任務,實體遮蓋已經用到實體資訊,再做屬性預測,商品标題和商品語義之間的關系幫助可能就沒那麼大。
具體案例:給定 query “中耳炎”,讓不同的模型去找,ELECTRA-base 和我們的模型,不同模型的打分。取了三個樣本,前面兩個是正樣本,後面一個是負樣本,我們希望正樣本打分越高越好,比如 0.99,負樣本小于 0.001。ELECTRA-base 模型打分 0.49 及 0.93 都是錯的,而我們的模型打分都是正确的。“中耳炎”是個疾病,在産品标題(頭孢,阿奇黴素)中是看不出來的,經過我們查找藥品說明書,發現前面兩種藥是可以治的,而莫沙必利是不治這個病的。通過此案例,表明我們的模型能夠了解藥品和疾病之間治療關系,這也和我們的 Loss 是呼應的。
結論:
- 我們在藥品垂直搜尋領域提出了知識增強的預訓練模型;
- 相對中文 ELECTRA 我們加入了實體級别的 masking;
- 我們提出一個新的産品屬性預測任務,并且把它融合到了語言模型當中;
- 實驗證明取得了不錯的效果,并且在藥品垂搜場景驗證了 PAP 預訓練任務的有效性。
--
04
問答環節
Q1:語料數量和比例是怎樣的?
A1:這個是百萬級别的,中文維基百科和醫藥社群問答語料(千萬級别)都有。
Q2:PAP 多任務中 Title 長度長,屬性值長度短,有考慮優化嗎?
A2:這個問題很好。标題我們用的是 SPU 的标題,一般是品牌+産品名稱,一般還有化學成分和劑型,而疾病症狀是多值。标題也不會特别長,沒有特别的處理。
Q3:Title 和屬性文本拼接,屬性值進入網絡得到 embedding 嗎?
A3:是的。
Q4:預訓練沒有用點選樣本嗎?
A4:出發點是利用商品結構化資訊,還沒有考慮使用者的行為資料。
Q5:PAP 任務的損失是如何計算的?
A5:有負樣本,在 PAP 任務中,t 和 n 拼接後與 v 盡可能接近,而與 v’ 盡可能遠。
Q6:多任務學習需要調整不同任務的占比嗎?
A6:需要。其實訓練中有一個超參,一個 batch 都是 RTD,下一個 batch 都是 PAP,在 input 中會控制兩個任務比例。
Q7:直接重頭訓練的嗎?還是基于 Best BERT 做 continue 訓練?
A7:重頭訓練的。這個主要是為了模型的對比,參數有随機初始化。
Q8:相關性上來了,電商轉化率有沒有影響?
A8:沒有做相關實驗。做的是 query 了解,意圖識别,實體識别。
Q9:Title 與屬性值拼接有采用特别的拼接符?
A9:沒有,就是直接拼接的。考慮到 attention 會在 token 兩兩之間進行計算。
Q10:判别器與生成器的參數是共享的嗎?為什麼要用 backbone?
A10:判别器與生成器不共享,Main Transformer 是共享的。第二個問題,對業務場景有用的部分是 PAP 任務,RTD 理論可以換 BERT,GPT 都是可以的,不一定非要用 ELECTRA 的結構,之是以使用,是因為看到 ELECTRA 12 層與 BERT 24 層比較接近,是以拿這個去做。
Paper:Liu, Kesong, Jianhui Jiang and Feifei Lyu. “A Domain Knowledge Enhanced Pre-Trained Language Model for Vertical Search: Case Study on Medicinal Products.” COLING (2022).
今天的分享就到這裡,謝謝大家。
|分享嘉賓|
劉克松 博士|阿裡健康 算法專家
博士畢業于中國科學院理論實體研究所。曾在北大方正集團從事網際網路輿情研究、京東商城負責搜尋平台生态業務,現任職于阿裡健康的資料智能與引擎部,負責自然語言處理以及搜尋相關技術應用。
|《資料智能知識地圖》下載下傳|
上下滑動,檢視《資料智能知識地圖》全景圖,高清版請關注公衆号“大話數智”下載下傳
|DataFun新媒體矩陣|
|關于DataFun|
專注于大資料、人工智能技術應用的分享與交流。發起于2017年,在北京、上海、深圳、杭州等城市舉辦超過100+線下和100+線上沙龍、論壇及峰會,已邀請超過2000位專家和學者參與分享。其公衆号 DataFunTalk 累計生産原創文章900+,百萬+閱讀,近16萬精準粉絲。