自 2015 年開始,深度學習用於 KB-QA 的方法取得了很好的效果,並逐漸成為了 KB-QA 的主流方法。也湧現出了一批使用深度學習提升傳統的語義解析、資訊抽取和向量建模方法的優秀論文。本期,我們先以深度學習提升向量建模方法為例,作為深度學習篇的上篇,為大家進一步揭開知識庫問答的面紗。
我們在揭開知識庫問答KB-QA的面紗4·向量建模篇介紹了 KB-QA 中介紹了傳統方法之一的向量建模(Vector Modeling)方法,該方法具有操作性強,不需要任何手工的特徵等優點。
今天,我們將介紹一篇利用深度學習對該向量建模方法進行提升的論文,來自北京大學和 Microsoft 研究院的 Question Answering over Freebase with Multi-Column Convolutional Neural Networks(文章發表於 2015 年的 ACL 會議)。
該文章使用了卷積神經網路的一種變體(作者稱為 multi-column)從三個方面(答案路徑 Answer Path,答案上下文資訊 Answer Context,答案的型別 Answer Type)對問題和答案的分散式表達進行學習,使得該分散式表達相比之前的向量建模方法能夠包含更多有效的特徵。該方法在 WebQuestion 資料集上測試,取得了 40.8 的 F1-score。
1. 向量建模方法的再思考
在上期的向量建模方法中,我們談到該方法本身存在一些缺陷。
首先是對於問題的向量化。對問題的向量化,傳統向量建模方法採用了類似詞袋模型的方式,相當於它並未考慮問題的語言順序(比如 “謝霆鋒的爸爸是誰?” “謝霆鋒是誰的爸爸?” 這兩個問題用該方法得到的表達是一樣的,然而這兩個問題的意思顯然是不同的)。
對於這個缺陷,我們可以使用深度學習的模型對問題進行向量化,比如使用迴圈神經網路(Recurrent Nerual Networks, RNNs)、卷積神經網路(Counvoulutional Nerual Networks, CNNs )等模型提取問題特徵,這樣的方式考慮了語言的順序,並且提取特徵的能力也更加強大。
第二個缺陷是,在對答案進行向量化的時候,直接將答案的路徑(問題主題詞到答案實體的路徑)和上下文資訊(答案實體周圍的知識庫子圖)一起作為答案特徵,透過 multi-hot 的方式對答案進行向量化。事實上,這樣的形式不利於模型區分答案的特徵(僅僅根據答案的 multi-hot 向量是不好區分哪些是答案的型別,哪些來自答案的上下文,哪些來自問題主題詞到答案實體的路徑)。
因此我們可以將問題的特徵表示拆解開,用三個向量分別表示答案的三個特徵,即答案路徑(Answer Path),答案上下文資訊(Answer Context),答案型別(Answer Type),對於每一個答案特徵向量,都用一個卷積網路去對問題進行特徵提取,將提取出的分散式表達和該答案對應特徵向量的分散式表達進行點乘,這樣我們就可以得到一個包含三部分的得分函式:
其中 q 代表問題,a 代表答案, 代表問題經過卷積神經網路輸出的分散式表達, 表示答案在對應特徵下的分散式表達。
有了得分函式,我們就可以像向量建模方法一樣,透過定義 margin-based ranking 損失函式對模型引數進行訓練。
接下來,我們再看一下和是怎麼計算得到的。
2. Multi-Column 卷積神經網路
對於問題的特徵提取,作者使用 Multi-Column 卷積神經網路,其結構實質上是共享word-embedding 層的三個 text-CNNs,text-CNNs 模型在文字分類問題上取得了很好的效果。(這兩個概念是 Deep Learning for NLP 中的重要概念,我在這裡只作簡單介紹,不再展開深入討論,想深入瞭解的朋友可以檢視相應的論文)。
詞向量(Word-embedding):對於問題序列 ,對於其中的每一個單詞 它對應的 one-hot 形式 ,我們可以透過 word-embedding 矩陣 轉化為一個 d 維的分散式向量(這裡的 word-embedding 矩陣是透過 word2vec 等 pre-train 方式初始化的),即 。
卷積操作(Convolution):對於一個含 n 個單詞的問題 q,我們可以得到一個 n*d 的矩陣。如果我們把該矩陣想象成是一個圖片,那麼我們就可以像對圖片一樣進行卷積操作了。與圖片卷積操作的不同之處在於,每一個卷積核的大小(即卷積視窗)是 m*d,表示每次對 m 個單詞的 embedding 進行卷積操作。
池化操作(Pooling):對於每一個卷積核的輸出(假設卷積核大小為 m,在 n*d 的矩陣上進行卷積,那麼輸出是一個 n-m+1 維的向量),透過對該向量進行 max-pooling 操作(即取最大值)可以得到一個標量,該標量將作為問題最終表達 的某一維度(可以理解成一個卷積核負責對整個問題提取一個一維的特徵)。因此透過控制卷積核的數目我們可以控制最終輸出的維度,即個卷積核可以輸出一個 k 維的最終表達(注意這裡卷積核大小可以不同,一般設定為 2,3,4)。
上述流程可以用下面這個圖片來表達,注意,對於不同長度的問題,會透過補零(padding)操作將所有問題的長度限定到固定長度。
這樣,我們透過三個 text-CNNs,在共享 word-embedding 的情況下,就可以得到 , 和 。(事實上,在這篇文章中所使用的卷積操作,對於每一個 column 只採用了一個卷積核,一個卷積核對一個卷積視窗的卷積結果並非一個值而是一個向量,max-pooling 作用在每一個卷積視窗的卷積結果上,具體方式可以參看後面的圖。個人認為這樣的卷積方式減少了引數,顯得特徵提取更加粗粒度,效果很可能不如 text-CNNs)。
接下來,我們用三個向量來分別表示答案的三種特徵。
答案路徑(Answer Path):從問題中的主題詞到答案在知識庫中形成一條路徑,我們記錄該路徑上的每一個實體關係,可以透過 multi-hot 的形式 來進行表示,答案路徑的分散式表達 可以表示為 ,這裡由於路徑的長度不確定,所以使用一範來做一個歸一化 normalization。
答案上下文資訊(Answer Context):我們將答案實體對應 1 跳(hop)範圍內的實體關係和實體作為答案實體的上下文資訊。透過同樣的方式我們可以得到答案上下文資訊的分散式表達 。
答案型別(Answer Type):在資訊抽取中我們提到,答案的型別是一個很重要的特徵。型別是一種特殊的實體關係,比如時間 2009-12-17 的型別是 datetime,James Cameron 的型別是 people.person 和 film.producer。 在實際操作中,可以在freebase裡透過實體關係common.topic.notable.types 來查詢實體對應的所有型別。透過同樣的方式,我們可以得到相應的分散式表達 。注意,如果候選答案是一個值,那麼就用該值的型別(string/float/datetime)作為答案型別,比如答案是 2009-12-17,那麼型別就是 string。
至此,我們得到了包含個三部分的得分函式:
整個流程如下圖所示:
圖中方塊帶紅色斜線的為主題詞,紅色箭頭表示路徑,綠色橢圓表示答案型別,藍色虛線橢圓表示上下文資訊範圍。
對於問題“when did Avatar release in UK”和它的答案 2009-12-17,我們透過 multi-column 卷積神經網路提取三種問題的分散式表達,再透過答案的路徑、上下文資訊和型別得到答案相應的三種分散式表達,透過分別點乘再求和的方式得到最終的答案-問題對得分。
我們可以透過我在揭開知識庫問答KB-QA的面紗4·向量建模篇介紹了 KB-QA 提到的同樣的方式構造損失函式和多工學習來訓練模型引數。
3. 實驗分析與總結
模型的引數這裡不再贅述。值得一提的是這篇文章採用的關於候選答案的尋找方式。和向量建模方法類似,也是尋找問題中主題詞 n 跳範圍內(一般取兩跳)的實體作為候選答案集合。然而對於有些問題,其候選答案集合很大,因此我們採取一種啟發式方法,如果同一路徑候選答案數超過 200,則隨機選擇 200 個作為候選。如果某個候選答案得分最高,那麼我們把它所在的答案路徑中的所有其他節點(不在 200 個候選集合的節點)也計算得分,選出得分最高的作為最終答案。
實驗依舊是在 benchmark——WebQuestion 上進行,取得了 40.8 的 F1-score,這個效能擊敗了幾乎當時所有的傳統方法。並且我個人認為如果引入現在的一些深度學習技巧(諸如 batch normalization、Adam 等)並且加大模型的引數數量,改進 word-embedding 預訓練等,效果還有上升的空間。我相信該方法如果面對更大規模的資料集會比傳統方法取得更好的效果。
由於這篇文章考慮了答案的三個因素(路徑、上下文、型別),為了探究哪個因素對最終效果影響最大。作者透過測試 在得分函式中去除某一因素、只使用 single column、不進行多工訓練、只使用 1 hop 範圍作為候選答案(該順序對應下表的順序)等情況下的模型效能,來對模型進行分析。
那麼你猜猜對於答案的路徑、上下文、型別這三個因素,去除哪個因素之後對效能影響最大呢?實驗結果如下表:
其中 w/o 表示 without,可以看出答案的路徑對效果影響最大(問題主題詞到答案實體的路徑其實相當於問題到答案的推理過程),其次是答案的型別,影響最小的是答案的上下文資訊(仔細想想,其實答案實體的上下文資訊很多對尋找該問題的答案沒有幫助,比如詢問奧巴馬的出生地,那麼奧巴馬的其他很多資訊如社會關係、職位等等對答案沒有幫助,相當於噪音)。
分散式表達,雖然沒有傳統的資訊抽取和語義解析那麼具有解釋性,但是,我們卻可以透過衡量分散式表達的餘弦(Cosine)距離和透過得分函式來觀察到一些可解釋性。為此,作者還進行了兩個實驗。
首先,我們想知道對於一個問題,我們的模型最關注這個問題的哪個單詞,即顯著性單詞檢測(Salient words detection) 。我們可以進行這樣的實驗,要檢測問題中的某一個單詞的顯著性,我們可以將該單詞替換為某些停頓詞(如 to is a 等),計算替換了單詞之後的表達 ,再計算該表達和原始表達的歐式距離(可以多替換幾種停頓詞取平均距離)作為顯著性得分,這裡給出了一些例子:
我們可以看出來,問題詞(wh-)、問題詞相關的名詞和動詞都對找出最終答案有重要影響。
我們也可以透過問題 表達之間的 cosine 距離來尋找相似的問題,如下表:
我們透過計算問題(字型加粗)的表達,透過 cosine 距離尋找最近的問題表達所對應的問題,可以看出這些問題在語義上還是很相似的。如相同語義“who found/own/start *”和“who be the owner of *”的距離很接近。
最後,作者也列舉了一些錯誤分析(透過對錯誤情況進行分析,對我們提出改進的方法很有幫助),錯誤主要有以下三種情況:
候選答案生成:有些問題的主題詞是難以正確提取出來的,比如縮寫詞和表達不全,如問題“where did jfk and his wife live” ,很難將 jfk 這個縮寫詞對應到 John F. Kennedy 這個人名上,這樣會導致我們無法得到正確的候選答案集合。要解決這種情況,可能需要對問題進行一些預處理。
問題歧義:對於資料集中有些有歧義的問題,難以獲得和正確答案相應的關係,如問題“who is aidan quinn”,答案是演員,我們很難透過該問題 who is 推斷出和職業相關。這種情況該怎麼辦呢?
時序敏感(Time-Aware)問題:對於問題中帶有 first / second 這種與時間順序相關的詞語,如“who is johnny cash’s first wife” ,答案可能給出的是 second wife 的名字(模型只關注到了 wife 而忽略了 first 的含義,並沒有進行額外的推理)。對於這種情況,可能需要定義專門(ad-hoc)的操作,注意的是,這一點是該類方法相比語義解析方法的一個缺點。
那麼,下一期,我們就將介紹深度學習對語義解析方法的提升,我們將以 Micorsoft ACL 2015 年的 Outstanding paper 為例,為大家帶來揭開知識庫問答 KB-QA 的面紗 6·深度學習中篇,進一步揭開 KB-QA 的面紗。