附言:最近由于主要将經曆花在對于KGE與SPARQL的結合上,導緻TransH的文章解讀一再拖延,近期已大緻完成這方面工作,後期會專門出一個介紹一下KGE與SPARQL結合的文章。
前言:書讀百遍不如抄書一遍!通過複現各類模型,可以幫助更好的了解模型的細節,并加深記憶,為後面的學習鋪平道路. 首先先附上論文原文位址:TransH 原文citeseerx.ist.psu.edu
TransH 是Zhen Wang 等人在2014年提出的一種對于TransE模型(TransE論文詳解,請移步我之前的文章論文筆記(一):TransE論文詳解及代碼複現)的改進方案,這個模型的具體思路是将三元組中的關系(relation, 或者 predicate),抽象成一個向量空間中的超平面(Hyperplane),每次都是将頭結點或者尾節點映射到這個超平面上,再通過超平面上的平移向量計算頭尾節點的內插補點。
這樣做的目的,主要是因為TransE模型在反射,一對多,多對一等關系中處理的效果并不好。舉個例子,在一個對多的關系中,頭結點由一個向量表示,它在一個關系中指向多個不同的節點,而這個關系也是由一個vector表示的;理想情況下,如果h + r - t = 0,這就會導緻指向的多個節點所計算出來的向量都是相同的值,這明顯是有問題的。而且同時,這也造成一個節點在連接配接不同relations中時,都使用一個相同的vector表示。而在TransH中,為了改善上述問題,引入超平面來代替原有關系向量,進而使得同一個節點在不同關系超平面的向量表示不盡相同。
我們可以通過先下面這圖來進一步加深對這個超平面概念的了解:

TransH簡單示例
根據上圖,我們可以得一個三元組元素的數學表示,h和t分别代表頭結點和尾節點的向量,而關系超平面由平面的法向量
以及平面上的平移向量
表示。
具體的算法實作,對于一個三元組,我們首先需要将h和t映射到我們的超平面上,進而得到映射向量
和
, 具體公式如下:
其中簡單說明下
的含義,這裡
表示h在
方向上投影的長度(帶正負号),乘以
即h在
上的投影。
得到投影之後我們就可以根據下面的score function來求得三元組的內插補點:
這個公式中所期望的結果為,如果三元組關系是正确的,則結果數值較小,反之則結果數值較大.
為了實作上述所期望的結果,作者引入了margin-base ranking function 作為損失函數來訓練模型:
其中
看做 max(0, x),
表示正确三元組的集合,
表示負例的集合,
為margin值用于區分正例與負例。這個loss通過Mini-SGD進行訓練,需要強調的一點是, 訓練過程中,需要讓
盡可能的小,
盡可能大。
除此之外,在最小化loss function的過程中,模型還需要遵循三個軟限制原則:
公式一是保證所有實體的embedding都歸一化。
公式二則用于保證
和
正交垂直,保證dr在超平面上;
公式三則保證法向量的模為1。
為了展現上面三個限制條件,需要對loss function進行修改,加上對公式一和公式二的限制:
其中C表示軟限制的權重,它也是訓練過程中的一個超參數。
而公式三則是在每次Mini-SGD後,對
結果進行歸一化實作。
最後,TransH與TransE還有一點不同之處,在于負例的生成。現實中的知識圖譜不完整,需要減少假負例(即替換了一個節點後的三元組,恰好是整個知識圖譜中存在的另一個三元組)的出現,是以需要根據頭尾節點關系,進行節點替換,比如,對于一對多的關系,我們更多的替換頭結點而不是尾節點,這樣才能避免假負例出現的情況,具體的标準如下。
對于一個關系r, 我們首先要統計兩個數值,即這個關系每個頭結點平均對應的尾節點數,記做 tph;及這個關系每一個尾節點平均對應的頭節點數,記做 hpt 。最後通過公式
來表示頭結點沒被替換的機率,而尾節點替換的機率為 1-p。
相比于transE, TransH新增了很多參數,使得loss 在sgd中秋梯度變得更為複雜,下面簡單介紹下,各個參數梯度求解結果。首先Loss 可以分解為一下三個式子
其中Loss1的各參數求導如下
TransH代碼實作github.com
也不知道自己咋想的,非要自己用手推梯度來實作模型,雖然也實作了,但是訓練用時有點久,後來使用Pytorch.nn.Embedding來重新實作了一遍,模型收斂的效果以及運作的速度明顯比自己完全造輪子好很多,是以前前後後實作了三個版本,有需要的可以到github上自取~