Transformer解析——(一)概述

 本系列已完结,全部文章地址为:

Transformer解析——(一)概述-CSDN博客

Transformer解析——(二)Attention注意力机制-CSDN博客

Transformer解析——(三)Encoder-CSDN博客

Transformer解析——(四)Decoder-CSDN博客

Transformer解析——(五)代码解析及拓展-CSDN博客

1 背景

Transformer诞生于经典的论文《Attention is All You Need》,用于Seq2Seq任务,即输入一个序列,输出一个序列,输出的序列长度由模型决定。序列可以是一段文字,一串语音等,所以应用场景包括语音识别、语言翻译、聊天机器人等。近期火爆的DeepSeek也是基于transformer架构的。

Transformer最大的特色就是使用Attention机制,关注上下文的影响。以语言翻译为例,上下文对于机器理解语义是非常重要的,比如英译汉"Bob is a boy, he is smart.",如果想让机器理解"Is Bob smart?",机器需要识别Bob和he的上下文关系。RNN虽然也可以处理上下文,但是无法并行训练,因为RNN要将上一时刻的输出作为这一时刻的输入。而transformer优点是可以并行训练,提高了效率。

Transformer主要包含2个组件,Encoder(编码器)和Decoder(解码器)。Encoder和Decoder均应用Attention机制。

Encoder和Decoder的作用与AutoEncoder类似,可以类比理解:编码是为了提取信息本质;解码是为了将信息本质通过文字这一载体为人所知。 编码时输入多少字就输出多少字,输出的内容就是对应输入文字的信息。解码时输出文字的长度是不定的,直到输出<END>(结束符号)才结束。

2 结构

Transformer整体的结构如上图所示。

左侧下方是输入序列,先经过分词转换为计算机可以看懂的数字;经过Embedding将每个词转换为向量;通过Positional Encoding加入位置信息。传入到Encoder。

左侧上方是Encoder,由N个Block组成,每个Block包含多头注意力、Add&Norm归一化、前馈神经网络、Add&Norm归一化,结果输出到Decoder中。

右侧下方是目标序列,同样经过分词等操作输入到Decoder中。

右侧上方是Decoder,同样由N个Block组成。接收目标序列的输入到多头注意力模块,经过Add&Norm归一化后输入到交叉注意力模块,同时Encoder的输出也将输入到交叉注意力模块,通过Add&Norm归一化、前馈神经网络、softmax等步骤,得到输出每个词的概率。

3 输入

下面笔者具体介绍Transformer的各组件,先简要介绍输入。

3.1 Token化

首先需要将输入的文字转变为计算机可以看懂的数字。可利用Bert等模型将输入的文字转变为token,类似于分词。

Token是语言模型中常见的概念,中文可称为“词元”,是文本处理的基本单元。对于英文来说,Token类似于词根词缀,例如unhappiness可能拆分成un(表示否定)+happy(表示快乐的情感)+ness(表示名词),机器将该词分解成了3个token来处理。比如机器识别到这里的"ness"表示名词,那么后续可能会接上"is"构成“主系表”结构。对于中文来说,一个汉字不能再继续拆分了,所以Token至少是一个汉字,也可能是多个。比如“我想旅游”可以拆成“我”+“想”+“旅游”3个token。

3.2 Input Embedding

利用Embedding神经网络将每个token由一维转变为多维的向量,Embedding中的权重是可学习的。

Embedding神经网络的作用是将单个数字转变成N维向量。需要设置输入和输出大小。输入大小即词汇表的大小,输出大小即希望每个token转变的维度数N。假设词汇表的大小是6(即每个token的标号是0到5),想将token转变为2维的向量,则神经网络的输入和输出分别是6和2。

假设词汇表是0:你,1:好,2:我, 3:想, 4:学, 5:旅游,那么“我想旅游”这句话由3个token组成[2, 3, 5],代表在词汇表中的位置。做one-hot处理后,3个token每个维度都变成6,one-hot指词汇表维度中只有对应位置的元素为1,其余位置元素为0,例如“我”表示成[0,0,1,0,0,0]。将该6维数据输入到神经网络中,输出是2个神经元,即得到2维向量。

实际上Embedding等价于一个6*2的矩阵。输入的单词通过one-hot转变成1*6的矩阵,与Embedding矩阵相乘后即可得到1*2的矩阵,实现了单词升为2维向量。

由上述分析可知,如果Embedding输入一个比词汇表大小更大的数,比如10,是会报错的,因为无法用6维的one-hot表示。  

在单词做Embedding后,需要先除以sqrt(d_model),d_model表示词向量大小。因为Embedding是线性加权,d_model维度越高会导致数值越大,影响词向量表示效果。

3.3 Positional Encoding

语序对于翻译是有影响的,比如“我打球”和“球打我”是完全不一样的意思。Transformer没有使用RNN的方式处理语序影响,而是使用位置编码控制语序。

虽然用Attention能处理每个词与整个序列的相关性,但并不掌握每个词语位置的信息。换句话说,只要模型的参数训练好,把输入的序列打乱,计算Attention的结果是一样的,因此要加入位置信息。

