小樣本場景下的多跳推理及其可解釋性(MetaKGR、DacKGR、BIMR)


這幾篇論文是 TransC 的作者 Lv Xin 近幾年在知識推理方面的研究工作,因為找 TransC 的代碼,順騰摸瓜找到了這幾篇,正好知識推理是我剛回所就想做的方向,因為種種原因沒有選擇,現在有機會了解一下了。作者似乎對 EMNLP 情有獨鍾,TransC 發表在 EMNLP 2018,MetaKGR 發表在 EMNLP 2019,DacKGR 發表在 EMNLP 2020,BIMR 還沒有公開發表,不過大概率也是投今年的 EMNLP 吧。

MetaKGR

paper: Adapting Meta Knowledge Graph Information for Multi-Hop Reasoning over Few-Shot Relations

論文

本文作者是清華大學劉知遠老師團隊的 Lv Xin 發表於 EMNLP 2019 上的文章,提出了 MetaKGR 模型,在小樣本場景下進行多跳推理,使用強化學習的 MAML 方法,在常規數量關系上初始化得到參數,然后在具體的 few-shot 關系上進行快速適應,並進行多跳推理。

問題提出

可以進行多跳推理的模型有兩類,一類是通用的 KGE 模型,另一類是多跳推理模型,前者雖然可以計算出推理的結果,但無法給出合理的可解釋性(如推理路徑),后者在小樣本場景下表現差。本文提出的模型 MetaKGR,將帶有同一關系的三元組查詢視為一個任務,采用強化學習訓練 agent 搜索目標實體和推理路徑。

MAML 元學習方法: 從高頻關系任務中捕捉不同的任務中包含的共同的元信息(meta information),在 MetaKGR 中,就是在 normal relation 上初始化參數,然后在具體的低頻關系上進行快速適應(微調訓練出新的模型)。

few-shot 關系的定義: 如果包含某個關系的三元組的數量小於定義的閾值 K,則該關系被視為小樣本關系(few-shot relaiton),否則是 normal relation。

特定關系學習

對於關系集中的每一個關系(包括 normal 關系和 few-shot 關系),學習一個多跳推理的 agent,用於推理路徑、搜索目標實體。(對強化學習沒什么了解,暫時認為 agent 可以視為一個虛擬的主題,可以在 KG 的圖上隨機游走)

  1. 馬爾可夫決策過程(Markov Decision Process,MDP)

MDP: 將知識譜圖視為有向圖,關系和實體視為節點和邊,給定查詢和答案 \((e_s,r_q,e_o)\),期望 agent 從源實體 \(e_s\) 出發,經過幾條邊,到達目標實體 \(e_o\)

MDP 的其他定義概念:

State: 第 t 個時間步的狀態定義為 \(s_t=(r_q,e_s,\hat{e}_t)\),括號正分別為查詢關系、源實體、當前到達的實體。

Actions: 一個動作是即將到達的邊(關系)和實體,t 時刻的動作空間定義為當前實體的所有出邊和下一實體:\(A_t=\{(r_{t+1},\hat{e}_{t+1})|(\hat{e}_t,r_{t+1},\hat{e}_{t+1}) \in G \}\)

Transition: 如果 agent 選擇了一個動作,狀態將會發生改變,狀態轉移的函數定義為 \(\delta(s_t,A_t)=(r_q,e_s,\hat{e}_{t+1})\),轉移函數的輸出為 t+1 時刻的狀態。給定固定的時間步 T,最終到達的狀態為 \(s_T=(r_q,e_s,\hat{e}_T)\)

Rewards: 如果 agent 最終到達了正確的實體,即 \(\hat{e}_T=e_o\),則得到獎賞 \(R(s_T|r_q,e_s)=1\),否則得到的獎賞是由基於 embedding 的函數值—— \(f(e_s,r_q,\hat{e}_T)\)\(f\) 度量三元組 \((e_s,r_q,\hat{e}_t)\) 的概率。其實 \(f\) 就是三元組打分函數,在這里用於計算獎賞值。

  1. 策略網(Policy Network)

