代码地址:https://github.com/daiquocnguyen/CapsE
摘要
本文提出一种嵌入模型,名为CapsE,用胶囊网络建模三元组关系。
用一个三列的矩阵表示每个三元组,每列表示三元组(subject, relation, object)中的一个元素。然后将这个三列的矩阵喂给卷积层,用不同的卷积核生成不同的feature map,输入胶囊网络进行打分操作。有效的三元组分数很高,无效的三元组分数很低。
动机
1.大多数KG embedding模型都是为给定三元组的相同维度上的条目建模而构造的,中每个维度几乎都捕获了实体的一些特定于关系的属性。然而,现有的模型中没有一个具有用于在相同维度上对三元组中的条目进行建模的“深度”结构。
To the best of our knowledge, however, none of the existing models has a “deep” architecture for modeling the entries in a triple at the same dimension.
CapsE模型
符号描述
v
s
,
v
r
,
v
o
v_s,v_r,v_o
vs,vr,vo分别为(subject, relation, object)的k维embedding。
在CapsE中,将每个embedding三元组
[
v
s
,
v
r
,
v
o
]
[v_s,v_r,v_o]
[vs,vr,vo]作为一个矩阵
A
=
[
v
s
,
v
r
,
v
o
]
∈
R
k
×
3
\mathbf{A}=[v_s,v_r,v_o] \in \mathbb{R}^{k\times3}
A=[vs,vr,vo]∈Rk×3;
A
i
,
:
∈
R
1
×
3
\mathbf{A}_{i,:}\in\mathbb{R}^{1\times3}
Ai,:∈R1×3表示矩阵
A
A
A的第
i
i
i 行;
卷积层使用
w
∈
R
1
×
3
w\in\mathbb{R}^{1\times3}
w∈R1×3的卷积核,使用该卷积核重复对
A
A
A的每一行做卷积操作,生成feature map
q
=
[
q
1
,
q
2
,
.
.
.
,
q
k
]
∈
R
k
\mathbf{q}=[q_1,q_2,...,q_k]\in\mathbb{R}^k
q=[q1,q2,...,qk]∈Rk,其中,
q
i
=
g
(
w
⋅
A
i
,
:
+
b
)
q_i=g(w\cdot\mathbf{A}_{i,:}+b)
qi=g(w⋅Ai,:+b),该式中的
⋅
\cdot
⋅表示点乘,
b
∈
R
b\in\mathbb{R}
b∈R为偏置项,
g
g
g为非线性函数如ReLU,因此生成的
q
i
∈
R
k
q_i\in\mathbb{R}^k
qi∈Rk。
本文中使用的卷积核集合表示为
Ω
\Omega
Ω,总数表示为
N
=
∣
Ω
∣
N=|\Omega|
N=∣Ω∣,因此卷积层会生成
N
N
N个
k
k
k维的feature map,每一个特征映射可以捕获相同维度内的某个条目的某种特性。
模型架构
卷积层:
输入:矩阵
A
=
[
v
s
,
v
r
,
v
o
]
∈
R
k
×
3
A=[v_s, v_r, v_o]\in\mathbb{R}^{k\times3}
A=[vs,vr,vo]∈Rk×3,此例中
k
=
4
k=4
k=4
卷积核:
N
N
N个卷积核
w
∈
R
1
×
3
w\in\mathbb{R}^{1\times3}
w∈R1×3,此例中
N
=
5
N=5
N=5
激活函数:ReLU,有
q
i
=
g
(
w
⋅
A
i
,
:
+
b
)
q_i=g(w\cdot\mathbf{A}_{i,:}+b)
qi=g(w⋅Ai,:+b)
输出:一个feature map表示为
q
=
[
q
1
,
q
2
,
.
.
.
,
q
k
]
∈
R
1
×
k
\mathbf{q}=[q_1,q_2,...,q_k]\in\mathbb{R}^{1\times k}
q=[q1,q2,...,qk]∈R1×k,此例中
k
=
4
k=4
k=4,共4维,共5个fearture map。
第一层胶囊层:
由
k
=
4
k=4
k=4个胶囊组成
输入:5个fearture map,一个feature map表示为
q
=
[
q
1
,
q
2
,
.
.
.
,
q
k
]
∈
R
k
\mathbf{q}=[q_1,q_2,...,q_k]\in\mathbb{R}^{k}
q=[q1,q2,...,qk]∈Rk
输出:
u
=
[
u
1
,
u
2
,
.
.
.
,
u
k
]
\mathbf{u}=[u1,u2,...,u_k]
u=[u1,u2,...,uk],其中,
u
i
∈
R
N
×
1
\mathbf{u}_i\in\mathbb{R}^{N\times1}
ui∈RN×1
Routing process:
输入:
u
=
[
u
1
,
u
2
,
.
.
.
,
u
k
]
\mathbf{u}=[u1,u2,...,u_k]
u=[u1,u2,...,uk]
输出:
u
^
i
=
W
i
u
i
\hat{\mathbf{u}}_i=\mathbf{W}_i\mathbf{u}_i
u^i=Wiui,
W
i
∈
R
d
×
N
\mathbf{W}_i\in\mathbb{R}^{d\times N}
Wi∈Rd×N,
u
i
∈
R
N
×
1
\mathbf{u}_i\in\mathbb{R}^{N\times1}
ui∈RN×1,
u
^
i
∈
R
d
×
1
\hat{\mathbf{u}}_i\in\mathbb{R}^{d\times1}
u^i∈Rd×1;
s
=
∑
i
c
i
u
^
i
\mathbf{s}=\sum_ic_i\hat{\mathbf{u}}_i
s=∑iciu^i,
s
∈
R
d
×
1
\mathbf{s}\in\mathbb{R}^{d\times1}
s∈Rd×1;
第二层胶囊层:
输入:
s
=
∑
i
c
i
u
^
i
\mathbf{s}=\sum_ic_i\hat{\mathbf{u}}_i
s=∑iciu^i,
s
∈
R
d
×
1
\mathbf{s}\in\mathbb{R}^{d\times1}
s∈Rd×1;
输出:
e
=
s
q
u
a
s
h
(
s
)
\mathbf{e}=squash(\mathbf{s})
e=squash(s),
s
q
u
a
s
h
(
s
)
=
∣
∣
s
∣
∣
2
1
+
∣
∣
s
∣
∣
2
s
∣
∣
s
∣
∣
squash(\mathbf{s})=\frac{||\mathbf{s}||^2}{1+||\mathbf{s}||^2}\frac{\mathbf{s}}{||\mathbf{s}||}
squash(s)=1+∣∣s∣∣2∣∣s∣∣2∣∣s∣∣s,耦合系数
c
i
c_i
ci 由路由过程决定;
打分函数:输出向量
e
\mathbf{e}
e 的长度作为输入三元组的分数。打分函数如下:
f
(
s
,
r
,
o
)
=
∣
∣
c
a
p
s
n
e
t
(
g
(
[
v
s
,
v
r
,
v
o
]
∗
Ω
)
)
∣
∣
f(s,r,o)=||capsnet(g([v_s,v_r,v_o]*\Omega))||
f(s,r,o)=∣∣capsnet(g([vs,vr,vo]∗Ω))∣∣
损失函数:对数损失函数,在KG embedding中很常见。