图解自注意力机制

article/2025/10/29 12:05:15

写在最前边

  1. 这个文章是《图解GPT-2 | The Illustrated GPT-2 (Visualizing Transformer Language Models)》的一部分,因为篇幅太长我就单独拿出来了。

    当然如果你只想了解自注意力机制可以只看本文的前半部分

    后半部分主要是讲Masked Self-attention在GPT-2中的应用,不了解GPT-2的可以忽略这部分内容。

  2. 我补充的内容格式如下:

    这是我补充的内容。

    仅属于我的个人理解,如有漏误欢迎批评指正。

文章目录

      • 自注意力
      • 图解Masked Self-attention
      • GPT-2 的 Masked Self-attention
        • 1. 创建queries, keys和values
        • 1.5 划分注意力头
        • 2. 注意力分数
        • 3. 求和
        • 3.5 合并注意力头
        • 4. 映射 projection
          • GPT-2 全连接神经网络第一层
          • GPT-2 全连接神经网络第二层:投影到模型维度
      • 你学完了!


正文

看下图,图中表示的是使用自注意力处理 输入序列中的it单词 的时候。
在这里插入图片描述

接下来我们详细介绍一下这一过程是如何实现的。

注意,接下来的图解过程会用到很多 “向量” 来图解算法机制,而实际代码实现是使用 矩阵 进行计算的。这个分析过程是想让读者了解在处理过程中每个单词发生了什么,因此本文的重点是对单词级(word-level)处理逻辑进行解析。

自注意力

我们从原始的自注意开始,它是在一个Transformer组件(encoder)中计算的。我们先来看看这个简单的Transformer组件,假设它一次只处理四个tokens。

仅需三步即可实现自注意力:

  1. 为每个单词路径创建Query、Key、Value。
  2. 对于每个输入token,使用其Query向量对其他所有的token的Key向量进行评分,获得注意力分数。
  3. 将Value向量乘以上一步得到的注意力分数,之后加起来。

在这里插入图片描述

1. 创建Query、Key、Value

现在我们只关注第一个路径, 我们需要用它的Query和所有的Key比较,这一步骤会为每个路径都生成一个注意力分数。

先不管什么是多头自注意力,只考虑自注意力,也就是只有一个head的情况。自注意力计算的第一步就是要计算出每个路径的Query、Key、Value三个向量。

1. 看下图是一次处理四个tokens,每个token都有它单独的路径,第一路径指的是 X 1 X_1 X1这个token。

2. 对于每个token来说对应的Query、Key、Value是三个向量,而在实际代码计算中是使用整个输入序列的矩阵。

3. 获得Query、Key、Value三个向量的方法是 每个单词的表示向量和对应的权重矩阵( W Q 、 W K 、 W V W^Q、W^K、W^V WQWKWV)做矩阵乘法。

在这里插入图片描述

2. 计算注意力分数

现在我们已经有了Query、Key、Value三个向量。在第二步我们只需要用到Query和Key向量。因为我们关注的是第一个token,所以我们将第一个token的Query和其他token的key向量做点乘,这样计算会得到每一个token的注意力分数。

在这里插入图片描述

3. 求和

现在对于每个token,将上一步得到的注意力分数乘以Value向量。将相乘之后的结果加起来,那些注意力分数大的占比会更大。

在这里插入图片描述

对于Value向量,注意力分数越低,颜色越透明。这是为了说明乘以一个小数如何稀释不同token的Value向量。

看下图,注意力分数乘以每个Value向量,原作者用不同深浅的蓝色的框框表示计算之后的结果。可以看到 V 3 V_3 V3比较显眼, V 2 V_2 V2几乎看不到了,然后将计算结果加起来得到 Z 1 Z_1 Z1。这个 Z 1 Z_1 Z1就是 X 1 X_1 X1新的表示向量,这个向量除了单词本身,还涵盖了上下文其他token的信息。

这一过程可以认为注意力分数就是表示不同单词重要性的权重,而整个自注意力计算就是求所有token的加权和,这一过程可以引入其他token的表示,让当前token获得上下文信息。

之后我们对每个token都进行相同的操作,最终会得到每个token新的表示向量,新向量中包含该token的上下文信息。之后会将这些数据传给Transformer组件的下一个子层(前馈神经网络):

