大语言模型系列-Transformer

news2024/11/26 8:41:34

文章目录

  • 前言
  • 一、Attention
  • 二、Transformer结构
  • 三、Transformer计算过程
    • 1. 编码器(Encoder)
      • 1)Self-Attention层
      • 2)Multi-Head-Attention层
      • 3)Add & Norm层
    • 2. 解码器(Decoder)
      • 1)Masked Multi-head Self Attention层
      • 2)Encoder-Decoder Attention层
    • 3. 输出
    • 4. 训练和预测
    • 5. 损失函数
  • 总结


前言

前文大语言模型系列-ELMo提到了,RNN的缺陷限制了NLP领域的发展,2017年Transofrmer的横空出世,NLP领域迎来了基于Transformer的预训练模型(LLM)的大爆发。

Transformer由谷歌的2017年论文《Attention is All You Need》提出。

Transformer通过引入注意力机制解决了RNN存在的以下问题:

  • RNN编码器-解码器结构中,仅将最后一个隐藏状态传递给解码器,会丢失信息
  • RNN难以并行计算

提示:以下是本篇文章正文内容,下面内容可供参考

一、Attention

  1. 循环神经网络(RNN)模型建立了网络隐藏层之间的时序关联 , 每一时刻的隐藏层 s t s_t st,不仅取决于输入 x t x_t xt,还取决于上一时刻隐藏层信息 s t − 1 s_{t-1} st1
    在这里插入图片描述
  2. 两个RNN组合可以形成Encoder-Decoder模型
    在这里插入图片描述
  3. 但是这种不管输入多长,都统一压缩成长度编码C的做法,会导致信息的丢失,因此出现了Attention机制:即通过每个时间输入不同的C解决这个问题,其中 a t a_t at表明了在 t t t时刻所有输入的权重,以 c t c_t ct的视角看过去, a t a_t at权重就是不同输入的注意力,因此也被称为Attention分布
    在这里插入图片描述
  4. 后来随着GPU等大规模并行运算的发展,人们发现RNN的顺序结构很不方便,难以并行运算,效率太低
    在这里插入图片描述
  5. 便去掉了Encoder(RNN)隐藏层,衍生出自注意力(Self-Attention)
    在这里插入图片描述
  6. 但去除Encoder隐藏层的同时也失去了上下文的关联,可以通过位置编码的方法增加数据的先后关系(位置编码在词嵌入完成后再进行计算)
    在这里插入图片描述

    ps:RNN有天然的时序关系,在输入“我爱你”这句话时,会先输入“我”…,Self-Attention可以将一句话同时输入同时处理,实现并行计算,增加了速度,但是这种方法损失了单词间的先后关系

二、Transformer结构

Transformer是典型的编码器-解码器架构

编码组件部分由一堆编码器(Encoder)构成(论文中是将6个编码器叠在一起)。解码组件部分也是由相同数量(与编码器对应)的解码器(Decoder)组成的。

在这里插入图片描述

所有的Encoder在结构上都是相同的,但它们没有共享参数。

  • 每个Encoder都可以分解成两个子层:自注意力层、前馈神经网络层
  • 每个Decoder都可以分解成三个子层:自注意力层、编码解码注意力层、前馈神经网络层,其中编码解码注意力层用于接收编码器输出

在这里插入图片描述
Transformer完整结构图如下图,图中的Self-Attention变成了多头注意力机制(Multi-Head Attention),下文会详细解释。

在这里插入图片描述

三、Transformer计算过程

1. 编码器(Encoder)

像大部分NLP应用一样,首先将每个输入单词通过词嵌入算法转换为词向量。每个单词都被嵌入为512维的向量,用这些简单的方框来表示这些向量。

在这里插入图片描述
词嵌入过程只发生在最底层的编码器中。所有的编码器都有一个相同的特点,即它们接收一个向量列表,列表中的每个向量大小为512维。在底层(最开始)编码器中它就是词向量,但是在其他编码器中,它就是下一层编码器的输出(也是一个向量列表)。向量列表大小是我们可以设置的超参数——一般是我们训练集中最长句子的长度。

将输入序列进行词嵌入之后,每个单词都会流经Encoder中的两个子层。

在这里插入图片描述

1)Self-Attention层

  1. 第一步是生成每个单词的查询向量q、键向量k和值向量v

将输入的词向量矩阵与三个权重矩阵( W Q , W K , W V W^Q,W^K,W^V WQ,WK,WV)相乘,获得查询向量矩阵(Q)、键向量矩阵(K)和值向量矩阵(V),其中每个单独词向量的查询向量、键向量和值向量为 q i , k i , v i q_i,k_i,v_i qi,ki,vi
在这里插入图片描述

  1. 第二步是通过查询向量q、键向量k计算每个单词对编码当下单词的贡献分数,计算方式为:该单词查询向量 q i q_i qi点乘其他所有单词的键向量 k j k_j kj,结果除以8再softmax

