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

transformer模型初理解

模型介绍

在 Transformer 之前,主流的序列模型是 **RNN(循环神经网络)**

工作方式类似「逐字阅读」:处理序列时,必须从第一个词开始,一个接一个往后算(比如翻译时,先看 “我”,再看 “爱”,再看 “你”,不能同时看三个词)。

这种串行计算有两个致命问题:

  1. 推理速度慢:因为无法实现并行计算,对于长文章来说,处理效率极低
  2. 长距离依赖差:比如一句话的开头和结尾有逻辑关联(如 “小明…… 他……”),但 RNN隔得太远就会 “记不清”。

对于翻译任务来说,文字之间存在语法关系,如果只是按照串行方式进行翻译,最终得到的翻译序列会是一个语法混乱的序列

而 Transformer 彻底抛弃了循环结构,改用 注意力机制 实现「并行计算」,同时能直接捕捉任意两个词之间的关联(无论距离多远)。这就是它能在 NLP 任务中碾压前任的核心原因。

整体模块介绍

模块由两部分组成:编码器、解码器,一个模型中含有n个结构相同的编码器和解码器(可以自己定义数量)
在这里插入图片描述

以翻译任务为例:

编码器负责对原始文字序列的语义特征进行提取

解码器负责预测原始文字序列对应的目标文字序列

分模块解析

编码器

在这里插入图片描述

输入部分
编码器的原始输入是一段文字序列,比如"我爱你"

在输入部分有两个关键预处理步骤,分别是:

  1. 词嵌入(Embedding)
  2. 位置编码(Positional Encoding
词嵌入(Embedding)
这部分是将原始输入序列转变成计算机能理解的词**向量,**如 “我”→ [0.2, 0.5, -0.1]),让计算机能理解;

要注意的是,在初始时,词向量是随机生成的,并将随机数定格在某个范围内,在训练时会经过反向传播动态调整词向量

对于"我爱你",初始时可能会转变成[[0.2, 0.5, -0.1],[0.1, 0.3, -0.2],[0.5, 0.2, -0.2]]

位置编码(Positional Encoding):
为每个词向量生成**"位置信息",原因是**Transformer 并行处理,本身不知道词的顺序,加入位置编码后可以在训练过程中逐渐学习到每个词的先后顺序关系

位置编码的生成公式

pos表示的是当前词在整个输入序列中的位置,例如"我"的pos为0,“爱”的pos为1

2i2i+1中的i表示的是某个词向量的第i个维度,以上面的例子,一个词被分为了512个维度。

而2i表示为偶数的维度,2i+1表示为奇数的维度


为什么要这样做呢,因为这个公式蕴含着词汇之间的相对关系

所以在训练调整权重时,模型能根据输入向量之间的数学关系来学习他们之间的位置关系


在计算完位置编码后,将词向量与位置编码进行相加,得到的新向量就是编码器的第二个模块注意力机制的输入

多头自注意力机制
自注意力机制是 Transformer 的灵魂,作用是:**让输入序列中的每个词,都能 “看到” 其他词,并计算它们之间的关联度**。

举个例子:输入 “猫坐在垫子上,它很舒服”,“它” 指的是 “猫”,自注意力会让 “它” 重点关注 “猫”,而不是 “垫子” 或 “舒服”。

自注意力机制的计算步骤是这样的:

核心是三个变量的计算:Q(Query)、K(Key)、V(Value)可以类比成查字典:

  • 你想查 “它” 指什么(这是 Query);
  • 字典里的每个词都有自己的 “标签”(如 “猫” 的标签是 “动物”,这是 Key);
  • 查到后得到的解释(如 “猫是一种动物”,这是 Value)。