在这里插入图片描述

图解Masked Self-attention

现在我们已经了解了Transformer中普通的自注意力机制,让我们继续看看带Masked自注意力。

Masked自注意力和普通的自注意力是一样的,除了第二步计算注意力分数的时候有点差异。

假设模型只有两个token作为输入,我们当前正在处理第二个token。在下图的例子中,最后两个token会被屏蔽掉。这样模型就可以干扰计算注意力分数这一步骤,它会让未输入的token的注意力得分为0,这样未输入的token就不会影响当前token的计算,当前token的注意力只会关注到在它之前输入的tokens。

在这里插入图片描述
这种屏蔽通常以矩阵的形式实现,称为注意力屏蔽(attention mask)。

还是假设输入序列由四个单词组成,例如robot must obey orders。在语言建模场景中,每个单词需要一个步骤处理(假设现在每个单词都是一个token),因此这个序列包含四个处理步骤。由于模型是按照批量(batch)进行处理的,我们可以假设这个模型的批量大小为4(batch_size = 4),然后模型将把整个序列作为一个batch进行处理。

假设现在每个单词都是一个token。单词word 不一定等于 token,这是由分词方式决定的。

在这里插入图片描述

token无法直接计算注意力分数,因此我们需要用tokens对应的Query和Key进行计算。搞成矩阵乘法的形式,我们通过将Query向量乘以Key矩阵来计算注意力分数。

在这里插入图片描述
完成乘法运算后,我们要加上一个mask矩阵屏蔽掉当前还未输入的词,就是加一个上三角形矩阵,一般是将我们想要屏蔽的位置设置为 − ∞ -∞ 或一个非常大的负数(GPT-2中的为负一亿):
在这里插入图片描述
然后,对每一行进行softmax就会转化成我们需要的注意力分数:

在这里插入图片描述
这个分数表的含义如下:

  • 第一步:只输入一个词robot,当模型处理数据集中的第一个单词时,也就是score矩阵的第一行,因为其中只包含一个单词robot,所以它的注意力100%集中在这个单词上。

  • 第二步:输入robot must,当模型处理第二个单词must时(score矩阵第二行),48%的注意力会放在robot上,52%的注意力会放在must上。

  • 以此类推……


GPT-2 的 Masked Self-attention

让我们更详细地了解一下GPT-2中的masked注意力。

现在还是假设模型做预测任务,每次处理一个 token。

使用训练好的模型进行预测的时候,模型在每次迭代后都会增加一个新词,对于已经处理过的token来说,沿着之前的路径重新计算效率很低。

因为一个训练好的模型,每个组件的权重矩阵是固定的。每次增加一个token都要重新计算整个输入序列的QKV的话会造成巨大的计算开销。
比如a robot must obey the rule,如果第一次迭代时候只有a,仅需要计算它的QKV,第二次迭代时候是a robot,就需要计算二者的QKV。但是这样就重复计算了a的QKV


GPT-2的高效处理方法如下:

假设我们处理输入序列的第一个tokena,(暂时忽略<s>)。在这里插入图片描述

之后GPT-2会保留a token的Key和Value向量。以便之后使用。

注意,每个组件的自注意力层都有各自的Key和Value向量,不同的组件中Key和Value向量不共享:

在这里插入图片描述

在下一次迭代中,当模型处理单词robot时,它不需要为a重新生成Query、Key、Value,而是直接用第一次迭代中保存的那些:

在这里插入图片描述

1. 创建queries, keys和values

让我们假设这个模型正在处理单词it。如果我们讨论的是最底层的decoder组件,那么它接收的token的输入是token的嵌入+ 第九个位置的位置编码:

在这里插入图片描述

Transformer中的每个组件之权重不共享,都有自己的权重。我们首先要和权重矩阵进行计算,我们使用权重矩阵创建Query、Key、Value。
在这里插入图片描述

自注意力子层会将输入乘以权值矩阵(还会加上bias,图中没表示出来),乘法会产生一个向量,这个向量是单词it的Query、Key、Value的拼接向量。

在这里插入图片描述

将输入向量乘以注意力权重向量(然后添加一个偏差向量),就会得到这个token的Query、Key、Value向量。

