从Attention到Bert——1 Attention解读

article/2025/10/15 0:21:16

下一篇从Attention到Bert——2 transformer解读

文章目录

  • 1 Attention的发展历史
    • 2015-2017年
  • 2 Attention的原理
  • 3 Multi-Head Attention
  • 4 Self-Attention
    • 为什么需要self-attention
    • 什么是self-attention
  • 5 Position Embedding

最早,attention诞生于CV领域,真正将其发杨光大的还是在NLP领域,自2018年Google的bert和OPENAI的GPT大火之后,大家才开始注意到背后的transformer以及Attention。

1 Attention的发展历史

Attention 的发展可以粗暴地分为两个阶段。
ref from:https://zhuanlan.zhihu.com/p/77307258

2015-2017年

自从 attention 提出后,基本就成为 NLP 模型的标配,各种各样的花式 attention 铺天盖地。不仅在 Machine Translation,在 Text summarization,Text Comprehend(Q&A), Text Classification 也广泛应用。奠定基础的几篇文章如下:

2015年 ICLR 《Neural machine translation by jointly learning to align and translate》首次提出 attention(基本上算是公认的首次提出),文章提出了最经典的 Attention 结构(additive attention 或者 又叫 bahdanau attention)用于机器翻译,并形象直观地展示了 attention 带来源语目标语的对齐效果,解释深度模型到底学到了什么,人类表示服气。

2015年 EMNLP 《Effective Approaches to Attention-based Neural Machine Translation》在基础 attention 上开始研究一些变化操作,尝试不同的 score-function,不同的 alignment-function。文章中使用的 Attention(multiplicative attention 或者 又叫 Luong attention)结构也被广泛应用。

2015年 ICML 《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》是 attention(提出hard/soft attention的概念)在 image caption 上的应用,故事圆满,符合直觉,人类再次表示很服气。

在上面几篇奠基之作之上,2016和2017年 attention 开枝散叶,无往不利。Hiearchical Attention,Attention over Attention,multi-step Attention……这些或叫得上名的或叫不上名。

2017年-至今是属于 transformer 的时代。基于 transformer 强大的表示学习能力,NLP 领域爆发了新一轮的活力,BERT、GPT 领跑各项 NLP 任务效果。奠基之作无疑是:

2017年 NIPS《Attention is all you need》提出 transformer 的结构(涉及 self-attention,multi-head attention)。基于 transformer 的网络可全部替代sequence-aligned 的循环网络,实现 RNN 不能实现的并行化,并且使得长距离的语义依赖与表达更加准确(据说2019年的 transformer-xl《Transformer-XL:Attentive Lanuage Models Beyond a fixed-length context》通过片段级循环机制结合相对位置编码策略可以捕获更长的依赖关系)。

2 Attention的原理

Attention 经常会和 Encoder–Decoder 一起说。
参见《一文看懂 NLP 里的模型框架 Encoder-Decoder 和 Seq2Seq》
在这里插入图片描述
但是,Attention 并不一定要在 Encoder-Decoder 框架下使用的,他是可以脱离 Encoder-Decoder 框架的。

下面的图片则是脱离 Encoder-Decoder 框架后的原理图解。
在这里插入图片描述
Attention 原理的3步分解:
可以描述query为将查询和一组键key值value对映射到输出y,其中查询、键、值和输出都是向量。输出是作为值的加权和计算的,其中分配给每个值的权重是通过查询与相应键的兼容性函数计算的。
在这里插入图片描述

  1. 第一步: query 和 key 进行相似度计算,得到权值
    相似度计算有多种,最简单就是
    点乘、矩阵相乘: s ( p , q ) = q T k s(p,q)=q^Tk s(p,q)=qTk
    cos函数: s ( q , k ) = q T k ∥ q ∥ ⋅ ∥ k ∥ s(q, k)=\frac{q^{T} k}{\|q\| \cdot\|k\|} s(q,k)=qkqTk

  2. 第二步:将权值进行归一化,得到直接可用的权重
    α i = softmax ⁡ ( s ( k i , q ) ) \alpha_{i}=\operatorname{softmax}\left(s\left(k_{i}, q\right)\right) αi=softmax(s(ki,q))

  3. 第三步:将权重和 value 进行加权求和。
    a t t ( q , k , v ) = ∑ i = 1 N α i v i att(q,k,v)=\sum^{N}_{i=1}\alpha_iv_i att(q,k,v)=i=1Nαivi

