丁香园在语义匹配任务上的探索与实践
前言
語義匹配是NLP領域的基礎任務之一,直接目標就是判斷兩句話是否表達了相同或相似意思。其模型框架十分簡潔,通常包含文本表示和匹配策略兩個模塊,因而很容易擴展到相關應用場景,如搜索、推薦、QA系統等。此類模型通常依賴數據驅動,即模型的效果需要高質量的數據作為基礎,而在醫療領域,文本數據的質量不光依賴語法,還要求相對嚴謹的實體描述,因而對數據的要求更為嚴格,也為模型訓練調整增添了困難。
聯系到丁香園團隊的在線問診、病癥查詢、醫療推薦等業務場景,我們希望能構建更高質量的語義表征模型,一方面對于文本中的疾病癥狀等實體詞足夠敏感,另一方面能夠捕獲長距離的組合信息。通過在語義匹配任務上的嘗試,積累語義模型的特點,從而在各個具體應用場景下,針對性地構建模型結構。本文介紹了丁香園大數據團隊在醫療文本數據上,對語義匹配這一基礎任務的實踐。首先簡單介紹早期的文本特征表示方法,然后列舉幾種Representation-Based和Interaction-Based的模型,最后介紹實踐中的一些細節。
傳統文本表示
經典的匹配模型普遍采用某種基于bow的統計文本表示,例如tf-idf和bm25,這類方法普遍存在兩個問題,一是維數太高,二是丟失了context的特征。2013年的Word2Vec的出現改變了文本表示的方式,利用文本的context token訓練每個token的低維度向量表示,使向量本身包含語義信息,此后成為文本類任務的主流預訓練手段。
在對比傳統方式和word2vec的效果后,丁香園也逐漸用詞向量作為各個業務場景中的文本表示,并在此基礎上,不斷挖掘更深層的文本表示學習,語義匹配模型則是重要的探索方向。
模型介紹
常見的語義匹配模型有兩種設計的思路:基于表示(Representation-Based)和基于交互(Interaction-Based)
Representation-Based Model
基于表示的模型很直接,就是用一個Encoder模塊提取本文的特征信息,以可計算的數值向量輸出,最后一層計算兩個向量的匹配程度,可接一層MLP,也可直接算余弦相似。很明顯這類模型的關鍵是中間Encoder模塊的設計,目標是設計強大的特征提取器,在Encoder部分獲得文本的語義表示。
Interaction-Based Model
基于交互的模型認為,只用孤立的Encoder模塊是不夠的,而兩個文本交互匹配本身就會產生有關匹配程度的信息,利用好這個信息可以提升模型的匹配能力。基于這個設想,再加上attention機制的流行,語義模型就開始變得復雜了。下面將列舉幾個有代表性的網絡結構。
DSSM
DSSM是非常經典的語義模型,是標準的Representation-Based的結構模版,模型本身效果很好,且極易修改或擴展,因而廣泛應用在相關業務場景中。Encoder部分,DSSM采用了MLP,在此基礎上的擴展通常也是將MLP換成CNN或RNN結構,頂層直接計算cos,各部分都相對容易實現。不過,原文選用了BOW模型作為文本的表示方式,雖然也加入了trigrams等策略,但仍不可避免會失去詞的context信息。此外,原文采用了point-wise的loss,我們團隊在搜索精排序階段嘗試改進了DSSM,用RNN替換了MLP,并采用triplet loss訓練模型,并與多種Encoder+point-wise-loss對比,結構顯示了triplet loss在排序任務上有更大的優勢。
SiameseRNN
孿生網絡(Siamese network)是一類網絡結構,其特點是Encoder共享權重。Encoder可根據需要替換。這里以RNN為例,是因為RNN結構的特性。DSSM結尾處提到了詞的context信息,雖然詞向量是利用context訓練得到,但文本序列的詞序信息仍需要Encoder捕捉,而RNN類結構本身就具有捕捉序列信息的能力,因此在語義匹配任務中,RNN常常會比CNN有更好的效果。這也是很多文本任務的模型會在Embedding層上加Bi-RNN的原因。
?不過RNN類模型訓練耗時長,并行困難,這對科研調試和產業應用都不友好,特別對于應用落地,時間開銷太大,再好的模型也沒法上線。當然關于RNN并行也有很多相關研究,SRU和Sliced RNN應該是兩種代表性的改進方式,不過仍然難以比擬天生就適合并行的CNN和Transformer。
TextCNN
上面提到了RNN具備提取詞序信息的能力,其實就是說每個詞和其前后的內容并不獨立出現,但CNN是一個個窗口,窗口間的計算并不關聯,如何用CNN抽取詞序信息呢?本文是Kim在2014年發表的,代表性的CNN做文本特征提取的工作。原文模型用于句子分類任務,基本思路就是,讓一個窗口的大小剛好裝下k個詞,對這種窗口的卷積操作就相當于抽取了k個詞共同表達的信息,也起到了抽取詞序信息的作用。不過這種CNN結構存在兩個明顯的問題,一是k的取值通常很小,意味著文中采用的單層CNN無法提取長序列的信息;二是文中的CNN包含max pooling操作,對于k個詞對應的向量,池化操作只保留一個最大的值,這勢必會丟掉一些信息,因此目前也有許多針對性的CNN改進策略,下一節將介紹CNN的改進以及與RNN,Transformer的對比。
Transformer
Transformer的出現應該是NLP界的大新聞,除了在機器翻譯任務上超越了Seq2seq外,霸氣的文章標題也令人記憶猶新。正如該題目所述,Transformer給了人們CNN和RNN外的其他選擇。這里針對語義匹配,我們只關注其中的Encoder部分。全文的重點是self-attention,通過這種attention計算,讓文本序列中的每個詞都和序列本身建立聯系,計算過程非常簡單。其中Q,K,V都是文本序列本身,分母上的sqrt(dk)作用是緩解Q和K的dot計算出現過大的值。不難想象,分子上的dot(Q,K)操作計算了序列中每個詞與其他詞之間的相似度,softmax對這一結果做歸一化,得到的就是序列對自身的權重。此外,文中提到了多次計算self-attention對特征提取是有幫助的,因此Encoder采用了Multi-Head Attention機制,多個self-attention獨立的計算,原文采用了base和big兩種結構,分別對應12和24個self-attention塊,更寬更深的模型在文中的實驗里取得了更好的效果,并且,由于self-attention本身計算不慢,又相互獨立,這使得Multi-Head機制很容易并行操作。
當然,整個Encoder不光包含Multi-Head Attention,Transformer如此有效,或許跟Block結構本身也有很大關系,完全可以嘗試將Multi-Head Attention替換成CNN或RNN結構,針對不同應用場景很可能會有奇效。
ESIM
上述的結構都是完全關注Encoder的Representation-Based Model,而事實上Interaction-Based Model早已成為此類任務的主流設計思路。一方面對比融合不同輸入的信息符合人們的常識,另一方面諸如attention等融合機制所提供的改進的確在很多任務中表現出色。下面將介紹兩個在文本分類,文本匹配等比賽中頻頻奪魁的模型,首先是ESIM。
該模型專門為自然語言推理而設計,結構上并不復雜,重點是在兩層Bi-LSTM間加入了interaction計算,文中稱作 local inference modeling ,其實就是利用了 soft attention 計算兩個文本的匹配矩陣,可以認為這個矩陣中包含了兩個文本的交互信息。之后這個矩陣和兩個Embedding后的輸入文本做差和點基,再做concat,就得到增強后的文本特征向量。
當然,本文還有其他創新點,例如在句法分析類問題上可以用Tree-LSTM替換Bi-LSTM,不過這里重點關注提取interaction信息的結構設計。類似 soft attention 的結構已經是眾多Interaction-Based Model的標配,計算量不大,實現簡單,對模型的效果提升也很客觀,是個性價比很高的trick。相比之下,兩個Bi-LSTM層的計算耗時要顯著的長。
BiMPM
BiMPM是和ESIM類似的Interaction-Based Model,interaction計算上下均有一層Bi-LSTM,不過作者在interaction計算上花了很多心思,并非簡單采用 soft attention ,而是同時用4種匹配策略。此模型在quora question pairs數據集上測試accuracy達到88,比當時最好的[L.D.C.]模型高3個點,比Siamese-LSTM高6個點。在類似文本匹配的比賽中,BiMPM和ESIM的表現也非常突出,也能一定程度上說明不同的interaction計算策略對匹配效果有不小的幫助。
不過,這兩個模型都有一個明顯的缺點————慢,而小數據集又無法發揮它們的效果,所以訓練調參的過程會很耗時。像是quora question pairs數據集提供了40W對訓練樣本,不平衡程度也不大(正負比 3:5),這時兩個模型效果都不錯,這也印證了數據驅動的重要性。
實踐體會
TextCNN的局限和改進
上節提到,TextCNN通過調整卷積窗口來提取序列context信息,但是卷積窗口一次畢竟只能提取k個詞的組合信息,這樣仍然無法處理長序列。為了在長序列問題上比肩RNN,一個直接的應對方式就是堆疊層數,也是目前相對主流的方法,反正CNN計算比RNN快得多,多加幾層也沒什么問題。
話雖如此,但直接堆疊TextCNN的效果并不理想,業界也衍生出了不少對TextCNN結構的改進,這里筆者將介紹Facebook AI Research提出的ConvS2S結構。本文對應著Transformer,二者都是Seq2seq結構的改進,因此ConvS2S的Encoder完全可以用于文本匹配等任務。就Encoder模塊而言,ConvS2S為了有效堆疊CNN做出了兩處改進,GLU(Gated Linear Units)和殘差連接(Residual Connections),使用glu作為非線性運算可以優化梯度傳播,后者residual結構則為了保留了輸入序列的信息。這樣的修改可以幫助增加卷積層的深度,一定程度上提升CNN在序列任務上的特征提取能力,同時相比于RNN類模型,模型耗時和并行能力的優勢依舊存在。筆者嘗試用ConvS2S替換TextCNN,疊加5層后模型效果有明顯提升,僅從Encoder模塊對比,可以與LSTM效果持平,當然這樣的對比無法證明CNN可以通過疊加取代RNN,畢竟實驗結果與本文數據的關系更大,不過至少說明CNN仍然有改進的潛力。
Positional Embedding
CNN除了面對長序列乏力外,還存在一個問題,就是編碼序列時會丟掉position信息。由于RNN是按時序處理序列的,所以序列的位置信息自然會被編碼進狀態變量中,但CNN做不到,尤其是卷積過后用pooling操作降維會損失的更嚴重,相同的問題transformer中也存在,看self-attention的公式很容易理解,每個詞的地位是完全相同的,計算出的權重只和當前參與計算的兩個詞有關。因此,在ConvS2S和Transformer的文章中都提出了額外補充位置信息的策略,被稱作 position embedding 。
ConvS2S提出的編碼策略很簡單,就是加一個類似詞向量的位置向量參與訓練,在模型訓練過程中把位置向量也學出來;transformer則提出一種傅立葉變換生成詞的位置編碼,作者表示這種計算得到的結果與訓練出的位置向量基本一致,但生成過程是一個確定的公式,不必訓練生成。
對于這兩種 position embedding 方法,筆者的實踐結果并不好。學習位置向量相當于加了一層網絡,完全寄希望與網絡學習能力,可能在數據量充足的情況下會有效果(BERT也用了這種學習策略),但小數據集的條件下想要學習出這組參數其實難度很大。至于Transformer配合使用的生成公式,也有不少人從信號系統角度出發給出相應解釋,不過筆者認為說服力并不足夠,這種生成方式本身是不是合理,以及是否與語言語法相關都值得商榷,不過好在計算很快,訓練時加一組對比實驗開銷也不大。
總而言之,筆者認為,序列數據中存在位置信息這個設想是有道理的,對于非RNN類的提取器,如何更好的抽取這類信息,也是值得關注的方向,這里link一篇包含相關工作的(https://arxiv.org/pdf/1803.02155.pdf)供大家學習參考。
Encoder組合
其實對于語義匹配這個任務,不同領域的數據源,不同的任務需求才是影響模型的關鍵因素,寄希望于sota得到的結果往往令人失望,原因也很好理解,大部分sota的成果都是針對一兩個數據集做優化,其目的也是驗證某些結構或trick的可行性,并不意味著sota等價于萬能。因此在嘗試過包括LDC,ESIM,BiMPM在內的十余種模型后,我們專門嘗試了簡單的編碼器以及編碼器組合的對比實驗。
首先是用Representation-Based的結構,對比CNN,RNN,Transformer的效果。實驗結果仍然是RNN最好,CNN用了ConvS2S的Encoder并堆疊層數后可以逼近RNN的結果,Transformer的效果則不理想。筆者認為,CNN雖然可以靠層數增強長序列捕捉能力,但畢竟增強有限,這篇文章(https://arxiv.org/pdf/1808.08946v1.pdf)中對三種編碼器的長序列特征捕捉能力做了比較,實驗結果說明了CNN在此方面仍然有所不足。不過該文章中Transformer的能力應該是強于RNN的,這與筆者的實驗結果不符,其原因在于筆者這里實驗所用的數據量不足,以及Transformer的模型不夠"重"。其實Transformer的強力早已在OpenAI-GPT一文中被展現,去年10月的BERT更是再次證明這一模型的強大,只是由于header的數量會極大影響Transformer的性能,所以在小數據集上單純靠Transformer可能會讓人失望。
對比這三類編碼器后,我們也嘗試了組合RNN和CNN,或在Encoder間加入attention提升模型,根據組合實驗,我們認為Embedding層后首先用RNN的效果通常比較好,在RNN之上加CNN是有幫助的,不過用attention計算匹配矩陣的提升似乎更大。這里的組合方式都是最簡單的拼接,或是向量線性運算,實現很容易,并且在數據集不大的條件下,結果也能逼近甚至超越ESIM,BiMPM這種強力模型。
BERT
最后介紹一下BERT,相信入坑超過半年的NLPer一定都知道BERT的威名,2018年10月一經問世立刻刷新了各個榜單,現如今搭載BERT的模型已經成為了榜單上的標配。網上關于模型本身的解讀非常多,因此這里重點介紹下在小數據集上的語義匹配的實驗過程。模型本身的結構非常簡單,就是秉承深度模型理念的,做深做寬的巨型Transformer,即便是Base版,原始的模型尺寸也是顯存無法接受的存在,筆者嘗試過精簡模型參數后自己做模型預訓練,效果比直接用官方完成預訓練的中文模型差很多,所以如果不是既有海量語料又有足夠資源,還是不建議自己預訓練的。看模型結構在文中的占比就能感受到,巨型Transformer甚至都不是文章的重點,全文最著重描述的其實是BERT的pre-training思路,下面將盡量詳細的介紹兩個任務的訓練過程。
預訓練有兩個任務:第一個是預測句子中的詞,也就是訓練文中的 MLM(Masked LM) ,如上圖所示,模型的輸入包含3種embedding,token,segment和position,其中的token和position好理解,與ConvS2S中的word embedding + position embedding是一回事,segment是和token中的[SEP]是為第二個任務服務的,我們稍后在介紹。首先為什么要用雙向Transformer訓練MLM呢,作者的解釋大概可以總結成"為了訓練足夠深的雙向模型",這里對比的就是OpenAI-GPT的單向模型以及ELMo的兩個單向的concat。那訓練MLM到底是如何做呢,說白了就是隨機的遮擋住句子中的某些詞(用[MASK]替換),讓模型去預測這些詞,不過作者也提到了,fine-tuning時文本中是沒有[MASK]的,這和預訓練時模型遇到的輸入不同,為了緩解這種差異帶來的影響,作者僅取15%的token,且以0.8的概率遮擋,0.1的概率保持不變,0.1的概率隨便換一個詞,原文提到,模型不知道那個詞是被mask的還是被replace的,所以能force to學習每個輸入的context信息,并且由于被replace的詞僅有1.5%,因此不會降低模型的效果。
第二個任務是預測下一個句子,先解釋segment是和token中的[SEP],BERT中每行input都是由兩句話拼成的,兩句話間用[SEP]分割,第一句開頭是[CLS],第二句結尾是[SEP],segment就是input每個位置屬于第一句還是第二句,第一句的位置index都是0,第二句都是1。源碼中,兩個句子分別對應變量token_a和token_b,其中token_b的構造也有trick,每句都以50%的概率替換成隨機某一篇文檔中的隨機某句話。這個任務其實是為了讓模型學習到句間關系,文中的實驗結果對比顯示了此任務對模型的提升(在QNLI數據集上accuracy提高4個點)
以上就是兩個關鍵的預訓練的設計,完成后,BERT提供了一個輸出層,針對不同任務,只需要對該層稍作修改即可,可以參考文中給出的結構圖。這里不得不說,BERT不僅效果好,源碼也很友好,想遷移到自己的任務上,只需要實現對應的數據處理類,調整模型輸出層即可,即便是想在bert后接自己的模型,也只需要取到transformer最后一層作為自己模型的輸入。這里需要注意,對于中文任務,官方的預訓練是在字向量基礎上做的,字典也必須用官方提供的,需要按詞分的話就不得不重新預訓練了,不過修改成分詞的數據生成代碼也只需要簡單做幾行改動,不過通常字典的size只是萬級(BERT中文語料來自維基百科,字典大小21128),而常用的語料中詞典的大小至少有幾十倍大,恐怕BERT這種預訓練方式也難以收斂。
從ELMo到BERT,語言理解模型可能是2018年NLP領域最耀眼的成果。2013年的Word2Vec之于NLP可謂功勛卓著,它本身就有預訓練的思路,但word embedding層面的trick還不夠滿足任務需求,并且一直以來NLP領域的模型總是做不深,即便是ELMo嘗試堆疊Bi-LSTM,也只有3層,而且3層的時間開銷已經讓大部分團隊難以接受,直到Transformer被OpenAI-GPT驗證了有堆疊提升的潛力,緊接著BERT再次證明了Transformer的能力,同時也證明了深度模型的潛能。從工程角度出發,NLP的標注數據通常不易得,而這種利用大規模無標注數據做預訓練的方法無疑大大降低成本,小團隊或個人也有機會利用少量數據和計算資源fine-tuning出滿足需求的模型。
總結
作為nlp領域的基礎任務,語義匹配模型可以根據應用場景靈活調整,但核心都是挖掘文本序列特征的表示學習。為此,我們希望能把握不同結構中細節的作用,以便在不同任務場景中移植。同時,丁香園也在逐漸適應深度學習模型應用落地,在搜索的精排序階段,大數據團隊嘗試接入改進后的LSTM-DSSM,利用Bi-LSTM的長序列捕捉能力,并采用triplet-loss訓練模型,同時在召回階段,我們也在探索改進CNN和Transformer以提高召回質量。此外,BERT源碼易讀,fine-tuning成本低,模型遷移性好,我們目前的實踐結果也證明其在業務中的潛力,因此,我們未來也會跟進BERT工程化的工作。
另一方面,這次BERT的成功很大程度上是依靠新穎的預訓練策略,以及對無標注語料的探索,近期OpenAI-GPT2.0的成功似乎也證明了高質量數據驅動的能量巨大。然而對于醫療場景而言,準確性和嚴謹性是重中之重,依靠數據驅動是遠遠不夠的,這更需要基于圖譜的知識表示和推理的復雜技術,結合數據驅動和專業信息來共同實現知識表示和語言理解,從而提供安全準確的醫療智能服務。
本文原創首發于【丁香園自然語言處理】,團隊專注于互聯網醫療領域的自然語言處理,利用NLP(自然語言處理)、Knowledge Graph(知識圖譜)、Deep Learning(深度學習)等技術,處理丁香園海量醫學文本數據,打通電商、在線問診、健康知識、社區討論等各個場景數據,構建醫學知識圖譜,搭建通用NLP服務。團隊會總結整理近期閱讀的NLP相關論文并應用于實際的業務場景中,提供滿滿的干貨!關注公眾號【丁香園大數據】了解更多,每月月初,干貨滿滿,不見不散~
【丁香園大數據】近期文章????
搜索中的Query擴展技術
初探GNN-文本表示學習
如何為實體抽取描述性短語
多知識圖譜的融合算法探究
醫療健康領域的短文本解析探索(2)
如何擴充知識圖譜中的同義詞
夕小瑤的賣萌屋
_
關注&星標小夕,帶你解鎖AI秘籍
訂閱號主頁下方「撩一下」有驚喜哦
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的丁香园在语义匹配任务上的探索与实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 惊了,掌握了这个炼丹技巧的我开始突飞猛进
- 下一篇: 谁才是Transformer家族中的最强