傅 健
(復旦大學計算機學院 上海 200433)
語義匹配是自然語言處理中非常重要的一個任務。它旨在將多個句子進行建模并計算它們的相似性或相關度,是許多具體應用中非常中心的環節,包括自動問答[1]、答案句子選擇[2]、信息檢索、釋義識別和文本蘊涵[3-4]等。
在自動問答(Question Answering)任務中,對自然語句的建模和理解是非?;竞椭匾?,其難點通常在于自然語句由于時序和層次關系所帶來的復雜結構。在許多神經網絡模型中,我們可以用長短時記憶網絡LSTM[5](Long Short-Term Memory),一種循環神經網絡RNN的改進版本,亦或者是本文使用的卷積神經網絡CNN[6](Convolutional Neural Network),去對句子和句對作建模。此外,通常也會使用雙向LSTM[7]。CNN對局部的計算選擇(local selecting)能力[8],使得它擁有提取輸入的有效特征和抽象特征。同時考慮到其便于修改的優點[9-10],所以本文選擇使用CNN去做句子建模。
一個好的句子匹配算法,除了需要對自然語句的內部結構進行建模之外,還需要考慮它們之間的交互。我們可以利用這些句對之間豐富的匹配模式信息,來獲得更好的匹配得分。所以,在基本的如ARC-I[11]這樣的句子匹配模型的基礎上,提出一種將兩個句子進行詞和詞的對齊的方法(如ARC-II[11])。除了對齊和共同使用這些句對之外,我們還可以通過相似度匹配[12]達到這樣的目的。具體地,我們計算出一個相似度單元,并代入到后續的計算中去。這里需要補充說明的是,對于相似度的計算,可以放在神經網絡的上游,也可以放在下游,亦或者上下游同時計算[13]。
在上述基礎上,我們也可以增加一些無需使用外部知識的特征,從而配合神經網絡,進一步提高任務的表現(見實驗),例如TF-IDF、重疊詞指示器[2]、帶逆文本頻率指數加權(IDF-weighted)的重疊詞特征等。
綜上所述,我們提出應用了基于卷積深度神經網絡的語義匹配模型,不僅通過多層的卷積和池化,利用了句子各自內部獨立的結構信息,而且能夠捕捉每一對問題和答案之間豐富的模式信息。本文還將神經網絡模型應用在了基于文檔的中文自動問答任務(NLPCC DBQA Task)上,取得了不錯的效果,并且能夠配合額外的詞重疊等構建的無外部知識特征進一步提升效果。
受許多卷積網絡模型的啟發[9],本文基于卷積的句子模型ConvNet如圖1所示,其目的是對每一對問題query和文檔document都能學習出有效的中間特征表示,并用于后續的語義匹配。模型將輸入的句子序列,在詞嵌入處理之后,再用多層(或一層)卷積層和最大池化層進行信息提取,最終得到一個定長的向量表示,并以此作為特征表示。需要額外說明的是,卷積時可以使用多個過濾器,其數量作為超參進行調節。