这也就是文中提到的Scaled Dot-Product Attention。
在这里插入图片描述
由此推出Attention的公式:
Attention ⁡ ( Q , K , V ) = softmax ⁡ ( Q K ⊤ d k ) V \operatorname{Attention}(\boldsymbol{Q}, \boldsymbol{K}, \boldsymbol{V})=\operatorname{softmax}\left(\frac{\boldsymbol{Q} \boldsymbol{K}^{\top}}{\sqrt{d_{k}}}\right) \boldsymbol{V} Attention(Q,K,V)=softmax(dk QK)V

可以逐个向量来看:
Attention ⁡ ( q t , K , V ) = ∑ s = 1 m 1 Z exp ⁡ ( ⟨ q t , k s ⟩ d k ) v s \operatorname{Attention}\left(\boldsymbol{q}_{t}, \boldsymbol{K}, \boldsymbol{V}\right)=\sum_{s=1}^{m} \frac{1}{Z} \exp \left(\frac{\left\langle\boldsymbol{q}_{t}, \boldsymbol{k}_{s}\right\rangle}{\sqrt{d_{k}}}\right) \boldsymbol{v}_{s} Attention(qt,K,V)=s=1mZ1exp(dk qt,ks)vs
其中Z是归一化因子。事实上q,k,v分别是query,key,value的简写,K,V是一一对应的,它们就像是key-value的关系,那么上式的意思就是通过qt这个query,通过与各个ks内积的并softmax的方式,来得到qt与各个vs的相似度,然后加权求和,得到一个dv维的向量。

因子 √dk 起到调节作用,使得内积不至于太大(太大的话softmax后就非0即1了,不够“soft”了)。

3 Multi-Head Attention

这个是Google提出的新概念,是Attention机制的完善。不过从形式上看,它其实就再简单不过了,就是把Q,K,V通过参数矩阵W映射一下,然后再做Attention,把这个过程
重复做h次,结果拼接起来就行了,可谓“大道至简”了。具体来说

head  i = Attention  ( Q W i Q , K W i K , V W i V ) \text { head }_{i}=\text { Attention }\left(\boldsymbol{Q} \boldsymbol{W}_{i}^{Q}, \boldsymbol{K} \boldsymbol{W}_{i}^{K}, \boldsymbol{V} \boldsymbol{W}_{i}^{V}\right)  head i= Attention (QWiQ,KWiK,VWiV)
这里 W i Q ∈ R d k × d ~ k , W i K ∈ R d k × d ~ k , W i V ∈ R d v × d ~ v \boldsymbol{W}_{i}^{Q} \in \mathbb{R}^{d_{k} \times \tilde{d}_{k}}, \boldsymbol{W}_{i}^{K} \in \mathbb{R}^{d_{k} \times \tilde{d}_{k}}, \boldsymbol{W}_{i}^{V} \in \mathbb{R}^{d_{v} \times \tilde{d}_{v}} WiQRdk×d~k,WiKRdk×d~k,WiVRdv×d~v ,然后
MultiHead ⁡ ( Q , K , V ) = Concat ⁡ ( head ⁡ 1 , … , head  h ) \operatorname{MultiHead}(\boldsymbol{Q}, \boldsymbol{K}, \boldsymbol{V})=\operatorname{Concat}\left(\operatorname{head}_{1}, \ldots, \text { head }_{h}\right) MultiHead(Q,K,V)=Concat(head1,, head h)
最后得到一个 n × ( h d ~ v ) n \times\left(h \tilde{d}_{v}\right) n×(hd~v) 的序列。所谓“多头”(Multi-Head),就是只多做几次同样的杀情(参数不共享),然后把结果拼接。