應用策略網解決馬爾可夫決策過程,即決定每個狀態選擇哪個 action。\(A_t\) 中的每個動作具體表示為 \(a_t=[r_{t+1};\hat{e}_{t+1}]\)

使用 LSTM 編碼搜索路徑:\(h_t=LSTM(h_{t-1},a_{t-1})\)\(h_t\) 是歷史路徑的表示,LSTM 實現了一跳路徑的編碼。

動作空間 \(A_t\) 中所有動作的概率分布為:\(\pi_{\theta}(a_t|s_t)=softmax(A_t(W_2ReLU(W_1[\hat{e}_t;h_t;r_q])))\)

  1. 損失函數

給定關系 r 和帶有該關系的三元組集合 D,特定關系的策略網上的整體 loss 為:

元學習(Meta-Learning)

元學習的目的是學習到在 common task 上初始化好的參數 \(\theta^*\)(Figure 2中)。當適應到新任務 \(T_r\) 時,模型的參數變為 \(\theta_r^{'}\)

對單個 r 的梯度下降步驟:

\(D_r\) 是從屬於 \(T_r\) 的三元組中隨機采樣得到的訓練集,同樣采樣得到 \(D_Q\) 用於評價參數 \(\theta^{'}_r\)

一個 batch 中多個任務共同做梯度下降:

實驗

進行了鏈接預測和魯棒性分析實驗。

  1. 鏈接預測

用了兩個數據集 FB15K-237 和 NELL-995 進行鏈接預測,分別設定 K 為 137 和 114 來決定兩個數據集中的關系是否是 few-shot relation。四個多跳推理模型作為 baseline 進行對比。個人認為 baseline 應該再加上一個同樣用多跳路徑作推理的 PTransE。

  1. 魯棒性分析

在 FB15K-237 上調整了 K 觀察實驗結果的變化。

與 MultiHop 的對比結果表明,Meta-KGR 對決定關系是否是小樣本的閾值 K 不敏感,因此模型更魯棒。

這篇文章的實驗做得比較少,而且不夠直觀,會令讀者有一些疑問,比如多跳關系訓練出來有幾跳?即如何證明做的是多跳推理?如果能用 case study 直觀地展示推理效果就好了。

代碼

該作者的每一篇研究都給出了代碼,該模型的 https://github.com/THU-KEG/MetaKGR 。嘗試在服務器上運行,但是因為環境、路徑、包等一些小問題也很多 bug,沒能一次跑通(盡管我知道那是小概率事件)。因為忙着記錄下面的兩個模型,代碼就先不看了,我是很想並且打算要做推理方向的,等把 KGE 的基礎模型梳理完之后再來看這幾個模型,想 idea。

后記:五一回來嘗試運行了一下,即使是在 2080ti 上,也太慢了,預訓練 KGE 還好,一個白天能跑完,第二步 --few-shot 的時候,一晚上才訓了 10 個 epoch,太慢了,大概率要放棄這個方向了。

小結: 強化學習思想用於 KG 知識推理,是我第一次接觸這方面的內容。看文章綜述,真正結合 KGE 做多跳推理的工作應該不是很多,后面學習完了神經網絡 KGE 模型,再看有沒有可以結合可做的點。

DacKGR

paper: Dynamic Anticipation and Completion for Multi-Hop Reasoning over Sparse Knowledge Graph

論文

這篇文章是作者發表在 EMNLP 2020 上的工作,主要思想還是用強化學習做稀疏 KG (這里沒有強調是小樣本關系)的多跳推理,包括動態預測和動態補全兩步。

問題提出及形式化定義

該文針對稀疏知識圖譜做多跳推理。可以做多跳推理的模型主要有兩類:KGE 模型和專門的多跳推理模型。但 KGE 做補全是計算出來的結果,不能給出推理路徑之類的解釋。而專門的多跳推理模型作用於稀疏知識圖譜時面臨兩個問題:稀疏 KG 包含的信息少,路徑選擇困難;路徑的缺乏使得預測目標實體變得困難。

因此,文章提出了 DacKGR,包括動態預測(Dynamic Anticipation)和動態補全(Dynamic Completion)兩部分,前一部分應用 KGE 模型預測尾實體信息用於 agent 選擇正確的 action;后一部分負責在推理過程中動態地向 KG 中添加額外的邊(關系),緩解 KG 的稀疏性問題。

模型

強化學習框架及策略網

這兩部分的介紹和前面一篇論文中的介紹是相同的,簡單貼一下:

  1. 強化學習相關概念
  • State:某時刻的狀態
  • Action:狀態轉移的動作,給出一個關系和一個實體;狀態 \(s_t\) 的所有動作組成其動作空間
  • Transition:從當前狀態轉移到下一狀態
  • Reward:若到達正確實體,獎勵為1,否則為三元組打分函數給出的值
  1. 策略網

策略網用於指導 agent 選擇正確的動作。

第 t 步的某個動作表示為某個關系和實體的向量拼接:\(a_t=[r;e]\)

LSTM 對路徑信息進行編碼,生成和存儲歷史路徑信息:\(h_t=LSTM(h_{t-1},a_{t-1})\)

第 t 個狀態表示為 查詢關系、當前實體、歷史信息 三者的拼接:\(s_t=[r_q;e_t;h_t]\)

策略網定義為動作空間 \(A_t\) 中的所有動作的概率分布:\(\pi_\theta(a_t|s_t)=\sigma(A_t(W_1ReLU(W_2s_t)))\)

動態預測(Dynamic Anticipation)

這部分說白了就是用 KGE 模型進行普通的鏈接預測。先用 KGE 模型計算出所有實體作為尾實體的概率得分,然后添加到 \(s_t\) 中:\(s_t=[e_p;r_q;e_t;h_t]\)。這部分給出的 \(e_p\) 信息只為 agent 提供一個路徑方向選擇的參考,並不是必須的。

\(e_p\) 為 KGE 模型給出的預測信息,有三種獲取方式:

  1. Sample 方式:基於所有實體的三元組打分的概率分布采樣一個實體
  2. Top-one 方式:選 P 中概率得分最高的實體表示
  3. Average 方式:所有實體表示的加權平均作為 \(e_p\)

實驗表明,sample 方式最好。

動態補全(Dynamic Completion)

這部分是模型的重點,用於拓展動作空間。從添加動作的候選集合 \(C_t\) 中選出高概率的動作添加到 KG。

給定狀態 \(S_t\) 條件下的某個動作的概率定義為:\(p((r,e)|s_t)=p(r|s_t)p(e|r,s_t)\)

這里用近似剪枝的方法計算 \(p((r,e)|s_t)\):先選定給定狀態下概率最高的關系,然后選給定狀態和關系下概率最高的實體。

使用關系的 attention 值作為 \(p(r|s_t)\)\(w=Softmax(MLP(s_t)\cdot[r_1,...,r_{|R|}])\)

然后根據 attention 的值選出前 x 個關系,組成集合 \(R_{add}=\{r^1,r^2,...,r^x\}\)

對於選出的這些關系,用 KGE 模型計算所有實體作為尾實體的概率得分 \(p(e|r^i,s_t)\),並選擇前 k 個得分最高的。

因為額外添加的動作數量為:\(N_{add}=min(\lceil \alpha N \rceil,M)\)

所以關系選擇的個數 x 為 \(x=\lcel N_{add}/k rcel\)

每個狀態下得到的 additional 動作空間會被添加到原有動作空間:\(A_t=A_t+A_t^{add}\)

策略優化(目標函數)

模型使用 REINFORCE 算法訓練代理、優化策略網的參數。我簡單將這種訓練方法理解為和梯度下降相反的訓練方法。梯度下降是最小化 loss,這里是最大化獎賞:

目標函數沒有像前一篇論文那樣加負號,因此參數優化時是梯度上升:

實驗

  1. 鏈接預測

在 FB15K-237 的三個子數據集和 NELL23K、WD-singer 上進行了鏈接預測實驗。

(1)DacKGR 在越稀疏的數據集上,效果提升越明顯。
(2)多跳推理的模型和本文提出的 DacKGR 很多都比不過 KGE 模型,但論文中說只把 KGE 模型作為參考,它們屬於不同的類型,不具可解釋性。
(3)DA模塊中 \(e_p\) 的三種獲得方式中,sample strategy 的效果最好。

  1. 消融實驗

分別去掉 DA 和 DC 模塊觀察實驗效果,兩個模塊都可以起到一定的效果,DC 的效果比 DA 的效果好一丟丟,文章的解釋是 DA 用於 agent 做出正確的選擇,基本不改善 KG 的稀疏性。

DA 和 DC 的關系:DA 只是為 agent 提供動作選擇的方向,DC 用 DA 的結果做多跳推理、補全圖譜。

  1. 驗證分析

這部分用於探究額外添加的動作是否被 agent 選擇。圖中的曲線代表各數據集上的動態補全(DC)的正確率,上面一行是關於訓練 epoch,下面一行是關於添加動作的數量占比 \(\alpha\)

對於第一行,在 10% 的子數據集上,正確率先降后升,其他數據集上只下降,下降是因為 additional actions 引入了噪聲,在 10% 子數據集上先降后升是因為 agent 識別出了噪聲部分,並減少了對 additional actions 的選擇比率。證明了模型在稀疏 KG 上表現好。

對於第二行,DC 正確率隨着 \(\alpha\) 的增大而增長(FB15K-237-50%),符合直觀預期。而因為 50% 的子數據集不太稀疏,添加額外動作對其正確率影響不大。

  1. case study

對於三元組查詢給出了三條推理路徑,加粗的 London 是添加的 additional action,該 action 形成的路徑對於推理有幫助。第三條是 KG 中已有的路徑。

代碼

模型代碼: https://github.com/THU-KEG/DacKGR

后面做的時候再看代碼吧=.=。

小結: 這篇文章比前一篇感覺詳實了很多,給出了 case study 便於直觀理解。模型效果雖然沒有 KGE 的效果好,並且在探究 DC 的正確率時,正確率反而隨着 epoch 的增加而下降,引出一個問題:既然添加 additional actions 引入的是噪聲,那么添加額外動作的意義是什么?盡管如此,論文對實驗結果都給出了合理的解釋,令我感受到,實驗結果好壞並不重要,只要能夠給出合理的解釋即可。

BIMR

paper: Is Multi-Hop Reasoning Really Explainable? Towards Benchmarking Reasoning Interpretability

論文

這篇論文是今年新出的,還未公開發表,但根據作者歷年的習慣,八成是要投今年的 EMNLP。文章的主要工作是提出了一個 benchmark —— BIMR (Benchmark to detect the Interpretability of Multi-hop Reasoning),用於對多跳推理的效果進行評估,並用該 benchmark 對 9 個 baseline 模型進行了測試。

問題提出

很多多跳推理模型給出的路徑並不合理,如上圖下面的例子,盡管模型預測出了正確的尾實體,但是給出的推理路徑完全不合理,目前對多跳推理效果評價的方法只有 case study,因此文章提出了量化的評價指標 BIMR,用於評價多跳路徑的可解釋性。

評價框架

BIMR 包括三個指標:

  1. Path Recall (PR)

PR 代表在測試集中,可通過一條或多條路徑連接的三元組所占的比例。\(Cnt(h,r,t)\) 是一個指示函數,用於指示模型是否可以找到一條從 \(h\) 到達 \(t\) 的路徑,有的話函數值為 1,否則為 0。

  1. Local Interpretability

局部可解釋性用於評價模型發現的路徑的合理性。p 代表模型發現的從 h 到 t 的最佳路徑(最高得分的路徑),\(S(p)\) 是該路徑的可解釋性得分。

  1. Global Interpretability

全局可解釋性是前兩者的乘積,代表模型整體的可解釋性程度。PR 指示模型發現的路徑的數量,GI 代表模型發現路徑的可解釋性程度,二者的乘積代表模型整體的效果。

路徑可解釋性得分 \(S(p)\) 的計算

BIMR 使用基於 wikipedia 構建的 WD15K 數據集(包含 15817 個實體、182個關系,共 176524 個三元組),采用廣度優先(BFS)進行路徑搜索,設置最大跳數為 3,去重后,大約可得到 1600 萬條路徑組成路徑集合 \(P\),對這些路徑手動標注得分工作量巨大,因此文章提出了一種估計優化的方法來計算這些路徑的可解釋性得分。

具體為:對於路徑 \(p \in P\),用該路勁對應的規則 \(f\) 的可解釋性得分作為該路徑的可解釋性得分:\(S(p) \approx S(f)\)

對於一條路徑:

將其轉化到它對應的規則:

由於規則是“entity-independent”的,因此規則集 \(F\) 的規模(96019)遠遠小於路徑集 \(P\)(1600 萬),因此標注工作量會大大減少。此外,還使用了一些剪枝優化規則來降低標注成本。(后面人工標注和挖掘規則的兩小節沒看太懂,也不是很重要,先過了=.=)

實驗

在 WD15K 數據集上對 9 個模型進行了鏈接預測和可解釋性評估的實驗:

從實驗結果看出,基於規則的推理模型普遍優於多跳推理模型,其中 AnyBURL 效果最好。

此外,還對 9 個模型在人工標注和挖掘規則的不同 benchmarks 上進行了對比實驗。

代碼

代碼給出了傳送門,但還沒有放內容:https://github.com/THU-KEG/BIMR

小結: 針對多跳推理沒有量化的評價指標的問題,提出了衡量多跳路徑可解釋性得分的 BIMR,包括三個指標:PR、LI 和 GI,彌補了多跳推理效果沒有量化評價指標的空白,算是一個從 0 到 1 的開創性工作,個人認為比前兩篇貢獻更大,中今年的 EMNLP 應該是沒有問題的。


整體小結: 過了一個五一,前兩篇看的全忘了=.=,只還記得是用強化學習做小樣本關系場景和稀疏 KG 場景的多跳知識推理,最后一篇提出衡量多跳路徑可靠性的評價指標 BIMR,over~

最近的兩點感受(寫於五一前):

  1. 最近本打算這幾篇論文一起看完一起寫筆記的,但是前兩篇論文涉及的強化學習的知識我之前沒有接觸過,所以看得比較慢,又有些事情沒有把全部心思放在學習上,因此沒有看得很明白透徹,期望全部看完一起理解是不現實的。吸取到了一點教訓就是:看論文必須要全神貫注、一氣呵成,走馬觀花的話就會陷入“理解不透徹、重看浪費時間、不看等於沒看”的尷尬境地,因此做事情一定要安排好固定的時間塊,在該時間塊內把該做的事情做完。看論文時,記住,“快就是慢,慢就是快”。
  2. 第二點就是代碼,正好前兩篇論文的代碼是用 pytorch 實現的,因此想嘗試運行,但是會遇到很多小的類似文件路徑、環境設置這樣的問題,解決這些無關痛癢的 bug 可能大半天就下去了,單純看代碼又沒有太深的感覺,所以這一直是令我比較頭疼的一個問題,花了很多時間配環境、debug,這還不算學習代碼的時間,如果不是真的決定要做這個點的話,時間成本有點大,我的代碼能力又比較差,確實應該多看代碼、多實踐,所以,這樣吧,對於一篇有代碼的論文,可以不嘗試運行,看一下代碼,在論文筆記中把它的代碼思路寫出來吧,學習下有什么可以借鑒的實現方式,如果確定要做這個點,再去配環境運行和看代碼實現細節吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM