当前位置: 首页 > backend >正文

Transformer相关

问题汇总

    • Transformer的结构
    • 自注意力机制(Self-Attention)
      • 多头自注意力
      • 前馈神经网络(Feed-Forward Network, FFN)
      • 位置编码
      • 编码器(Encoder)和解码器(Decoder)
      • Multi-Query Attention(多查询注意力机制)
      • Grouped-query Attention(分组查询注意力机制)
      • FlashAttention
    • 与注意力机制相关的问题
      • 为什么要除以dk的开根号?
      • Transformer为何使用多头注意力机制?
      • 为什么Q和K使用不同的权重矩阵生成,为何不能使用同一个值进行自身的点乘?
      • Transformer计算attention的时候为何选择点乘而不是加法?两者计算复杂度和效果上有什么区别?
      • CNN用注意力机制也可以提取全局特征,为什么用Transformer
    • 与transformer架构相关的问题
      • tokenizer的作用?为什么bert要用专门的tokenizer?
      • Transformer为什么优于RNN和LSTM,好在哪?

Transformer的结构

Transformer 的整体结构是一个编码器-解码器架构,每个编码器和解码器都由多个层堆叠而成。每层都由自注意力机制和前馈神经网络(Feed-Forward Network, FFN)组成。此外,还有残差连接(Residual Connection)和层归一化(Layer Normalization)

自注意力机制(Self-Attention)

自注意力机制是 Transformer 的核心创新,它的主要作用是对输入序列中的每个词进行加权求和,考虑到其他所有词对当前词的影响,从而获得词与词之间的全局关系。
具体而言,对于输入的每个单词,生成三个向量:查询(Query),键(Key),值(Value)。然后计算查询和键的相似度(通过点积计算),并根据这个相似度给值加权,最后生成输出。
时间和空间复杂度是 O(N^2),其中 N 是序列长度。
在这里插入图片描述

多头自注意力

Transformer 使用了多头注意力机制(Multi-Head Attention),即将查询、键、值分别映射到多个子空间,然后在不同子空间上并行计算多个注意力头,最后将这些头的输出拼接起来并线性变换。这样做的目的是让模型可以在不同的子空间中捕捉不同层次的语义信息。
在这里插入图片描述

前馈神经网络(Feed-Forward Network, FFN)

每个 Transformer 层还包括一个前馈神经网络,它是由两个线性变换和一个激活函数(通常是 ReLU)构成的。前馈网络的目的是通过非线性变换来增加模型的表达能力。

位置编码

由于 Transformer 没有递归结构,无法直接处理序列中词语的顺序信息,因此引入了位置编码。位置编码是一个与输入序列长度相同的向量,其中每个位置的编码值代表该位置的相对位置。通常使用正弦和余弦函数来计算每个位置的编码。

编码器(Encoder)和解码器(Decoder)

编码器:由多个相同的层堆叠而成,每层包含自注意力机制和前馈神经网络。每个输入的词向量通过自注意力机制和前馈神经网络,生成一个编码表示,该表示可以捕捉序列中的上下文信息。
解码器:解码器结构与编码器类似(Masked 多头自注意力层和前馈网络),但每个解码器层有一个额外的“编码器-解码器注意力”子层,用于根据编码器输出的表示来生成当前时刻的预测。解码器的目标是根据已经生成的部分输出和编码器的输出,逐步生成目标序列。

注意力机制变种
注意力机制变种

Multi-Query Attention(多查询注意力机制)

主要是对传统注意力机制中的查询和键值对的交互方式进行了优化。它在每个头(head)中使用多个查询向量,但共享相同的键和值矩阵。

Grouped-query Attention(分组查询注意力机制)

它将查询头分成若干个组,在每个组内的查询头共享一组键和值矩阵。例如,假设有h个查询头,将其分成g个组,那么每个组就有g/h个查询头,同一组内的查询头会共同使用一组键和值矩阵来计算注意力。

FlashAttention

通过分块处理将输入矩阵划分为小块以减少对 HBM(高带宽内存,High Bandwidth Memory) 的访问并实现并行计算,利用重计算技术存储归一化因子来减少存储需求并加速反向传播,采用核融合把多个计算步骤融合到一个 CUDA 内核以提高内存访问效率

与注意力机制相关的问题

为什么要除以dk的开根号?

有些qk对在经过点积运算后的结果相对于其他点积对来说过大,这就导致在之后的softmax中占据了绝大多数注意力,而其他的点积对在经过softmax之后的分数则趋于0,结果就是会出现梯度消失的问题。因此这里除以一个常数的操作类似于归一化,使得各点积对的结果更加平滑。

Transformer为何使用多头注意力机制?

i. 捕捉多种依赖关系
ii. 提高模型容量和表达能力
iii. 更好的泛化能力
iv. 避免信息损失
v. 并行计算的能力

为什么Q和K使用不同的权重矩阵生成,为何不能使用同一个值进行自身的点乘?

i. 在注意力机制中,Q(查询)和K(键)的功能不同
ii. 如果使用同一个权重矩阵来生成Q和K,那么Q和K 将会是同样的表示,Q和 K之间的点积将变成类似于自身的相似性计算,会导致单一的注意力模式(模型可能倾向于对自己最关注,而不是考虑其他token的影响,可能会导致注意力矩阵接近于单位矩阵,这在多头注意力机制下会显得单一且局限)和缺乏多样性(不同的Query和Key可以捕捉到输入序列中更复杂的关系,如果它们相同,模型将无法有效地对多样化的上下文信息进行建模)。