1.5 划分注意力头

在前面的例子中,我们只专注于自注意力,忽略了“多头”(muti-head)的部分。现在说一下什么是“多头”。
就是将原来一个长的Query、Key、Value向量按照不同位置截取并拆分成短的向量。

在这里插入图片描述

前边的例子中我们已经了解了一个注意力头怎么计算,现在我们考虑一下多头注意力,如下图考虑有三个head。

在这里插入图片描述

2. 注意力分数

现在我们可以开始打分了,你们应该知道,我们这只画出来一个注意力头(head #1),其他的头也是这么计算的:

在这里插入图片描述

现在,该token可以针对其他token的所有Value进行评分:

在这里插入图片描述

3. 求和

和前边讲的一样,我们现在将每个Value与它的注意力分数相乘,然后将它们相加,产生head #1的自我注意结果 Z Z Z

在这里插入图片描述

3.5 合并注意力头

不同的注意力头会得到不同的 Z Z Z,我们处理不同注意力头的方法是把这个 Z Z Z连接成一个向量:

在这里插入图片描述
但是这个拼接结果向量还不能传给下一个子层。

我们需要把这个拼接向量再做一次projection,得到另一个同类表示

作者原文写的“We need to first turn this Frankenstein’s-monster of hidden states into a homogenous representation.” 直译是“我们需要首先把这个隐藏状态的弗兰肯斯坦怪物变成同类表示。”
弗兰肯斯坦是一个人造人,是个怪物,作者是玛丽·雪莱,这本书可以看作是科幻小说开山之作。感兴趣的可以看一下。

拼接向量再做一次projection(映射)对于这句我存在一些疑问。因为我看了其他人对这篇文章的翻译,如下图,这个人说这里的projection是因为维度不对,需要调整维度。这是错误的!!! 看下边第4节可以知道这个projection并没有改变维度、向量长度。至于为什么这里需要projection,第4节也进行了解释。
,

我也看了一下GPT-2的源码,维度、向量长度确实没有发生变化。 以下列出链接,感兴趣的可以自己去查证,如果有错误欢迎指正,有问题也欢迎和我探讨。

  • OpenAI的GPT-2 tensorflow版
  • HuggingFace的GPT-2 pytorch版
  • GPT-2 论文+代码笔记
  • GPT-2代码解读[2]:Attention

4. 映射 projection

我们要让模型学习到 如何将自注意力的拼接结果更好地映射成前馈神经网络可以处理的向量 。因此这里要做一步映射。

在这就用到了我们的第二大权重矩阵,它将自注意力的拼接结果映射为自注意力子层的输出向量:

在这里插入图片描述

注意这里的Zoom out意思是维度没有变,只是用更少的格子来表示这个向量。

既然这有一个权重,那肯定模型训练过程中要学啊,学这个权重矩阵的目的就是为了让模型能把自注意力计算之后拼接的那个矩阵 映射到 前馈神经网更好处理的矩阵,个人认为这里的projection就是做了一个平滑作用。

之后我们就产生了可以发送到下一层的向量:

在这里插入图片描述

GPT-2 全连接神经网络第一层

全连接神经网络的输入是自注意力层的输出,用于处理自注意力子层得到的token的新的表示,这个新的表示包含了原始token及其上下文的信息。

全连接神经网络由两层组成。第一层是把向量转化到模型大小的4倍(因为GPT-2 small是隐状态大小是768,所以GPT-2中的全连接神经网络第一层会将其投影到768*4 = 3072个单位的向量中)。为什么是四倍?因为原始Transformer的也是四倍,这里就没改。

在这里插入图片描述
上图没画出bias。

GPT-2 全连接神经网络第二层:投影到模型维度

第二层将第一层的结果再投射回模型的维度(GPT-2 small为768)。这个计算结果就是一个完整的Transformer组件(decoder)对token的处理结果。

在这里插入图片描述

上图没画出bias。

你学完了!

总结一下输入向量都会遇到哪些权重矩阵:

在这里插入图片描述

每个Transformer组件都有自己的权重。组件之间权重不共享!

另外,该模型只有一个token的嵌入矩阵和一个位置编码矩阵:

在这里插入图片描述

如果你想知道模型的所有参数,我在这进行了统计:

在这里插入图片描述

由于某种原因,它们加起来有124M的参数,但是实际GPT-2 small模型只有117M参数。我不知道为什么,但这就是他们发布的代码中的参数数量(如果我错了欢迎指正)。

上图中博客作者对GPT-2 small的参数进行了统计,计算结果和OpenAI开源的GPT-2模型的参数量不一样。
作者算的是124M,实际代码中只有117M,
原因如下:
OpenAI团队说:“我们论文里参数计算方法写错了。所以你现在可以看到GPT-2 small模型参数只有117M……”
在这里插入图片描述
截图来源https://github.com/openai/gpt-2


http://chatgpt.dhexx.cn/article/8Q7IKcpm.shtml

相关文章

NeurIPS 2021 | Twins:重新思考高效的视觉注意力模型设计

Twins 是美团和阿德莱德大学合作提出的视觉注意力模型&#xff0c;相关论文已被 NeurIPS 2021 会议接收。本文主要讲述 Twins 解决的难点、设计和实现思路&#xff0c;以及在美团场景的探索落地&#xff0c;希望能对从事视觉算法研发的同学有所帮助和启发。 导读 Twins [1] 是美…

深度理解机器学习20-注意力机制模型

人类的注意力机制&#xff08;Attention Mechanism&#xff09;是从直觉中得到&#xff0c;它是人类利用有限的注意力资源从大量信息中快速筛选出高价值信息的手段。深度学习中的注意力机制借鉴了人类的注意力思维方式&#xff0c;被广泛的应用在自然语言处理&#xff08;Natur…

人工智能之注意力模型

朋友们&#xff0c;如需转载请标明出处&#xff1a;人工智能AI技术的博客_CSDN博客-python系列教程,人工智能,程序人生领域博主 注意力模型 通过对教程中前面一些文章的学习&#xff0c;我们知道可以用上面的神经网络来实现机器翻译。假设要将一段法语句子翻译成英文句子。那么…

注意力之双线性模型注意力

本文主要针对两篇论文&#xff1a;双线性注意力网络模型和深度模块化注意力进行总结&#xff0c;加上自己对其的理解。若有不足&#xff0c;还望指出。 论文地址&#xff1a; 双线性注意力网络 深度模块化注意力 项目地址&#xff1a; 双线性注意力网络 深度模块化注意力 0. 写…

注意力模型CBAM

论文&#xff1a;CBAM: Convolutional Block Attention Module Convolutional Block Attention Module (CBAM) 表示卷积模块的注意力机制模块。是一种结合了空间&#xff08;spatial&#xff09;和通道&#xff08;channel&#xff09;的注意力机制模块。相比于senet只关注通道…

注意力模块

目前主流的注意力机制可以分为以下三种&#xff1a;通道注意力、空间注意力以及自注意力&#xff08;Self-attention&#xff09; 通道域旨在显示的建模出不同通道之间的相关性&#xff0c;通过网络学习的方式来自动获取到每个特征通道的重要程度&#xff0c;最后再为每个通道…

注意力机制学习

注意力机制学习 学习于博客https://blog.csdn.net/weixin_44791964/article/details/121371986 1.Channel Attention 1.1 SeNet 对于输入进来的特征层&#xff0c;关注其每一个通道的权重&#xff0c;让网络关注它最需要关注的通道。【channel不变&#xff0c;h,w变】 代表…

一般注意力模型

文章目录 一般注意力模型注意力输入注意力输出 一般注意力模型 描述一般注意力模型&#xff0c;首先要描述可以使用注意力的模型的一般特征。我们将这种模型称为任务模型&#xff0c;如图&#xff1a; 这个模型接受一个输入&#xff0c;执行指定的任务&#xff0c;然后产生所…

深度学习中的注意力机制模型及代码实现(SE Attention、CBAM Attention)

目录 常用的注意力机制模型 SE Attention CBAM Attention CBAM Attention 模型结构​ CBAM Attention 代码实现&#xff08;Pytorch版&#xff09;&#xff1a; 注意力机制加到网络的哪里合适 常用的注意力机制模型 常用的注意力机制多为SE Attention和CBAM Attention。它…

深度学习笔记——Attention Model(注意力模型)学习总结

深度学习里的Attention model其实模拟的是人脑的注意力模型&#xff0c;举个例子来说&#xff0c;当我们观赏一幅画时&#xff0c;虽然我们可以看到整幅画的全貌&#xff0c;但是在我们深入仔细地观察时&#xff0c;其实眼睛聚焦的就只有很小的一块&#xff0c;这个时候人的大脑…

什么是注意力机制?

Attention机制在近几年来在图像&#xff0c;自然语言处理等领域中都取得了重要的突破&#xff0c;被证明有益于提高模型的性能。 Attention机制本身也是符合人脑和人眼的感知机制&#xff0c;这次我们主要以计算机视觉领域为例&#xff0c;讲述Attention机制的原理&#xff0c…

transformer 模型(self-attention自注意力)

transformer模型在《Attention is all you need》论文中提出 这篇论文主要亮点在于&#xff1a;1&#xff09;不同于以往主流机器翻译使用基于RNN的seq2seq模型框架&#xff0c;该论文用attention机制代替了RNN搭建了整个模型框架。2&#xff09;提出了多头注意力&#xff08;…

深度学习中的注意力机制模型ECANet

目录 ECANet简介 ECA Module ECANet 性能对比 ECANet简介 Efficient Channel Attention Module 简称 ECA&#xff0c;2020年 Qilong Wang等人提出的一种 高效通道注意力(ECA)模块 &#xff1b; 提出了一种 不降维的局部跨通道交互策略 &#xff0c;有效避免了降维对于通道…

注意力模型直观理解(Attention Model Intuition)

来源&#xff1a;Coursera吴恩达深度学习课程 本周的课程我们都在使用这个编码解码的构架&#xff08;a Encoder-Decoder architecture&#xff09;来完成机器翻译。当你使用RNN读一个句子&#xff0c;于是另一个会输出一个句子。注意力模型&#xff08;the Attention Model&a…

深度学习中的注意力机制

作者 | 张俊林 责编 | 何永灿 最近两年&#xff0c;注意力模型&#xff08;Attention Model&#xff09;被广泛使用在自然语言处理、图像识别及语音识别等各种不同类型的深度学习任务中&#xff0c;是深度学习技术中最值得关注与深入了解的核心技术之一。 本文以机器翻译为例&…

注意力模型---Attention Model

注意力模型---Attention Model 1、Soft Attention Mode1.1 什么是Soft Attention Mode1.1 公式介绍 2、四种注意力中的打分函数2.1 加性注意力&#xff08;additive attention&#xff09;2.2 点积注意力&#xff08;multiplicative attention&#xff09;与双线性注意力(MLB)2…

【机器学习】关于注意力模型(Attention-model)的理解和应用

注意力模型是近年来在序列处理领域新提出的机器学习方法&#xff0c;在语言翻译等领域取得了不错的效果。要想了解注意力模型&#xff0c;那么必须对现在的机器学习各领域有一定的了解&#xff0c;而且要了解encoder-decoder基本思想。 首先可以大致的概括下目前的机器学习尤其…

一文读懂计算机视觉中的注意力机制原理及其模型发展

作者&编辑 | 言有三 来源 | AI有道&#xff08;ID:yanyousan_ai&#xff09; 导读&#xff1a;Attention机制在近几年来在图像&#xff0c;自然语言处理等领域中都取得了重要的突破&#xff0c;被证明有益于提高模型的性能。Attention机制本身也是符合人脑和人眼的感知机制…

注意力模型(Attention Model)理解和实现

1. 直观感受和理解注意力模型 在我们视野中的物体只有少部分被我们关注到&#xff0c;在某一时刻我们眼睛的焦点只聚焦在某些物体上面&#xff0c;而不是视野中的全部物体&#xff0c;这是我们大脑的一个重要功能&#xff0c;能够使得我们有效过滤掉眼睛所获取的大量无用的视觉…

注意力模型(Attention Model)

八月的第一天&#xff0c;苏神yyds&#xff01; 来源&#xff1a;Coursera吴恩达深度学习课程 在注意力模型直观理解中我们看到注意力模型如何让一个神经网络只注意到一部分的输入句子。当它在生成句子的时候&#xff0c;更像人类翻译。让我们把这些想法转化成确切的式子&…