4 Self-Attention

自注意力机制就是只有输入X,通过三个变换得到QKV矩阵,然后在根据三步计算注意力得分。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

为什么需要self-attention

RNN 的长距离依赖比较 tricky:RNN 很强大

  1. 作为 encoder 对长度任意的序列进行特征抽取,基于特征抽取的能力可以胜任分类任务。
  2. 作为Generators 学习 Language Model),其实核心就是长距离依赖gate architectures - 线性操作让信息可以保持并流动,并选择性地让信息通过,可以对长度任意的序列进行表达。

但是这种方式还是比较 tricky。并且这种序列建模方式,
3. 无法对具有层次结构的信息进行很好的表达。.
4. RNN 由于递归的本质,导致无法并行
在这里插入图片描述
CNN 在 NLP 中扮演了 n-gram 的 detector 角色,

  1. 虽然层内可以并行。
  2. 但是 CNN 具有 Hierarchical Receptive Field,使得任意任意两个位置之间的长度距离是对数级别的。
  3. 基于的假设是局部信息相互依赖。

所以有没有一种方法,能够做到既能又能还能?

相对于 CNN:

  • 要 constant path length 不要 logarithmic path length ,
  • 要 variable-sized perceptive field,不要固定 size 的 perceptive field;

相对于 RNN:

  • 考虑长距离依赖
  • 还要可以并行!

这就是 self attention。下图可以看到 self-attention 和 convolution 有点儿神似,它摒弃了 CNN 的局部假设,想要寻找长距离的关联依赖。看下图就可以理解 self-attention 的这几个特点:

  • constant path length & variable-sized perceptive field :任意两个位置(特指远距离)的关联不再需要通过 Hierarchical perceptive field 的方式,它的 perceptive field 是整个句子,所以任意两个位置建立关联是常数时间内的。
  • parallelize : 没有了递归的限制,就像 CNN 一样可以在每一层内实现并行。

在这里插入图片描述

什么是self-attention

  1. QKV 都是对输入 x 的线性映射。但是不能是一样的,不然乘积之后会出现大的更大,小的更小,导致数据分布的方差增大。映射到softmax函数上面导致权重的方差也增大。

  2. score-function 使用 scaled-dot product。

  3. multihead 的方式将多个 head 的输出 z,进行 concat 后,通过线性变换得到最后的输出 z。

在这里插入图片描述

5 Position Embedding

然而,只要稍微思考一下就会发现,这样的模型并不能捕捉序列的顺序!换句话说,如果将K,V按行打乱顺序(相当于句子中的词序打乱),那么Attention的结果还是一样的。这就表明了,到目前为止,Attention模型顶多是一个非常精妙的“词袋模型”而已。

这问题就比较严重了,大家知道,对于时间序列来说,尤其是对于NLP中的任务来说,顺序是很重要的信息,它代表着局部甚至是全局的结构,学习不到顺序信息,那么效果将会大打折扣(比如机器翻译中,有可能只把每个词都翻译出来了,但是不能组织成合理的句子)。

于是Google再祭出了一招——Position Embedding,也就是“位置向量”,将每个位置编号,然后每个编号对应一个向量,通过结合位置向量和词向量,就给每个词都引入了一定的位置信息,这样Attention就可以分辨出不同位置的词了。

