當前位置:首頁 > 科技 > 正文

華為史佳欣:基于知識圖譜的複雜問題推理問答

編輯整理:姚順鵬 北京公瑾

出品平台:DataFunTalk


導讀:知識圖譜在現有的實際業務中存在着各種各樣的應用,問答是其中一個非常重要的應用,本文主要關注如何解決基于知識圖譜的複雜問題,該任務又稱為推理問答。

本文的介紹會圍繞下面四點展開:

  • KBQA背景介紹
  • 構造推理過程數據
  • 跨領域遷移
  • 隐式學習推理過程

--

01

背景介紹

1. KBQA

首先回顧下什麼是知識圖譜問答——KBQA。一個給定的知識圖譜,包含了許多信息,如實體、屬性以及實體之間的關系。基于一個已經構建好的知識圖譜,我們希望機器能夠通過知識圖譜來自動回答一些問題,如上圖中,提問“勒布朗·詹姆斯生日是什麼時候?”,我們希望機器能夠給出答案1984年12月30日。

2. 簡單問答和複雜問答

一個問題,根據它的複雜程度,可以分為簡單問題與複雜問題兩種類型。對于簡單問題來說,通常包含一個實體和一個關系,比如“中國的首都是哪裡?”,這個問題包含了實體“中國”和關系“首都”。而複雜問題需要更多的推理技能才能解決,主要包括多跳推理、計數、比較、邏輯運算這四類。

  • 多跳推理(“XX公司的CEO有哪些朋友?”),從“XX公司”找到對應CEO的一跳,再從CEO找到對應朋友關系的第二跳,這樣形成一個多跳推理的問題。
  • 計數類型,統計滿足某類條件或關系的實體的數量,比如“有多少家公司持有XX公司的股票?”。
  • 比較類型,通過比較實體的某個屬性,篩選得到符合條件的一個實體,比如“A股市場2021年漲幅最高的是哪家公司?”。
  • 邏輯運算,對符合條件的實體集合作邏輯運算,比如“哪些專家同時在BAT工作過?”,對在BAT工作過的專家取交集運算。

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具有以下四點優勢:

  • 注重過程:KoPL拆解問題的過程結果都是可見的,而SPARQL是無法定位中間過程的。
  • 符合人類思維:KoPL是一種過程性語言,将一個問題拆分為多個簡單問題,然後組合進行解決。
  • 操作具有良好的可組合性:我們将知識圖譜的複雜問答拆分為20多個簡單操作,這些操作能夠互相組合來解決各種各樣的問題。
  • 可以面向多種知識來源:除了結構化數據外,還可以對非結構化的文本數據進行操作,比如KoPL還可以對Wikipedia的非結構化文本,描述文本問答的複雜問題的解決過程。

2. 大規模知識庫問答數據集——KQA Pro

基于KoPL的基本操作與組合,我們能夠大規模地生成複雜問題,具體生成的策略有四個。第一個策略是模闆,比如針對比較類型問題定義這樣的模闆“<>和<>誰的<屬性>更<大/小>”,詢問兩個人的身高更高就可以套用這個模闆,我們可以對這樣的模闆填充各種實體和屬性得到不同的問題。第二個策略是采樣,根據第一個策略得到的模闆,我們在知識庫中進行采樣,然後對模闆中空缺的位置進行填空,得到不同的問題。第三個策略是組合,根據KoPL的基本操作,我們可以做各種各樣的排列組合得到不同的問題。第四個策略是遞歸,對于問題中已有的實體,我們對其進行遞歸拆解,增加問題的複雜度,比如将問題“勒布朗·詹姆斯和布朗尼·詹姆斯誰更高?”中的“布朗尼·詹姆斯”使用關系描述為“勒布朗·詹姆斯的兒子”,那麼問題就會變為“勒布朗·詹姆斯和勒布朗·詹姆斯的兒子誰更高?”,這樣問題的複雜度也就變高了。

基于這四種策略,我們可以生成大量多樣化的高複雜度問題。

最終每個樣例生成5個元素,由模闆得到的問題,回答問題使用的SPARQL,問題拆解的KoPL,10個候選答案以及标準答案。

通過問題生成,我們得到了大量的模闆問題以及問題對應的SPARQL, KoPL, 選項和标準答案。下一步對模闆問題衆包轉寫,在保持原意的前提下,轉寫得到更加流暢多樣的問題。最後對衆包轉寫的結果進行衆包評測,評價指标為是否保持問題的原意和轉寫問題的流暢性,我們會丢棄未保持原意的問題,比如轉寫二“勒布朗·詹姆斯的個子是不是比他兒子高?”,這個轉寫将問題的答案變為是或否。

最終我們得到了約12萬條五元組數據,将其命名為KQA Pro,是目前首個包含了自然語言、全知識類型、多種邏輯形式的大規模數據集。

3. 下一個問題

以上是我們探讨的第一個問題——如何構造大規模推理過程數據。在擁有領域一的推理過程數據之後,我們思考這些數據是否可以幫助其他領域學習推理過程?在這些領域裡,已經有了一些問題和答案,但缺乏推理過程,比如是否可以使用金融領域的推理過程數據幫助醫學領域的推理過程學習?

--

03

跨領域遷移

這是我們分享的第二個問題,我們希望将已有的推理過程遷移到其他領域中。

1. 跨領域遷移

