transE(Translating Embedding)详解+简单python实现
表示學習旨在學習一系列低維稠密向量來表征語義信息,而知識表示學習是面向知識庫中實體和關系的表示學習。當今大規模知識庫(或稱知識圖譜)的構建為許多NLP任務提供了底層支持,但由于其規模龐大且不完備,如何高效存儲和補全知識庫成為了一項非常重要的任務,這就依托于知識表示學習。
transE算法就是一個非常經典的知識表示學習,用分布式表示(distributed representation)來描述知識庫中的三元組。想象一下,這類表示法既避免了龐大的樹結構構造,又能通過簡單的數學計算獲取語義信息,因此成為了當前表示學習的根基。
1 transE算法原理
我們知道知識圖譜中的事實是用三元組 (h,l,t)(h,l,t)(h,l,t) 表示的,那么如何用低維稠密向量來表示它們,才能得到這種依賴關系呢?transE算法的思想非常簡單,它受word2vec平移不變性的啟發,希望h+l≈th+l≈th+l≈t(此為歸納偏差?)。
光有這一個約束可不夠。想讓h+l≈th+l≈th+l≈t,如何設置損失函數是個關鍵。我們發現表示學習都沒有明顯的監督信號,也就是不會明確告訴模型你學到的表示正不正確,那么想要快速收斂就得引入“相對”概念,即相對負例來說,正例的打分要更高,方法學名“negative sampling”。損失函數設計如下:
其中(h′,l,t′)(h',l,t')(h′,l,t′)稱為corrupted triplet,是隨機替換頭或尾實體得到(非同時,其實也可以替換relation)。γ\gammaγ為margin。細看發現這就是SVM的soft margin損失函數,所以可以說,transE針對給定三元組進行二分類任務,其中負例是通過替換自行構造的,目標是使得最相近的正負例樣本距離最大化。
論文中給出了詳細的算法流程:
其中距離度量方式有L1范數和L2范數兩種。在測試時,以一個三元組為例,用語料中所有實體替換當前三元組的頭實體計算距離d(h′+l,t)d(h'+l,t)d(h′+l,t),將結果按升序排序,用正確三元組的排名情況來評估學習效果(同理對尾實體這樣做)。度量標準選擇hits@10和mean rank,前者代表命中前10的次數/總查詢次數,后者代表正確結果排名之和/總查詢次數。
還有一點值得一提,文中給了兩種測試結果raw和filter,其動機是我們在測試時通過替換得到的三元組并不一定就是負例,可能恰巧替換對了(比如(奧巴馬,總統,美國)被替換成了(特朗普,總統,美國)),那么它排名高也是正確的,把當前三元組擠下去也正常。(存疑:這樣的話訓練時是否也應當過濾corrupted triplet呢) 所以測試時在替換后要檢查一下新三元組是否出現在訓練集中,是的話就刪掉,這就是filter訓練方法(不檢查的是raw)。
2 transE算法的簡單python實現
為了更好地理解(其實是因為看不懂別人的),用python簡單實現了transE算法,使用數據集FB15k。這里記錄一些細節和幾個小坑。完整代碼見github。
1. 訓練transE
- Tbatch更新:在update_embeddings函數中有一個deepcopy操作,目的就是為了批量更新。這是ML中mini-batch SGD的一個通用的訓練知識,在實際編碼時很容易忽略。
- 兩次更新:update_embeddings函數中,要對correct triplet和corrupted triplet都進行更新。雖然寫作(h,l,t)(h,l,t)(h,l,t)和(h′,l,t′)(h',l,t')(h′,l,t′),但兩個三元組只有一個entity不同(前面說了,不同時替換頭尾實體),所以在每步更新時重疊的實體要更新兩次(和更新relation一樣),否則就會導致后一次更新覆蓋前一次。
- 關于L1范數的求導方法:先對L2范數求導,逐元素判斷正負,為正賦值為1,負則為-1。
- 超參選擇:對FB15k數據集,epoch選了1000(其實不需要這么大,后面就沒什么提高了),nbatches選了400(訓練最快),embedding_dim=50, learning_rate=0.01, margin=1。
2. 測試
- isFit參數:區分raw和filter。filter會非常慢。
3 transE算法的局限性
transE效果很好且非常簡單,后續大量的工作都是在此基礎上的改進(簡稱trans大禮包),傳統方法已經基本不用了(有些思想還是值得借鑒的,比如矩陣分解、雙線性模型)。改進大體針對以下幾個問題:
- 復雜關系建模效果差。對1-N,N-1,N-N關系,會出現沖突映射,一個實體在不同三元組內的表示融合,導致不明確甚至錯誤的語義信息。
- 多源信息融合。 如何充分利用知識庫中的額外信息(如實體類型、實體描述)。
- 關系路徑建模。 對relation之間的依賴進行建模。
理解或實現有錯誤歡迎指出!
參考文獻:
[1] Bordes A, Usunier N, Garcia-Duran A, et al. Translating embeddings for modeling multi-relational data[C]//Advances in neural information processing systems. 2013: 2787-2795.
[2] 劉知遠, 孫茂松, 林衍凱, et al. 知識表示學習研究進展[J]. 計算機研究與發展, 2016, 53(2):247-261.
總結
以上是生活随笔為你收集整理的transE(Translating Embedding)详解+简单python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TransE算法(Translating
- 下一篇: 知识图谱 - TransE算法