ps:假设我们在为这个例子中的第一个词“Thinking”计算自注意力向量,我们需要拿输入句子中的每个单词对“Thinking”打分。这些分数决定了在编码单词“Thinking”的过程中有多重视句子的其它部分。
在这里插入图片描述

  1. 第三步是通过贡献分数和值向量v计算自注意力输出,计算方式为:将每个值向量 v t v_t vt乘以softmax分数,然后求和

ps:
在这里插入图片描述

这样Self-Attention的计算就完成了(注意:这里为了演示,以单个词向量的计算为例,实际中,这些计算是以矩阵Q、K、V形式完成计算的),具体公式如下:

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac {QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dk QKT)V

2)Multi-Head-Attention层

Transformer中使用的是注意力层的计算使用的是多头注意力机制,Multi-Head-Attention是Self-Attention的扩展,与上述相同的Self-Attention计算基本相同,区别在于使用八个不同的Q、K、V权重矩阵,进行八次Self-Attention得到八个不同的Z矩阵,然后把这些矩阵拼接在一起,用一个附加的权重矩阵 W o W^o Wo与它们相乘得到结果。
在这里插入图片描述
Multi-Head-Attention在两方面提高了注意力层的性能:

  1. 扩展了模型专注于不同位置的能力:多头注意力可以协同工作,以更好地处理长距离的依赖关系。每个头可以关注不同距离的上下文,有助于模型更好地捕捉全局信息。
  2. 更好的捕捉多重关系:多头注意力允许模型在同一时间关注输入序列的不同部分,每个注意头都可以学习关注序列中不同的特征。这有助于模型更好地捕捉输入序列中的多重关系和模式。

3)Add & Norm层

接下来,对Multi-Head-Attention的输出进行求和与归一化(Add & Norm,这里的Norm具体指Layer-Normalization),然后输入到前馈神经网络中, 注意Encoder的每个子层周围都有一个残差连接,并跟随一个求和归一化(如下图所示)。

在这里插入图片描述
将Encoder向量都进行可视化,结果如下所示:
在这里插入图片描述
这样我们就基本清楚了Encoder的具体内容与计算情况,相比于Encoder,Decoder多了一个Encoder-Decoder Attention层 。假设一个 Transformer 是由 2 层编码器和两层解码器组成的,如下图所示。
在这里插入图片描述
注意编码器最终会输出一组Attention向量 K 和 V到解码器,计算方式是初始化一个新的 W K W^K WK W V W^V WV权重矩阵和最后一个Encoder层输出 Z n Z_n Zn相乘。

2. 解码器(Decoder)

Decoder结构相比于Encoder结构有两大区别:

  1. 多头注意力层和Add & Norm层中间多了一个Encoder-Decoder Attention层
  2. 多头注意力层变为Masked Multi-head Self Attention

1)Masked Multi-head Self Attention层

掩膜多头注意力层和多头注意力层类似,但其只允许关注输出序列中早于当前位置之前的单词。具体做法是Masked:在 Self Attention 分数经过 Softmax 层之前,屏蔽当前位置之后的那些位置。

在这里插入图片描述

2)Encoder-Decoder Attention层

编码器输出的Attention向量K 和 V将会输入到每个解码器的Encoder-Decoder Attention层,这有助于解码器把注意力集中到输入序列的合适位置。

Encoder-Decoder Attention层的原理和多头注意力层类似,不同之处是:Encoder-Decoder Attention层是使用前一层的输出来构造 Q 矩阵,而 K、V矩阵来自于编码器的输出。

3. 输出

解码器的输出,会经过最后的全连接层(Linear)和 Softmax 层得到最终的输出结果,这里以英语翻译为例:

全连接层会把解码器输出的向量,映射到一个更长的向量,这个向量称为 logits 向量。假设我们的模型词汇表有 10000 个英语单词,则 logits 向量有 10000 个数字,每个数表示一个单词的分数。

然后,Softmax 层会把这些分数转换为概率(把所有的分数转换为正数,并且加起来等于 1),最高概率的那个数字对应的词将作为这个时间步的输出。

4. 训练和预测

以英语翻译为例

训练过程如下:

  1. 第一个时间步,输入起始符,对应的输出为I
  2. 第二个时间步,输入起始符+我,对应的输出为Love
  3. 第三个时间步,输入起始符+我+爱,对应的输出为China
  4. 第三个时间步,输入起始符+我+爱+中国,对应的输出为结尾符end of sentence

ps:注意训练阶段输入输出都是已知的,所以可以并行执行,预测过程则只能按时间步进行

