Note:Transfrom的基本原理梳理,以及Transformer优化思路简介
参考文章:Linformer、ReFormer等
Transfrom基本知识介绍
Transformer的基础结构
如上图所示,transformer主要由两个主要模块组成(encoder+decoder),两个模块中又由三个模块组成(multHead Self-Attention、Feed Forward以及Add&Norm):
Encoder和Decoder的整体结构相似,但Decoder中的K和V均使用了Encoder的输入。其基本思想在于:
-
Encoder的任务:学习;学习输入信息的高纬特征,抽象出输入信息(序列)之间的相关性,目的在于特征抽取。(某种意义上,可以理解为Encoder学习到了一个非常丰富的高纬度的知识库——映射关系);
-
Decoder的任务:生成;在Encoder的学习到的高维特征(知识库)中,通过Decoder端的输入到encoder的高维“知识库”中查找需要“生成的内容”。
除了上述的主要模块外,transformer在seq特征输入multHead Self-Attention前,还引入了positional Embedding模块。原因是:self-attention虽然能够学习到序列之间的关系,但是完全忽略了序列中的先后顺序关系,所以映入positional Embedding模块给模型加入“先验”的序列关系。
Transformer的基础思想:Transformer的主要是因为其核心模块self-attention的引入。产生self-attention的主要原因是:在RNN、LSTM以及GRU等研发过程中,但是在解决长序列和训练时长等问题时,往往由于梯度消失问题,使得模型训练结果不尽如人意;而attention走的思路和RNN等原始的方法不同,它不再依赖于前面序列训练传入后续后续节点,而是直接计算节点和序列其他节点的相关性。
Transformer的公式拆解& 介绍
X = L a y e r N o r m ( F s ( X ) ) + X X=LayerNorm(Fs(X))+X X=LayerNorm(Fs(X))+X
Transformer主要由3个主要模块组成
- MultHead Self-Attention (
F
s
(
X
)
Fs(X)
Fs(X)模块)
A h = S o f t m a x ( a ∗ Q h K h t ) V h Ah = Softmax(a*Q_hK_h^t)V_h Ah=Softmax(a∗QhKht)Vh
其中 Q h = X W q Q_h=XW_q Qh=XWq的维度为 N ∗ d H N * \frac{d} {H} N∗Hd,其中 W q W_q Wq的维度为 d ∗ d H d*\frac{d}{H} d∗Hd,X的维度为 N ∗ L ∗ d N*L*d N∗L∗d;其他两个变量维度和 Q h Q_h Qh相同。 - Position-wise Feed-forward Layers
F 2 ( R e l u ( F 1 ( X A ) ) ) F_2(Relu(F_1(X_A))) F2(Relu(F1(XA))) - Putting it all together:将前两步进行合并
X A = L a y e r N o r m ( M u l t i h e a d A t t e n t i o n ( X , X ) ) + X X B = L a y e r N o r m ( P o s i t i o n F F N ( X A ) ) + X A X_A = LayerNorm(MultiheadAttention(X,X))+X X_B = LayerNorm(PositionFFN(X_A))+X_A XA=LayerNorm(MultiheadAttention(X,X))+XXB=LayerNorm(PositionFFN(XA))+XA
Transfromer存在的问题
Transformer由于存在大量的矩阵运算,所以Transformer在计算资源和时间复杂度上都有更高花销。
- 在Self-Attention的计算中,其矩阵计算需要消耗 N 2 N^2 N2的时间复杂度和内存;故在Transformer的使用上,序列的长度受到计算资源和时间的限制;
- 在PositionFNN的计算中,两层向前传播网络结构,其计算成本仍然和序列长度呈线性相关的状态。
Transformer当前改进思路
Efficient Transformers —— 对Transformer模型进行改进以提高其效率的一类模型。Efficient Transformers一般可以分为以下几类:
- Fixed Patterns(FP):通过限制self-attention的视野,从而简化transformer过程,减小N值。eg:1、Blockwise Patterns——将输入序列来进行分块,从而减少transformer的视野;2、Strided Patterns——使用固定的间隔来减少N值;3、Compressed Patterns——使用池化的方式来减少N值。
- Combination of Patterns(CP):组合模式,通过两种或多种不同的访问模式来提高覆盖范围;eg:将Strided Patterns和Compressed Patterns的方法组合。该方式可以大大减少内存复杂度,并提高注意力机制的整体覆盖范围。
- Learnable Patterns(LP):学习模式,通过引入可学习的模式来改进Transformer的效率。eg:使用路由注意力(Routing Transformers)或基于核函数(kmeans等)的方法来减少计算量。
- Low-Rank Methods: 相关论文(Linformer:Self-Attention with Linear Complexity)——简单理解,通过共享
W
k
W_k
Wk 和
W
v
W_v
Wv矩阵,同时在K和V进入attention前加入low_rank矩阵,从而使得计算的时间复杂度由
O
(
n
2
)
O(n^2)
O(n2)降低到
O
(
n
k
)
O(nk)
O(nk)
Low-Rank个人思路解析:原有的Transformer上,由于其公式设计:
h e a d = A t t e n t i o n ( Q W q , K W k , V W v ) = s o f t m a x ( Q W q ∗ ( K W k ) t √ d k ) V W v head = Attention(QW^q,KW^k,VW^v)=softmax(\frac{QW^q*(KW^k)^t}{√d_k})VW^v head=Attention(QWq,KWk,VWv)=softmax(√dkQWq∗(KWk)t)VWv
其中令 P = s o f t m a x ( Q W q ∗ ( K W k ) t √ d k ) P=softmax(\frac{QW^q*(KW^k)^t}{√d_k}) P=softmax(√dkQWq∗(KWk)t),一般的transformer中P的维度为 n ∗ n n*n n∗n,在最终计算时间复杂度的时候,其复杂度则为 O ( n 2 ) O(n^2) O(n2)。但是在实际应用中,通过对矩阵P的奇异值分解,通过计算n维度和奇异值的关系,可以知道通过低秩 k k k,就可以反应高的奇异值,即:低秩的k就可以在反应模型较多的信息。
基于这种思考,利用一个矩阵L来降低P和V在计算过程中产生的 O ( n 2 ) O(n^2) O(n2)时间复杂度,将时间复杂度降低到 O ( n k ) O(nk) O(nk),改进点:将transformer改进为以下公式:
A t t e n t i o n = s o f t m a x ( Q W q ∗ ( L K W k ) t √ d k ) F V W v Attention = softmax(\frac{QW^q*(LKW^k)^t}{√d_k})FVW^v Attention=softmax(√dkQWq∗(LKWk)t)FVWv
网络结构:
Transfromer改进思路详解——ReFormer
相关论文:https://arxiv.org/abs/2001.04451
相关博客:https://blog.csdn.net/mengzhengnan/article/details/108545703
ReFormer这类算法的思想的基础数据原理,主要来源于两个数学理论:
- LSH(局部敏感hash):目的是为了解决两个vector在高维空间计算相似度等时,其在时间复杂度上过大的问题
O
(
d
n
)
O(dn)
O(dn);其基本思想是——从LSH函数族(eg:K-Shingling、MinHashing)等中选择hash函数,将每个数据点哈希到哈希表中,在查找最近邻居时,LSH只扫描与查询点具有相同哈希索引的点。LSH算法的假设:若两个向量在原有的数据空间是相似的,那么分别经过哈希函数转换以后的他们也具有很高的相似度;相反,若它们本身是不相似的,那么经过转换后它们应仍不具有相似性。
ReFormer算法中使用的LSH attention:cross-polytope LSH(当然也可以使用其他的LSH)—— 该方法主要研究单位球面上欧几里德距离的LSH。 - 可逆残差网络(The Reversible Residual Network):目的是解决在神经网络反向传播中,需要存储网络的中间结果来计算梯度,从而其对内存的消耗与网络单元数成正比,也就是网络越深越广,其对内存的消耗越大。而可逆残差神经网络:当前层的激活结果可以由下一层的结果计算得到,即若知道网络层的最后结果,就可以反算出每一层的中间结果,从而减少内存的消耗。从实验结果来看:可逆残差网络的表现相较于残差网络的表现,其结果并没有太大的下降,可以说是旗鼓相当的。
ReFormer的目的是使得transformer更加高效,传统的transformer存在以下问题:
- attention的内存、计算复杂度是文本长度L的平方复杂度即 O ( L 2 ) O(L^2) O(L2),这样transformer在处理超长文本时往往是不可接受的,即token存在限制;
- 原生的transformer训练需要的内存是层数的倍数(因为反向传播需要存储每层的结果从而来计算误差的梯度);
- 在transformer结构中,由于feed-forward层的存在,中间隐藏层基本是attention输出层的两倍,这样在反向误差传播中,由于要保持中间层的结果,其需要的空间复杂度会线性提高。
ReFormer的解决方案:
- 和大多数思路类似,在优化时间复杂度的过程中, Q Q Q中的“子项”一般只和几个重要的 K K K有关:所以如何从 K K K中找到和 Q Q Q比较相似的列是降低attention过程中的时间复杂度的关键——ReFormer的想法是:利用LSH(局部近似hash)快速查找和 K K K有关的 Q Q Q,从而将时间复杂度从 O ( L 2 ) O(L^2) O(L2)降低为 O ( L ∗ l o g ( L ) ) O(L*log(L)) O(L∗log(L))。
- 空间复杂度产生的主要原因是:在反向传播的过程中,需要保存中间层的结果,从而通过反向误差传播来更新结果——ReFormer的思路:通过可逆残差网络的想法来去掉对中间结果的保存,只需要保存最终输出的结果即可。
ReFormer中的attention
- ReFormer中attention公式:
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
其中: m ( j , P i ) m(j,P_i) m(j,Pi)表示一个mask,即:当 k j k_j kj不在 q i q_i qi的相似(桶)中, m ( j , P i ) = ∞ m(j,P_i)=\infty m(j,Pi)=∞,表示该列不进入计算,反之 m ( j , P i ) = 0 m(j,P_i)=0 m(j,Pi)=0; z ( i , P i ) z(i,P_i) z(i,Pi)表示归一化函数,代表softmax函数。
在上文中,关键在于 P i P_i Pi集合的计算,ReFormer使用LSH的方法计算该集合。针对在LSH时,可能发生的两个问题:
1、若q和k中,所有的值均分到一个桶中,则ReFormer的时间复杂度和传统的TransFormer相同 —— 使用分块的方式解决;
2、若q和k中,所有的值均未分到一个桶中,即所有的点相似度均较低—— 共享 Q Q Q和 K K K的矩阵。
ReFormer中 Q K T QK^T QKT计算步骤详解:
1、进行Hash值计算:用hash进行分桶。时间复杂度为 O ( L ) O(L) O(L)
2、按桶排序进行排序,将相同的桶放在一起。时间复杂度为 O ( L ∗ l o g ( L ) ) O(L*log(L)) O(L∗log(L))
3、分块:为了防止所有的hash值均被分到同一个桶中,对序列进行分块处理。每个分块的块内长度为 c c c
4、计算attention:相同块内的互相attention,若不同块的第一个位置属于前面的块,那么需要和前面的块均关注该块。即:
P i = j : [ s i m ] − 1 < = [ s j m ] < = [ s i m ] P_i = {j:[\frac{s_i}{m}]-1<=[\frac{s_j}{m}]<=[\frac{s_i}{m}]} Pi=j:[msi]−1<=[msj]<=[msi]
上文中,时间复杂度(暂不考虑多头的影响)为 O ( n r ∗ c ∗ L ) O(n_r*c*L) O(nr∗c∗L)其中 n r n_r nr为使用的hash函数数量,所以当 n r ∗ c < L n_r*c<L nr∗c<L时,ReFormer才会比传统的transformer更加高效,故:在处理超长文本时,ReFormer的效率更加高效。
ReFormer中的可逆网络——解决空间复杂度问题
可逆残差网络:
在ReFormer中,有:
F
(
x
)
=
a
t
t
e
n
t
i
o
n
(
x
2
)
G
(
x
)
=
f
e
e
d
w
a
r
d
(
x
1
)
F(x)=attention(x_2) \quad G(x)=feedward(x_1)
F(x)=attention(x2)G(x)=feedward(x1)
则ReFormer中的可逆残差网络变为:
Y
1
=
x
1
+
a
t
t
e
n
t
i
o
n
(
x
2
)
Y
2
=
x
2
+
f
o
r
w
a
r
d
(
y
1
)
Y_1=x_1+attention(x_2) \quad Y2=x2+forward(y_1)
Y1=x1+attention(x2)Y2=x2+forward(y1)
由上面公式可知,
x
1
x_1
x1和
x
2
x_2
x2的结果,可以通过
Y
1
Y_1
Y1和
Y
2
Y_2
Y2反向计算出结果。因为可逆残差网络具有该种特性,所以训练的时候只需保存最后一层的输出
Y
Y
Y,就可以轻易求出输入
X
X
X,也就是前一层的输出,这样就可以空间复杂度从多层变为单层。