- Title:《Translating Embeddings for Modeling Multi-relational Data》
- 比较经典的embedding算法,做个笔记一起学习。
文章目录:
Abstract
- 第一句就说明:本文针对的问题 在低纬向量空间中,多关系数据的实体和关系的Embedding问题,换句话说就是将实体和关系用低纬向量表示。于是有了TransE,别看它训练容易,处理大型数据也不在话下,又确保了实验效果出色,作者还在FB15k和WN18上进行了link prediction,真的是“可盐可甜“了。
Introduction
- 论文主要面向多关系数据(wordnet,freebase)
- 提到很多年前的模型,比如基于向量分解model,矩阵分解model;然后还有最近的模型,比如贝叶斯聚类model,基于能量的模型model,这些模型表面上是提高了模型的表示能力,实际上一个能打的都没有,都是以提高模型复杂度和加重计算效率为代价的,还容易出现过拟合和拟合不足。既然这样作者提到,还不如用简单的线性model,效果也挺好!所以作者最后提到合适的模型要在准确性和扩展性之间做trade-off。--------TransE model 呼之欲出
- 这句话个人理解:TransE整体是Translation distance model(在许多综述中都是这么说的),这里提到它的实体的embedding是基于能量模型的。
- 提出了重要的思想:如果三元组(h, l, t)成立,则头实体embedding和关系embedding相加约等于尾实体的embedding。
- 即: h+l ≈ t
Translation-based model
-
公式:
- loss function: L = ∑ ( h , ℓ , t ) ∈ S ( h ′ , ℓ , t ′ ) ∈ S ( h , ℓ , t ) ′ [ γ + d ( h + ℓ , t ) − d ( h ′ + ℓ , t ′ ) ] + \mathcal{L}=\sum_{(h, \ell, t) \in S\left(h^{\prime}, \ell, t^{\prime}\right) \in S_{(h, \ell, t)}^{\prime}}\left[\gamma+d(\boldsymbol{h}+\ell, \boldsymbol{t})-d\left(\boldsymbol{h}^{\prime}+\ell, \boldsymbol{t}^{\prime}\right)\right]_{+} L=∑(h,ℓ,t)∈S(h′,ℓ,t′)∈S(h,ℓ,t)′[γ+d(h+ℓ,t)−d(h′+ℓ,t′)]+
- 正确三元组的距离: d ( h , l , t ) = ∥ h + l − t ∥ 1 / 2 2 d(h, l, t)=\|\mathbf{h}+\mathbf{l}-\mathbf{t}\|_{1/2}^{2} d(h,l,t)=∥h+l−t∥1/22
- 错误三元组的距离:同理
-
错误三元组生成:将正确三元组的头或者尾替换成其他的(每次只能选择头或者尾进行替换,不同时替换),得到错误的三元组。
- S ( h , ℓ , t ) ′ S_{(h, \ell, t)}^{\prime} S(h,ℓ,t)′ : 错误三元组
- ( h ′ , ℓ , t ) \left(h^{\prime}, \ell, t\right) (h′,ℓ,t):替换了头的三元组
- ( h , ℓ , t ′ ) \left(h, \ell, t^{\prime}\right) (h,ℓ,t′):替换了尾的三元组
Algorithm 伪代码
algorithm步骤 |
---|
input: 设置初始的三元组集S,正负样本之间的距离 γ \gamma γ,embedding纬度k |
1.对每个关系赋值,并做归一化处理 |
2.同理,对每个实体赋值,并作归一化处理 |
3.设置从整个S集合抽取子集的次数,分批进行处理,每一批为 S b a t c h S_{b a t c h} Sbatch |
4.初始化所有三元组,一开始 T b a t c h T_{b a t c h} Tbatch是空的 |
5.对每批 S b a t c h S_{b a t c h} Sbatch做迭代,每个 ( h , ℓ , t ) (h, \ell, t) (h,ℓ,t),根据前面提到,替换头 ( h ′ , ℓ , t ) \left(h^{\prime}, \ell, t\right) (h′,ℓ,t)或者替换尾 ( h , ℓ , t ′ ) \left(h, \ell, t^{\prime}\right) (h,ℓ,t′) ,得到错误三元组,将正确的和错误的三元组 { ( ( h , ℓ , t ) , ( h ′ , ℓ , t ′ ) ) } \left\{\left((h, \ell, t),\left(h^{\prime}, \ell, t^{\prime}\right)\right)\right\} {((h,ℓ,t),(h′,ℓ,t′))} 加到一开始空的 T b a t c h T_{b a t c h} Tbatch中。 |
第5步,需要注意:实际代码在替换头尾时,需要先做一个deep copy,不然替换了错误三元组,正确三元组就没了。 |
6.利用SGD更新损失函数(这步也有很多学习的地方) |
Experiments
指标说明 | |
---|---|
FB15K | 14951个entity,1345个relation,592213个三元组 |
WN18 | 40943个entity,18个relation,151442个三元组 |
FB1M | 25000个relation,1千7百万个三元组 |
raw | 在替换错误三元组中,会出现替换完对的情况。 raw是不处理这种情况下的结果 |
filt | filt就是去掉替换完后仍然正确的三元组 |
hit@10 | 每个给定的(h,l,t),对原来(h,l,t)和替换后(h’,l,t’)求得分,再从小到大排序,排在前10的比例 |
- 论文实验结果:
- 用openke框架跑FB15k的实验结果(k=50,epoch=1000,学习率0.01)
Conclusion and future work
-
TransE的不足:在处理复杂关系(1-N,N-1,N-N)时,性能显著下降,比较适合处理1-1 的关系。
为了满足复杂的关系,才有了后面的好多好多Trans**…
- 需要论文、数据或者代码(自己下不下来),可以留言邮箱,我会发的哈