, 则 缩放点积注意力 (scaled dot-product attention)评分函数为:a ( q , k ) = q ⊤ k / d a(\mathbf q, \mathbf k) = \mathbf{q}^\top \mathbf{k} /\sqrt{d} a ( q , k ) = q ⊤ k / d
考虑小批量计算时,整个注意力机制的输出可以写成:
s o f t m a x ( Q K ⊤ d ) V \mathrm{softmax}\left(\frac{\mathbf Q \mathbf K^\top }{\sqrt{d}}\right) \mathbf V softmax ( d Q K ⊤ ) V
向量点积之所以能表示相似度,是因为其源头是余弦距离 (不考虑方向)
多头注意力机制 在实践中,为了捕捉不同方面的信息,将注意力机制分为多个头,形成多个子空间表示(representation subspaces)是有意义的。
用独立学习得到的h h h 组不同的 线性投影 (linear projections)来变换查询、键和值。 然后将它们并行地 送到注意力池化中。 最后,将这h h h 个输出拼接在一起, 并且通过另一个可以学习的线性投影进行变换, 以产生最终输出。 这种设计就被称为 多头注意力 (Multi-Head Attention)。
第i i i 个 head 的查询、键和值线性变换后的结果如下:
以矩阵形式 给出,此处暂且忽略板书时对符号的加粗
Q i = Q W i Q , K i = K W i K , V i = V W i V Q_i=QW_i^Q,\;K_i=KW_i^K,\;V_i=VW_i^V Q i = Q W i Q , K i = K W i K , V i = V W i V
从而第i i i 个 head 的输出为:
h e a d i = A t t e n t i o n ( Q i , K i , V i ) A t t e n t i o n ( Q i , K i , V i ) = s o f t m a x ( Q i K i ⊤ d ) V i \begin{aligned} \mathrm{head}_i&=\mathrm{Attention}(Q_i,K_i,V_i)\\ \mathrm{Attention}(Q_i,K_i,V_i)&=\mathrm{softmax}\left(\frac{Q_iK_i^\top }{\sqrt{d}}\right)V_i \end{aligned} head i Attention ( Q i , K i , V i ) = Attention ( Q i , K i , V i ) = softmax ( d Q i K i ⊤ ) V i
最终的多头注意力输出为:
A t t e n t i o n ( Q , K , V ) = C o n c a t ( h e a d 1 , . . , h e a d i , . . ) W O \mathrm{Attention}(Q,K,V)=\mathrm{Concat}\left(\mathrm{head}_1,..,\mathrm{head}_i,..\right)W^O Attention ( Q , K , V ) = Concat ( head 1 , .. , head i , .. ) W O
自注意力机制 自注意力机制 (self-attention)也被称为内部注意力(intra-attention),顾名思义就是对输入数据自身进行和传统注意力机制类似的处理。特别地,有q = k = v \bf q=k=v q = k = v 。
如果输入小批量样本X = { x 1 , . . . , x n } ∈ R n × d , x i ∈ R d {\bf X}=\{\boldsymbol x_1,...,\boldsymbol x_n\}\in\Bbb R^{n\times d},\;\boldsymbol x_i\in\Bbb R^d X = { x 1 , ... , x n } ∈ R n × d , x i ∈ R d ,那么一个自注意力机制任务中,任意一个键值对可以表示成( x i , x i ) (\boldsymbol x_i,\boldsymbol x_i) ( x i , x i ) ,由其自身构成。从而当查询q = x i q=\boldsymbol x_i q = x i 时,有:
y i = f ( x i , ( x 1 , x 1 ) , ( x 2 , x 2 ) , . . . , ( x n , x n ) ) ∈ R d \boldsymbol y_i=f\left(\boldsymbol x_i,\;(\boldsymbol x_1,\boldsymbol x_1),(\boldsymbol x_2,\boldsymbol x_2),...,(\boldsymbol x_n,\boldsymbol x_n)\right)\in\Bbb R^d y i = f ( x i , ( x 1 , x 1 ) , ( x 2 , x 2 ) , ... , ( x n , x n ) ) ∈ R d
其中,f f f 是注意力机制的一般范式。值得注意的是,通过注意力机制映射完之后的y i \boldsymbol y_i y i 的尺寸与输入一致。
实际中的自注意力 通常情况下,我们并不是直接取q = k = v \bf q=k=v q = k = v ,而是对原始输入x i \boldsymbol x_i x i 进行3种仿射变换,依次得到:q i = W q x i , k i = W k x i , v i = W v x i , i = 1 , . . , n \boldsymbol q_i=W^q\boldsymbol x_i,\;\boldsymbol k_i=W^k\boldsymbol x_i,\;\boldsymbol v_i=W^v\boldsymbol x_i,\quad i=1,..,n q i = W q x i , k i = W k x i , v i = W v x i , i = 1 , .. , n .
然后再进行:
y i = f ( q i , ( k 1 , v 1 ) , ( k 2 , v 2 ) , . . . , ( k n , v n ) ) ∈ R d \boldsymbol y_i=f\left(\boldsymbol q_i,\;(\boldsymbol k_1,\boldsymbol v_1),(\boldsymbol k_2,\boldsymbol v_2),...,(\boldsymbol k_n,\boldsymbol v_n)\right)\in\Bbb R^d y i = f ( q i , ( k 1 , v 1 ) , ( k 2 , v 2 ) , ... , ( k n , v n ) ) ∈ R d
即是用q i \boldsymbol q_i q i 作为查询,对所有的键值对进行注意力评分,然后加权得到第i i i 个输入的输出结果。如下图所示:
同样地,我们可以并行地 计算出和x 1 , . . . , x n \boldsymbol x_1,...,\boldsymbol x_n x 1 , ... , x n 同样多的输出y 1 , . . . , y n \boldsymbol y_1,...,\boldsymbol y_n y 1 , ... , y n 。而且这些输出中的每一个都考虑到了所有的输入。其矩阵形式如下:
SelfAttention ( X ) = Attention ( X W q , X W k , X W v ) = softmax ( X W q W k ⊤ X ⊤ d k ) X W v \begin{aligned} \text{SelfAttention}(\boldsymbol{X}) =&\, \text{Attention}(\boldsymbol{X}\boldsymbol{W}_q, \boldsymbol{X}\boldsymbol{W}_k, \boldsymbol{X}\boldsymbol{W}_v)\\ =&\, \text{softmax}\left(\frac{\boldsymbol{X}\boldsymbol{W}_q \boldsymbol{W}_k^{\top}\boldsymbol{X}^{\top}}{\sqrt{d_k}}\right)\boldsymbol{X}\boldsymbol{W}_v& \end{aligned} SelfAttention ( X ) = = Attention ( X W q , X W k , X W v ) softmax ( d k X W q W k ⊤ X ⊤ ) X W v
奠基之作 注意力机制的集大成者是如今赫赫有名的 Transformer,本文因聚焦在对于其中注意力机制的探讨,所以便略过了其在该模型中的使用。Transformer 在本站文章中有展开梳理,并回顾了由其带来的大模型热潮。
PyTorch 实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 class Attention (nn.Module): def __init__ (self, dim, heads = 8 , dim_head = 64 , dropout = 0. ): ''' dim: 输入维度 heads: 多头注意力的头的个数 dim_head: 每个头的输出维度 dropout: dropout比率 ''' super ().__init__() inner_dim = dim_head * heads project_out = not (heads == 1 and dim_head == dim) self.heads = heads self.scale = dim_head ** -0.5 self.norm = nn.LayerNorm(dim) self.attend = nn.Softmax(dim = -1 ) self.dropout = nn.Dropout(dropout) self.to_qkv = nn.Linear(dim, inner_dim * 3 , bias = False ) self.to_out = nn.Sequential( nn.Linear(inner_dim, dim), nn.Dropout(dropout) ) if project_out else nn.Identity() def forward (self, x ): x = self.norm(x) qkv = self.to_qkv(x).chunk(3 , dim = -1 ) q, k, v = map (lambda t: rearrange(t, 'b n (h d) -> b h n d' , h = self.heads), qkv) dots = torch.matmul(q, k.transpose(-1 , -2 )) * self.scale attn = self.attend(dots) attn = self.dropout(attn) out = torch.matmul(attn, v) out = rearrange(out, 'b h n d -> b n (h d)' ) return self.to_out(out)
稀疏 Attention 从理论上来讲,Self Attention的计算时间和显存占用量都是O ( n 2 ) \mathcal{O}(n^2) O ( n 2 ) 级别的(n n n 是序列长度),也就是说 Self Attention具有二次复杂性 的问题。这就意味着如果序列长度n n n 很大时,Transformer模型的计算量难以承受。 于是,研究Attention的一些“为节约而生”——既节约时间,也节约显存的变体也就成为了一种研究方向。
Self Attention 的二次复杂性主要来源于它要对序列中的任意两个向量都计算相关度,最后生成n × n n\times n n × n 的相关性矩阵。所以,如果要节省显存,加快计算速度,那么一个基本的思路就是减少关联性的计算,也就是认为每个元素只跟序列内的一部分元素相关,这就是稀疏Attention 的基本原理。
上图列出了在减少计算性上已有的部分工作,命名方式参考了苏剑林苏神 。
Atrous Self Attention 很显然参考了空洞卷积(Atrous Convolution),强行要求每个元素只跟它相对距离为k , 2 k , 3 k , … k,2k,3k,… k , 2 k , 3 k , … 的元素关联,其中k > 1 k>1 k > 1 是预先设定的超参数。Local Self Attention 约束每个元素只与前后k k k 个元素以及自身有关联,这其实反而违背了“注意力机制在 CV 界具有全局性”的特点,把局部性由引入回来了。Sparse Self Attention 由 OpenAI 提出,直接将Atrous Self Attention和Local Self Attention合并在一起,这样一来Attention就具有“局部紧密相关和远程稀疏相关 ”的特性,这对很多任务来说可能是一个不错的先验,因为真正需要密集的长程关联的任务事实上是很少的。虽然这种思路切实能提高效率,但是也存在两个明显的不足之处:
如何选择要保留的注意力区域,这是人工主观决定的,带有很大的不智能性; 需要从编程上进行特定的设计优化,才能得到一个高效的实现,不容易推广。 还有一些经典工作也是延续了稀疏化矩阵的思想展开的,比如 Longformer 和 BigBird 等。
📃 Reformer: The Efficient Transformer
Reformer 致力于解决传统 Transformer 的以下三种问题在工程中面临的挑战:
Attention 计算的二次复杂性(使用 LSH Attention); 多层 Transformer Block 在反向传播时产生的内存开销(使用 RevNet); 前馈网络的深度造成的内存开销(分块计算). Reformer 通过引入 局部敏感哈希 (Locality-Sensitive Hashing, LSH)算法来解决二次复杂性问题。
LSH 的背景是实现海量高维数据的近似最近邻快速搜索 (Approximate Nearest Neighbor, ANN),由 Indyk-Motwani 在1998年引入。想象一下,当我们需要寻找相似的向量对时,即使在样本量不高的数据集上,比较所有向量所需的计算量至多也是O ( N ) O(N) O ( N ) 的。如果引入 向量索引 ,那么最佳排序方法则优化为了对数线性时间复杂度O ( N log N ) O(N\log N) O ( N log N ) 。如果我们可以接受近似,即可以接受搜索得到的向量不一定是全局最近邻的,能否还可以找到一种 减少比较次数 的方法呢?甚至理想情况下,我们只想比较我们认为是潜在匹配的向量(候选对) ,而 LSH 则实现了这样的想法.
LSH 的核心思想是:寻求一种哈希函数,使得原本的向量空间中就相邻和接近的向量通过哈希映射之后还能有很大可能性被放入同一个桶中 。这样的哈希函数就是“局部敏感”的。 用数学表示如下:对于一个测度d d d (即相似性函数)和其对应空间中的两个向量p , q \boldsymbol{p},\boldsymbol{q} p , q 有:
Pr [ h ( p ) = h ( q ) ] ≈ d ( p , q ) \Pr[h(\boldsymbol{p})=h(\boldsymbol{q})]\approx d(\boldsymbol{p},\boldsymbol{q}) Pr [ h ( p ) = h ( q )] ≈ d ( p , q )
其中h ( ⋅ ) h(·) h ( ⋅ ) 为一个局部敏感哈希函数。
【定义 】一个( r , R , α , β ) -sensitive (r,R,\alpha,\beta)\text{-sensitive} ( r , R , α , β ) -sensitive 的哈希函数族H H H 中的任意函数h ∈ H h\in H h ∈ H 对于任意p , q ∈ R d \boldsymbol{p},\boldsymbol{q}\in\mathbb{R}^d p , q ∈ R d 和给定常数r < R , 0 < α < β < 1 r<R,\; 0<\alpha<\beta<1 r < R , 0 < α < β < 1 满足下列约束:
如果p ∈ Ball ( q , r ) \boldsymbol{p}\in \text{Ball}(\boldsymbol{q},r) p ∈ Ball ( q , r ) ,则Pr [ h ( p ) = h ( q ) ] ≥ α \Pr[h(\boldsymbol{p})=h(\boldsymbol{q})]\geq\alpha Pr [ h ( p ) = h ( q )] ≥ α ; 如果p ∈ Ball ( q , R ) \boldsymbol{p}\in \text{Ball}(\boldsymbol{q},R) p ∈ Ball ( q , R ) ,则Pr [ h ( p ) = h ( q ) ] ≤ β \Pr[h(\boldsymbol{p})=h(\boldsymbol{q})]\leq\beta Pr [ h ( p ) = h ( q )] ≤ β ; 说人话就是,向量p \boldsymbol{p} p 如果与 向量q \boldsymbol{q} q 的距离在r r r 到R R R 之间,那么它们映射到同一个桶的概率就在α \alpha α 到β \beta β 之间。
为了减少漏报率(就是本来很相近的两条数据被认为是不相似的),一种常用的解决方案是采用用多个哈希函数(即使用哈希表)来映射向量,然后对结果进行指定操作(AND、OR、XOR 等)从而得到最终的结果。
下图展示了一个在二维空间中随机 划分超平面,然后使用sign ( p ⊤ H ) \text{sign}(\boldsymbol{p}^\top H) sign ( p ⊤ H ) 作为哈希函数来区分不同向量的 LSH 示意图。
Reformer 引入了 Angular LSH 来构造哈希,简单来说就是把d d d 维空间上的点投影到单位球上,球被预先划分好了多个区域。然后对点进行随机旋转之后,这些点所属的区域编号就是其对应的桶。
上图展示了一个在 2D 平面上经过 3次随机选择后,两个点x , y x,y x , y 所得的hash值。可以看出,原本靠得更近的两个点所得 hash 值相同,即划分到了同一个桶中。
最终,将这种机制应用于 Attention 中,即不计算Q Q Q 和K K K 矩阵中所有向量的注意力,而是做以下工作:
计算Q Q Q 和K K K 矩阵 hash 值; 只计算相同哈希桶中的k k k 和q q q 向量的标准注意力值。 一个包括原始注意力和自注意力的示例如下图所示:
【总结 】相比前述稀疏Attention,Reformer解决了它的第一个缺点,即实现了自动选择需要保留注意力的区域。但是它依然有难以实现这一缺点,具体来说,要实现LSH形式的Attention比标准的Attention复杂得多,而且对可逆网络重写反向传播过程对普通读者来说更是遥不可及。
更多相关文献解读:💡Illustrating the Reformer. 🚊 ️ The efficient Transformer | by Alireza Dirafzoon | Towards Data Science | 中文翻译 Reformer: 局部敏感哈希、可逆残差和分块计算带来的高效 - 知乎
Linear Attention 📃 Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention
Self Attention具有二次复杂性 问题追根溯源还是绕不开矩阵相乘上,即
softmax ( Q K ⊤ ) V \begin{aligned} \operatorname{softmax}\left(QK^\top\right)V \end{aligned} softmax ( Q K ⊤ ) V
其中的Q K ⊤ QK^\top Q K ⊤ 。简单起见我们没有显式地写出Attention的缩放因子。
而事实上,如果没有 Softmax ,那么就是三个矩阵连乘Q K ⊤ V QK^\top V Q K ⊤ V . 由于矩阵乘法满足结合律 ,所以我们可以先计算K ⊤ V K^\top V K ⊤ V ,得到一个d × d d\times d d × d 的矩阵,然后再用Q Q Q 左乘它。 而由于d ≪ n d \ll n d ≪ n ,所以这样一来,大致的复杂度就只有O ( n ) \mathcal{O}(n) O ( n ) 了。因为仅有左乘的那一步占主导。
论文通过引入新的核函数 代替原本的高斯核以达到消去 softmax 的目的。
Attention ( Q , K , V ) i = ∑ j = 1 n K ( q i − k j ) v j ∑ j = 1 n K ( q − k j ) , \text{Attention}(Q,K,V)_i =\frac{\sum_{j=1}^n \mathcal K(q_i - k_j) v_j}{\sum_{j=1}^n \mathcal K(q - k_j)}, Attention ( Q , K , V ) i = ∑ j = 1 n K ( q − k j ) ∑ j = 1 n K ( q i − k j ) v j ,
具体来说,就是把上式中的核函数用新的相似性度量方式sim ( q i , k i ) \text{sim}(q_i,k_i) sim ( q i , k i ) 代替,并且为了保留和Attention相似的分布特性,我们要求核函数的值域非负 。
论文作者提出继续用内积做相似性度量方式,但是由于两个向量的内积无法保证结果非负,所以又在外面套了一层激活函数然后再让两个向量做内积 。即:
sim ( q i , k i ) = ψ ( q i ) ⊤ ϕ ( k i ) \text{sim}(q_i,k_i)=\psi(q_i)^\top\phi(k_i) sim ( q i , k i ) = ψ ( q i ) ⊤ ϕ ( k i )
其中,只要保证激活函数的值域非负即可。 具体来说,在该论文中选取了ψ ( x ) = ϕ ( x ) = elu ( x ) + 1 \psi(x)=\phi(x)=\text{elu}(x)+1 ψ ( x ) = ϕ ( x ) = elu ( x ) + 1 .
另一篇更早的文章《Efficient Attention: Attention with Linear Complexities》 也有类似的思考,不过提出的方案是 “各自给Q , K Q,K Q , K 加 Softmax,而不是Q K ⊤ QK^\top Q K ⊤ 算完之后才加Softmax”。如果将 Softmax 看作是归一化后的激活函数的话,该方法其实就是本节论文思想的一种特殊情况。
那么,论文标题说的 Transformer 作为 RNN 实现自回归又从何谈起呢?实际上当做了上述的线性化处理之后,
待更:线性Attention的探索:Attention必须有个Softmax吗? - 科学空间|Scientific Spaces (kexue.fm)
📃Rethinking Attention with Performers
参考前面几节的内容,我们知道,从公式上将注意力机制线性化的一般“套路”就是给出合适的相似性度量sim ( q , k ) \text{sim}(q,k) sim ( q , k ) 。而 Performer 指出可以通过随机投影,在不损失精度 的情况下,将Attention的复杂度线性化 。
考虑到不损失精度,Performer 沿用了 Transformer 的相似性度量方式,即:
sim ( q , k ) = e q ⋅ k \text{sim}(q,k)=e^{q\cdot k} sim ( q , k ) = e q ⋅ k
然后它希望将复杂度线性化,那就是需要找到新的q ~ , k ~ \tilde{q},\tilde{k} q ~ , k ~ ,使得:
e q ⋅ k ≈ q ~ ⋅ k ~ e^{q\cdot k}\approx\tilde{q}\cdot\tilde{k} e q ⋅ k ≈ q ~ ⋅ k ~
Performer的最大贡献就在于,它真的找到了一个非常漂亮的映射方案:
e q ⋅ k = E ω ∼ N ( ω ; 0 , 1 d ) [ e ω ⋅ q − ∥ q ∥ 2 / 2 × e ω ⋅ k − ∥ k ∥ 2 / 2 ] ≈ 1 m ( e ω 1 ⋅ q − ∥ q ∥ 2 / 2 e ω 2 ⋅ q − ∥ q ∥ 2 / 2 ⋮ e ω m ⋅ q − ∥ q ∥ 2 / 2 ) ⏟ q ~ ⋅ 1 m ( e ω 1 ⋅ k − ∥ k ∥ 2 / 2 e ω 2 ⋅ k − ∥ k ∥ 2 / 2 ⋮ e ω m ⋅ k − ∥ k ∥ 2 / 2 ) ⏟ k ~ \begin{aligned} e^{\boldsymbol{q}\cdot \boldsymbol{k}}&=\mathbb{E}_{\boldsymbol{\omega}\sim \mathcal{N}(\boldsymbol{\omega};0,\boldsymbol{1}_d)}\left[e^{\boldsymbol{\omega}\cdot \boldsymbol{q}-\Vert \boldsymbol{q}\Vert^2 / 2} \times e^{\boldsymbol{\omega}\cdot \boldsymbol{k}-\Vert \boldsymbol{k}\Vert^2 / 2}\right]\\[6pt] &\approx\underbrace{\frac{1}{\sqrt{m}}\begin{pmatrix}e^{\boldsymbol{\omega}_1\cdot \boldsymbol{q}-\Vert \boldsymbol{q}\Vert^2 / 2} \\ e^{\boldsymbol{\omega}_2\cdot \boldsymbol{q}-\Vert \boldsymbol{q}\Vert^2 / 2}\\ \vdots\\ e^{\boldsymbol{\omega}_m\cdot \boldsymbol{q}-\Vert \boldsymbol{q}\Vert^2 / 2} \end{pmatrix}}_{\tilde{\boldsymbol{q}}} \cdot \underbrace{\frac{1}{\sqrt{m}}\begin{pmatrix}e^{\boldsymbol{\omega}_1\cdot \boldsymbol{k}-\Vert \boldsymbol{k}\Vert^2 / 2} \\ e^{\boldsymbol{\omega}_2\cdot \boldsymbol{k}-\Vert \boldsymbol{k}\Vert^2 / 2}\\ \vdots\\ e^{\boldsymbol{\omega}_m\cdot \boldsymbol{k}-\Vert \boldsymbol{k}\Vert^2 / 2} \end{pmatrix}}_{\tilde{\boldsymbol{k}}} \end{aligned} e q ⋅ k = E ω ∼ N ( ω ; 0 , 1 d ) [ e ω ⋅ q − ∥ q ∥ 2 /2 × e ω ⋅ k − ∥ k ∥ 2 /2 ] ≈ q ~ m 1 e ω 1 ⋅ q − ∥ q ∥ 2 /2 e ω 2 ⋅ q − ∥ q ∥ 2 /2 ⋮ e ω m ⋅ q − ∥ q ∥ 2 /2 ⋅ k ~ m 1 e ω 1 ⋅ k − ∥ k ∥ 2 /2 e ω 2 ⋅ k − ∥ k ∥ 2 /2 ⋮ e ω m ⋅ k − ∥ k ∥ 2 /2
其中,ω ∼ N ( ω ; 0 , 1 d ) \boldsymbol{\omega}\sim \mathcal{N}(\boldsymbol{\omega};0,\boldsymbol{1}_d) ω ∼ N ( ω ; 0 , 1 d ) ,可以独立重复地采样m m m 次然后求平均来近似新的q ~ , k ~ \tilde{q},\tilde{k} q ~ , k ~ 。
相关证明和推导: 📃Performer:用随机投影将Attention的复杂度线性化 🏷️n维空间下两个随机向量的夹角分布 🔔更多的近似方案:作为无限维的线性Attention
跟Performer相比,Nyströmformer去除了线性化过程中的随机性,因为Performer是通过随机投影来达到线性化的,这必然会带来随机性。对于某些有强迫症的读者来说,这个随机性可能是难以接受的存在,而Nyströmformer则不存在这种随机性,因此也算是一个亮点。
Nyströmformer:基于矩阵分解的线性化Attention方案 - 科学空间|Scientific Spaces (kexue.fm)
VQ一下Key,Transformer的复杂度就变成线性了 - 科学空间|Scientific Spaces (kexue.fm)
FLASH FLASH:可能是近来最有意思的高效Transformer设计 - 科学空间|Scientific Spaces (kexue.fm)
番外篇 Self-attention vs. CNN 论文 《On the Relationship between Self-Attention andConvolutional Layers》
(https://arxiv.org/abs/1911.03584)指出,CNN其实就是自注意力机制的一种特例。
Synthesizer 📃Synthesizer: Rethinking Self-Attention in Transformer Models
直观上来看,自注意力机制算是解释性比较强 的模型之一了,它通过自己与自己的Attention来自动捕捉了token与token之间的关联。通过可视化注意力矩阵我们也可以直观看到这一点,因此这也是科研中用来做模型可解释性的有利可视化工具。
事实上在Transformer原论文中,就给出了如下的看上去挺合理的可视化效果:
然而,Google发表的这篇论文对自注意力机制做了一些“异想天开”的探索。
为了讨论方便,原论文将自注意力机制所需的矩阵简记如下:
A = softmax ( B ) , B = X W q W k ⊤ X ⊤ d k \boldsymbol{A}=\text{softmax}\left(\boldsymbol{B}\right),\quad\boldsymbol{B}=\frac{\boldsymbol{X}\boldsymbol{W}_q \boldsymbol{W}_k^{\top}\boldsymbol{X}^{\top}}{\sqrt{d_k}} A = softmax ( B ) , B = d k X W q W k ⊤ X ⊤
然后,这项研究直接不考虑输入数据之间的关联 ,将矩阵B ∈ R n × n \boldsymbol B\in\mathbb{R}^{n\times n} B ∈ R n × n 直接通过仿射变换获得,或者甚至直接固定其数值从一开始就随机给出。论文将这两种给出B \boldsymbol B B 的形式分别命名为 Dense 和 Random 形式。更进一步,还验证了对两种形式的低秩分解,还有混合两种形式来参与模型训练。
最终实验证明,这样训练出来的模型居然还和原版 Transformer 有着旗鼓相当 的性能,而且相应的效率更高。只可惜在迁移性上效果不佳 ,而其解释性就无从谈起了。实验结果很可能冲击了我们对自注意力机制的已有认知,值得思考。
Google新作Synthesizer:我们还不够了解自注意力 - 科学空间
Att的Bug? 待更:https://zhuanlan.zhihu.com/p/645922048 https://www.evanmiller.org/attention-is-off-by-one.html
低秩问题? Transformer升级之路:3、从Performer到线性Attention - 科学空间|Scientific Spaces (kexue.fm)
参考 动手学习深度学习|D2L Discussion - Dive into Deep Learning 详解深度学习中的注意力机制(Attention) - 知乎 拆 Transformer 系列二:Multi- Head Attention 机制详解 【李宏毅机器学习2021】自注意力机制 (Self-attention) -bilibili 为节约而生:从标准Attention到稀疏Attention - 科学空间 线性Attention的探索:Attention必须有个Softmax吗? - 科学空间 Performer:用随机投影将Attention的复杂度线性化 - 科学空间