线性Attention的探索:Attention必须有个Softmax吗?
By 苏剑林 | 2020-07-04 | 215931位读者 |众所周知,尽管基于Attention机制的Transformer类模型有着良好的并行性能,但它的空间和时间复杂度都是$\mathcal{O}(n^2)$级别的,$n$是序列长度,所以当$n$比较大时Transformer模型的计算量难以承受。近来,也有不少工作致力于降低Transformer模型的计算量,比如模型剪枝、量化、蒸馏等精简技术,又或者修改Attention结构,使得其复杂度能降低到$\mathcal{O}(n\log n)$甚至$\mathcal{O}(n)$。
前几天笔者读到了论文《Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention》,了解到了线性化Attention(Linear Attention)这个探索点,继而阅读了一些相关文献,有一些不错的收获,最后将自己对线性化Attention的理解汇总在此文中。
Attention #
当前最流行的Attention机制当属Scaled-Dot Attention,形式为
\begin{equation}Attention(\boldsymbol{Q},\boldsymbol{K},\boldsymbol{V}) = softmax\left(\boldsymbol{Q}\boldsymbol{K}^{\top}\right)\boldsymbol{V}\label{eq:std-att}\end{equation}
这里的$\boldsymbol{Q}\in\mathbb{R}^{n\times d_k}, \boldsymbol{K}\in\mathbb{R}^{m\times d_k}, \boldsymbol{V}\in\mathbb{R}^{m\times d_v}$,简单起见我们就没显式地写出Attention的缩放因子了。本文我们主要关心Self Attention场景,所以为了介绍上的方便统一设$\boldsymbol{Q}, \boldsymbol{K}, \boldsymbol{V}\in\mathbb{R}^{n\times d}$,一般场景下都有$n > d$甚至$n\gg d$(BERT base里边$d=64$)。相关解读可以参考笔者的《Attention is All You Need》浅读(简介+代码),以及它的一些改进工作也可以参考《突破瓶颈,打造更强大的Transformer》、《Google新作Synthesizer:我们还不够了解自注意力》,这里就不多深入介绍了。
摘掉Softmax #
读者也许想不到,制约Attention性能的关键因素,其实是定义里边的Softmax!事实上,简单地推导一下就可以得到这个结论。$\boldsymbol{Q}\boldsymbol{K}^{\top}$这一步我们得到一个$n\times n$的矩阵,就是这一步决定了Attention的复杂度是$\mathcal{O}(n^2)$;如果没有Softmax,那么就是三个矩阵连乘$\boldsymbol{Q}\boldsymbol{K}^{\top}\boldsymbol{V}$,而矩阵乘法是满足结合率的,所以我们可以先算$\boldsymbol{K}^{\top}\boldsymbol{V}$,得到一个$d\times d$的矩阵,然后再用$\boldsymbol{Q}$左乘它,由于$d \ll n$,所以这样算大致的复杂度只是$\mathcal{O}(n)$(就是$\boldsymbol{Q}$左乘那一步占主导)。
也就是说,去掉Softmax的Attention的复杂度可以降到最理想的线性级别$\mathcal{O}(n)$!这显然就是我们的终极追求:Linear Attention,复杂度为线性级别的Attention。所以,本文的主题就是探究摘掉Softmax后的线形Attention。
一般的定义 #
问题是,直接去掉Softmax还能算是Attention吗?它还能有标准的Attention的效果吗?为了回答这个问题,我们先将Scaled-Dot Attention的定义$\eqref{eq:std-att}$等价地改写为(本文的向量都是列向量)
\begin{equation}Attention(\boldsymbol{Q},\boldsymbol{K},\boldsymbol{V})_i = \frac{\sum\limits_{j=1}^n e^{\boldsymbol{q}_i^{\top}\boldsymbol{k}_j}\boldsymbol{v}_j}{\sum\limits_{j=1}^n e^{\boldsymbol{q}_i^{\top}\boldsymbol{k}_j}}\label{eq:std-att-2}\end{equation}
所以,Scaled-Dot Attention其实就是以$e^{\boldsymbol{q}_i^{\top}\boldsymbol{k}_j}$为权重对$\boldsymbol{v}_j$做加权平均。所以我们可以提出一个Attention的一般化定义
\begin{equation}Attention(\boldsymbol{Q},\boldsymbol{K},\boldsymbol{V})_i = \frac{\sum\limits_{j=1}^n \text{sim}(\boldsymbol{q}_i, \boldsymbol{k}_j)\boldsymbol{v}_j}{\sum\limits_{j=1}^n \text{sim}(\boldsymbol{q}_i, \boldsymbol{k}_j)}\label{eq:gen-att}\end{equation}
也就是把$e^{\boldsymbol{q}_i^{\top}\boldsymbol{k}_j}$换成$\boldsymbol{q}_i, \boldsymbol{k}_j$的一般函数$\text{sim}(\boldsymbol{q}_i, \boldsymbol{k}_j)$,为了保留Attention相似的分布特性,我们要求$\text{sim}(\boldsymbol{q}_i, \boldsymbol{k}_j)\geq 0$恒成立。也就是说,我们如果要定义新式的Attention,那么要保留式$\eqref{eq:gen-att}$的形式,并且满足$\text{sim}(\boldsymbol{q}_i, \boldsymbol{k}_j)\geq 0$。
这种一般形式的Attention在CV中也被称为Non-Local网络,出自论文《Non-local Neural Networks》。
几个例子 #
如果直接去掉Softmax,那么就是$\text{sim}(\boldsymbol{q}_i, \boldsymbol{k}_j) = \boldsymbol{q}_i^{\top}\boldsymbol{k}_j$,问题是内积无法保证非负性,所以这还不是一个合理的选择。下面我们简单介绍几种可取的方案。
值得指出的是,下面介绍的这几种Linear Attention,前两种来自CV领域,第三种是笔者自己构思的,所以都还没有在NLP任务上做过什么实验,各位做模型改进的NLPer们就有实验方向了(^_^)~~顺便说一下,CV领域有不少对Attention的改进工作(除了下面介绍的外,还有EMANet等),很多内容都值得做NLP的我们参考阅读。
核函数形式 #
一个自然的想法是:如果$\boldsymbol{q}_i,\boldsymbol{k}_j$的每个元素都是非负的,那么内积自然也就是非负的。为了完成这点,我们可以给$\boldsymbol{q}_i,\boldsymbol{k}_j$各自加个激活函数$\phi,\varphi$,即
\begin{equation}\text{sim}(\boldsymbol{q}_i, \boldsymbol{k}_j) = \phi(\boldsymbol{q}_i)^{\top} \varphi(\boldsymbol{k}_j)\label{eq:gen-att-2}\end{equation}
其中$\phi(\cdot),\varphi(\cdot)$是值域非负的激活函数。本文开头提到的论文《Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention》选择的是$\phi(x)=\varphi(x)=\text{elu}(x)+1$。
非要讲故事的话,式$\eqref{eq:gen-att-2}$可以联想到“核方法(kernal method)”,尤其是$\phi=\varphi$时$\phi$就相当于一个核函数,而$\langle \phi(\boldsymbol{q}_i), \phi(\boldsymbol{k}_j)\rangle$就是通过核函数所定义的内积。这方面的思考可以参考论文《Transformer dissection: An unified understanding for transformer’s attention via the lens of kernel》,此处不做过多延伸。
妙用Softmax #
另一篇更早的文章《Efficient Attention: Attention with Linear Complexities》则给出了一个更有意思的选择。它留意到在$\boldsymbol{Q}\boldsymbol{K}^{\top}$中,$\boldsymbol{Q}, \boldsymbol{K}, \in\mathbb{R}^{n\times d}$,如果“$\boldsymbol{Q}$在$d$那一维是归一化的、并且$\boldsymbol{K}$在$n$那一维是归一化的”,那么$\boldsymbol{Q}\boldsymbol{K}^{\top}$就是自动满足归一化了,所以它给出的选择是:
\begin{equation}Attention(\boldsymbol{Q},\boldsymbol{K},\boldsymbol{V}) = softmax_2\left(\boldsymbol{Q}\right)softmax_1(\boldsymbol{K})^{\top}\boldsymbol{V}\end{equation}
其中$softmax_1$、$softmax_2$分别指在第一个($n$)、第二个维度($d$)进行Softmax运算。也就是说,这时候我们是各自给$\boldsymbol{Q},\boldsymbol{K}$加Softmax,而不是$\boldsymbol{Q}\boldsymbol{K}^{\top}$算完之后才加Softmax。
如果直接取$\phi(\boldsymbol{q}_i)=softmax(\boldsymbol{q}_i),\varphi(\boldsymbol{k}_j)=softmax(\boldsymbol{k}_j)$,那么很显然这个形式也是式$\eqref{eq:gen-att-2}$的一个特例。另外这个设计在CV中出现过不止一次,比如A2-Nets也包含了同样的做法。
自己的构思 #
在这里,笔者给出自己的一种构思。这个构思的出发点不再是式$\eqref{eq:gen-att-2}$,而是源于我们对原始定义$\eqref{eq:std-att-2}$的近似。由泰勒展开我们有
\begin{equation}e^{\boldsymbol{q}_i^{\top}\boldsymbol{k}_j} \approx 1 + \boldsymbol{q}_i^{\top}\boldsymbol{k}_j\end{equation}
如果$\boldsymbol{q}_i^{\top}\boldsymbol{k}_j\geq -1$,那么就可以保证右端的非负性,而从可以让$\text{sim}(\boldsymbol{q}_i, \boldsymbol{k}_j)=1 + \boldsymbol{q}_i^{\top}\boldsymbol{k}_j$。到这里读者可能已经想到了,想要保证$\boldsymbol{q}_i^{\top}\boldsymbol{k}_j\geq -1$,只需要分别对$\boldsymbol{q}_i,\boldsymbol{k}_j$做$l_2$归一化。所以,笔者最终提出的方案就是:
\begin{equation}\text{sim}(\boldsymbol{q}_i, \boldsymbol{k}_j) = 1 + \left( \frac{\boldsymbol{q}_i}{\Vert \boldsymbol{q}_i\Vert}\right)^{\top}\left(\frac{\boldsymbol{k}_j}{\Vert \boldsymbol{k}_j\Vert}\right)\end{equation}
这不同于形式$\eqref{eq:gen-att-2}$,但理论上它更加接近原始的Scaled-Dot Attention。
相关工作 #
通过修改Attention的形式来降低它的计算复杂度,相关的工作有很多,这里简要列举一些。
稀疏Attention #
我们之前介绍过OpenAI的Sparse Attention,通过“只保留小区域内的数值、强制让大部分注意力为零”的方式,来减少Attention的计算量。经过特殊设计之后,Attention矩阵的大部分元素都是0,因此理论上它也能节省显存占用量和计算量。后续类似工作还有《Explicit Sparse Transformer: Concentrated Attention Through Explicit Selection》、《Longformer: The Long-Document Transformer》等。
但是很明显,这种思路有两个不足之处:
1、如何选择要保留的注意力区域,这是人工主观决定的,带有很大的不智能性;
2、它需要从编程上进行特定的设计优化,才能得到一个高效的实现,所以它不容易推广。
Reformer #
Reformer也是有代表性的改进工作,它将Attention的复杂度降到了$\mathcal{O}(n\log n)$。某种意义上来说,Reformer也是稀疏Attention的一种,只不过它的稀疏Pattern不是事先指定的,而是通过LSH(Locality Sensitive Hashing)技术(近似地)快速地找到最大的若干个Attention值,然后只去计算那若干个值。此外,Reformer通过构造可逆形式的FFN(Feedforward Network)替换掉原来的FFN,然后重新设计反向传播过程,从而降低了显存占用量。
所以,相比前述稀疏Attention,Reformer解决了它的第一个缺点,但是依然有第二个缺点:实现起来复杂度高。要实现LSH形式的Attention比标准的Attention复杂多了,对可逆网络重写反向传播过程对普通读者来说更是遥不可及~
Linformer #
跟本文所介绍的Linear Attention很相似的一个工作是Facebook最近放出来的Linformer,它依然保留原始的Scaled-Dot Attention形式,但在进行Attention之前,用两个$m\times n$的矩阵$\boldsymbol{E},\boldsymbol{F}$分别对$\boldsymbol{K},\boldsymbol{V}$进行投影,即变为
\begin{equation}Attention(\boldsymbol{Q},\boldsymbol{K},\boldsymbol{V}) = softmax\left(\boldsymbol{Q}(\boldsymbol{E}\boldsymbol{K})^{\top}\right)\boldsymbol{F}\boldsymbol{V}\end{equation}
这样一来,$\boldsymbol{Q}(\boldsymbol{E}\boldsymbol{K})^{\top}$就只是一个$n\times m$的矩阵,而作者声称对于哪怕对于很大的序列长度$n$,$m$也可以保持为一个适中的常数,从而这种Attention也是线性的。跟Linformer类似的思路还出现在更早一些的CV论文《Asymmetric Non-local Neural Networks for Semantic Segmentation》中。
但是,笔者认为“对于超长序列$m$可以保持不变”这个结论是值得质疑的,对于长序列原论文只做了MLM任务,而很明显MLM并不那么需要长程依赖,所以这个实验没什么说服力。因此,Linformer是不是真的Linear,还有待商榷。
自回归生成 #
Linformer的另一个缺点是$\boldsymbol{E}\boldsymbol{K},\boldsymbol{F}\boldsymbol{V}$这两个运算直接把整个序列的信息给“糅合”起来了,所以它没法简单地把将来信息给Mask掉(Causal Masking),从而无法做语言模型、Seq2Seq等自回归生成任务,这也是刚才说的原作者只做了MLM任务的原因。相比之下,本文介绍的几种Linear Attention都能做到这一点。以式$\eqref{eq:gen-att}$和式$\eqref{eq:gen-att-2}$为例,如果要Mask掉未来信息,那么只需要把求和$\sum\limits_{j=1}^n$改为$\sum\limits_{j=1}^i$:
\begin{equation}Attention(\boldsymbol{Q},\boldsymbol{K},\boldsymbol{V})_i = \frac{\sum\limits_{j=1}^i \left(\phi(\boldsymbol{q}_i)^{\top} \varphi(\boldsymbol{k}_j)\right)\boldsymbol{v}_j}{\sum\limits_{j=1}^i \phi(\boldsymbol{q}_i)^{\top} \varphi(\boldsymbol{k}_j)}=\frac{ \phi(\boldsymbol{q}_i)^{\top} \sum\limits_{j=1}^i\varphi(\boldsymbol{k}_j)\boldsymbol{v}_j^{\top}}{ \phi(\boldsymbol{q}_i)^{\top} \sum\limits_{j=1}^i\varphi(\boldsymbol{k}_j)}\end{equation}
实现上式有两种方式:第一方式是设$\boldsymbol{S}_i=\sum\limits_{j=1}^i\varphi(\boldsymbol{k}_j)\boldsymbol{v}_j^{\top}$以及$\boldsymbol{z}_i=\sum\limits_{j=1}^i\varphi(\boldsymbol{k}_j)$,我们有
\begin{equation}Attention(\boldsymbol{Q},\boldsymbol{K},\boldsymbol{V})_i =\frac{ \phi(\boldsymbol{q}_i)^{\top} \boldsymbol{S}_i}{ \phi(\boldsymbol{q}_i)^{\top} \boldsymbol{z}_i},\quad \begin{aligned}&\boldsymbol{S}_i=\boldsymbol{S}_{i-1}+\varphi(\boldsymbol{k}_i)\boldsymbol{v}_i^{\top}\\
&\boldsymbol{z}_i=\boldsymbol{z}_{i-1}+\varphi(\boldsymbol{k}_i)
\end{aligned}\end{equation}
这说明这种Attention可以作为一个RNN模型用递归的方式实现,它的空间复杂度最低,但是要串性计算,适合预测解码时使用;第二种是直接将$\varphi(\boldsymbol{K}),\boldsymbol{V}\in\mathbb{R}^{n\times d}$做外积,得到一个$n\times d\times d$的矩阵,然后对$n$那一维执行$\text{cumsum}$运算,这样就一次性得到$\boldsymbol{S}_1,\boldsymbol{S}_2,\dots,\boldsymbol{S}_n$了,它的速度最快,但空间占用最大,适合训练时使用,不过很多时候都有$d^2\gg n$,一般情况下训练时都很难承受这个空间复杂度,因此多数还是用RNN形式。
下采样技术 #
从结果上来看,Linformer的$\boldsymbol{E}\boldsymbol{K}, \boldsymbol{F}\boldsymbol{V}$就是将序列变短(下采样)了,而将序列变短的一个最朴素的方法就是Pooling了,所以笔者之前也尝试过把Pooling技术引入到Transformer中去。近来也有类似的工作发出来,比如IBM的《PoWER-BERT: Accelerating BERT Inference via Progressive Word-vector Elimination》和Google的《Funnel-Transformer: Filtering out Sequential Redundancy for Efficient Language Processing》。除了Pooling之外,其实还有其他的下采样技术,比如可以通过stride > 1的一维卷积来实现,基于这个思路,或许我们可以把FFN里边的Position-Wise全连接换成stride > 1的一维卷积?总之这方面应该也能玩出很多花样来,不过跟Linformer一样,这样糅合之后做自回归生成就很难了。
文章小结 #
本文介绍了一些从结构上对Attention进行修改从而降低其计算复杂度的工作,其中最主要的idea是去掉标准Attention中的Softmax,就可以使得Attention的复杂度退化为理想的$\mathcal{O}(n)$级别(Linear Attention)。相比于其他类似的改进结构的工作,这种修改能在把复杂度降到$\mathcal{O}(n)$的同时,依然保留所有的“token-token“的注意力,同时还能保留用于做自回归生成的可能性。
转载到请包括本文地址:https://kexue.fm/archives/7546
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Jul. 04, 2020). 《线性Attention的探索:Attention必须有个Softmax吗? 》[Blog post]. Retrieved from https://kexue.fm/archives/7546
@online{kexuefm-7546,
title={线性Attention的探索:Attention必须有个Softmax吗?},
author={苏剑林},
year={2020},
month={Jul},
url={\url{https://kexue.fm/archives/7546}},
}
May 25th, 2022
苏神,请问一下,线性attention和稀疏attention可以结合使用吗?不知道数学上是否还有意义。
可以结合。
请问您能给点建议吗?因为我想的是,线性attention计算中没有n*n的矩阵形式,而稀疏attention是一个n*n矩阵的mask,如果才能把这个矩阵点乘上呢?(不用考虑稀疏计算的提升,我只想强制让大部分注意力为零)
就是要自己通过编程的方式实现(即你所谓的“考虑稀疏计算的提升”)。
比如每个token只能与前后$k$个token做注意力,那么就把前后$k$个token拿出来作为$K, V$,与原来的$Q$做线性注意力。
June 12th, 2022
苏神您好,感谢您的分享,我有一个关于您自己构想的问题,式(7)代入到式(3)中确实可以完成交换律,但是还需要通过分母去做归一化,您是通过何种方法保证了分母的归一化计算也是线性复杂度的呢?
结合律
分母其实就是分子的V换成全1向量,所以分子是线性的,那么分母更加是线性的了。
苏神你好,把原本的softmax(q@k)@v的softmax取消以后,可以写成(q@k)@v=q@(k@v)以很大程度地减少计算和内存开销,但这样一来是否会带来以下副作用,使得自注意力的真实性能有所降低:
1、虽然看着像是全局的token-to-token稠密(全连接)聚合,但实质上(k@v)是一个C*C的矩阵(C是通道数),这个过程其实已经可以理解、解释或者退化成一种通道级的自注意力了?可能已经很大程度丧失了空间域非局部聚合的能力?(图像上)
2、相似度矩阵(q@k)的秩必不大于C。相比于有softmax的版本,表示能力、自由度或者实际上的信息量可能已经大大降低了?
关于您根据泰勒展开启发式地设计的式(7),是不是依然需要对相似度矩阵做归一化(使得每一列的和为1),这样一来可能并不能节省内存,有没有规避掉这个操作的技巧,使得还是可以达到q@(k@v)类似的线性复杂度呢(或者是我有哪里没有理解到位)?
发现一篇很好的相关文章:《Flowformer: Linearizing Transformers with Conservation Flows》https://zhuanlan.zhihu.com/p/530502907
你的思考没有错,线性Attention因为秩问题,能力的受限的,参考 https://kexue.fm/archives/8338 、 https://kexue.fm/archives/8610 和 https://kexue.fm/archives/9529 。
我所设计的版本,实际效果其实还略差于常规的线性Attention,所以不建议深究。
June 14th, 2022
谢谢,我明白了
August 24th, 2022
大佬,有没有验证你的猜想,公式 (7)
试过,效果不好。
September 23rd, 2022
https://arxiv.org/pdf/2209.07484.pdf 这篇新出的论文里,不再强制让sim()非负了,甚至直接用了余弦相似度,就是你构想的那里,直接去掉了"1+"这部分,貌似效果在特定条件下还可以,苏神可以分析一下,让我们学习学习
这个工作我也留意到了,有点意思,但我的兴趣不大,我不认为它能掀起什么波澜。
首先,它的实验是CV,而且只有在部分Attention层替换为它的时候,才能获得一定的提升或者效果不变,这种做法本就很丑;其次,CV应用linear attention并且获得成功的例子已经不少,在CV中attention更多只是一个辅助,很多时候CNN就已经够好,所以CV中修改attention好的实验,在NLP中也很难work。
October 18th, 2022
求教苏神,为什么在CV领域(如CVPR2018 Non-local)计算空间注意力的时候,可以不需要Wq, Wk, Wv三个矩阵做线性变换得到Q,K,V,而仅仅通过Cx1x1的卷积核做乘法就可以得到多头注意力呢?(甚至有些模型直接将特征图X通过Cx1x1卷积核得到多头的A,再和X elementwise乘在一起)。请问在NLP中为什么不能将Wq, Qk, Wv直接换成卷积核用以减少参数量呢?谢谢
你说的两个东西是一回事。线性变换也是token-wise的,也就是跟你说的Cx1x1的卷积(NLP是Cx1的卷积)等价的,参数也一样。事实上最早的GPT好像就是用Cx1的卷积来实现的)
February 7th, 2023
请教苏神,虽然去掉softmax之后可以先算KV,再算Q(KV),但是causal attention mask怎么用得上呢?因为我的理解是attention mask需要先算出QK才行。
本文的“自回归生成”一节不是讨论了这个事情了嘛
April 20th, 2023
手动推导后,觉得(5)对应ϕ(qi)=softmax(qi),φ(kj)=ekj是有问题的。可以具体证明一下吗?
这就是直接根据定义算就得到了,还能怎么具体呢?倒不如你列一下你自己的推导过程。
用代码很容易验证是错的,我写了一个,但不让粘代码,也不能贴图,你可以自己写一个验证下
import torch
n, d = 4, 2
q = torch.randn(n, d)
k = torch.randn(n, d)
qk1 = q.softmax(dim=1) @ k.softmax(dim=0).t()
qk2 = q.softmax(dim=1) @ k.exp().t()
qk2 = qk2 / qk2.sum(dim=1, keepdim=True)
qk1 和 qk2 就是两种方法求出的 attention 矩阵
抱歉,我重新推导了一下,确实不等价,是我太武断了。感谢你的仔细反馈!
April 22nd, 2023
DIFFormer 就用了式子(7)來構建 attention,效果還不錯。
January 21st, 2024
看到這篇,突然想到一個問題:
如果我的應用是想取出 attention weight 來抓取關鍵字,那是不是沒有 softmax 就不行了?
因為 softmax 後是一個 0~1 的值,從物理直觀上,這個值越接近1,可代表一句話當中,最重要的那個關鍵字。所以有些應用是把 attention weight 最高的字抓出來,當作extractive summarization。
但替代方案如果僅僅是非負,而沒有限制總合為1,那所得到的 attention weight 的物理意義就不明確了。他的值有可能在好幾個字都有很高的 attention weight,但我們無法得知這些"很高"相對來說是多高?因為 weight 值是 unbounded 的,永遠都有可能出現一個更高的值。因此就很難有一個基準來比較每個詞在不同句子的重要性。
如果改成像 sigmoid 這種 bounded 函數,會不會比較好?但這時情況就會變成對每個字的attention weight 是各自獨立的 0~1 值,我們知道最高值是1,所以相對上可以比較。但是越靠近1變化就越小,導致可能很多個字同時都很接近1,看不出哪個「最重要」。但這可能反而是優點,因為 softmax 在長的句子中, weight 值會變得很小,因為總和為1,如果有100個字,平均每個就只能分到0.01,越長就越小,所以也很難反應出「重要性」。
但 sigmoid 也有一個問題,因為最後得出的 embedding 是 weighted sum,每個字獨立的 weight 加起來,如果句子長度不同,就很難比較了。但這似乎很容易解決,只要加起來除以句子長度就可以了。
所以我嘗試提出一個方案:
將softmax 替換成 sigmoid 並於 weighted sum後除以句子長度。在decoder的情況下,每次新產生一個token,都要先除以前面input的長度。這樣,隨著生成的長度增加,新生成的 embedding 不會跟長度有關。同時,sigmoid weight 取出來可以代表每個字各別的重要性,可以設一個threshold,如 0.8,把超過 0.8 的字當作是重要的字取出來,而不需要multihead。
更進一步,有沒有可能把 softmax 跟 sigmoid 兩者混和?
用 sigmoid 篩出 weight 大於 threshold 的 token,然後再對這些 token 做 softmax。這樣一來,softmax 處理的長度就會明顯短於 input 長度,同時可以在 sigmoid 之上,更進一步比較這些篩出來的 token 的相對強度。
这个问题在于,哪怕加了softmax,它虽然有界且和为1,但未必有什么物理含义(因为没有直接用物理世界的数据去训练这个softmax的直接,我们训练的只是最终输出的label)。别忘了softmax之前也是无界的logits,如果我们只看logits,不也得出logits无界就没法用的结论?
实际上,即便attention矩阵无界(在理论上),但它实际上也不真的无界,我们可以统计它的范围甚至分布,估算均值方差等,然后根据一些截断技巧(比如模仿正态分布的3sigma法则)就可以得出相应的显著范围、一般范围等,无序借助有界性。
蘇兄,我要回復,結果它一直說不合規,我怎麼找都看不出哪裡不合規...請問怎麼解決?
顶部 https://kexue.fm/me.html 有我的邮箱,你可以发评论内容我来查查哈。
照你這麼說, attention 的直觀解釋"注意力",其實也只是種比喻,不是我們人類專注在一間事情的那種注意力了...。但不管怎樣,這個架構的設計,一開始一定是參考了人類注意力的想法,所以才提出了可以加上 softmax 代表一個人的「注意力總合為1」這樣的直觀想法。不然照你說,不用加 softmax,那直接用 logits 來計算,就是 (QK)V ,不就好了嗎?為何還要苦苦追求各種 Linear Attention,想辦法把softmax去掉?
顯然softmax還是具有某種物理意義的,就像 CNN 的靈感是取自視網膜的結構,attention 應該也反映了某一部分的物理事實,這就是所謂的歸納偏置(inductive bias)。我們假定訓練資料的結構符合 attention 的假設,例如每個token "注意到" 其他token,是透過softmax這樣的注意力分配,後來又從實驗上得到了良好的結果,支持了使用softmax 作為注意力分配的假設。
所以我認為使用 softmax 確實有其物理意涵的,因為並非隨便加上一個函數就可替代 softmax 。所以了解softmax為何有效,是否因為它有界、總合為1才使它如此有效?或者有其他理由?這是一個可以思考的點。
1、Linear Attention也有求和为1的注意力,但它效果并不如标准的Attention;
2、相比之下,Softmax的分子$e^x$,要比它做归一化的分母重要得多;
3、不归一化的注意力也能Work的很好,比如GAU:https://kexue.fm/archives/8934
1,2: 這只能證明 Linear 本身能力不夠強,需要用到 $e^x$ ,但不代表歸一化不重要。
3: 但你也提到,因為GLU本身就很強,對attention的依賴較弱,所以並不能完全歸因於不歸一化的attention。除非可以直接用 $\frac{1}{n} relu^2()$ 替換掉標準 Transfomer 中的 softmax,否則你很難說不歸一化也可以作用。
1、GAU有做直接将Multi-Head Attention的Softmax换成$\text{relu}^2$的对比实验,波动很小,可以在它论文找到;
2、另外我们自己也做过将Softmax换成$\frac{1}{n}\text{relu}$的实验,也没对效果(Loss)有实质影响;
3、如果将概率归一化的分母视为$e^{logits}$向量的L1模长,那么我还做过将分母换成其L2模长(这时候是平方和为1,而不是求和为1),效果一样很好,而且理论上比L1模长更完备,参考:https://kexue.fm/archives/9105#%E6%96%B0%E5%BD%92%E4%B8%80%E5%8C%96
所以很遗憾,(概率)归一化的作用确实非常不明显。目前我的看法是,注意力的稀疏性可能会比其他杂七杂八的性质更为本质,参考:https://kexue.fm/archives/9889 。另外,看得出你有非常多有趣的思考,但建议同时多配合实验,会得到更靠谱的结论。
3. 我在這篇 https://kexue.fm/archives/9105#%E6%96%B0%E5%BD%92%E4%B8%80%E5%8C%96 底下留言了,因為我發現 L2 norm 如果擴展到複數域,在物理上有對應的概念,就是量子力學中的機率波。而機率波的振幅平方即表示機率。所以,平方和為1,也是一種計算機率的形式,只是多考慮了用複數代表"相位"。
而你所說的稀疏性指標也用到 L2 norm,在我的複數擴展中,可以這樣理解:
如果實數域越稀疏,虛數域就越不稀疏;反之亦然。
這有點像物理中的測不準原理: $\delta x \cdot \delta p = \hbar$
當粒子的位置越確定,他的動量就越不確定。
所謂的越確定,就是越稀疏,越不確定,就是越不稀疏。
如果選定實部的 attention 增加稀疏性,虛部的attention就會較不稀疏。所以如果把實部 attention score 的 $S(x) = \frac{\mathbb{E}[|x|]}{\sqrt{\mathbb{E}[x^2]}}$ 加到loss中最小化,這樣實部的 attention score 的可解釋性應該就可以提升,而不影響到準確率,因為虛部吸收了不確定的部分。