Transformer计算attention的时候为何选择点乘而不是加法?两者计算复杂度和效果上有什么区别?

i. 乘操作能够有效地测量两个向量之间的相似性或相关性。在注意力机制中,Q与K的点乘结果代表了它们之间的关联程度,这种相似性度量是非常适合用于确定权重的。
ii. 点乘计算简单直接,不涉及复杂的加法和乘法运算,这有助于提高计算效率和模型的训练速度。,用加法的话后面还得加一个激活函数,计算复杂度为O(d+d),d为特征维度。而点乘操作的计算复杂度仅为O(d)

CNN用注意力机制也可以提取全局特征,为什么用Transformer

a) 带有注意力机制的CNN依然受限于 局部卷积操作 和 区域级的注意力计算。
b) Transformer 的核心优势在于其全局自注意力机制(Self-Attention),该机制具有全局信息交互、并行计算和可变输入长度的优点,可直接捕捉所有位置之间的依赖关系,CNN每一层的感受野仍然是有限的。

与transformer架构相关的问题

tokenizer的作用?为什么bert要用专门的tokenizer?

a) Tokenizer(分词器)是自然语言处理(NLP)任务中的重要组件,主要作用是将输入文本转换为模型可处理的格式。具体来说,Tokenizer 主要完成以下任务:
i. 文本切分
ii. 词汇表映射(Vocabulary Mapping):将 Token 映射为唯一的 ID,使其可供模型处理。
iii. 特殊 Token 处理:添加 [CLS]、[SEP]、[PAD] 等特殊 Token,以适应不同任务的需求。
iv. 序列截断与填充:确保输入符合模型的最大长度要求,进行截断或填充。
v. 子词拆分(Subword Tokenization):对于未登录词(Out-of-Vocabulary, OOV),利用子词单元(如 WordPiece、BPE)进行处理,避免 OOV 问题。
b) BERT 采用的是 WordPiece Tokenizer,与传统 Tokenizer 相比,它有几个特殊的地方:
i. 基于子词(Subword)拆分,减少 OOV 问题
在这里插入图片描述
ii. 对词频和参数效率进行了优化:WordPiece 通过统计词频和词的共现关系,构建一个包含高频完整单词和低频子词的词表。例如,高频词 “the” 会单独保留,而低频词会被拆成子词。
iii. 统一适配不同语言的 Tokenizer
iv. 应 BERT 预训练方式:BERT 采用 双向 Transformer,需要用 [CLS] 标记句子起始,[SEP] 标记句子间隔。这些 Token 在 BERT 训练时就已经嵌入模型权重,因此 Tokenizer 需要特别处理它们。

Transformer为什么优于RNN和LSTM,好在哪?

a) 并行计算能力:RNN 和 LSTM是递归结构,处理序列时需要按顺序逐步处理每个时间步的输入。Transformer 完全基于自注意力机制,并且不依赖于顺序信息,允许模型在处理序列时并行化计算
b) 捕捉长距离依赖:自注意力机制使得 Transformer 可以直接在所有位置之间建立联系。每个位置的表示都能够同时参考序列中其他位置的信息,而无需依赖前面的状态或步进计算。
c) 全局上下文建模:每个位置都能同时关注序列中的所有其他位置。
d) 可扩展性:可以更轻松地扩展到大规模数据集,处理更长的序列。
e) 更好的梯度流:避免了递归结构中的梯度消失问题

http://www.xdnf.cn/news/10558.html

相关文章:

  • 辅助角公式
  • 财管-0-战略和战略管理
  • Spring Boot + MyBatis 实现的简单用户管理项目的完整目录结构示例
  • AI 医疗影像诊断:技术实现、临床应用与未来趋势 —— 以肺部 CT 早期肺癌检测为例
  • 文言文停词库 | 古文停词库 | 624个简体停词 |文言文python分词库-thulac
  • Baklib知识中台加速企业服务智能化实践
  • 达梦分布式集群DPC_分布式事务理解_yxy
  • 机器学习算法-k-means
  • LeetCode 40.组合总和II:含重复元素的组合问题去重策略详解
  • 生物化学笔记:神经生物学概论【脑客中国·科研】第186位讲者 | 何超:大脑的觉醒与睡眠
  • LCA(最近公共祖先)与树上差分
  • 【Dv3Admin】工具异常处理配置文件解析
  • 智能指针unique
  • 【MySQL】第13节|MySQL 中模糊查询的全面总结
  • Codeforces Round 1028 (Div. 2)(ABC)
  • JAVA实战开源项目:精简博客系统 (Vue+SpringBoot) 附源码
  • Python打卡训练营Day42
  • 阻塞队列BlockingQueue解析
  • Window系统程序加入白名单
  • LangChain-结合智谱AI大模型实现自定义tools应用实例
  • 吴恩达MCP课程(4):connect_server_mcp_chatbot
  • springboot中@Async做异步操作(Completable异步+ThreadPoolTaskExecutor线程池+@Async注解)
  • shp转3d tiles在cesium渲染楼宇白膜
  • Linux 驱动之设备树
  • Leetcode 2093. 前往目标城市的最小费用
  • SAR ADC 异步逻辑设计
  • Linux系统配置屏幕旋转和触摸旋转
  • 从冷上电到main()函数,Bootloader都做了什么?
  • 数据类型检测有哪些方式?
  • robot_lab学习笔记【MDP综述】