齊樂,張宇*,馬文濤,崔一鳴,王士進,劉挺
(1.哈爾濱工業(yè)大學 社會計算與信息檢索研究中心,黑龍江 哈爾濱 150001;2.哈工大訊飛聯(lián)合實驗室,訊飛研究院,北京 100094)
問答是自然語言處理中的一個重要任務,并獲得了廣泛的關注?,F(xiàn)今有著許多問答系統(tǒng)的應用,比如Siri,Cortana,Waston等等。假設現(xiàn)在有如下場景:當你買了一臺新車,坐在駕駛位上時,遇到了一些問題,你需要怎么做?傳統(tǒng)的做法是找到并打開汽車說明書,然后在說明書中檢索問題的答案。為了簡化這一復雜并煩瑣的過程,本文設計了一個新的問答系統(tǒng),針對用戶的提問快速檢索并返回說明書中相關的文檔作為答案。
在國內(nèi)外均有大量研究人員進行問答相關的研究。根據(jù)答案類型,問答系統(tǒng)可以被分為3類。第1類是在大規(guī)模文檔集中返回相關文檔作為答案,等價于文檔檢索(Document Retrieval)任務。文檔檢索的方法可以分為2種:1)無監(jiān)督的基于特征的方法。研究者根據(jù)不同的特征改進文檔排序的算法。Robertson[1]等人使用BM25作為加權函數(shù),利用詞項排序的方式檢索文檔。Ponte[2]等人以及Laffert[3]等人利用語言模型進行文檔檢索。2)有監(jiān)督的方法。一些研究者將文檔檢索看作二分類任務,Nallapati[4]利用SVM和最大熵來解決該問題。另一些則將其看作排序任務,Gao[5]等人使用線性判別函數(shù)對相關文檔進行排序。Burges[6]等人則使用相對熵以及梯度下降的算法訓練用于文檔檢索的神經(jīng)網(wǎng)絡模型。
第2類是在一篇文檔或多個候選答案句中選取包含答案的句子,即答案句選擇(Answer Sentence Selection)任務[7]。通常,研究者將該任務轉化為計算問題和候選答案句間的相似度計算任務。Bordes[8]等人設計了Siamese網(wǎng)絡去計算問題和候選答案句間的相似度,將問題和候選答案句映射到聯(lián)合空間上。Yu[9]等人考慮了問題和答案句間的語義表示,提出了一種二元CNN網(wǎng)絡進行匹配。Yin[10]等人使用注意力機制建模問題和候選答案句間的交互關系,將兩者的信息進行融合,而非對兩者進行獨立的建模,提出了基于注意力的CNN模型(ABCNN)。與其思想相似,Wang[11]等人提出了基于內(nèi)部注意力機制的RNN模型(IARNN)。與傳統(tǒng)的具有注意力機制的RNN模型不同,其在RNN的輸入端使用注意力機制而非在輸出端使用。
第3類是在一篇文檔中找到精準的答案片段,其中答案片段通常由一個或兩個詞組成。這類任務也可稱為閱讀理解(Reading Comprehension,RC)任務[12]。大多數(shù)閱讀理解模型都使用相似的框架:編碼層、交互層和答案層。編碼層將問題和文檔轉化為向量表示;交互層抽取問題和文檔之間的交互信息,輸出問題和文檔的聯(lián)合表示;答案層則基于聯(lián)合表示預測答案。Wang[13]等人結合Match-LSTM模型和邊界模型,將預測答案的過程簡化為預測答案的開始和結束位置。另外,R-Net[14]模型使用雙層交互架構,第1個交互層用來捕捉文檔和問題簡單交互信息,第2個交互層用來捕獲文檔中單詞之間的交互信息。而Adams[15]等人則結合CNN和Transformer,拋棄了LSTM結構,其可以并行進行訓練,可以使用更為龐大的語料,而耗時也更少,同時可以達到更好的結果。
本文的任務是問答系統(tǒng)的一個實際應用,與文檔檢索相類似,也借鑒了答案句抽取和閱讀理解中的相關方法。以奇瑞汽車的說明書作為文檔集,共包含181篇文檔,每篇文檔包括三個部分:標題、摘要和內(nèi)容。表1給出了一個例子,當用戶提出問題“制動報警信號燈在哪里?”時,通過計算問題和每篇文檔之間的相關程度,對文檔進行排序,排名最高的文檔“制動報警信號燈”將作為答案返回給用戶。
該任務主要有3個難點:1)如何充分利用文檔信息對文檔進行建模。標題是文檔的主題,包括文檔最核心的信息。但標題信息太過精煉,不能完全涵蓋文檔的全部信息。同時,部分文檔的標題非常相似,但文檔內(nèi)容卻千差萬別。因此不能只根據(jù)標題判斷一篇文檔是否為正確答案。摘要是文檔內(nèi)容的高度概括,同時包含的信息要多于標題信息,摘要信息可以幫助區(qū)分文檔間的不同。文檔內(nèi)容則包含了文檔的全部信息,但文檔內(nèi)容相對較長,包含許多噪聲,較難建模。這三者相輔相成,因此要充分利用這三類信息對文檔進行建模。
2)汽車說明書中包含大量領域詞。這些特殊詞匯會對問題、文檔的建模造成很大的困擾。在分詞過程中,這些領域詞可能會被識別為短語,被分割為多個詞匯的組合,而不是獨立的詞匯。更為關鍵的是,在不同的句子中,由于分詞錯誤或分詞規(guī)則原因,同一領域詞可能會被分為不同的詞匯組合。在使用詞向量對其建模時,同一領域詞可能會被建模為多個完全不同含義的短語向量。同時,同一含義的領域詞可能會有多種不同的表示,即一個領域詞可能會有很多復述存在。因此需要正確地識別這些復述,將它們聚類在一起。另外部分領域詞或其復述不存在于詞向量的詞表中,屬于未登錄詞,這也極大地影響了模型的效果。
表1 汽車說明書數(shù)據(jù)樣例
3)針對某一問題,文檔集中只有一篇文檔是正確答案,其他文檔均為錯誤答案。當將該任務轉化為計算問題和候選文檔間的相關度的任務時,正例數(shù)量遠遠小于負例數(shù)量,正負樣本的比例極不均衡。這會導致模型在預測時傾向于將所有候選文檔標記為負例,給所有候選文檔相對較低的分數(shù),從而導致模型的效果不佳。
為了解決這些問題,本文提出了一個新的問答系統(tǒng),先計算問題和每個候選文檔間的相關度作為每篇候選文檔的得分,然后根據(jù)得分對候選文檔進行排序,選擇得分最高的文檔作為答案予以返回。為了能更好地利用候選文檔的信息,分別對候選文檔的標題、摘要和內(nèi)容進行建模,并分別計算這3部分與問題的相關度,然后根據(jù)3個得分綜合判斷候選文檔是否為問題的答案。同時,為了更好地將領域詞及其復述聚類在一起,手工構建了領域詞的復述詞典。而為了避免領域詞的分詞問題,放棄了分詞,并將文本轉化為字符級別的向量表示,而非詞級別的向量表示。最后,為了改善數(shù)據(jù)集正負樣本不均衡的問題,設計了兩種訓練策略。第1種是將分類模型轉換為基于Pairwise思想[16]的排序模型,即將一對正例和負例同時輸入到模型中進行訓練。排序模型的訓練目標是使正負例間的得分差距變大,使正例的得分相對更高,負例的相對更低。第2種是直接復制正例,增大正例的數(shù)量。數(shù)據(jù)集中共有181篇文檔,為此針對1個問題復制180個正例,使正負例比例變?yōu)?∶1。實驗結果顯示兩種訓練策略均是有效的,在測試集上達到了93.07%的準確率,可以實際應用到真實場景中。
系統(tǒng)包括2個部分:復述替換和相關度計算。在復述替換中,手工構建了一份領域詞的復述詞典,再根據(jù)復述詞典對問題和文檔進行復述替換。之后,用神經(jīng)網(wǎng)絡模型對問題和文檔進行建模,計算問題和文檔間的相關度作為文檔得分,并根據(jù)得分對文檔進行排序。
眾所周知,許多詞和短語有著相同或相近的含義。對于同一含義的詞,可能有著很多不同的表達形式。尤其是針對特殊領域的詞匯,由于大規(guī)模訓練語料的缺失,很難訓練具有針對性的詞向量。而使用在通用語料上預訓練的詞向量則很難將多個具有相同含義的領域詞聚類在一起。同時,許多領域詞可能根本不會出現(xiàn)在預訓練的詞向量中,屬于未登錄詞。因此針對同一領域詞的不同表達形式會對模型的建模造成很大的負面影響。為了減少這些負面影響,從數(shù)據(jù)集中收集具有相同或相近含義的領域詞對,手工構造了領域詞的復述詞典。復述詞典的規(guī)模較小,只有97條。表2展示了詞典中的一些樣例。
表2 復述樣例
根據(jù)復述詞典對問題和文檔中的句子進行復述替換。以“ABS是什么?”一句為例,如表2所示“ABS”是“防抱死制動系統(tǒng)”的復述,因此將其進行替換,得到新的問句“防抱死制動系統(tǒng)是什么?”。使用一個神經(jīng)網(wǎng)絡模型去計算問題和每篇文檔間的相關程度。模型由3部分組成,如圖1所示。先將問題和文檔的標題、摘要、內(nèi)容轉化為獨立的向量表示,接著用不同的編碼器將它們分別編碼為不同的特征向量,最后利用這些特征向量計算問題和文檔間的相關程度。
Fig.1 Model architecture圖1 模型架構
1.2.1 詞向量表示
由于領域詞和領域短語在不同的句子中可能會產(chǎn)生不同的分詞結果,而在向量的維度上,不同的分詞結果的向量組合可能會產(chǎn)生完全不同的語義。以“手剎指示燈亮”為例,如表3所示,其在不同的句子中可能會被分多種不同的組合。這些組合在向量維度上的語義不完全相同,有的甚至有著很大的差別。
同時,某些領域詞不存在于詞向量中,如表3中的“手剎指示燈”,屬于未登錄詞,無法使用詞向量對未登錄詞的語義進行建模。為了避免分詞和未登錄詞對模型帶來的影響,放棄了分詞以及詞級別的向量表示,轉而使用字符級別的向量表示。本文使用基于word2vec[17]算法在百度百科上預訓練得到的字符向量表示問題和文檔,對模型進行初始化。同時,在模型的訓練過程中持續(xù)更新字符級的向量,以保證其包含語義的有效性。
表3 同一領域短語的不同分詞結果
1.2.2 編碼器
任務中存在2種長度的文本:短文本和長文本。短文本一般在30個字以內(nèi),而長文本則通常多于50個字。將問題、文檔標題以及文檔摘要視為短文本,將文檔內(nèi)容視為長文本,并針對長短文本設計了兩種不同的編碼器。針對短文本,設計了一種基于CNN的編碼器,短文本中包含的信息一般都是關鍵信息,比如標題和問題中可能都包含相同的領域詞。CNN編碼器和傳統(tǒng)的n-gram模型相類似,可以很好地建模局部信息并對文本進行匹配。但由于CNN沒有遺忘機制,在對長文本建模時會抽取并存儲大量不重要的信息,這些信息會干擾模型的判斷。而針對長文本,希望通過在全局的視角下對文本建模,因此設計了一種基于Bi-LSTM的編碼器。由于遺忘機制的存在,Bi-LSTM可以很好地對長文本建模,并保留相對重要的信息,對長文本的核心語義進行建模。
如圖2所示,令xi為文本中第i個字符的向量表示,則一段長度為n的文本可以表示為x(1:n)=x1?x2?…?xn,其中?表示連接操作。
Fig.2 Architectures of the two encoders圖2兩種編碼器的架構
CNN編碼器結構如圖2(a)所示,包括卷積層、池化層和隱含層。在卷積層中,設計了k組過濾器{w1,w2,…,wk},每個過濾器的窗口大小為{d×h},其中d為字符向量的維度。過濾器wi每次從h個字符中抽取特征ci,j,其過程為:
ci,j=f(wix(j:j+h-1)+b),
(1)
其中b是偏移項,f是非線性函數(shù)。
通過卷積操作,過濾器wi生成一組特征向量ci=(ci,0,ci,1,…,ci,n),k組過濾器共生成k組特征向量c=(c0,c1,…,ck)。接著,將k組特征向量輸入到最大池化層,抽取每組特征中的最大值,得到文本的特征向量:
(2)
最后將文本的特征向量輸入到全連接層中,得到文本最終的向量表示。
Bi-LSTM編碼器的結構如圖2(b)所示。其隱含層狀態(tài)可以表示為:
(3)
1.2.3 相關度計算
經(jīng)過編碼器,得到了問題和文檔標題、摘要、內(nèi)容的向量表示(vq,vt,va,vc)。分別計算問題和其他3項間的余弦相似度:
st=cosine(vq,vt),
sa=cosine(vq,va),
sc=cosine(vq,vc).
(4)
基于這些余弦相似度計算問題和文檔間的相關度作為文檔的得分:
s=sigmoid(wtst+wasa+wcsc+b),
(5)
其中wt,wa和wc是相應的權重,b是偏移項。
在數(shù)據(jù)集中,每一個問題都有180個錯誤答案和1個正確答案。正負樣本的比例為180∶1。由于正負樣本數(shù)量的不均衡,模型無法很好地學習問題和正確答案之間的關系,傾向于將所有候選文檔標記為負例。為此,設計了2種訓練策略來改善這一問題。第1種是將模型轉化為基于Pairwise思想的排序模型。這種策略可以幫助模型更好地區(qū)分正例和負例,學習到問題和正例之間的關系。第2種是擴展正例,增大正例的數(shù)量使正例和負例的比例變?yōu)?∶1,這種方法可以間接地讓模型學習到問題和正例之間的聯(lián)系,從而改善正負例樣本不均衡的問題。
相關度計算模型可以看作是一個二分類模型。它的輸入是問題Q和文檔P的表示,輸出是問題和文檔間的相關程度。這里使用二元交叉熵函數(shù)作為損失函數(shù),若事件X表示文檔P是問題Q的答案,Pr(X=T)=p,則Pr(X=F)=1-p,則X的交叉熵為:
H(X)=Hb(p)=-(plog2(p)+(1-p)log2(1-p)).
(6)
這種方法計算了問題和文檔間的相關度,可以學習到問題和文檔間的內(nèi)在聯(lián)系,但無法很好地利用正例和負例之間的聯(lián)系和區(qū)別。為此嘗試將其轉化為基于Pairwise的排序模型,其訓練目標是使正確文檔的得分高于錯誤文檔,在學習到問題和文檔間內(nèi)在聯(lián)系的同時,還擴大了正例和負例之間的區(qū)別,利用了正負例之間的關聯(lián)信息。
Fig.3 Ranking model圖3 排序模型
圖3展示了排序模型的結構。其輸入是由問題Q、正確文檔R以及錯誤文檔W構成的三元組。將問題-文檔對(Q,R)(Q,R)和(Q,W)分別輸入到相關度計算模型中,得到Q和R、Q和W之間的相關度sR和sW。最后使用Hinge Loss替代二元交叉熵函數(shù):
hingeloss=max(0,m-sR+sW),
(7)
其中m是自定義的超參數(shù)。
當發(fā)現(xiàn)正負例不均衡這一問題時,直覺就是調整它們的比例。同時,當分析排序模型時,發(fā)現(xiàn)其輸入由問題-文檔對變成了問題-正確文檔-錯誤文檔的三元組。模型每次訓練均對正確文檔進行了1次訓練,對于同一個問題訓練了其正例180遍,其每個負例各1遍,也就相當于對于每個負例都復制了其對應的正例。因此,設計了正例擴展的訓練策略。該策略將仍然使用相關度計算模型,只需要對于每個問題都復制180份正例,使語料的正負例比例變?yōu)?∶1。由于更多的正例參與到了模型的訓練過程中,模型可以更好地學習到問題和文檔之間的聯(lián)系,不再傾向于將所有文檔標記為負例。
將奇瑞汽車的說明書作為文檔集進行實驗。實驗數(shù)據(jù)來源于真實用戶提問,并由多名相關專業(yè)人士進行標注,數(shù)據(jù)集共包含181篇文檔,用人工標注了3 000條問題作為訓練集,800條問題作為測試集。給定1個問題,從181篇文檔中找出最相關的文檔作為正例,其余的作為負例,目標是使正確答案得分最高,因此根據(jù)文檔的得分對所有文檔進行排序,并將準確率作為任務的評價指標,即只有排名第1的文檔是正確答案時模型的預測是正確的,其他情況均視為錯誤。
對于相關度計算模型和轉換得到的排序模型均使用相同的參數(shù)設置。在百度百科語料上使用word2vec算法訓練詞向量,向量的維度為50。字向量是詞向量的一部分。對于CNN編碼器,設置了500個過濾器,過濾器的大小為{2,50},全連接層的維度是200。對于Bi-LSTM編碼器,設置其每一時間節(jié)點的輸出維度為100。除此之外,在排序模型中將hinge loss中的參數(shù)m設置為0.5。最后,使用Adam[18]算法作為優(yōu)化算法。
首先,用實驗證明領域詞的復述替換和字符級向量的有效性。公平起見,詞向量和字向量在模型訓練時都會被更新。使用CNN作為短文本編碼器,Bi-LSTM作為長文本編碼器,使用正例擴展策略訓練模型。
表4 復述替換和向量表示的對比實驗
如表4所示,可以發(fā)現(xiàn)字向量的表現(xiàn)要優(yōu)于詞向量的表現(xiàn)。正如上文所說,不同的短語在不同的句子中有著不同的分詞結果,不同的分詞結果導致其詞向量的組合也不一致,這無疑會導致一定的語義偏差。以短語“指示燈亮”為例,其可能被分割為“指示”和“燈亮”,也可能被分割為“指示燈”和“亮”。很明顯這兩組分割有著不同的語義。因此使用詞向量,同一短語會有著不同的語義組合,導致模型判斷出錯。字向量的缺點在于一個字在不同的詞中會有不同的語義,使用字向量無法解決語義的歧義性問題。但由于語料是特定領域的語料,包含的詞的規(guī)模有限,因此該問題造成的影響相對較小,與其帶來的效果提升相比可以暫時忽略。
另外,無論使用詞向量或是字向量,領域詞的復述替換均有效提升了模型的準確率。無論在字符級還是詞級別,領域詞和其復述均有著不同的向量表示。雖然模型在訓練的過程中會將這些不同表示聚類在一起,但仍有可能出錯。所以使用復述詞典將領域詞所有不同的表示轉化為單一的表示,使模型可以更簡單地判斷出兩段文本是否相關。
表5 針對復述對“停車”和“關閉發(fā)動機”模型是否使用復述替換的對比樣例
表5展示了1個樣例?!瓣P閉發(fā)動機”和“停車”在語料中往往代表著幾乎相同的含義。在模型對“怎樣停車?”這一問題進行預測時,如果使用復述替換,則可以找到正確的文檔“關閉發(fā)動機”;而不使用復述替換時,則找到了錯誤的文檔“ISS啟停系統(tǒng)”。
接著,為了說明2種訓練策略是有效的,設計了另一組實驗。同樣使用CNN作為短文本編碼器,Bi-LSTM作為長文本編碼器。基礎訓練策略是只使用原始數(shù)據(jù)作為模型的輸入,既不擴展正例,也不將模型轉化為排序模型。實驗結果如表6所示。
從表6中可以看出,提出的兩種訓練策略均可以提升系統(tǒng)的準確率。而正例擴展策略的實驗結果要更優(yōu)于排序模型。通過分析實驗結果和模型結構發(fā)現(xiàn),與原始模型相比排序模型訓練相對困難,不易找到最優(yōu)參數(shù),無法得到最優(yōu)解。而另一種策略則更加直接簡單,同時由于訓練樣例數(shù)量的增多,尤其是正例樣本的數(shù)量增多,模型可以學到更多關于正例的信息,訓練也更加充分,并更容易學習到正例和負例之間的區(qū)別,獲取更優(yōu)的分類效果。因此最終選擇了正例擴展策略作為最終的訓練策略。
表6 不同訓練策略的對比實驗
最后對不同的編碼器作用于不同長度文本所產(chǎn)生的效果進行對比,結果見表7。對于所有的模型,均使用字向量、復述替換和正例擴展策略。
表7 編碼器對比實驗
如表7所示,在短文本上,CNN的效果要優(yōu)于Bi-LSTM。正如上文所說,問題、標題、摘要的語義信息比較精煉,在文本上則通常包含了最關鍵的詞匯,一旦關鍵詞得到了匹配,就可以判定文檔和問題是否相關。而CNN則擅于捕獲關鍵信息,因此在短文本上CNN的效果要更好。而在長文本上,實驗結果也驗證了本文方法的有效性。由于文檔內(nèi)容過長,需要從全局的角度計算其與問題的相關度。而Bi-LSTM則可以將長文本的語義信息熔煉到單一向量中,并忽略文本中不重要的信息,因此其效果要更好。
通過一系列實驗,系統(tǒng)最終選擇CNN作為短文本編碼器,Bi-LSTM作為長文本編碼器,使用復述替換和字向量作為補充,并使用正例擴展作為訓練策略。
最后,將模型同傳統(tǒng)的基于特征抽取的算法進行對比,使用了2-gram相似度、詞共現(xiàn)以及詞向量間的余弦相似度作為特征,對候選文檔進行排序。
表8 模型對比實驗
實驗結果如表8所示,可以看出,本文算法要明顯優(yōu)于基于傳統(tǒng)的特征抽取的檢索算法。
為了更好地幫助用戶使用汽車說明書,本文在汽車說明書領域設計了一個新的問答系統(tǒng)。為了解決該任務中的文檔表示問題設計了CNN和Bi-LSTM相結合的神經(jīng)網(wǎng)絡模型,而為了解決領域詞相關問題,結合了領域詞的復述詞典,并用字向量替代詞向量。同時為了解決數(shù)據(jù)不均衡問題,設計了2種訓練策略,并選擇其中的正例擴展策略來解決數(shù)據(jù)不均衡的問題。實驗結果也驗證了本文模型的有效性。但系統(tǒng)還有一定的不足,首先人工構建的復述詞典規(guī)模較小,無法覆蓋所有復述詞;其次系統(tǒng)無法很好地回答過于細節(jié)和需要常識進行推理的問題。在未來的工作中,將嘗試自動構建領域詞的復述詞典,并嘗試新的深度學習模型來捕獲更為細節(jié)的問題,并引入外部知識解決需要推理的問題。