可能有读者有疑问,Attention计算时不是考虑了上下文吗,上下文不是语序吗?Attention考虑了上下文不错,但上下文不等于语序。计算Attention时是打乱了语序的,比如"What a beautiful day"中,计算"day"和其他词(注意模型中实际是计算token之间的注意力,这里笔者为了方便理解直接用词代替)的注意力时,并不会因为与"beautiful"距离近就提高attention,也不会因为与"what"远就降低attention。

请注意Input序列是并行输入的,并没有顺序。【如果读者没有相关基础知识,可先略过此段落】。Decoder最开始是将<BEGIN>标识符输入到第一个attention,然后将Encoder的输出输入到第二个attention,预测出各个词的概率。那么如果我们把Encoder的输入顺序打乱,QKV参数是不变的,那么他们之间的Attention结果是不变的,Encoder的输出只是换了个顺序,并不影响最终概率的计算。就像是如果只考虑实力,跳水运动员的成绩不会受到他们出场顺序影响一样。

经典的位置编码的算法是用正余弦函数。具体算法为

PE(pos,2i)=sin(pos/10000^(2i/d))

PE(pos,2i+1)=cos(pos/10000^(2i/d))

其中PE表示Position Encoding,pos表示位置序号(即第几个token),2i表示词向量维度中偶数的部分,2i+1表示词向量中奇数的部分(即第pos个token中词向量第2i或2i+1维度),d表示词向量维度大小。

这样设计的好处是:

第一,方便识别词与词之间的相对位置关系,因为第i个词与第i+k个词之间是有规律的,基于正弦和余弦定理,sin(i+k)=sin(i)cos(k)+cos(i)sin(k), cos(i+k)=cos(i)cos(k)-sin(i)sin(k),因此,两个前后间隔k个位置的编码是有线性规律的,这就像是编码阶段预留的“彩蛋”,后续transformer训练时也可以找到这种规律,从而理清楚词与词之间的位置关系。

第二,正余弦函数是周期性函数,因此可以处理任意长度的序列,即使序列很长超过训练集里最长的序列,也可以代入位置编码函数中得到结果。

第三,计算效率高,sin和cos都是简单函数,而且导数也易于计算。

将位置编码叠加到Embedding,即可得到最终的输入。

4 行文思路

本系列中笔者尽量避免照本宣科,而是以问题为切入点,并辅以通俗例子讲解。这样的行文思路可以帮助读者理解Transformer为什么这么设计。笔者希望本系列走出“懂的都懂,不懂的依然不懂”的怪圈。当然,在此之前可能需要读者有部分机器学习的背景知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/70376.shtml

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

相关文章

Qt的QToolButton的使用

在C中使用QToolButton的详细步骤如下&#xff1a; 1. 包含头文件 #include <QToolButton> #include <QAction> #include <QMenu>2. 创建QToolButton实例 QToolButton *toolButton new QToolButton(parentWidget); // parentWidget为父部件指针3. 基础属性…

Canvas进阶-2、可视化应用

前言 Canvas 可以用来创建各种 数据可视化 图表和图形&#xff0c;通过绘制不同的形状、线条和颜色来展示数据的特征和趋势。 数据可视化的基本原理是将数据转化为可视化的图形元素&#xff0c;以便人们更容易理解和分析数据。这涉及到以下几个方面&#xff1a; 数据映射&…

力扣-回溯-17 电话号码的字母组合

思路 和之前的回溯不同的是&#xff0c;要遍历完所有的数字&#xff0c;并且在单层递归逻辑里需要遍历一整个字符串 代码 class Solution { public:vector<string> letters {"", "", "abc", "def", "ghi", "…

Windows11切换回Windows10风格右键菜单

参考文章&#xff1a;Win11新版右键菜单用不惯&#xff1f;一键切换回Win10经典版&#xff01;-CSDN博客 以管理员权限运行命令行cmd 切换为经典旧版右键菜单&#xff0c;执行 reg.exe add “HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServe…

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统&#xff0c;不需要降级 v1.0.91 &#xff08;2025&#xff09; 本文内容需要你有一定的 Linux 操作基础&#xff0c;最好是程序员那种&#xff0c;英文水平足够用才行。一般人不需要使用这么复杂的路由器操作系统&#xff0c…

Linux自学day23-进程和线程

1. 什么是进程&#xff1f; 进程是程序执行的过程&#xff0c;涵盖创建、调度和消亡阶段&#xff0c;是活的。 而程序是一段数据的集合&#xff0c;是死的。 进程还是操作系统资源分配的最小单元&#xff0c;拥有独立的虚拟地址空间&#xff0c;包括文本段、数据段、系统数据…

python查错误TypeError: bad operand type for unary -: ‘str‘

TypeError: bad operand type for unary -: str​​​ 这个错误表明尝试对一个字符串类型的数据使用一元减号运算符&#xff08;​​-​​&#xff09;&#xff0c;而在 Python 中&#xff0c;一元减号运算符只能用于数值类型&#xff08;如整数、浮点数等&#xff09;&#xf…

常用的性能优化方法和技巧

