模型介绍

在 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.pswp.cn/diannao/96098.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96098.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96098.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

驱动开发系列66 - glCompileShader实现 - GLSL中添加内置函数

一&#xff1a;概述 本文介绍如何为 GLSL 语言中增加一个内置函数&#xff0c;以https://registry.khronos.org/OpenGL/extensions/ARB/ARB_shader_texture_image_samples.txt扩展为例&#xff0c;介绍下添加textureSamples内置函数的过程。

指针的应用学习日记

Git常见的命令&#xff1a;%h 简化哈希 %an 作者名字 %ar 修订日期(距今) %ad修订日期 %s提交说明指针简介指针(Pointer)是C语言的一个重要知识点&#xff0c;其使用灵活、功能强大&#xff0c;是C语言的灵魂。 指针与底层硬件联系紧密&#xff0c;使用指针可操作数据的地址&am…

KMM跨平台叛逃实录:SwiftUI与Compose Multiplatform共享ViewModel的混合开发框架(代码复用率85%)

KMM跨平台叛逃实录&#xff1a;SwiftUI与Compose Multiplatform共享ViewModel的混合开发框架&#xff08;代码复用率85%&#xff09;一、架构革命&#xff1a;跨平台统一状态管理1.1 核心架构设计1.2 技术矩阵对比二、KMM共享ViewModel实现2.1 基础状态管理2.2 ViewModel核心架…

关于Android webview协议混淆

背景&#xff1a;android中引入的html页面是http请求(web服务仅开放了80端口)&#xff0c;但html页面引用的后端接口是https请求&#xff0c;则发生android中html页面请求接口异常<请求无法发送到后端服务(status0)>。浏览器出于安全考虑&#xff0c;要求&#xff1a; 同…

Android Jetpack | Lifecycle

一.前言 本篇主线包含三点&#xff0c;Lifecycle的作用、简单使用、核心原理&#xff08;包含核心类与源码主线分析&#xff09;&#xff1b; 二.作用 官方文档生命周期感知型组件可执行操作来响应另一个组件&#xff08;如 Activity 和 Fragment&#xff09;的生命周期状态…

单片机编程架构

没有最好的程序架构。 只要在项目中实现产品功能并稳定工作&#xff0c;且能在团队内统一应用管理就是最优的程序架构。 一、单片机运行模型&#xff1a; 1.能分配时间的裸机代码 2.FreeRTOS操作系统 代码分层框架&#xff1a; 1.与板关联的底层 2.《驱动底层的驱动层》《中间层…

114. 二叉树展开为链表

题目&#xff1a;给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。…

【Langchain系列三】GraphGPT——LangChain+NebulaGraph+llm构建智能图数据库问答系统

Langchain二次开发专栏 【Langchain系列一】常用大模型的key获取与连接方式 【Langchain系列二】LangChain+Prompt +LLM智能问答入门 【Langchain系列三】GraphGPT——LangChain+NebulaGraph+llm构建智能图数据库问答系统 【Langchain系列四】RAG——基于非结构化数据库的智能问…

【GNSS定位原理及算法杂记6】​​​​​​PPP(精密单点定位)原理,RTK/PPK/PPP区别讨论

PPP 技术详解&#xff1a;原理、流程与 RTK/PPK 对比 在高精度 GNSS 定位技术体系中&#xff0c;除了 RTK 和 PPK 以外&#xff0c;还有一类无需基站即可实现分米到厘米级定位的方法 —— PPP&#xff08;Precise Point Positioning&#xff0c;精密单点定位&#xff09;。它以…

LeetCode 837.新 21 点:动态规划+滑动窗口

【LetMeFly】837.新 21 点&#xff1a;动态规划滑动窗口 力扣题目链接&#xff1a;https://leetcode.cn/problems/new-21-game/ 爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏&#xff0c;描述如下&#xff1a; 爱丽丝以 0 分开始&#xff0c;并在她的得分少于 k 分时…

Codeforces 盒装苹果

题目来源&#xff1a;问题 - 2107B - Codeforces 这道题其实只需要判断两个要点&#xff0c;首先判断一下最大值-1后与最小值的差值是否>k&#xff0c;这里有个小细节&#xff0c;当有多个最大值时&#xff0c;可以先将一个最大值-1后再排序&#xff0c;判断新数组最大值与最…

