最近對知識圖譜比較感興趣,覺得這會是未來整個人工智能領域的發展方向。知識圖譜是對人類知識的結構化總結,試想以後所有我們知道的不知道的事情都能通過知識圖譜串在一起,形成一個雲圖書館。那麼知識圖譜是如何建立的呢?下面分享一篇文章,來自劉知遠老師15年AAAI的文章。
源碼鏈接:https://github.com/thunlp/KB2E
以下內容轉載自http://www.07net01.com/2016/03/1394641.html
-我是表情分割線-
一、引言
網絡上已經存在了大量知識庫(KBs),比如OpenCyc,WordNet,Freebase,Dbpedia等等。這些知識庫是爲了各種各樣的目的建立的,因此很難用到其他系統上面。爲了發揮知識庫的圖(graph)性,也爲了得到統計學習(包括機器學習和深度學習)的優勢,我們需要將知識庫嵌入(embedding)到一個低維空間裏(比如10、20、50維)。我們都知道,獲得了向量後,就可以運用各種數學工具進行分析。深度學習的輸入也是向量。(考慮一下,word2vec,我們訓練出一個向量後,可以做好多事情,深度學習的輸入也往往是一個矩陣)。
二、基礎背景
一條知識圖譜可以表示爲一個三元組(sub,rel,obj)。舉個例子:小明的爸爸是大明,表示成三元組是(小明,爸爸,大明)。前者是主體,中間是關係,後者是客體。主體和客體統稱爲實體(entity)。關係有一個屬性,不可逆,也就是說主體和客體不能顛倒過來。
知識圖譜的集合,鏈接起來成爲一個圖(graph),每個節點是一個一個實體,每條邊是一個關係,或者說是一個事實(fact)。也就是有向圖,主體指向客體。
具體的用處和知識圖譜提取方式可見劉知遠大神的文章http://www.36dsj.com/archives/31317(ps,最好是買本他的書)
Freebase的例子:
(Barack Obama, place of birth, Hawai) (Albert Einstein, follows diet, Veganism) (San Francisco, contains, Telegraph Hill)
上面三條都是知識圖譜的例子。
三、TransE的提出
TranE是一篇Bordes等人2013年發表在NIPS上的文章提出的算法。它的提出,是爲了解決多關係數據(multi-relational data)的處理問題。我們現在有很多很多的知識庫數據knowledge bases (KBs),比如Freebase、 Google Knowledge Graph 、 GeneOntology等等。
TransE的直觀含義,就是TransE基於實體和關係的分佈式向量表示,將每個三元組實例(head,relation,tail)中的關係relation看做從實體head到實體tail的翻譯(其實我一直很納悶爲什麼叫做translating,其實就是向量相加),通過不斷調整h、r和t(head、relation和tail的向量),使(h + r) 儘可能與 t 相等,即 h + r = t。
以前有很多種訓練三元組的方法,但是參數過多,以至於模型過於複雜難以理解(作者表達的意思就是,我們的工作效果和你們一樣,但我們的簡單易擴展)。(ps:作者以前也做過類似的工作,叫做Structured Embeddings,簡稱SE,只是將實體轉爲向量,關係是一個矩陣,利用矩陣的不可逆性反映關係的不可逆性。距離表達公式是1-norm)。
如下圖,作者的目的是將向量轉爲這種形式(此圖是2維)
爲此,作者定義了距離公式爲
四、TransE的訓練
註釋:
1、
直觀上,我們要前面的項(原三元組)變小(positive),後面的項(打碎的三元組)變大(negative)。就跟喂小狗一樣,它做對了,就給骨頭吃;做錯了,就打兩下。前面的項是對的(來自於訓練集),後面的項是錯的(我們隨機生成的)。不同時打碎主體和客體,隨機挑選一個打碎,另一個保持不變,這樣才能夠有對照性。
2、圖上的加號是大於0取原值,小於0則爲0。我們叫做合頁損失函數(hinge loss function),這種訓練方法叫做margin-based ranking criterion。是不是聽起來很熟悉?對的,就是來自SVM。支持向量機也是如此,要將正和負儘可能分開,找出最大距離的支持向量。同理,TransE也是如此,我們儘可能將對的和錯的分開。
3、關於模型的參數:參數θ是所有實體的向量。設一共有 |E| 個實體和 |R| 個關係,每個實體/關係的向量長度爲d維,因此,一共有( |E| + |R| ) * d 個參數。
4、關於參數的更新:我們使用的是隨機梯度下降(Stochastic Gradient Descent,SGD)訓練方法。
SGD不用對所有的和求梯度,而是對一個batch求梯度之後就立即更新theta值。
對於數據集大的情況下,有速度。但是每一次更新都是針對這一個batch裏的三元組的向量更新的,也就是意味着,一次更新最多更新(3+2)*batch_size*d 個參數(設一個batch的長度爲batch_size)。並不是把所有的theta值都更新了,或者說不用更新整個( |E| + |R| ) * d 矩陣,只需要更新sample裏抽出來的batch裏的向量即可。爲什麼可以這樣呢(也就是爲什麼可以不用把參數全更新了,而是隻更新一部分)?因爲參數之間並沒有依賴(或者說衝突conflict),對於此,可以參考論文 Hogwild!:
A Lock-Free Approach to Parallelizing Stochastic。
5、對SGD多說兩句:SGD的收斂沒有GD好,但是,這反而是優點,因爲在機器學習領域,過於best的結果反而是害處,因爲用於過擬合(overfitting)。也就是,儘管叫做D(下降),但整個過程我們難保一直D下去。只能保證在forever可以做到D。
6、對於每一次迭代,每一次的歸一化約束(constraint)實體長度爲1(減少任意度量(scaling freedoms(SE)),使得收斂有效(避免 trivially minimize(transE)),但對關係不做此要求。