圖1 基于卷積的句子模型結構,將輸入句子映射為 中間的特征表示
我們的句子模型按順序由詞嵌入層、卷積層、非線性層和最大池化層組成,以下將依次對這4個神經網絡層作詳細介紹。
詞嵌入層的目的是將原先輸入的字或詞(可以分詞的話)映射到一定維度的表示空間中,從而賦予字或詞更豐富的上下文信息或同級信息。常用的詞嵌入方法主要為兩種,一是word2vec[14],基于字或詞和上下文周邊文本的相互預測;二是GloVe,基于字或詞在所有文本中前后出現次數。總而言之,詞嵌入都利用的是字或詞在上下文文本中豐富的統計信息。具體地,在本文的自動問答任務中,我們首先對問題和答案這兩個輸入序列先作中文分詞之后(利用分詞工具,如jieba等),再用word2vec對序列中的每個詞作分布式表示,詳細步驟如下:
首先,整個神經網絡的輸入看作一串詞的序列:[w1,w2,…,wl],且每個詞均來自詞表V。每個詞會依據預先訓練好的word2vec詞嵌入,從已有的嵌入矩陣W∈R|v|×d中獲得對應的分布式向量w∈Rd。
除了詞嵌入表示之外,我們還對句子中的每一個詞增加了重疊指示器特征,表示當前詞是否在另一個句子中出現。這將作為額外的輸入,并參與后續匹配打分的計算(見圖1模型結構)。最終,我們對問題和文檔,都將分別得到句子矩陣S∈RL×(d+1)。
卷積層即對當前的輸入以卷積作為基本操作,進行進一步處理。與全連接(fully connected)網絡相比,它們的計算方式相同,只不過卷積的輸入為其中的一段定長的窗口大小。通常卷積神經網絡的輸入為圖片,具體地,圖片輸入可看作是長度、寬度、深度(depth或channel)的三圍張量,卷積時則用一個或多個擁有長度、寬度的filter在圖片的每個channel上計算。那么應用到自然語言處理任務時,我們可以把輸入的channel看作1,而卷積時filter的size設定為詞的embedding。前面介紹過,卷積的作用可以有效提取局部特征,進一步地,我們可以設置多個卷積窗口大小,從而在局部特征外,得到盡可能更好的全局特征。下面進行詳細步驟介紹。
卷積層的目標是提取特征或模式信息,具體地,在給定輸入(詞級別)序列qemb=rw1,rw2,…,rwl之后,我們定義矩陣Zq=[z1,z2,…,zl],每一列包含一個向量zi∈Rdws,代表序列中ws的詞的嵌入表示。在我們對問題q,用c個(窗口大小不同的)filter進行卷積操作后,得到:
Q=WZq+b
(1)
式中:Q∈Rl×c中的每一行m包含了以q中的第m個詞為中心的文本窗口提取出來的特征,W和b為神經網絡訓練中待學習的參數。需要說明的是,卷積過濾器的數量為c,以及詞級別文本窗口大小ws均為超參,需要進行手動選擇。
接著,我們用相同的方式計算出答案a的輸出矩陣A。在這里,神經網絡可以選擇共享參數或相互獨立。
為了使得神經網絡能夠學習到非線性決策邊際,從而更好地提取出特征的表示,我們需要在線性的卷積層之后增加一層非線性激活函數α()。需要說明的是,這將會應用在之前卷積處理之后結果的每一位元素上。通常,非線性激活函數有多種選擇,如relu(常見于圖像任務重)、sigmoid、tanh等。在本文中,非線性激活函數默認使用的是雙曲正切函數tanh,它會將原先的輸出重新映射到[-1,1]之間。
在過了卷積層與非線性函數計算之后,我們還需要池化層來將信息進行融合,并且同時將表示進行壓縮。在卷積中提取特征時,通常采用最大池化或者平均池化。在本文中,我們選擇使用最大池化,即在每一個filter中都選取最大值作為輸出,以便為后續的語義匹配提供有效信息。
整個句對匹配模型的結構如圖2所示。我們基于卷積的句子模型(前面所述),能夠學習將輸入的句對各自表示為中間向量表示,進而我們可以繼續利用它們去計算相似度。與傳統做法類似[8,15]:在我們獲得兩個句子的矩陣表示之后,將其作為一個多層感知器[16](multi-layer perceptron,MLP)的輸入,并得到(分類或分數)輸出。

