TransC
paper: Differentiating Concepts and Instances for Knowledge Graph Embedding
論文
這篇文章是清華大學劉知遠老師團隊發表在 EMNLP 2018 上的工作。C 代表 concept。文章提出了區分概念(concept)和實例(instance)的KGE方法:concept 用球表示,instance 用向量表示,建模 instance 與 concept 之間的 "instanceOf" 關系和 concept 與 concept 之間的 "subClassOf" 關系。
問題提出
人腦中的概念知識是層次化組織的,實例應當與其所屬的概念類別距離接近。但所有之前的KGE模型在進行嵌入時候,並沒有區分對待概念和實例,而是將它們同等地試做實體。這樣會導致兩個問題:不充分的概念表示,以及"isA"關系的傳遞性丟失(我覺得應該有一些預實驗來證明"isA"傳遞性的丟失)。
針對以上問題,提出 TransC,將 concept 編碼為球,instance 編碼為同一語義空間的向量。對於 "instanceOf" 關系,判斷某實例是否屬於某概念,只需要判斷向量是否位於概念的球內;對於 "subClassOf" 關系,判斷某概念是否是另一概念的子類別,理想情況是該類別的球位於父類別的球內(關系成立),此外還針對兩個球可能存在的其他三種位置關系定義了損失函數。
TransC
知識圖譜中包括三種關系:instanceOf、subClassOf 及其他,相應地,三元組分為三類。對於每個 concept,學習一個(超)球的表示 \(s(p,m)\),p 是球心,m 是半徑。
"isA" 關系的傳遞性可形式化地表示為:
- 由 instanceOf + subClassOf 可推 instanceOf

- 由 subClassOf + subClassOf 可推 subClassOf

instanceOf 的表示
對於 "instanceOf" 關系成立的三元組 \((i,r_e,c)\),只需保證 i 的向量位於 c 的球 \(s(p,m)\) 內,因此,打分函數定義為:

subClassOf 的表示

對於存在 "subClassOf" 關系的三元組 \((c_i,r_c,c_j)\),兩個概念的球 \(s_i(p_i,m_i)\) 和 \(s_j(p_j,m_j)\),兩個球心的距離為:\(d=\Vert p_i-p_j \Vert_2\)。若關系成立,兩個球的位置關系應當像圖(a)一樣,它是對於正樣本三元組的訓練目標。
另外三種情況,分別定義打分函數,使其相對位置關系向理想情況靠近。
對圖(b)的“Si在Sj外且與Sj相離”的情況,及圖(c)的“Si與Sj相交”的情況,打分函數定義為: \(f_c(c_i,c_j)=\Vert p_i-p_j \Vert_2 + m_i - m_j\),盡量使兩球的球心距離拉近、Si的半徑減小、Sj的半徑增大。
對圖(d)的“Sj反而處於Si內”的情況,打分函數定義為:\(f_c(c_i,c_j)=m_i-m_j\),盡量使 Si 的半徑減小、Sj 的半徑增大。
其他關系三元組的表示
對於除 "instanceOf" 和 "subClassOf" 之外的其他三元組關系,采用和 TransE 一樣的打分函數:\(f_r(h,t)=\Vert h+r-t \Vert_2^2\)
實現中采用歸一化作為正則約束。
Loss
三種關系的 Loss 都是一樣 margin-based 的:



總的 Loss 為三部分 Loss 之和:

實驗
在自建的 YAGO39K 和 M-YAGO39K 數據集上,進行了鏈接預測和三元組分類的實驗。
YAGO39K 上的鏈接預測和三元組分類實驗結果:

兩個數據集上的 instanceOf 和 subClassOf 類三元組的分類結果:

此外,實驗部分的最后還進行了一個 case study,但沒有什么新東西,只是為了表明 TransC 可以挖掘新的 instanceOf 和 subClassOf 類型的三元組。
代碼
文章給出了代碼:https://github.com/davidlvxin/TransC ,代碼包括 C++ 和 python 兩個版本,python 版本是基於 PyTorch 實現的,非常友好。
python 版本的代碼大概瀏了一遍,居然沒找到核心的打分函數的部分=.=,就不往這貼了。
最近一直在看論文,很久沒有跑代碼了,手都有點癢了,但是因為沒有打算跟進這個方向,只好作罷。看了這個作者的其他工作,有近兩年的兩篇知識推理的工作,后面有時間研讀一下,我個人對於知識推理還是很感興趣的。
小結: 提出了一個新的前所未有的問題,然后用 plausible 的方法解決了它。但是很多時候我我覺得搞文章的順序剛好是反過來的:開腦洞想到一個 idea,做了一些工作,得到了一些結果,然后寫論文 tell story,去提出一個所做的工作可以解決的問題。實際在工業界中到底落實到了哪一步?是否真的存在需要區分概念和實例、以及"isA"傳遞性的問題,象牙塔中的科研者們真的知道嗎?現在我的觀念和讀研之前仍舊是一樣的:需求驅動的工作才是有用的,才是可以鍛煉到人的能力的。