论文《Reasoning With Neural Tensor Networks for Knowledge Base Completion》的学习笔记
写在前面:
作为一个NLP小白,现在满脑子都是”不能拖后腿 不能拖后腿“ ,所以今天开始每天一篇文献好好做笔记,不知不觉已经爱上了typora的排版,所以上面的译文链接中的译文是用typora进行翻译的哦~由于排版需要耗点时间,博客可能没办法做到每天都及时更新,但但但,我会尽力的(ง •_•)ง
一、问题描述
1.1 输入
三元组 ( e 1 , R , e 2 ) (e_1,R,e_2) (e1,R,e2),如:(Bengal tiger, has part, tail)。
1.2 输出
三元组 ( e 1 , R , e 2 ) (e_1,R,e_2) (e1,R,e2)中 e 1 和 e 2 e_1和e_2 e1和e2关系 R R R的置信度。
二、算法介绍
2.1 Neural Models for Reasoning over Relations 神经网络结构
神经张量网络(NTN)用双线性张量层取代了标准的线性神经网络层,该层直接将两个实体向量联系起来。该模型通过以下基于NTN的函数计算两个实体处于某种关系中的可能性的分数:
g
(
e
1
,
R
,
e
2
)
=
u
R
T
f
(
e
1
T
W
R
[
1
:
k
]
e
2
+
V
R
[
e
1
e
2
]
+
b
R
)
(
1
)
g(e_1,R,e_2)=u^T_Rf(e^T_1{W^{[1:k]}_R}e_2+V_R \left[ \begin{matrix} e_1 \\ e_2 \\ \end{matrix} \right]+b_R) (1)
g(e1,R,e2)=uRTf(e1TWR[1:k]e2+VR[e1e2]+bR)(1)
其中
g
g
g为NTN网络的输出,也就是最后对关系
R
R
R置信度的打分。
e
1
,
e
2
e_1,e_2
e1,e2为两个实体的特征向量,维度均为
d
d
d,初始化可以是随机值(实验部分有描述),也可以是通过第三方工具训练后的向量,可基于训练不断调整。
u R T f ( V R [ e 1 e 2 ] + b R ) u^T_Rf(V_R \left[ \begin{matrix} e_1 \\ e_2 \\ \end{matrix} \right]+b_R) uRTf(VR[e1e2]+bR)
去掉Tensor部分后,整个网络就是一个典型的三层BP网络, f = tanh f=\tanh f=tanh是隐层激活函数,输出层激活函数为 p u r e l i n e pureline pureline,第一层权重为 V V V, b b b为偏置,第二层权重为 u u u。
e 1 T W R [ 1 : k ] e 2 e^T_1{W^{[1:k]}_R}e_2 e1TWR[1:k]e2为Tensor项, W R [ 1 : k ] ∈ R d × d × k W_R^{[1:k]}∈R^{d×d×k} WR[1:k]∈Rd×d×k是一个张量每个 W R i W_R^i WRi是 d × d d×d d×d矩阵,称为一个 s l i c e slice slice,网络中一共有 k 个 s l i c e k个slice k个slice,对应神经网络隐层节点个数。
h i = [ e 1 T W R [ 1 : k ] e 2 ] i = e 1 T W R i e 2 h_i=[e_1^TW_R^{[1:k]}e^2]_i=e_1^TW_R^{i}e^2 hi=[e1TWR[1:k]e2]i=e1TWRie2
图2:神经张量网络的可视化。每个虚线框代表张量的一个切片,在这种情况下有
k
=
2
k=2
k=2个切片。
2.2 损失函数思想
利用这个网络可以进行知识库推理学习,给定样本 ( ( e i , R k , e j ) ((e_i,R_k,e_j) ((ei,Rk,ej)。实体特征给定后,对应输入。关系类型 R R R对应训练后的网络参数,即网络权重和张量值的集合,每个关系 R R R对应一个参数集合,样本中含有多个关系。
训练时要构建负例样本,构建的方法就是从正例中随机把一个实体替换掉,最终的损失函数如下:
J ( Ω ) = ∑ i = 1 N ∑ c = 1 C max ( 0 , 1 − g ( T ( i ) ) ) + g ( T c ( i ) ) ) + λ ∣ ∣ Ω ∣ ∣ 2 2 J(\Omega)=\sum_{i=1}^N{\sum_{c=1}^C{\max(0,1-g(T^{(i)}))+g(T_c^{(i)}))}}+\lambda||\Omega||_2^2 J(Ω)=i=1∑Nc=1∑Cmax(0,1−g(T(i)))+g(Tc(i)))+λ∣∣Ω∣∣22
其中
Ω
\Omega
Ω是所有参数
u
,
W
,
V
,
b
,
e
u,W,V,b,e
u,W,V,b,e的集合。
u
,
V
,
b
u,V,b
u,V,b
为一般的BP网络的权重参数,
e
e
e为输入的实体特征向量,
W
W
W为张量。
T
c
(
i
)
T_c^{(i)}
Tc(i)是第
i
i
i个样本对应的反例。
根据损失函数计算出上述参数的偏导数,按照一般的梯度下降法或L-BFGS等算法训练网格,训练出来的一个参数集对应一个关系。
一个关系对是一个命题,我们要判定一个命题的置信度。把实体向量(已知)传入具体网络(关系参数已知)输出的结果即为置信度。
2.3 重新审视词向量
作者在文中介绍了两种关于随机初始化实体向量时提高模型准确率的方法:
- 由多个单词复合构成的实体向量初始化用多个词向量的平均值构成(WV)。作者也尝试使用RNNs学习复合词构成的实体向量,但由于某些原因实际效果并不好,所以直接取词向量的平均值。
- 用无监督学习预训练出实体的向量去初始化实体里的词向量(WV-init)。
三、实验
表1:WordNet和Freebase的统计数据,包括不同关系的数量#R。
本论文选取WordNet和FreeBase两个样本集去预测新的关系。在WordNet使用112581条三元组关系
(
e
1
,
R
,
e
2
)
(e_1,R,e_2)
(e1,R,e2)去训练,这些三元组来自38696个不同实体和11个不同类型的关系。与前任工作不同,作者过滤掉了一些关系,比如在WordNet三元关系里重复出现相同的实体的关系等。
3.1 三元组关系的判断
本论文通过替换正样例中实体生成负样例,通过设置门槛
T
R
T_R
TR,判断关系是否存在
g
(
e
1
,
R
,
e
2
)
≥
T
R
g(e_1,R,e_2)\geq T_R
g(e1,R,e2)≥TR
在测试三元组关系是否存在的任务上对比了文中提到的物种不同模型的准确率,并发现本文提出的NTN模型准确率大幅度优于其他模型。
同时作者对比了在WordNet和Freebase里不同关系在同一个数据集上的准确率,结论如图所示,不同关系准确率不一样:
作者发现,实体向量初始化的方式的不同对准确率有很大影响,对比三种实体向量不同的初始化方式: * EV(Entity Vector):整个实体作为一个单独向量表示 * WV(Word Vector):词向量是随机初始化得到,然后用词向量的平均值表示实体向量 * WV-init:相比于WV词向量,其初始化是由无监督学习得到的
3.2 推理的例子
在判断三元关系准确率的任务中已证明本文模型对于预测一个三元关系是否存在较高的准确率。接下来,作者用两个实验展示NTN的推理能力
3.2.1 实验一
选择一个实体和关系,然后将其他所有实体和这个实体的关系进行打分,并按分数降序进行排序,如下表所示:
从这个表看出,主观看出,其中大多数推断的关系都是可信的。
3.2.2 实验二
通过knowledge base已有训练过的三元关系,去推理实体间未知的关系,如下:
如图通过黑线已有的关系,推理出红线未知的关系,并且用词向量(word vector)表示实体向量(entity vector)后,相同的词语组成的实体的潜在语义关系也得以保存。
四、总结
本文引入了神经张量网络NTN来实现知识库的完成。与以前使用知识库中的实体来预测关系的模型不同,我们的模型允许通过一个张量进行实体向量的中介交互。通过在给定的知识库内进行推理,该模型在预测实体之间看不见的关系方面获得了最高的准确性。即使没有外部文本资源,它也可以扩展数据库。我们进一步表明,通过实体的组成词表示实体,并使用现成的词向量初始化这些词表示,所有模型的性能都大大提高。未来工作的潜在路径包括根据每个关系的可用训练数据来缩放切片的数量,并将这些想法扩展到在自由文本上的推理。
五、等价变换
我们观察公式 e 1 T × W × e 2 e^T_1×W×e_2 e1T×W×e2,记第一个特征向量 e 1 e_1 e1为 x x x,第二个为 y y y,皆为列向量(本文中所有向量如未说明,皆为列向量)。该公式改写为:
f ( x , y ; W ) = x T × W × y = ∑ W ⊗ ( x × y T ) f(x,y;W)=x^T×W×y=\sum W \otimes(x ×y^T) f(x,y;W)=xT×W×y=∑W⊗(x×yT)
其中 ⊗ \otimes ⊗表示,两矩阵对应元素相乘作为新矩阵, × × ×为矩阵叉乘, ∑ \sum ∑为矩阵所有元素求和。
该函数可等价为:
f ( x , y ; W ) = ∑ i , j w i , j x i y j f(x,y;W)=\sum_{i,j} w_{i,j}x_iy_j f(x,y;W)=i,j∑wi,jxiyj
每个矩阵 W W W对应一个 s l i c e slice slice,对应函数用 f i f_i fi表示,共 k k k个。
此时使用一个小技巧,把矩阵 W W W压扁,拉成一个向量 s s s, s = ( w 1 , 1 , w 2 , 1 , . . . , w k , k , ) T s=(w_{1,1},w_{2,1},...,w_{k,k},)^T s=(w1,1,w2,1,...,wk,k,)T,然后把矩阵 x × y T x\times y^T x×yT压扁,形成向量 z z z, z = ( x 1 y 1 , x 2 y 1 , , , , x k y k ) T z=(x_1y_1,x_2y_1,,,,x_ky_k)^T z=(x1y1,x2y1,,,,xkyk)T。保持原矩阵元素不变,然后二维降成一维。矩阵和拉长后的向量可以相互转换,生成网络结构时,我们把矩阵拉成成为向量,在训练时计算梯度后要把向量还原为矩阵。上述公式变为:
f ( x , y ; W ) = s T z f(x,y;W)=s^Tz f(x,y;W)=sTz
z z z作为两个原始向量的 x , y x,y x,y的二次项 x i , y j x_i,y_j xi,yj集合, s s s是二次项系数,函数 f f f是关于 x , y x,y x,y的二次多项式。每个片(slice)对应一个矩阵记为 W i W_i Wi,忽略关系下标 R R R;对应一个长向量 s i s_i si;对应一个函数 f i f_i fi,所有片的向量组成一个矩阵:
S = [ s 1 T s 2 T ⋅ ⋅ ⋅ s k T ] S=\left[ \begin{matrix} s_1^T \\ s_2^T\\···\\s_k^T \end{matrix} \right] S=⎣⎢⎢⎡s1Ts2T⋅⋅⋅skT⎦⎥⎥⎤
这个矩阵
S
S
S称之为张量矩阵,与张量
W
R
[
1
:
k
]
W^{[1:k]}_R
WR[1:k]等价,此时公式(1)中的张量项表示为:
e
1
T
W
R
[
1
:
k
]
e
2
=
[
f
1
f
2
⋅
⋅
⋅
f
k
]
=
S
×
z
e_1^TW_R^{[1:k]}e_2=\left[ \begin{matrix} f_1 \\ f_2\\···\\f_k \end{matrix} \right]=S\times z
e1TWR[1:k]e2=⎣⎢⎢⎡f1f2⋅⋅⋅fk⎦⎥⎥⎤=S×z
到此为止,忽略关系下标,我们重写公式(1)所表示的网络结构为:
g
=
u
T
(
[
V
S
]
×
[
x
y
z
]
+
b
)
g=u^T(\left[ \begin{matrix} V\\S\end{matrix} \right] \times \left[ \begin{matrix} x \\y\\z \end{matrix} \right]+b)
g=uT([VS]×⎣⎡xyz⎦⎤+b)
这就是一个经典的三层BP神经网络了,输入层为 x , y x,y x,y以及它们的二次向量 z z z,第一层权重矩阵为原权重矩阵 V V V与张量矩阵 S S S的合体。
六、思考
NTN模型的本质是在经典的BP神经网络的输入层中加入了二次项,从而大大提高了推断的准确率。
用NTN神经网络训练进行三元组关系推理时候的阈值 T R T_R TR是怎么确定的?
源码居然是matlab写的,好家伙