Position Embedding并不算新鲜的玩意,在FaceBook的《Convolutional Sequence to Sequence Learning》也用到了这个东西。但在Google的这个作品中,它的Position Embedding有几点区别:

  1. 以前在RNN、CNN模型中其实都出现过Position Embedding,但在那些模型中,Position Embedding是锦上添花的辅助手段,也就是“有它会更好、没它也就差一点点”的情况,因为RNN、CNN本身就能捕捉到位置信息。但是在这个纯Attention模型中,Position Embedding是位置信息的唯一来源,因此它是模型的核心成分之一,并非仅仅是简单的辅助手段。

  2. 在以往的Position Embedding中,基本都是根据任务训练出来的向量。而Google直接给出了一个构造Position Embedding的公式:
    { P E 2 i ( p ) = sin ⁡ ( p / 1000 0 2 i / d p o s ) P E 2 i + 1 ( p ) = cos ⁡ ( p / 1000 0 2 i / d p o s ) \left\{\begin{array}{l} P E_{2 i}(p)=\sin \left(p / 10000^{2 i / d} p o s\right) \\ P E_{2 i+1}(p)=\cos \left(p / 10000^{2 i / d_{p o s}}\right) \end{array}\right. {PE2i(p)=sin(p/100002i/dpos)PE2i+1(p)=cos(p/100002i/dpos)
    这里的意思是将id为 p p p 的位置映射为一个 d pos  d_{\text {pos }} dpos  维的位置向量,这个向量的第 i i i 个元素的数值就是 P E i ( p ) P E_{i}(p) PEi(p) 。Google在论文中说到他们比较过直接训练出来的位置向量和上述公式计算出来的位置向量,效果是接近的。因此显然哦们更乐意使用公式构造的Position Embedding了,我们称之为Sinusoidal形 İ 的Position Embedding。

  3. Position Embedding本身是一个绝对位置的信息,但在语言中,相对位置也很重要,Google选择前述的位置向量公式的一个重要原因是:由于我们有 sin ⁡ ( α + β ) = sin ⁡ α cos ⁡ β + cos ⁡ α sin ⁡ β \sin (\alpha+\beta)=\sin \alpha \cos \beta+\cos \alpha \sin \beta sin(α+β)=sinαcosβ+cosαsinβ 以及 cos ⁡ ( α + β ) = cos ⁡ α cos ⁡ β − sin ⁡ α sin ⁡ β \cos (\alpha+\beta)=\cos \alpha \cos \beta-\sin \alpha \sin \beta cos(α+β)=cosαcosβsinαsinβ ,这表明位置 p + k p+k p+k 的向量可以表示成位置 p p p 的向量的线性恋换, 这提供了表达相对位置信息的可能性


下一篇 从Attention到Bert——2 transformer解读


http://chatgpt.dhexx.cn/article/anCcfHxt.shtml

相关文章

Attention UNet

Attention UNet论文解析 - 知乎Attention UNet论文地址: https://arxiv.org/pdf/1804.03999.pdf 代码地址: https://github.com/ozan-oktay/Attention-Gated-NetworksAttention UNet在UNet中引入注意力机制,在对编码器每个分辨率上的特征与解…

attention

文章目录 Attention基本的Attention原理参考 Hierarchical Attention原理实践参考 Self Attentionother Attention Attention Attention是一种机制,可以应用到许多不同的模型中,像CNN、RNN、seq2seq等。Attention通过权重给模型赋予了区分辨别的能力&am…

史上最小白之Attention详解

1.前言 在自然语言处理领域,近几年最火的是什么?是BERT!谷歌团队2018提出的用于生成词向量的BERT算法在NLP的11项任务中取得了非常出色的效果,堪称2018年深度学习领域最振奋人心的消息。而BERT算法又是基于Transformer&#xff0…

一文看懂 Attention(本质原理+3大优点+5大类型)

Attention 正在被越来越广泛的得到应用。尤其是 BERT 火爆了之后。 Attention 到底有什么特别之处?他的原理和本质是什么?Attention都有哪些类型?本文将详细讲解Attention的方方面面。 Attention 的本质是什么 Attention(注意力&a…

史上最直白之Attention详解(原理+代码)

目录 为什么要了解Attention机制Attention 的直观理解图解深度学习中的Attention机制总结 为什么要了解Attention机制 在自然语言处理领域,近几年最火的是什么?是BERT!谷歌团队2018提出的用于生成词向量的BERT算法在NLP的11项任务中取得了非常…

关于Attention的超详细讲解

文章目录 一、动物的视觉注意力二、快速理解Attention思想三、从Encoder-Decoder框架中理解为什么要有Attention机制四、Attention思想步骤五、Self-Attention5.1 Self-Attention的计算步骤5.2 根据代码进一步理解Q、K、V5.3 再来一个例子理解 六、缩放点积中为什么要除以根号d…

浅聊古代————汉朝

文章目录 西汉西汉建立:汉高祖刘邦西汉灭亡:王莽篡汉新朝建立:王莽篡汉改新新朝灭亡:绿林赤眉起义 东汉东汉建立:起义军刘秀东汉灭亡:曹丕篡汉 西汉 西汉建立:汉高祖刘邦 刘邦被项羽封为汉王。…

XNU简介

XNU内核比较庞大复杂,因此这里只是进行主要内容的介绍 XNU据说是一个无限递归的缩写:XNU’s Not UNIX XNU内核是Mac和iOS的核心,有三个主要部分组成的一个分层体系结构;内核XNU是Darwin的核心,也是整个OS X的核心。 …

函数

1.编写函数,完成下面的程序,将一个字符串中的字母排序后输出。输出要求:字母从小到大排序(包括大小写)后的字符串。例如: 输入:Hello World! 输出:!HWdellloor 程序中的必要代码为: main() …

HangOver

How far can you make a stack of cards overhang a table? If you have one card, you can create a maximum overhang of half a card length. (We’re assuming that the cards must be perpendicular to the table.) With two cards you can make the top card overhang t…

❤️对比PyWinAuto和uiautomation实现微信联系人自动采集❤️

大家好,我是小小明。昨天我在《UI自动化工具轻松实现微信消息的自动收发和朋友圈爬取》一文中演示了UIAutomation的三个使用示例,链接:https://blog.csdn.net/as604049322/article/details/119899542 由于昨天对UIAutomation的API了解还不够全面,个别代码优化空间还较大。…

适用于winform程序的UI自动化实现(python+uiautomation)

适用于winform程序的UI自动化实现(pythonuiautomation) 一、使用的工具和库 定位工具:inspect(提取码:kvwx)、UISpy(提取码:ab0e) python库使用:subprocess(内置库&…

WPF UIAutomation测试套件开发

目录 介绍 目标 测试方案 功能测试(黑匣子) 测试示例 设计 记录测试并生成测试方法 更新测试方法并构建 测试用例规范 测试方法 初始化方法 实现自定义TestContext 测试配置 关于CodedUI的常见问题 不要手动更改* .Designer.cs文件中的代…

安卓手机 Python 自动化( uiautomation、uiautomation2、weditor )

其他自动化工具或者框架: Airtest:https://airtest.readthedocs.io/zh_CN/latest/autojs:Auto.js快速入门实战教程:https://zhuanlan.zhihu.com/p/90065914appium:https://blog.csdn.net/freeking101/article/details/…

UIAutomation识别UI元素

MS UI Automation(Microsoft User Interface Automation:UIA)是随.net framework3.0一起发布的,虽然在如今这个几乎每天都有各种新名词、新技术出来的所谓的21世纪,它显得已经有些过时了。前些日子,正好一个项目,可以用…

uiautomation实现自动化

1.下载UI SPY 下载地址:https://download.csdn.net/download/yangzhichao_csdn/85389759 2.CMD指令导入uiautomation库 pip install uiautomation 3.打开计算器,然后打开UISpy 如图ControlType为”ControlType.Window” 那么捕获窗口就用:uiautomation.WindowCo…