数据结构--------堆

目录 二叉树 树的概念与结构 非树形结构&#xff1a; 注意&#xff1a; 树的相关术语 树的表示 孩子兄弟表示法 树形结构实际运用场景&#xff08;拓展&#xff09; 1. 文件系统管理 2. 数据库与索引 3. 编程语言与数据结构 信息组织与展示 1. 思维导图 2. 目录与…

VSCode Cursor 大模型 插件扩展 Kilo Code 配置

1.1 概述 Kilo Code 是一个 VSCode Cursor 插件扩展&#xff0c;提供了对多种 AI 模型的支持&#xff0c;包括 Claude Code 和 Qwen3。通过正确配置 Kilo Code&#xff0c;可以在开发过程中获得更好的 AI 辅助编程体验。 Kilo使用文档&#xff1a;https://kilocode.ai/docs/zh-…

深入解析:Unity、Unreal Engine与Godot引擎中的Uniform变量管理

在现代游戏开发中&#xff0c;Uniform变量是实现高质量图形渲染的关键元素。不同游戏引擎对Uniform变量的管理方式有所不同&#xff0c;了解这些差异可以帮助开发者在选择引擎时做出更明智的决策。本文将深入探讨Unity、Unreal Engine和Godot引擎中Uniform变量的管理方式&#…

遨游旅游天地,开启探索未知的梦幻之旅

你是否也怀揣着一颗对世界充满好奇的心&#xff0c;渴望踏上探索旅游世界的奇妙旅程&#xff1f;旅游&#xff0c;是一场与未知的邂逅&#xff0c;是心灵的一次自由翱翔。想象一下&#xff0c;你置身于神秘莫测的撒哈拉沙漠。当夕阳的余晖洒在连绵起伏的沙丘上&#xff0c;那金…

SConscript 脚本入门教程

第一章&#xff1a;什么是 SCons 和 SConscript&#xff1f;核心概念SCons 是一个现代化的构建工具&#xff0c;用于自动化软件构建过程&#xff0c;类似于 Make 但功能更强大、语法更简洁。SConstruct&#xff1a;是 SCons 的主配置文件&#xff0c;通常在项目根目录&#xff…

【深度学习】PyTorch从0到1——手写你的第一个卷积神经网络模型,AI模型开发全过程实战

引言本次准备建立一个卷积神经网络模型&#xff0c;用于区分鸟和飞机&#xff0c;并从CIFAR-10数据集中选出所有鸟和飞机作为本次的数据集。以此为例&#xff0c;介绍一个神经网络模型从数据集准备、数据归一化处理、模型网络函数定义、模型训练、结果验证、模型文件保存&#…

云计算核心技术之容器技术

一、容器技术 1.1、为什么需要容器 在使用虚拟化一段时间后&#xff0c;发现它存在一些问题&#xff1a;不同的用户&#xff0c;有时候只是希望运行各自的一些简单程序&#xff0c;跑一个小进程。为了不相互影响&#xff0c;就要建立虚拟机。如果建虚拟机&#xff0c;显然浪费就…

微信小程序通过uni.chooseLocation打开地图选择位置,相关设置及可能出现的问题

前言 uni.chooseLocation打开地图选择位置&#xff0c;看官方文档介绍的比较简单&#xff0c;但是需要注意的细节不少&#xff0c;如果没有注意可能就无法使用该API或者报错&#xff0c;下面就把详细的配置方法做一下介绍。 一、勾选位置接口 ①在uniapp项目根目录找到manif…

从财务整合到患者管理:德国医疗集团 Asklepios完成 SAP S/4HANA 全链条升级路径

目录 挑战 解决方案 详细信息 Asklepios成立于1985年&#xff0c;目前拥有约170家医疗机构&#xff0c;是德国大型私营诊所运营商。Asklepios是希腊和罗马神话中的医神。 挑战 Asklepios希望进一步扩大其作为数字医疗保健集团的地位。2020年9月&#xff0c;该公司与SNP合作…