预测过程如下:

  1. 第一个时间步,输入起始符+Encoder Enbeddings,对应的输出为I
  2. 第二个时间步,输入Encoder Enbeddings+I,对应的输出为am
  3. 第三个时间步,输入Encoder Enbeddings+am,对应的输出为a
  4. 第四个时间步,输入Encoder Enbeddings+a,对应的输出为student
  5. 第五个时间步,输入Encoder Enbeddings+student,对应的输出为结尾符 < e o s > <eos> <eos>

请添加图片描述

5. 损失函数

Transformer的损失函数其实就是对比模型输出的概率分布与实际的概率分布,序列生成任务中常使用负对数似然损失(Negative Log-Likelihood Loss, NLL Loss),又称为交叉熵(cross-entropy)损失

  • 每个时间步的输出向量即为一个概率分布,长度是 vocab_size
  • 第一个概率分布中,最高概率对应的单词是 “I”
  • 第二个概率分布中,最高概率对应的单词是 “am”
  • 以此类推,直到第 5 个概率分布中,最高概率对应的单词是 < e o s > <eos> <eos>,表示没有下一个单词了

在这里插入图片描述


总结

Transformer最初诞生于NLP领域,但到目前为止,已经成为了各个领域(CV、语音信号处理、多模态等)最新最火的架构,尤其是Transformer的注意力机制,比CNN看得更宽更远(能够处理长距离依赖,而CNN往往只能看到局部信息),比LSTM训练更快。

当训练数据集不够大的时候,Transformer的表现通常比同等大小的CNN网络要差一些,但当拥有足够多的数据进行预训练的时候,Transformer的表现就会超过CNN,突破Transformer缺少归纳偏置的限制,可以在下游任务中获得较好的迁移效果。

ps:CNN具有两种归纳偏置,一种是局部性(locality/two-dimensional neighborhood structure),即图片上相邻的区域具有相似的特征;一种是平移不变形(translation equivariance), f(g(x))=g(f(x)) ,其中g代表卷积操作,f代表平移操作。当CNN具有以上两种归纳偏置,就有了很多先验信息,需要相对少的数据就可以学习一个比较好的模型。

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

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

相关文章

【欢迎您的到来】这里是开源库get_local_info作者的付费专栏

您好&#xff0c; 我是带剑书生&#xff0c;开源库get_local_info的作者&#xff0c;欢迎您的到来&#xff0c;这里是我的付费专栏&#xff0c;会用更简洁的语言&#xff0c;更通俗的话语&#xff0c;来帮助您更好的学习rust&#xff0c;这里不仅仅讲解Rust在某些应用功能实现上…

就想搞一个简单的html模板学学css到底行不行?

做一个个人博客第一步该怎么做&#xff1f; 好多零基础的同学们不知道怎么迈出第一步。 那么&#xff0c;就找一个现成的模板学一学呗&#xff0c;毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题&#xff0c;那就是&#xff0c;那些模板都&#xff0c;太&#xff01;…

【性能调优】local模式下flink处理离线任务能力分析

文章目录 一. flink的内存管理1.Jobmanager的内存模型2.TaskManager的内存模型2.1. 模型说明2.2. 通讯、数据传输方面2.3. 框架、任务堆外内存2.4. 托管内存 3.任务分析 二. 单个节点的带宽瓶颈1. 带宽相关理论2. 使用speedtest-cli 测试带宽3. 任务分析3. 其他工具使用介绍 本…

SERVLET的概念

SERVLET的概念 假设一种您需要登录到网站上访问电子邮件账户的场景。您需要提交登录详细信息进行验证,如用户名和密码。网站使用服务器端程序接受并验证登录信息。这些服务器端程序是用不同的服务器端技术编写的,如公共网关接口(CGI)、Active Server Pages(ASP)及servle…

爬虫逆向开发教程1-介绍,入门案例

爬虫前景 在互联网的世界里&#xff0c;数据就是新时代的“黄金”。而爬虫&#xff0c;就是帮助我们淘金的“工具”。随着互联网的不断发展&#xff0c;数据量呈现指数级的增长&#xff0c;在数据为王的时代&#xff0c;有效的挖掘数据和利用&#xff0c;你会得到更多东西。 学…

Spring MVC的原理

Spring MVC中的MVC即模型-视图-控制器&#xff0c;该框架围绕一个DispatcherServlet设计而成&#xff0c;DispatcherServlet会把请求分发给各个处理器&#xff0c;并支持可配置的处理器映射和视图渲染等功能。Spring MVC的具体工作流程如下&#xff1a; &#xff08;1&#xff…

商业应用算力全球新标杆!浪潮信息八路服务器创SAP SD评测最高性能

1月15日&#xff0c;据全球领先的企业应用软件提供商SAP发布的最新SAP SD评测结果&#xff0c;浪潮信息TS860G7服务器创下1,659,970 SAPS的最高性能成绩&#xff0c;成为商业应用算力的全球新标杆。TS860G7是浪潮信息最新一代的企业级八路服务器&#xff0c;其取得的最新成绩也…