常用的性能优化方法和技巧 前端性能优化 减少HTTP请求&#xff1a;就好比你去超市买东西&#xff0c;每次请求就像你跑一趟超市。去的次数越多&#xff0c;花在路上的时间就越多。所以把多个小的资源&#xff0c;像图片、脚本这些&#xff0c;合并成一个大的&#xff0c;就能…

网络协议相关知识有哪些?

前言 网络协议的基础是OSI和TCP/IP模型,这两个模型是理解协议分层的关键。 正文(仅是个人理解,如有遗漏望海涵) 网络协议是网络中设备间通信的规则和标准,涉及数据传输、路由、错误控制等多个方面。以下是网络协议相关知识的系统梳理: 一、网络协议分层模型 1、OSI七…

鸿蒙初学者学习手册(HarmonyOSNext_API14)_自定义动画API(@ohos.animator (动画) )

前言 在纯血鸿蒙中最具有用户特色的效果就是自定义的动画效果。在纯血鸿蒙中有多种定义方式&#xff0c;但是今天介绍的是ApI中的自定义动画。 注意: 动画本身具有生命周期&#xff0c;但是不支持在UIAbility的文件使用&#xff0c;简单而言就是不允许在UIAbility生命周期中…

搭建Kubernetes (K8s) 集群----Centos系统

前期准备 准备3台Linux虚拟机&#xff08;CentOS系统&#xff09;&#xff0c;参考 https://carry.blog.csdn.net/article/details/144578009https://carry.blog.csdn.net/article/details/144578009搭建Docker环境&#xff0c;参考 https://carry.blog.csdn.net/article/de…

wps中的js开发

严格区分大小写 /*** learn_js Macro*/ function test() {Range(D7).Value2Selection.Value2; // Selection.formula "100" }function Workbook_SheetSelectionChange(Sh, Target) {if(Sh.Name Sheet1) {test();}}function test2() {// 把I4单元格及其周边有数的单…

第3章 3.2 配置系统 .NET Core配置系统

3.2.1 配置系统的基本使用 .NET Core中的配置系统支持非常丰富的配置源&#xff0c;包括文件&#xff08;JSON、XML、INI等&#xff09;、注册表、环境变量、命令行、Azure Key Vault等&#xff0c;配置系统还支持自定义配置源。 用配置系统开发包Microsoft.Extensions.Confi…

第六届计算机信息和大数据应用国际学术会议(CIBDA 2025)

重要信息 大会官网&#xff1a;www.ic-cibda.org&#xff08;了解会议&#xff0c;投稿等&#xff09; 大会时间&#xff1a;2025年3月14-16日 大会地点&#xff1a;中国-武汉 简介 第六届计算机信息和大数据应用&#xff08;CIBDA 2025&#xff09;将于2025年3月14-16日在中国…

Mac M3/M4 本地部署Deepseek并集成vscode

Mac 部署 使用傻瓜集成平台ollama&#xff0c;ollama平台依赖于docker&#xff0c;Mac的M3/M4 因doesn’t have VT-X/AMD-v enabled 所以VB,VM无法使用&#xff0c;导致docker无法启动&#xff0c;需要使用docker的替代品podman&#xff0c; 它完全兼容docker brew install p…

最优化方法-牛顿法

牛顿法 泰勒级数 泰勒级数展开 $$ \begin{aligned} f(x)&\lim\limits_{n\rightarrow \infin}\sum\limits_{i1}n\frac{1}{n!}f{(n)}(x_0)(x-x_0)^n\ &f(x_0)f’(x_0)(x-x_0)\frac{f’(x_0)}{2!}(x-x_0)2\cdots\frac{1}{n!}fn(x_0)(x-x_0)^n\ &\quad~ O\left[(x-x_…

【系统架构】分布式事务模型详解

1. 分布式基础理论 1.1 CAP理论 CAP 理论可以表述为&#xff0c;一个分布式系统最多只能同时满足一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区容错性&#xff08;Partition Tolerance&#xff09;这三项中的两项。 一致性是…

「正版软件」PDF Reader - 专业 PDF 编辑阅读工具软件

PDF Reader 轻松查看、编辑、批注、转换、数字签名和管理 PDF 文件&#xff0c;以提高工作效率并充分利用 PDF 文档。 像专业人士一样编辑 PDF 编辑 PDF 文本 轻松添加、删除或修改 PDF 文档中的原始文本以更正错误。自定义文本属性&#xff0c;如颜色、字体大小、样式和粗细。…

使用GDI+、文件和目录和打印API,批量将图片按文件名分组打包成PDF

代码写了两个小时&#xff0c;速度太慢&#xff08;包括学习文档的时间&#xff09; #include <stdio.h> #include <Windows.h> #include <gdiplus.h> #include <string.h> using namespace Gdiplus; #pragma comment(lib, "Gdiplus.lib") …

设计模式教程:责任链模式(Chain of Responsibility Pattern)

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种常用的设计模式&#xff0c;它属于行为型模式&#xff0c;主要解决的是多个对象处理一个请求时&#xff0c;如何解耦请求的发送者和接收者&#xff0c;以及如何将请求的处理职责分配给不同的对象。 1…