具体计算如下:

  1. 生成Q、K、V:给每个词向量(上一步的输入)乘上三个不同的线型层矩阵这3个线型层矩阵在初始时为随机值,随着训练过程动态调整
  2. 计算注意力得分:用 Query 和每个词的 Key 做 “匹配度” 计算(用「缩放点积」:Q・K / √d,d 是向量维度,防止值太大);
  3. 归一化得分:用 softmax 把得分变成 0-1 的权重(总和为 1),表示 “关注程度”;得分越大,说明词向量与这个key最为匹配 ,举例子也就是猫坐在垫子上,它很舒服”,“它” 指的是 “猫”,所以“猫”这个key得分会更高
  4. 加权求和:用第三步的得分乘以每个词的V向量,再进行累加,得到该词的「注意力输出」(即 “综合了其他词信息的新向量”)。

前馈神经网络
这一个部分是为了**对每个词的注意力输出做独立的特征处理(和其他词无关)。**

结构是:两层线性变换 + ReLU 激活,公式可以简化为:
FFN(x) = max(0, x·W1 + b1) · W2 + b2
作用类似 “特征提纯”:把注意力捕捉到的关联信息,进一步转化为更有效的特征。

在此之后还有两个部分

  1. 残差连接:每个子层的输出 = 子层输入 + 子层计算结果(如注意力输出)。作用是解决深层网络的 “梯度消失”,让模型更容易训练。 “梯度消失”会使得模型训练不动,权重无法修改
  2. 层归一化:对每个词的向量做归一化(让均值为 0,方差为 1)。作用是稳定训练过程中的数值波动,让模型收敛更快。

对于transformer模型而言,可能有n个编码器,这n个编码器结构完全一样,但是内部权重不一样。没个编码器都有自己初始的线型层矩阵(3个),都独享矩阵参数。且一个编码器的输入是上一个编码器的输出。

编码器的多层结构设计目的是逐步提炼和抽象输入序列的特征(从低级特征到高级特征),而独立的线性层矩阵是实现这一目标的关键:

  • 第一层可能更关注基础的语法关系(如主谓、动宾),其会学习 “如何提取语法相关的 Q、K 特征”(比如让动词的 Q 更易匹配主语的 K)。
  • 第二层则更关注全局语义(如整个句子的场景或逻辑),其会学习 “如何提取语义相关的 Q、K 特征”(比如让 “猫” 的 Q 更易匹配 “垫子” 的 K,因为它们共同构成 “猫坐在垫子上” 的场景)。

如果多层共享同一套线性层矩阵,模型就无法针对不同抽象层次的特征进行专门优化,难以实现 “逐层递进” 的特征提取。

最后一个编码器的output最作为input进入n个解码器


解码器

在这里插入图片描述

解码器也由 N 个相同的层堆叠,每个层比编码器多一个子层,共 3 个子层:

  1. 掩码多头自注意力(Masked Multi-Head Self-Attention);
  2. 编码器 - 解码器注意力(Encoder-Decoder Attention);
  3. 前馈神经网络(和编码器的一样)。

在解码器的输入部分,可分为两种情况:

  1. 第一种是在训练时,输入部分是目标序列经过embedding以及位置编码转换后的向量以及编码器最后一层的注意力机制模块的K和V向量(这一部分会在解码器的第二个部分作为输入),这个目标序列怎么理解呢,加入我的编码器的输入原始序列是"我爱你",那么目标序列就是"i love you",训练时为了并行计算,会把整个输出序列(如 “I love you”)喂进去,但必须 “遮住” 每个词后面的内容(比如计算 “I” 的注意力时,只能看到 “I”,看不到 “love” 和 “you”)。

在训练阶段,我已经知道原始序列对应的目标序列是什么,所以会随机初始化一个**[目标序列长度✖️模型向量维度]**的矩阵作为解码器的输入

举例:
目标序列为:[我, 爱, 机器学习]
移位后输入:[<sos, 我, 爱, 机器学习](解码器需要基于此预测[我, 爱, 机器学习, ])

  1. 第二种是在推理时,模型不知道完整目标序列,需要自回归生成:每次生成一个词,将其拼接到 “已生成序列” 后,作为下一次的输入,直到生成<eos结束。所以它的输入部分是上一次的输出(最原始的输入是开头符)拼接到"已生成序列"之后再加上编码器最后一层的注意力机制模块的K和V向量