考慮在KoPL推理過程的跨領域遷移,我們将推理過程劃分為兩個部分:

  • 第一個部分是推理過程的骨架,指的是圖譜的基本操作,比如問題“AI行業哪家公司2021年融資最多?”對應的KoPL有四個操作,第一個操作是找到知識圖譜中對應AI行業的實體,第二個操作是通過關系找到跟AI行業具有所屬關系的實體,這個操作可以找到跟AI行業相關的實體,比如公司、高校或從業人員等,第三個操作是對概念進行過濾,得到行業的所有公司,最後第四個操作是從公司裡去比較屬性“2021年融資”,從中選出屬性值最大的實體。
  • 第二個部分是推理過程的參數,指的是骨架中每個操作選取的内容,比如Concept選擇了公司,公司就是一個參數。

通過将推理過程分解這樣兩個部分之後,我們發現了骨架和參數的特點:

  • 骨架與知識圖譜本身是弱相關的,知識圖譜一和知識圖譜二的領域完全不一樣,但在問題的骨架上有相似之處,比如問題一“AI行業哪家公司2021年融資最多?”與問題二“傳染病領域哪家醫院2021年病人最多?”提問的内容完全不一樣,但骨架是類似的。所以我們認為骨架與問題是強相關的,比較容易在跨領域間進行遷移。
  • 參數與知識圖譜和問題都是強相關的,例如問題一中的參數均來自金融領域的知識圖譜一,問題二中的參數則是來自醫學領域的知識圖譜二。

2. 骨架解析器

對于骨架部分的遷移,我們設計了一個帶有注意力機制的Seq2Seq骨架解析器,選用BERT作為編碼器,通過注意力機制選取BERT的編碼結果,再輸入到GRU解碼器中,将骨架中的操作逐步解碼出來。

3. 參數解析器

對于參數解析器,我們采取了不同的策略。由于參數與知識圖譜是強相關的,所以我們需要對知識圖譜中的元素也進行編碼,這裡使用BERT作為知識圖譜元素的編碼器。比如上圖中,骨架解碼器解碼得到一個關于Concept的操作,我們将這個解碼得到的特征向量與知識圖譜中使用BERT編碼的概念特征向量作相似度計算,選取相似度最高的概念。上圖中相似度最高的是公司,所以最終選擇公司作為參數。

4. 訓練方法

我們将模型訓練方法分為兩個階段:

  • 階段一,在領域一中進行有監督學習,通過标注好的推理過程數據訓練骨架解析器和參數解析器。
  • 階段二,将階段一訓練好的兩個解析器遷移到領域二上,采取強化學習的訓練方法,在這個階段中的訓練數據是問答對的形式。對于一個問題,使用骨架解析器和參數解析器進行解析,解析過程中根據概率進行采樣,得到不同的推理過程,再将這些不同的推理過程在相應的引擎上執行。比較執行結果與問題答案是否正确,給正确推理過程一個正向獎勵,通過強化學習優化正确推理過程的概率,降低錯誤推理過程的概率。

5. 實驗設定

下面介紹一下我們的實驗設定:

  • 領域一,采用KQA Pro數據集,使用Wikidata子集構造的知識圖譜,訓練數據為12萬條。
  • 領域二,使用兩個公開的數據集:

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

成果與資源

  • Shulin Cao*, Jiaxin Shi*, et al. KQA Pro: A Dataset with Explicit Compositional Programs for Complex Question Answering over Knowledge Base. ACL 2022.
  • Shulin Cao, Jiaxin Shi, et al. Program Transfer for Answering Complex Questions over Knowledge Bases. ACL 2022.
  • Jiaxin Shi, Shulin Cao, et al. TransferNet: An Effective and Transparent Framework for Multi-hop Question Answering over Relation Graph. EMNLP 2021.
  • KoPL:/
  • KQA Pro:
  • /kqa-pro/
  • ProgramTransfer:
  • https://github.com/THU-KEG/ProgramTransfer
  • TransferNet:
  • https://github.com/shijx12/TransferNet

--

06

問答

Q:非鍊式查詢如何解碼?

A:非鍊式查詢一般是二叉樹的形式,我們可以通過前序或中序遍曆的方法将其轉變為鍊式查詢。

Q:KoPL是否有一些序列化的表示方法?比如文本到查詢圖是如何生成的?

A:KoPL是一種過程化的語言,基本上不存在圖結構。它主要有序列化和樹形兩種結構,樹結構主要是二叉樹。如果是SPARQL這種圖結構,可以采用深度優先或廣度優先方法來進行遍曆。

Q:KBQA中需要對每個問題進行複雜度識别麼?系統是通過實體加規則的方法進行判斷的麼?

A:這個問題不需要進行區分,如果複雜問題都能夠回答的話,那麼簡單問題也能夠回答得很好。簡單問題可以看做多跳推理的特例,它是一跳的推理。如果要進行區分的話,可以直接訓練一個分類模型。

Q:KoPL能夠在Neo4J上進行推理?

A:目前來說是不行的,KoPL是運行在我們自研的引擎上。但KoPL是可以跟其它語言作轉換,這是我們目前正在進行的工作,通過中間語言來将KoPL轉換為其它查詢語言。


今天的分享就到這裡,謝謝大家。

你可能想看:

有話要說...

取消
掃碼支持 支付碼