編輯整理:姚順鵬 北京公瑾
出品平台:DataFunTalk
導讀:知識圖譜在現有的實際業務中存在着各種各樣的應用,問答是其中一個非常重要的應用,本文主要關注如何解決基于知識圖譜的複雜問題,該任務又稱為推理問答。
本文的介紹會圍繞下面四點展開:
--
01
背景介紹
1. KBQA
首先回顧下什麼是知識圖譜問答——KBQA。一個給定的知識圖譜,包含了許多信息,如實體、屬性以及實體之間的關系。基于一個已經構建好的知識圖譜,我們希望機器能夠通過知識圖譜來自動回答一些問題,如上圖中,提問“勒布朗·詹姆斯生日是什麼時候?”,我們希望機器能夠給出答案1984年12月30日。
2. 簡單問答和複雜問答
一個問題,根據它的複雜程度,可以分為簡單問題與複雜問題兩種類型。對于簡單問題來說,通常包含一個實體和一個關系,比如“中國的首都是哪裡?”,這個問題包含了實體“中國”和關系“首都”。而複雜問題需要更多的推理技能才能解決,主要包括多跳推理、計數、比較、邏輯運算這四類。
3. 簡單問答相關工作
簡答問答通常可以拆分為兩個任務,實體鍊接與關系分類。
對于問題“中國的首都是哪裡?”,通過問題的mention“中國”鍊接到知識圖譜中的實體“中國”。第二個任務是關系分類,尋找問題中提及的關系,問題中的謂語動詞是“首都”,我們通過一個分類任務,将關系聯系到知識圖譜上。通過這兩個任務得到了實體“中國”和關系“首都”,就能從知識圖譜中提取出答案“北京”。
4. 複雜問答相關工作
複雜問答涉及的相關工作會更加多樣,通常可以分為兩類:
對于一個給定的自然語言問題,通過某些模型或操作,轉換為邏輯語言,比如SPARQL是知識圖譜中常用的邏輯語言,将邏輯語言輸入到知識圖譜引擎中并得出答案。
依賴于神經網絡的表達能力,隐式地尋找問題的答案,比如Memory Networks在知識圖譜中的變種Key-Value Memory Networks,引入了Key-Value鍵值對,對于一個給定的查詢,維護一個查詢向量,基于查詢向量在Memory中進行多次的查詢并更新查詢向量,模拟複雜問題的多步推理。另一種檢索法是基于圖神經網絡,基于給定的問題,在圖神經網絡中進行特征更新,最後通過分類得到答案。
這兩類方法各有各的優勢和劣勢,語義解析法能夠處理各種類型的問題,比如前文提到的四種類型複雜問題,而且整個推理過程的可解釋性強,但構建推理過程的标注數據成本很高。對于信息檢索法來講,它隻需要問題與答案這樣的标注數據即可訓練模型,可以端到端地預測結果,但解決問題能力有限,中間過程不可解釋,所以一般使用中我們更傾向于語義解析法。
5. 關鍵問題
本文主要針對語義解析類方法探讨三個問題:
--
02
構造推理過程數據
首先考慮第一個問題,如何構造推理過程數據?
1. 推理過程描述語言——KoPL
SPARQL是一種非常經典的知識圖譜邏輯語言,能夠進行複雜問答的查詢,但它更偏向于對圖結構進行查詢,無法獲取查詢的中間過程,也不符合人類思維的過程,不易于理解。
因此我們提出一種推理過程描述語言:Knowledge-oriented Programming Language,簡稱KoPL。通過這種語言來幫助我們構造推理過程數據。舉個例子,對于問題“勒布朗·詹姆斯和他兒子誰更高?”,KoPL會将這個問題的推理過程分解為如上圖右側,首先在知識圖譜中找到實體“勒布朗·詹姆斯”,再通過關系“兒子”找到對應的實體,然後對這兩個實體進行一個比較操作,從中選取屬性“高度”更大的實體,最終得到問題的答案。
可以看出,KoPL拆解問題更加注重過程,符合人類思維,更容易理解。
KoPL是一種強類型語言,它包含7種知識類型、實體、實體概念,比如中國就是一個實體概念、實體屬性、實體之間的關系、屬性型三元組、關系型三元組,以及一種更加高階的修飾型知識。對于屬性型三元組或關系型三元組,存在一種新的針對三元組的知識,比如說“勒布朗·詹姆斯參加選秀,被某個隊選中”,而“被選中”這個事件的時間,就是一種高階的修飾型知識,它是用于修飾一個已有的三元組。KoPL支持以上7種知識類型,并且在表達過程中,KoPL對這些類型進行了顯式約束。
KoPL中包含了14個針對知識圖譜元素的操作,比如找到知識圖譜中某個實體或概念,根據屬性值作為過濾條件找到對應的實體,也包括了13個查詢操作,比如查詢某個實體的名字。
KoPL具有以下四點優勢:
2. 大規模知識庫問答數據集——KQA Pro
基于KoPL的基本操作與組合,我們能夠大規模地生成複雜問題,具體生成的策略有四個。第一個策略是模闆,比如針對比較類型問題定義這樣的模闆“<>和<>誰的<屬性>更<大/小>”,詢問兩個人的身高更高就可以套用這個模闆,我們可以對這樣的模闆填充各種實體和屬性得到不同的問題。第二個策略是采樣,根據第一個策略得到的模闆,我們在知識庫中進行采樣,然後對模闆中空缺的位置進行填空,得到不同的問題。第三個策略是組合,根據KoPL的基本操作,我們可以做各種各樣的排列組合得到不同的問題。第四個策略是遞歸,對于問題中已有的實體,我們對其進行遞歸拆解,增加問題的複雜度,比如将問題“勒布朗·詹姆斯和布朗尼·詹姆斯誰更高?”中的“布朗尼·詹姆斯”使用關系描述為“勒布朗·詹姆斯的兒子”,那麼問題就會變為“勒布朗·詹姆斯和勒布朗·詹姆斯的兒子誰更高?”,這樣問題的複雜度也就變高了。
基于這四種策略,我們可以生成大量多樣化的高複雜度問題。
最終每個樣例生成5個元素,由模闆得到的問題,回答問題使用的SPARQL,問題拆解的KoPL,10個候選答案以及标準答案。
通過問題生成,我們得到了大量的模闆問題以及問題對應的SPARQL, KoPL, 選項和标準答案。下一步對模闆問題衆包轉寫,在保持原意的前提下,轉寫得到更加流暢多樣的問題。最後對衆包轉寫的結果進行衆包評測,評價指标為是否保持問題的原意和轉寫問題的流暢性,我們會丢棄未保持原意的問題,比如轉寫二“勒布朗·詹姆斯的個子是不是比他兒子高?”,這個轉寫将問題的答案變為是或否。
最終我們得到了約12萬條五元組數據,将其命名為KQA Pro,是目前首個包含了自然語言、全知識類型、多種邏輯形式的大規模數據集。
3. 下一個問題
以上是我們探讨的第一個問題——如何構造大規模推理過程數據。在擁有領域一的推理過程數據之後,我們思考這些數據是否可以幫助其他領域學習推理過程?在這些領域裡,已經有了一些問題和答案,但缺乏推理過程,比如是否可以使用金融領域的推理過程數據幫助醫學領域的推理過程學習?
--
03
跨領域遷移
這是我們分享的第二個問題,我們希望将已有的推理過程遷移到其他領域中。
1. 跨領域遷移
考慮在KoPL推理過程的跨領域遷移,我們将推理過程劃分為兩個部分:
通過将推理過程分解這樣兩個部分之後,我們發現了骨架和參數的特點:
2. 骨架解析器
對于骨架部分的遷移,我們設計了一個帶有注意力機制的Seq2Seq骨架解析器,選用BERT作為編碼器,通過注意力機制選取BERT的編碼結果,再輸入到GRU解碼器中,将骨架中的操作逐步解碼出來。
3. 參數解析器
對于參數解析器,我們采取了不同的策略。由于參數與知識圖譜是強相關的,所以我們需要對知識圖譜中的元素也進行編碼,這裡使用BERT作為知識圖譜元素的編碼器。比如上圖中,骨架解碼器解碼得到一個關于Concept的操作,我們将這個解碼得到的特征向量與知識圖譜中使用BERT編碼的概念特征向量作相似度計算,選取相似度最高的概念。上圖中相似度最高的是公司,所以最終選擇公司作為參數。
4. 訓練方法
我們将模型訓練方法分為兩個階段:
5. 實驗設定
下面介紹一下我們的實驗設定:
WebQuestionSP和ComplexWebQuestions,使用Freebase構造的知識圖譜,它們的訓練數據分别為4737條和34689條。
上圖右側展示了兩個知識圖譜之間的差距,Source表示Wikidata的子集,Target表示Freebase。
6. 實驗結果
我們在WebQSP和CWQ數據集上做了一些實驗,在我們之前的SOTA方法能夠做到74.0和44.0的準确率,而我們的完整方法能夠做到76.5和58.7的準确率。從消融實驗中可以看出,兩個階段對于結果來說都是非常重要的。
7. 下一個問題
假如我們現在沒有推理過程數據,隻有問題和答案的數據,能不能直接學習出推理過程?
--
04
隐式學習推理過程
這是我們分享的第三個話題,如何隐式地學習推理過程。
1. TransferNet
在隐式學習推理過程中,我們将複雜問題類型進行約束,僅考慮多跳類問題,通過實體之間的多跳關系進行回答,比如問題“xx公司的董事長投資了哪家公司”,通過主題實體“xx公司”的董事長關系找到張三,再通過張三的投資關系找到答案實體“yy公司”,中間過程的關系和實體稱為推理路徑。我們的目标是自動地把推理路徑準确地學習出來。
我們的方法是通過向量矩陣乘法來建模實體轉移,方法中有兩個核心概念:
激活向量表示的是每一步中關注的實體,比如問題“xx公司的董事長投資了哪家公司”,在回答問題的推理過程中,我們分别關注到三個實體,分别是“xx公司”、“張三”和“yy公司”。它的維度為實體的數量,關注到哪個實體,對應位置的權重被置為1,其它實體置為0。
激活矩陣表示的是每一步中關注的關系,比如我們關注問題“xx公司的董事長投資了哪家公司”中的兩個關系“董事長”和“投資”。我們通過一個矩陣來表示關系,對于知識圖譜來說有N個節點,對這N個節點考慮它們兩兩之間的關系,得到一個NxN的矩陣。我們的激活矩陣對應到這個NxN的矩陣上,相應關系上的元素置為1,其它位置置為0。
激活向量和激活矩陣用a和W表示,因為這是一個多跳過程,使用上标t來表示進行到哪一步,每一步我們關注的實體和關系都是不一樣的。方法的核心是建模實體通過關系轉移到另一實體,我們通過at-1乘以Wt的矩陣乘法來實現,上圖給出一個直觀的例子。
我們可以通過鍊式乘法來進行多跳轉移,一開始主題實體是a0,然後通過鍊式乘法構造不同的激活矩陣W,來一步一步建模多跳問題的轉移。在每一步中通過注意力機制關注問題的不同部分,激活對應關系。如上圖下側,在第0步,找到問題中的主題實體“xx公司”,構造激活向量a0,在第1步中對問題做一個注意力機制,找到需要關注的關系“董事長”,然後将圖譜中“董事長”對應的邊做矩陣激活,得到W1,通過a0乘以W1得到激活向量a1這個實體,在第2步關注新的關系“投資”,将對應激活的邊W2做矩陣乘法得到a2,最終得到實體答案“yy公司”。
上圖展示了整個推理過程,我們的方法最顯著的優勢是推理過程完全可導,訓練模型時僅需要對最終預測的實體施加loss,即在進行了第T步轉移之後計算損失和優化,即可自動學出整個推理過程。
2. 實驗結果
最後簡單介紹我們三個數據集上做的實驗,在針對電影領域的多跳數據集MetaQA,我們首次實現了100%準确率,比如三跳問題“xx電影的導演執導的影片中主角是誰?”,從“電影”跳到“導演”,再跳到“影片”,最後跳到“主角”,對于這樣的問題,我們的模型實現了100%的準确率。
--
05
成果與資源
--
06
問答
Q:非鍊式查詢如何解碼?
A:非鍊式查詢一般是二叉樹的形式,我們可以通過前序或中序遍曆的方法将其轉變為鍊式查詢。
Q:KoPL是否有一些序列化的表示方法?比如文本到查詢圖是如何生成的?
A:KoPL是一種過程化的語言,基本上不存在圖結構。它主要有序列化和樹形兩種結構,樹結構主要是二叉樹。如果是SPARQL這種圖結構,可以采用深度優先或廣度優先方法來進行遍曆。
Q:KBQA中需要對每個問題進行複雜度識别麼?系統是通過實體加規則的方法進行判斷的麼?
A:這個問題不需要進行區分,如果複雜問題都能夠回答的話,那麼簡單問題也能夠回答得很好。簡單問題可以看做多跳推理的特例,它是一跳的推理。如果要進行區分的話,可以直接訓練一個分類模型。
Q:KoPL能夠在Neo4J上進行推理?
A:目前來說是不行的,KoPL是運行在我們自研的引擎上。但KoPL是可以跟其它語言作轉換,這是我們目前正在進行的工作,通過中間語言來将KoPL轉換為其它查詢語言。
今天的分享就到這裡,謝謝大家。
有話要說...