举例:

● 第 1 步输入:[<sos] → 生成 “我”
● 第 2 步输入:[<sos, 我] → 生成 “爱”
● 第 3 步输入:[<sos, 我, 爱] → 生成 “机器学习”
● 第 4 步输入:[<sos, 我, 爱, 机器学习] → 生成,结束

掩码多头自注意力
计算方式与编码器的自注意力机制是一样的,但是多了个**掩码**,也就是说,在输入的矩阵中,在计算注意力得分时,当前词是看不到后面词的K和V的,会将他们设置为0,**这样的话,在计算得分时就不会将当前词后面的词的特征考虑进来,防止模型参考后面的句子来预测当前词。**方便与推理时逻辑保持一致。
编码器 - 解码器注意力
这个注意力的作用是:**让解码器 “关注” 编码器输出的上下文向量(即输入序列的信息)。**

计算方式和自注意力类似,但 Q、K、V 的来源不同:

  • Query(Q):来自解码器第一层(掩码注意力)的输出;
  • Key(K)和 Value(V):来自编码器的最终输出(上下文向量)

最终会得到一个注意力得分向量

前馈神经网络(和编码器的一样)
所做的工作与编码器一样,是为了**对每个词的注意力输出做独立的特征处理(和其他词无关)。**

也有残差连接和归一化两个步骤

输出处理
解码器的最终输出是一个 512 维的向量(论文中如此设置),需要转换成 “下一个词的概率”:
  1. 经过一个线性层:把 512 维向量映射到 “词表大小” 维度(比如词表有 10000 个词,就变成 10000 维);
  2. 经过 softmax:把 10000 维向量变成概率分布(每个值在 0-1 之间,总和为 1);
  3. 取概率最大的词作为输出,然后把这个词再喂回解码器,重复生成下一个词,直到生成 “结束符”。

至此,整个从输入到输出的流程就结束了,在进行完一轮epoch后,会计算损失然后进行反向传播修改各个矩阵参数权重。

http://www.dtcms.com/a/340039.html

相关文章:

  • Transformer、BERT、BEiT等模型相关八股及代码【自用】
  • HJ4 字符串分隔
  • 神经网络训练过程详解
  • 电流采样实现方法
  • JavaScript 代码保护与混淆
  • Vue2+Vue3前端开发_Day1
  • 端口映射原理操作详解教程:实现外网访问内网服务,本地路由器端口映射公网ip和软件端口映射域名2种方法
  • Qwen2.5-vl源码解读系列:LLM的Embedding层
  • MySQL常用函数
  • 首届机器人足球运动会技术复盘:从赛场表现看智能机器人核心技术突破
  • Wireshark获取数据传输的码元速率
  • 中科米堆CASAIM提供机加工件来料自动化测量尺寸方案
  • Origin绘制气泡图|科研论文图表教程(附数据格式模板)
  • 【HarmonyOS】H5 实现在浏览器中正常跳转 AppLinking 至应用
  • Java基础 8.19
  • 基于SpringBoot的停车场管理系统【2026最新】
  • C文件/Linux内核级文件理解
  • 软考网工选择题-1
  • 路由器详解
  • Windows 8.1 补丁 KB2919355 安装方法 详细步骤
  • 【Netty4核心原理⑫】【异步处理双子星 Future 与 Promise】
  • 【AI】算法环境-显卡、GPU、Cuda、NVCC和cuDNN的区别与联系
  • Stimulsoft 发布 2025.3 版本:支持在报表计算中解释运行 C# 脚本
  • Apache ShenYu网关与Nacos的关联及如何配合使用
  • 基于Envoy的AI Gateway测试环境搭建
  • 基于决策树模型的汽车价格预测分析
  • DAY 50 预训练模型+CBAM模块
  • CiA402 伺服驱动标准与控制模式详解
  • STL——string的使用(快速入门详细)
  • 12.3.2设置背景色12.3.3 创建设置类12.4 添加飞船图像 12.4.1 创建Ship 类 12.4.2 在屏幕上绘制飞船