赞
踩
普通哈希映射是直接进行映射,没有考虑元素之间的联系,无法预知相似元素的位置信息,而局部敏感哈希则将元素相似性考虑进去,在进行映射时相似的元素位置接近或者会被分进同一个bucket中,这样就方便进行检索和数据提取,大大减少了时间的消耗。
Reformer局部敏感哈希采用的方法是球投影点随机旋转,三种不同的旋转投影作为三种哈希映射,每个点经过映射后会得到3个不同的哈希映射值,当三种映射结果一致时(下中的点x和y)则会被分到同一个bucket中。
在Transformer中,核心就在于Attention:
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
⋅
V
Attention(Q,K,V)=softmax(\frac {QK^T}{\sqrt d_k})·V
Attention(Q,K,V)=softmax(d
kQKT)⋅V
Q
Q
Q: L Queries of size d, to attend for
K
K
K: K Keys of size d, to attend to
V
V
V: L Values of size d
L
L
L: length of sequence
d
d
d: depth of attention
Q
K
T
QK^T
QKT的复杂度为
O
(
L
2
)
O(L^2)
O(L2),当序列长度过长时就会难以处理。
在Reformer中,进行运算时不是对所有的
Q
、
K
Q、K
Q、K进行直接运算,而是考虑同
Q
Q
Q比较接近的
K
K
K来进行运算。
LSH在运算过程中,选择Q=K,有如下设置:
k
j
=
m
e
a
n
(
q
j
)
∣
∣
q
j
∣
∣
k_j=\frac {mean(q_j)}{||q_j||}
kj=∣∣qj∣∣mean(qj)做一个映射,这个映射被称为
Q
K
−
a
t
t
e
n
t
i
o
n
QK-attention
QK−attention,即在一个小范围内进行权重注意力计算。
采用旋转投影映射划分成多个bucket,但是每个bucket中的元素可能会不均衡,因此选择连续并行查询运算的方式,运算chunk的长度为每个bucket平均长度的两倍,并且在运算时考虑当前chunk和前一个chunk所包含的内容,如下图左所示。
LSH哈希映射是通过多轮哈希映射取并集结果:
o
i
=
∑
j
∈
P
i
′
e
x
p
(
q
i
⋅
k
j
−
m
(
j
,
P
i
)
−
z
(
i
,
P
i
)
)
v
j
o_i=\sum_{j \in P'_i} exp(q_i·k_j-m(j,P_i)-z(i,P_i))v_j
oi=j∈Pi′∑exp(qi⋅kj−m(j,Pi)−z(i,Pi))vj
w
h
e
r
e
where
where
m
(
j
,
P
i
)
=
{
∞
,
i
f
j
∉
P
i
0
,
j
∈
P
i
m(j,P_i)=
其中
P
i
P_i
Pi是和i接近的元素的集合。
局部敏感哈希
在正常的编解码过程中,由于要进行反向传播,因此每一层中间结果需要进行保留存储,如(a),因此就有了如图(b)、(c)所示的思想,利用这种流程,中间结果都可以计算出来,不需要进行存储,用运算来代替空间存储。
比较厚的层仍会占用大量内存,前馈层的计算在序列中是完全独立的,所以可以分块处理,分chunk分开进行运算。
参考视频:
reformer 一个改进的transformer模型
参考博客:
解读Reformer
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。