圖2 整體卷積深度神經網絡結構圖,用以語義匹配任務
但是,這里與之前工作不同的是,我們還可以進一步地提高兩個句子之間的交互性,例如計算額外的問題q與文檔d的相似度得分、用attention方法對原來的結果進行重新權重上的表示等。
接下來,我們將描述如何使用之前得到的中間特征表示,計算出相似度得分(或稱為相似度單元),以及介紹其余的神經網絡層。
在得到輸入句對各自的中間向量表示之后,最常見的做法是將其進行拼接操作后作為輸入一起帶到后續的網絡層(如多層感知器)中計算。但這種做法的一個弊端在于沒有充分地提取出它們作為匹配的豐富模式信息,故需要加上交互層,用以將句對間的匹配信息表示出來。具體地,我們可以選擇將句對作為輸入,額外計算一些表征相似度的中間結果,并一同帶入后續網絡層。下面進行詳細的步驟介紹。
在我們用基于卷積的神經網絡句子模型分別對問題query和文檔document進行計算后,得到了中間向量的特征表示xq和xd。通常xq和xd均為二維張量,第二維維度d相同(也可以不同,不同時需改變后面的參數矩陣大小)。據此,我們可以進一步計算句對的相似度得分(或稱為相似度單元)。借鑒已有的方法[17],我們可以通過如下方式計算出相似度單元:
式中:M∈Rd×d是一個相似度矩陣,作為參數,隨著訓練進行優化、更新。需要說明的是,在這里可以選擇同時計算一個或多個這樣的相似度單元(相應地,會用到一個或多個參數矩陣M),從而得到提取到更多的有效信息,帶入后續的計算中。
MLP是一個常見的基本的網絡結構。它基于前向反饋網絡,含有多層網絡層,包括輸入層、中間的隱層、輸出層等,每一層均為全連接層,即下一層的輸出都依賴上一層的所有神經元。整個多層感知器,最終會得到一個分類或分數輸出,之后根據選擇的目標函數進行反向傳播,更新前面的參數以使得相應的目標函數降低(向梯度下降的方向)。在本文中,對于自動問答任務,我們簡單地將其看作是一個0-1(二)分類任務,即正確答案看作1,錯誤答案看作0(多個正確語句的前后順序不影響評價指標的高低)。
具體地,本文使用的MLP除了輸入層外,還由一層隱藏層,即一層線性全連接層,和一個邏輯回歸組成(softmax層),最終得到一個二值分類的輸出結果。隱藏層的計算如下所示:
f(whx+b)
(3)
式中:wh和b為隱藏層的參數向量,wh為隱層的權重向量,b為激活閾值。另外,f是一個非線性激活函數(默認為tanh函數)。
接下里類似地進行一層輸出層的計算,但在線性計算后無需跟一個非線性函數。而是對計算的結果進行邏輯回歸計算(以得到二值分類),softmax函數會計算出所有可能標簽(是否為正確答案)的概率分布,如下所示:
p(y=j|x)=eyj/∑eyk
(4)
在得到本文自動問答任務中是否為正確答案的概率分布表示之后,需要為模型定義一個訓練目標函數或者損失函數。根據具體任務的不同,損失函數可以選擇交叉熵損失函數、均方差誤差損失函數、最大邊際損失、其他距離衡量等。而在選取最終的目標函數之后,我們模型的所有網絡層的參數才能進行相應的更新,如使用批量的隨機梯度下降(SGD)等優化方法,最終使得整個任務的performance提高。
在本文的自動問答任務中,我們將輸出看作了0-1二值分類任務,并選擇隨機梯度下降進行模型參數更新。具體地,整個模型的訓練目標為降低交叉熵損失函數為:
(y,o)=-(1/N)∑ynlogonn∈N
(5)
式中:y為正確標簽答案,o為預測得分,N為類別(兩類)。模型對每一輪輸入的batch-size的數據進行如上更新,并進行多輪迭代,最終以early-stop的結果得到最優的模型。
接下來,我們討論將上述基于卷積的語義匹配模型應用到具體的自然語言處理任務中去,并加以改進。數據集上,我們選取了中文的自動問答任務,其數據集來源于NLPCC的DBQA任務(document-based QA Task)。配合其他如詞重疊等特征,模型取得了實際有效的結果。
我們在開放域上的基于文檔的中文自動問答數據集上進行了實驗,數據集如表1所示。其中,dbqa-train和dbqa-test的QA-pairs個數分別為181 882和122 531。經統計,在中文分詞后,大多數問題語句的長度在不到20個詞左右,而大多數答案語句的長度在不到40個詞左右。

表1 NLPCC DBQA任務數據集
關于任務的評價指標,考慮到DBQA任務實際上定義為一個排序任務,因此我們選擇使用更合適的Mean Reciprocal Rank(MRR)、Mean Average Precision(MAP)這兩種常見的搜索排序指標進行評價,而不采用正確率。其中,以MRR指標結果為主。
在詞嵌入上,我們用word2vec方法在中文wiki百科語料上訓練了word embedding,其中包含了超過230 000的中文文章。并且值得一提的是,預訓練的word embedding對任務效果具有很大的幫助。
實驗結果具體如表2所示。整個表格依次展示了:(1) 基于CNN的神經網絡基準線的效果;(2) 額外增加的計算相似度單元所帶來的效果提升;(3) 額外增加特征(詞重疊特征)所帶來的效果體征;(4) 基于模型并配合額外特征(詞重疊特征)所共同帶來的效果提升??梢钥吹?,相似度單元和詞重疊特征都分別起到了很大的作用。并且,基于卷積的語義匹配模型可以與額外的特征共同配合,得到更好的任務效果。需要說明的是,這幾種神經網絡的超參并未做過多的調整,后續還有待做更多的探究。

表2 NLPCC DBQA數據集上的實驗結果
在本文中,我們提出并運用了適用于語義匹配的基于卷積的深度神經網絡結構,它不僅考慮了對每個獨立句子作層次化建模,同時還提取出它們的匹配模式特征。并且,在開放域上的基于文檔的中文自動問答任務中,配合詞重疊等其他特征,本模型取得了實際有效的結果。后續仍有待作進一步的研究。