揭開知識庫問答KB-QA的面紗5·深度學習上篇
內容速覽
- 向量建模方法的再思考
- Multi-Column卷積神經網路
- 實驗分析與總結
我們在揭開知識庫問答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。
向量建模方法的再思考
在上期的向量建模方法中,我們談到該方法本身存在一些缺陷。
首先是對於問題的向量化。對問題的向量化,傳統向量建模方法採用了類似詞袋模型的方式,相當於它並未考慮問題的語言順序(比如 「謝霆鋒的爸爸是誰?」 謝霆鋒是誰的爸爸? 這兩個問題用該方法得到的表達是一樣的,然而這兩個問題的意思顯然是不同的)。
對於這個缺陷,我們可以使用深度學習的模型對問題進行向量化,比如使用循環神經網路(Recurrent Nerual Networks, RNNs)、卷積神經網路(Counvoulutional Nerual Networks, CNNs )等模型提取問題特徵,這樣的方式考慮了語言的順序,並且提取特徵的能力也更加強大。
第二個缺陷是,在對答案進行向量化的時候,直接將答案的路徑(問題主題詞到答案實體的路徑)和上下文信息(答案實體周圍的知識庫子圖)一起作為答案特徵,通過multi-hot的方式對答案進行向量化。事實上,這樣的形式不利於模型區分答案的特徵(僅僅根據答案的multi-hot向量是不好區分哪些是答案的類型,哪些來自答案的上下文,哪些來自問題主題詞到答案實體的路徑)。
因此我們可以將問題的特徵表示拆解開,用三個向量分別表示答案的三個特徵,即答案路徑(Answer Path),答案上下文信息(Answer Context),答案類型(Answer Type),對於每一個答案特徵向量,都用一個卷積網路去對問題進行特徵提取,將提取出的分散式表達和該答案對應特徵向量的分散式表達進行點乘,這樣我們就可以得到一個包含三部分的得分函數:
其中代表問題,代表答案,代表問題經過卷積神經網路輸出的分散式表達,表示答案在對應特徵下的分散式表達。有了得分函數,我們就可以像向量建模方法一樣,通過定義margin-based ranking損失函數對模型參數進行訓練。
接下來,我們再看一下和是怎麼計算得到的。
Multi-Column卷積神經網路
對於問題的特徵提取,作者使用Multi-Column卷積神經網路,其結構實質上是共享word-embedding層的三個text-CNNs,text-CNNs模型在文本分類問題上取得了很好的效果。(這兩個概念是Deep Learning for NLP中的重要概念,我在這裡只作簡單介紹,不再展開深入討論,想深入了解的朋友可以點擊進入查看相應的論文)。
(如果對text-CNNs了解的朋友可以跳過下面這一段)
詞向量(Word-embedding):對於問題序列,對於其中的每一個單詞它對應的one-hot形式,我們可以通過word-embedding矩陣轉化為一個維的分散式向量(這裡的word-embedding矩陣是通過word2vec等pre-train方式初始化的),即。
卷積操作(Convolution):對於一個含個單詞的問題,我們可以得到一個的矩陣。如果我們把該矩陣想像成是一個圖片,那麼我們就可以像對圖片一樣進行卷積操作了。與圖片卷積操作的不同之處在於,每一個卷積核的大小(即卷積窗口)是,表示每次對個單詞的embedding進行卷積操作。
池化操作(Pooling):對於每一個卷積核的輸出(假設卷積核大小為,在的矩陣上進行卷積,那麼輸出是一個維的向量),通過對該向量進行max-pooling操作(即取最大值)可以得到一個標量,該標量將作為問題最終表達的某一維度(可以理解成一個卷積核負責對整個問題提取一個一維的特徵)。因此通過控制卷積核的數目我們可以控制最終輸出的維度,即個卷積核可以輸出一個維的最終表達(注意這裡卷積核大小可以不同,一般設置為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提到的同樣的方式構造損失函數和多任務學習來訓練模型參數。
實驗分析與總結
模型的參數這裡不再贅述。值得一提的是這篇文章採用的關於候選答案的尋找方式。和向量建模方法類似,也是尋找問題中主題詞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的面紗。
敬請期待。
系列相關文章:
揭開知識庫問答KB-QA的面紗1·簡介篇
揭開知識庫問答KB-QA的面紗2·語義解析篇
揭開知識庫問題KB-QA的面紗3·信息抽取篇
揭開知識庫問題KB-QA的面紗4·向量建模篇
推薦閱讀:
※REASONING ABOUT ENTAILMENT WITH NEURAL ATTENTION
※隆重介紹集智的吉祥物--集智娘
※word2vec和sentence2vec的真正差別是什麼?後者和簡單用詞向量累加有什麼差別?
※遷移學習在自然語言處理方面的應用?