, 则 缩放点积注意力(scaled dot-product attention)评分函数为:a(q,k)=q⊤k/d
考虑小批量计算时,整个注意力机制的输出可以写成:
softmax(dQK⊤)V
向量点积之所以能表示相似度,是因为其源头是余弦距离(不考虑方向)
多头注意力机制
在实践中,为了捕捉不同方面的信息,将注意力机制分为多个头,形成多个子空间表示(representation subspaces)是有意义的。
用独立学习得到的h 组不同的 线性投影(linear projections)来变换查询、键和值。 然后将它们并行地送到注意力池化中。 最后,将这h 个输出拼接在一起, 并且通过另一个可以学习的线性投影进行变换, 以产生最终输出。 这种设计就被称为 多头注意力(Multi-Head Attention)。
第i 个 head 的查询、键和值线性变换后的结果如下:
以小批量样本输入的矩阵形式给出,此处暂且忽略板书时对符号的加粗
Qi=QWiQ,Ki=KWiK,Vi=VWiV
从而第i 个 head 的输出为:
headiAttention(Qi,Ki,Vi)=Attention(Qi,Ki,Vi)=softmax(dQiKi⊤)Vi
最终的多头注意力输出为:
Attention(Q,K,V)=Concat(head1,..,headi,..)WO
自注意力机制
自注意力机制(self-attention)也被称为内部注意力(intra-attention),顾名思义就是对输入数据自身进行和传统注意力机制类似的处理。特别地,有q=k=v。
如果输入小批量样本X={x1,...,xn}∈Rn×d,xi∈Rd,那么一个自注意力机制任务中,任意一个键值对可以表示成(xi,xi),由其自身构成。从而当查询q=xi 时,有:
yi=f(xi,(x1,x1),(x2,x2),...,(xn,xn))∈Rd
其中,f 是注意力机制的一般范式。值得注意的是,通过注意力机制映射完之后的yi 的尺寸与输入一致。
实际中的自注意力
通常情况下,我们并不是直接取q=k=v,而是对原始输入xi 进行3种仿射变换,依次得到:qi=Wqxi,ki=Wkxi,vi=Wvxi,i=1,..,n .
然后再进行:
yi=f(qi,(k1,v1),(k2,v2),...,(kn,vn))∈Rd
即是用qi 作为查询,对所有的键值对进行注意力评分,然后加权得到第i 个输入的输出结果。如下图所示:
用同样的方法,我们可以并行地计算出和x1,...,xn 同样多的输出y1,...,yn。而且这些输出中的每一个都考虑到了所有的输入。
Self-attention vs. CNN
论文 《On the Relationship between Self-Attention andConvolutional Layers》
(https://arxiv.org/abs/1911.03584)指出,CNN其实就是自注意力机制的一种特例。
奠基之作
注意力机制的集大成者是如今赫赫有名的 Transformer 模型,本文中略过了不少注意力机制在该模型中的使用,这在本站下面这篇文章中将再次展开。感谢你看到这里!
番外:Att的Bug?
待更:https://zhuanlan.zhihu.com/p/645922048
https://www.evanmiller.org/attention-is-off-by-one.html
参考
- 动手学习深度学习|D2L Discussion - Dive into Deep Learning
- 详解深度学习中的注意力机制(Attention) - 知乎
- 拆 Transformer 系列二:Multi- Head Attention 机制详解
- 11.【李宏毅机器学习2021】自注意力机制 (Self-attention) -bilibili