电商平台spu和sku的完整设计

一、关于数据库表的设计 1、商品属性表 比如一个衣服有颜色、尺码、款式这个叫属性表 -- ------------------------ -- 商品属性表 -- ------------------------ DROP TABLE IF EXISTS attribute; CREATE TABLE attribute (id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT CO…

复现PointNet++(语义分割网络):Windows + PyTorch + S3DIS语义分割 + 代码

一、平台 Windows 10 GPU RTX 3090 CUDA 11.1 cudnn 8.9.6 Python 3.9 Torch 1.9.1 cu111 所用的原始代码&#xff1a;https://github.com/yanx27/Pointnet_Pointnet2_pytorch 二、数据 Stanford3dDataset_v1.2_Aligned_Version 三、代码 分享给有需要的人&#xf…

阿里云国外服务器价格表

阿里云国外服务器优惠活动「全球云服务器精选特惠」&#xff0c;国外服务器租用价格24元一个月起&#xff0c;免备案适合搭建网站&#xff0c;部署独立站等业务场景&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云国外服务器优惠活动&#xff1a; 全球云服务器精选特惠…

Dubbo协议解析过程

Dubbo协议解析过程 Dubbo有哪些底层协议 同学们以为Dubbo只有一个RPC协议吗?非也&#xff0c;既然是阿里巴巴出品的开源项目&#xff0c;那自然秉承了“包罗万象”的一贯传统。Dubbo的底层有支持多达9种通信协议&#xff0c;并且他们都有各自的适用场景。我们快速的一扫而过…

阿赵UE学习笔记——10、Blender材质和绘制网格体

阿赵UE学习笔记目录   大家好&#xff0c;我是阿赵。   之前介绍了虚幻引擎的材质和材质实例。这次来介绍一个比较有趣的内置的Blender材质。   在用Unity的时候&#xff0c;我做过一个多通道混合地表贴图的效果&#xff0c;而要做过一个刷顶点颜色混合地表和水面的效果。…

Arm LDM和STM的寻址方式

A32指令集中包含多数据传输指令LDM和STM&#xff0c;也就是单条指令可以传输多个寄存器的值与内存交互&#xff0c;这对于数据块传输以及寄存器的压入栈很有帮助。LDM和STM指令可分别用于实现堆栈的pop和push操作。对于堆栈操作&#xff0c;基寄存器通常是堆栈指针(SP)。 LDM和…

uniapp写微信小程序实现电子签名

写电子签名一定要注意的是一切全部按照手机上的适配来&#xff0c;为啥这么说呢&#xff0c;因为你在微信开发者工具中调试的时候认为是好的&#xff0c;正常的非常nice,当你发布版本的时候你会发现问题出来了。我下边的写法你可以直接用很简单。就是要记住canvas的几个属性和用…

探索数据之美:深入Seaborn的数据可视化艺术与技巧【第26篇—python:Seaborn】

文章目录 1. 引言2. Seaborn基础2.1 安装和环境设置2.2 常用数据可视化函数2.3 设置样式和颜色主题 3. 数据准备与导入3.1 使用Pandas库加载和处理数据3.2 数据清理和缺失值处理 4. Seaborn中的常见图表4.1 折线图和散点图&#xff1a;展示趋势和变量关系4.2 条形图和箱线图&am…

【昕宝爸爸小模块】深入浅出之针对大Excel做文件读取问题

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

Nestjs 图片下载

一、download直接下载 1、添加下载代码 uploadController.ts import { Controller, Get, Post, Body, Patch, Param, Delete, UseInterceptors, UploadedFile, Res } from nestjs/common; import { UploadService } from ./upload.service; import { CreateUploadDto } from…

STM32WLE5JC介绍

32位 ARM Cotrex-M4 CPU 32MHz晶体振荡器 32 kHz RTC振荡器与校准 20x32位备份寄存器 引导程序支持USART和SPI接口 介绍 STM32WLE5/E4xx远程无线和超低功耗器件嵌入了强大的超低功耗LPWAN兼容无线电解决方案&#xff0c;支持以下调制&#xff1a;LoRa&#xff0c;&#xff08…

C++类与对象【对象的初始化和清理】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;C从基础到进阶 C类与对象&#x1f384;1 对象的初始化和清理&#x1f955;1.1 构造函数和析构函数&#x1f955;1.2 构造函数的分类及调用&#x1f955;1.3 拷贝构造函数调用时机&#x1f…

C# 读取ini文件示例

一般使用一个相关win32 api的封装类&#xff1b;我用的如下&#xff1b; using System; using System.Runtime.InteropServices; using System.Text;namespace DotNet.Utilities {/// <summary>/// INI文件读写类。/// </summary>public class INIFile{public str…