天天看点

sgd 参数 详解_论文笔记(三):TransH的详解与实现

附言:最近由于主要将经历花在对于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中,为了改善上述问题,引入超平面来代替原有关系向量,从而使得同一个节点在不同关系超平面的向量表示不尽相同。

我们可以通过先下面这图来进一步加深对这个超平面概念的理解:

sgd 参数 详解_论文笔记(三):TransH的详解与实现

TransH简单示例

根据上图,我们可以得一个三元组元素的数学表示,h和t分别代表头结点和尾节点的向量,而关系超平面由平面的法向量

sgd 参数 详解_论文笔记(三):TransH的详解与实现

以及平面上的平移向量

sgd 参数 详解_论文笔记(三):TransH的详解与实现

表示。

具体的算法实现,对于一个三元组,我们首先需要将h和t映射到我们的超平面上,从而得到映射向量

sgd 参数 详解_论文笔记(三):TransH的详解与实现

sgd 参数 详解_论文笔记(三):TransH的详解与实现

, 具体公式如下:

sgd 参数 详解_论文笔记(三):TransH的详解与实现
sgd 参数 详解_论文笔记(三):TransH的详解与实现

其中简单说明下

sgd 参数 详解_论文笔记(三):TransH的详解与实现

的含义,这里

sgd 参数 详解_论文笔记(三):TransH的详解与实现

表示h在

sgd 参数 详解_论文笔记(三):TransH的详解与实现

方向上投影的长度(带正负号),乘以

sgd 参数 详解_论文笔记(三):TransH的详解与实现

即h在

sgd 参数 详解_论文笔记(三):TransH的详解与实现

上的投影。

得到投影之后我们就可以根据下面的score function来求得三元组的差值:

sgd 参数 详解_论文笔记(三):TransH的详解与实现

这个公式中所期望的结果为,如果三元组关系是正确的,则结果数值较小,反之则结果数值较大.

为了实现上述所期望的结果,作者引入了margin-base ranking function 作为损失函数来训练模型:

sgd 参数 详解_论文笔记(三):TransH的详解与实现

其中

sgd 参数 详解_论文笔记(三):TransH的详解与实现

看做 max(0, x),

sgd 参数 详解_论文笔记(三):TransH的详解与实现

表示正确三元组的集合,

sgd 参数 详解_论文笔记(三):TransH的详解与实现

表示负例的集合,

sgd 参数 详解_论文笔记(三):TransH的详解与实现

为margin值用于区分正例与负例。这个loss通过Mini-SGD进行训练,需要强调的一点是, 训练过程中,需要让

sgd 参数 详解_论文笔记(三):TransH的详解与实现

尽可能的小,

sgd 参数 详解_论文笔记(三):TransH的详解与实现

尽可能大。

除此之外,在最小化loss function的过程中,模型还需要遵循三个软约束原则:

sgd 参数 详解_论文笔记(三):TransH的详解与实现

公式一是保证所有实体的embedding都归一化。

公式二则用于保证

sgd 参数 详解_论文笔记(三):TransH的详解与实现

sgd 参数 详解_论文笔记(三):TransH的详解与实现

正交垂直,保证dr在超平面上;

公式三则保证法向量的模为1。

为了体现上面三个约束条件,需要对loss function进行修改,加上对公式一和公式二的约束:

sgd 参数 详解_论文笔记(三):TransH的详解与实现

其中C表示软约束的权重,它也是训练过程中的一个超参数。

而公式三则是在每次Mini-SGD后,对

sgd 参数 详解_论文笔记(三):TransH的详解与实现

结果进行归一化实现。

最后,TransH与TransE还有一点不同之处,在于负例的生成。现实中的知识图谱不完整,需要减少假负例(即替换了一个节点后的三元组,恰好是整个知识图谱中存在的另一个三元组)的出现,因此需要根据头尾节点关系,进行节点替换,比如,对于一对多的关系,我们更多的替换头结点而不是尾节点,这样才能避免假负例出现的情况,具体的标准如下。

对于一个关系r, 我们首先要统计两个数值,即这个关系每个头结点平均对应的尾节点数,记做 tph;及这个关系每一个尾节点平均对应的头节点数,记做 hpt 。最后通过公式

sgd 参数 详解_论文笔记(三):TransH的详解与实现

来表示头结点没被替换的概率,而尾节点替换的概率为 1-p。

相比于transE, TransH新增了很多参数,使得loss 在sgd中秋梯度变得更为复杂,下面简单介绍下,各个参数梯度求解结果。首先Loss 可以分解为一下三个式子

sgd 参数 详解_论文笔记(三):TransH的详解与实现
sgd 参数 详解_论文笔记(三):TransH的详解与实现
sgd 参数 详解_论文笔记(三):TransH的详解与实现

其中Loss1的各参数求导如下

sgd 参数 详解_论文笔记(三):TransH的详解与实现
sgd 参数 详解_论文笔记(三):TransH的详解与实现
sgd 参数 详解_论文笔记(三):TransH的详解与实现
sgd 参数 详解_论文笔记(三):TransH的详解与实现
sgd 参数 详解_论文笔记(三):TransH的详解与实现
sgd 参数 详解_论文笔记(三):TransH的详解与实现
代码实现

TransH代码实现​github.com

也不知道自己咋想的,非要自己用手推梯度来实现模型,虽然也实现了,但是训练用时有点久,后来使用Pytorch.nn.Embedding来重新实现了一遍,模型收敛的效果以及运行的速度明显比自己完全造轮子好很多,所以前前后后实现了三个版本,有需要的可以到github上自取~