Translating Embeddings for Modeling Multi-relational Data
一个简单的python版本的复现: 复现代码
TransE 算法是一种用于表示图结构中节点及关系的嵌入表示的算法,可以广泛应用于后续各类基于图谱的任务,如基于知识图谱的推荐算法CFKG利用transE对图谱中的entity及relation进行embedding用于后续的推荐任务。同时TransE算法也是后续改进版的TransD,TransH系列算法的基础。
在知识图谱中,一条内容可以表示为一个不可逆的三元组(sub,rel,obj),其中sub和obj用节点表示,均为entity,rel利用边进行表示,为relation(例如(Beijing, is capital of, China),在此三元组中Beijing和China均为entity用图谱中结点表示, is capital of是一种relation,用图谱中的边表示)。
(题外话:嵌入的目的是将以上的entity和relation利用向量进行表示。当然给图中每个结点一个编号1->n来表示,给每个边一个编号(n+1) -> m来表示 ,这样m个编号也可以唯一表示图中所有内容,这也是一种embedding,但是存在的问题是这样的方式很难携带更多的信息来表示这些结点和边之间的关系,例如上例中的Beijing和China应该有很近的关系,但在这种顺序编号表示方法中他们可能会差的很大。这对后续利用一些基于距离的模型而言会造成很多困扰。因此需要更有效的方法来对图谱中的内容进行嵌入表示。)
在TransE算法中,其用相同长度的向量来表示每一个结点和关系,因此entity和relation之间可以进行各种向量运算。
该算法为实现以上目的,核心的优化目标是,即对于(sub + rel) 得到的向量尽可能等于obj向量
该算法比较简单,具体步骤如上所示:
其中1-5行的初始化,主要参考了Xavier Initialization,因此选择了
这样一个分布进行初始化,关于该初始化分布的取值可以参考Xavier Initialization的论文有相关证明
第6行是随机采样一个minibatch用于改embedding的训练。
第7-11行是对该采样后的minibatch S_batch构造"负样本"(corrupted triplet),构造过程是对于一个给定的triplet(h, l, t),保持其h和l或l和t不变,将原triplet中的t或h替换为随机选择的一个entity t‘或h’,即构造后的corrupted triplet为(h', l, t) 或(h, l, t') ,注意,不要同时改变h和t,针对每个triplet仅生成一个corrupted triplet(h', l, t) 或(h, l, t')
第12行是优化训练过程,论文使用了SGD,使优化目标函数(或称loss)尽可能的小,对于优化函数
第一个距离d(h+l,t)是正样本之间的距离,应当尽可能的小,第二个d(h'+l, t')是假样本之间的距离,因此应该尽可能的大,而是一个超参数,为了让整体优化函数可以大于零
优化函数中的d可以采用L1距离或L2距离,是一个超参数,为了让整体优化函数可以大于零,对于不同的距离,其求导如下:
L1 距离:
L2距离:
......
根据以上求导结果利用随机梯度下降的方法可以对优化目标函数进行优化。