日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

transE(Translating Embedding)详解+简单python实现

發布時間:2023/12/2 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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+lt(此為歸納偏差?)。

光有這一個約束可不夠。想讓h+l≈th+l≈th+lt,如何設置損失函數是個關鍵。我們發現表示學習都沒有明顯的監督信號,也就是不會明確告訴模型你學到的表示正不正確,那么想要快速收斂就得引入“相對”概念,即相對負例來說,正例的打分要更高,方法學名“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实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。