Transformer原理详解

前言好久没有用了,我已经快忘记了自己还有一个CSDN账号了。 在某位不知名好友的提醒下,终于拾起来了,自己也从大二转变成了研二。
目前研究方向主要为:时间序列预测,自然语言处理,智慧医疗
欢迎感兴趣的小伙伴一起交流、一起进步!!!

目录

  • 一.背景
    • 1.1论文
    • 1.2发展动机
    • 1.3特点
    • 1.4地位
  • 二.模型整体架构
    • 2.1宏观理解
    • 2.2微观理解
    • 2.3工作流程
  • 三.模型架构详解
    • 3.1数据
    • 3.2输入(先做了解,后续部分会详细讲解)
    • 3.3Embedding
    • 3.4位置编码
    • 3.5Encoder_self-attention
    • 3.6Encoder_scaled dot-product attention
    • 3.7Encoder_Multi-Head
    • 3.8Encoder_padding掩码
    • 3.9Encoder_多头注意力整体
    • 3.10Encoder_Add&Norm
    • 3.11Encoder_前馈神经网络
    • 3.12Dncoder_Masked Multi-Head Attentuion
    • 3.13Encoder_Decoder_Multi-Head Attention
    • 3.14输出部分
    • 3.15模型训练_损失函数
    • 3.16模型训练_自定义学习率
  • 四.参考

一.背景

1.1论文

  • 2017年谷歌Brain团队发表了“Attention Is All You Need”(注意力就是你所需要的一切),正式提出了Transformer。这是一篇非常经典的自然语言处理领域的文章,把注意力机制推向了高潮。

文章链接:https://arxiv.org/abs/1706.03762

1.2发展动机

  • Transformer的提出,最初针对的是机器翻译任务。
  • 传统的机器翻译采用的主流框架为Encoder-Decoder框架,以RNN作为主要方法,基于RNN发展出来的LSTM和GRU也一度被认为是解决该问题的最优方法。
  • 然而,RNN模型的计算被限制为顺序,阻碍了样本训练的并行化,会导致在计算过程中发生信息丢失从而引起长期依赖问题。
  • RNN以及其衍生网络的特点就是,前后隐藏状态依赖强无法实现并行

1.3特点

  • Transformer的self-attention可以实现快速并行,改进了RNN类模型训练慢的缺点
  • Transformer可以增加到非常深的深度,充分挖掘DNN模型的特征,提升准确率

1.4地位

  • 开天辟地,各种竞赛屠榜,毕业论文首选
  • 对NLP、CV等各种领域,产生了深刻的影响
  • 截止目前,知网收录名称包含Transformer的期刊达18.51万,学位论文总数达4.16万
    在这里插入图片描述

二.模型整体架构

在这里插入图片描述

图1 Transformer模型架构图

2.1宏观理解

  • 输入一段法文,经过Transformer模型后,可以输出对应的英文

在这里插入图片描述

图2 Transformer宏观理解模型
  • Transformer本质上是一种Encoder-Decoder架构,因此中间部分的Transformer可以分为两个部分:Encoder(编码组件)和Decoder(解码组件)
    在这里插入图片描述
图3 Transformer宏观理解模型(Encoder-Decoder)
  • 其中,Encoder和Decoder分别有n1和n2层(这里n1=n2=6),因此又可以将模型进一步细分

在这里插入图片描述

图4 Transformer进一步宏观理解模型(Encoder-Decoder)

2.2微观理解

  • 每个编码器由两个子层组成:Self-Attention 层(自注意力层)和 Position-wise Feed Forward Network(前馈网络)
  • 解码器也有编码器中这两层,但是它们之间还有一个注意力层(即 Encoder-Decoder Attention),使得解码器关注输入句子的相关部分

在这里插入图片描述

图5 Transformer微观理解

2.3工作流程

  1. 输入需要翻译的数据(以:Why do we work为例)
  2. 经过Encoder层,得到隐藏层,输出到Decoder
  3. Decoder的输入(即<strat> 开始符号)
  4. 将Decoder的输入进行上述操作得到Decoder的输出(即输入Why后,得到翻译的结果:为)
  5. 将Decoder的输出和Decoder的输入进行拼接,共同作为下一步Decoder的输入(即:<strat>
  6. 得到Decoder的输出:什
    值得注意的是,第4步和第5步是并行进行的,这里为了详细解释原理,拆分为了两步。

在这里插入图片描述

图6 Transformer工作流程

三.模型架构详解

3.1数据

  • 原始数据为一组元组,前面的部分为中文,后面的部分为对应的英文。均为Tensor的数据类型。

在这里插入图片描述

图7 输出的原始数据

  • 拿到数据后,第一件事就是将字符串转换为机器可以识别的数字编码。
    在这里插入图片描述
图8 编码后的数据
  • 为每一句话加上起始符和终止符,这里分别以12,8作为起始符;13,9作为终止符(只要不在编码的数字里面,任何数字都是可以的)
    在这里插入图片描述
图9 编码后加上起始符和终止符
  • 之后,一般会经过shuffle(打乱顺序)、batch(分批提速)、padding(填充)等操作,使得模型学习的效果更好。这里为了方便,仅展示batch和padding的操作,不进行shuffle。
  • 将前两行数据作为一个batch,后两行数据作为一个batch,然后按照一个batch中最长的长度进行填充。
  • 值得注意的是,每一个batch最长的长度可能是不一样的
    在这里插入图片描述
图10 batch和padding

3.2输入(先做了解,后续部分会详细讲解)

  • 以第一个batch为例,左边为中文(input),右边为英文(target)在这里插入图片描述
图11 输入数据(以第一个batch为例)
  • 对于target,需要分为target_input(如图6中的步骤3-5。即经过Encoder后,传入Decoder的输入)和target_real(如图6中的步骤6。Decoder的输出)。
    在这里插入图片描述
图12 target部分拆分
  • 记录input和target_input的padding,消除影响。具体操作位:padding项变为1,非padding项变为0
  • 提醒:以下部分大家可能目前觉得难理解,没关系,现在有一个印象就好,后面到了这一部分就会理解
    在这里插入图片描述
图13 input的padding例子

在这里插入图片描述

图14 target_input的padding例子
  • 下面展示出4个padding的对应关系

在这里插入图片描述

图15 input的padding对应的位置(绿色:Encoder部分;红色:Decoder部分)

在这里插入图片描述

图16 target_input的padding对应的位置(对应于Decoder的Mask部分)

3.3Embedding

  • 将对应的数字编码,转为向量表示。这里以4维为例(每个数字,用一个4维的向量表示)
  • input由二的张量变成了一个三维的张量(即batchsize,input_sql,dmodel)
  • 大家不用纠结数字的具体表示,只需要了解结构就可以
    在这里插入图片描述
图17 Embedding示例

3.4位置编码

  • Transformer因为并行化,无法捕捉到位置信息
  • 解决方案:位置编码,引入绝对位置和相对位置
  • 下面公式中,pos指的是这句话的位置(向量的顺序),i = dim_index // 2 dmodel指的是向量的维度
  • 位置编码只和Embedding的维度和seq_length有关
    在这里插入图片描述
图18 位置编码公式
  • 值得注意的是,在原文中,作者给出了一个位置编码的示意图,如下图19所示。
  • 这里,d_model = 512,seq_length = 50。可以看到每一个位置(纵坐标)的颜色都不一样,这也是说明了位置编码可以反应真实的顺序。
    在这里插入图片描述
    图19 位置编码示例

3.5Encoder_self-attention

  • 没有self-attention,每个词只能表示自身的含义,不包含信息
  • self-attention会对词向量进行重构,使得词向量不单只包含自己,而是综合考虑全局,融入上下文
  • 举个例子,以“我宣你”为例,embedding后,会生成对应的词向量,经过线性变化后,每个词向量会生成q、k、v三个变量,来进行后续的计算,如图20所示。

在这里插入图片描述

图20 self-attention示例(生成q、k、v)
  • 接下来,q、k进行点乘操作,计算相关性,每一个q跟所有的k进行计算。计算后,得到一个相关性得分,经过softmax将得分映射到0-1之间。之后与v进行相乘,形成一个新的向量,这就是结合了上下文的向量,不仅仅包含embedding。

  • (这里要注意:q1和v2点乘 与 v2和q1点乘是不一样的。举个例子,有人对你笑,你可能是因为)

在这里插入图片描述

图21 self-attention示例(计算相关性得分)

3.6Encoder_scaled dot-product attention

  • 本文对self-attention进行了改进,公式如下图22所示。

  • 改进一:q、k、v是一个矩阵(原来是向量)

  • 改进二:除以根号dk,dk表示的是k的维度(这也就是为什么叫scaled)

在这里插入图片描述

图22 scaled dot-product attention公式
  • 为什么要除以根号dk呢?这里从两个角度进行解释

1.前向传播角度:softmax 是一种非常明显的 “马太效应”:强(大)的更强(大),弱(小)的更弱(小)。而缩放后,注意力值就分散些,这样一般就获得更好的泛化能力。

2.反向传播角度:不除以这个的话,注意力得分score是一个很大的值,softmax在反向传播时,容易造成梯度消失

  • 为什么选择根号dk,而不是其他的值呢?

假设向量q和k的各个分量是互相独立的随机变量,均值为0,方差为1,那么q和k点积后的均值为0,方差为dk

3.7Encoder_Multi-Head

  • 理论上,Embedding后,需要生成q、k、v,采用不同的参数,如图23所示,用两套不同的参数生成两套不同的q、k、v。这就叫不同的头(本文采用了8个头)
  • 本文中,用一套参数生成Q、K、V,进行拆分。拆分后,Q的维度减少(depth = d_model / heads_num),要保证d_model能够整除heads_num
    在这里插入图片描述
    图23 Multi-Head示例
  • 之后,每个头独立行动,进行scaled dot-product attention操作,将结果进行拼接,还原为之前的维度d_model,这就相当于将多个头提取到的特征进行了融合
  • 为什么使用多头?

能够从多个角度去理解内容,注意到不同子空间的信息,捕捉到更加丰富的特征信息

3.8Encoder_padding掩码

  • 在这之前,我们要知道padding只要不影响有效信息就可以了
  • 计算qk关系的时候,padding不会影响
  • 但是计算softmax的时候(公式如图24),padding会影响。因为softmax计算的是每一个值,可能让模型以为padding和我们的向量有了关系(如图25绿色部分所示),所以要让padding的结果变成0,因此需要padding mask

在这里插入图片描述

图24 softmax公式
  • padding mask:最开始的时候,就将padding变成1,非padding变成0,用来标记padding(注意,1只是一个标记作用,不是padding的值一直是1)

  • 计算的时候,获取标记,将padding变成一个非常小的数,那么和padding有关的项会变成极其小的数。对于指数函数,当x无限小的时候,那么值就无限趋近于0,因此可以把softmax中padding产生的影响消除掉。
    在这里插入图片描述

    图25 padding示例
  • 为什么padding变成1,非padding变成0?一开始padding为0不是更好吗?

如果padding一开始为0,那么我们看softmax公式,e的0次方,就是1,这没有消除padding的影响,所以一开始给padding为0是没有

3.9Encoder_多头注意力整体

  • 到了这里,学习完这些主要的操作后,我们回到最初的环节(接图17 embedding)

  • Embedding后,我们要经过scaled dot-product attention(缩放),位置编码。

  • 之后input需要经过多头注意力模块;target_input需要经过掩码多头注意力模块
    在这里插入图片描述

    图26 Embedding后的操作
  • 首先,经过线性变化,得到QKV三个矩阵,如图27所示
    在这里插入图片描述

    图27 线性变化

在这里插入图片描述

图28 线性变化结果(得到QKV矩阵)
  • 然后,进行分头(这里以2个头为例),如图29所示
    在这里插入图片描述

    图29 分头结果
  • 之后,利用attention进行注意力权重得分(scaled dot-product attention公式),结果如图30所示。

  • 注意:右图中使用padding mask消除padding的影响
    在这里插入图片描述

    图30 计算注意力权重
  • 接下来,经过softmax归一化,得到权重

  • softmax后,与V进行相乘,提取出新特征

  • 维度还原,将多头进行拼接
    在这里插入图片描述

    图31 维度还原
  • 到这里,多头注意力机制就结束了

3.10Encoder_Add&Norm

  • Add&Norm在许多地方都用到了
    在这里插入图片描述

    图32 Add&Norm
  • Add其实就是一个残差网络,能使训练层数到达比较深的层次,缓解梯度消失

  • Norm这里采用的是LayerNorm

BatchNorm:将特征进行标准化
LayerNorm:将样本进行标准化

  • 为什么不用BatchNorm?
    • 有padding项,BatchNorm不足以代表所有样本的均值和方差
    • batch size太小时,一个batch的样本,其均值与方差,不足以代表总体样本的均值与方差
    • NLP场景下不适合用BatchNorm

3.11Encoder_前馈神经网络

  • 前馈神经网络在Encoder和Decoder中也是都用到了
    在这里插入图片描述
    图33 前馈神经网络
  • 本质上,特别简单,就是一个两层的全连接层,可以参考如下代码:
def FeedForward(dff, d_model):
        return tf.keras.Sequential([
                    tf.keras.layers.Dense(units=dff, activation='relu'),
                    tf.keras.layers.Dense(d_model),
                ])
  • 第一层设置units个数(原文为2048),用relu激活函数
  • 第二层用d_model作为神经元个数

3.12Dncoder_Masked Multi-Head Attentuion

3.13Encoder_Decoder_Multi-Head Attention

3.14输出部分

3.15模型训练_损失函数

3.16模型训练_自定义学习率

四.参考

  1. http://t.csdnimg.cn/freZY
  2. https://github.com/LaoGong-zp/Transformer.git

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git 指定时间代码统计

指定时间代码统计 用法 13 - 17 号 代码情况 近一周 git log --since2023-11-13 00:00:00 --until2023-11-17 23:00:00 --prettytformat: --numstat | awk { add $1; subs $2; loc $1 - $2 } END { printf "added lines: %s, removed lines: %s,total lines: %s\n&…

map和set的简易封装(纯代码)

RBTree.h #pragma once#include<iostream> #include<vector> using namespace std;enum colar { red,black };template<class T>//有效参数就一个 struct RBTreeNode {RBTreeNode(const T& data):_left(nullptr), _right(nullptr), _parent(nullptr)…

Vue bus事件总线的原理与使用

这里写自定义目录标题 一、 Vue Bus 总线原理二、Vue bus的使用1、创建总线&#xff1a; 在 Vue 应用中&#xff0c;可以创建一个 Vue 实例作为总线&#xff0c;用于管理事件。2、事件的发布与订阅&#xff1a; 组件通过订阅事件来监听总线上的消息&#xff0c;而其他组件则通过…

(免费)双相情感障碍筛查MDQ 在线测试双向情感障碍

MDQ用于筛查双相障碍&#xff0c;主要包含13个关于双相障碍症状的是非问题&#xff0c;当前测试采用的量表为2010年杨海晨博士翻译版。该量表为目前世界范围内最常用的双相障碍筛查量表&#xff0c;目前在精神科门诊最为常用的量表之一。 双向情感障碍筛查量表&#xff0c;也叫…

Linux(多用户下)查看cuda、cudnn版本、查看已经安装的cuda版本相关命令

查看已经安装的CUDA多个版本 linux 中cuda默认安装在/usr/local目录中&#xff1a; -可以使用命令&#xff1a; ls -l /usr/local | grep cuda查看该目录下有哪些cuda版本&#xff1a; 如果输出&#xff1a; lrwxrwxrwx 1 root root 21 Dec 17 2021 cuda -> /usr/loc…

监控直流防雷浪涌保护器综合方案

监控系统是一种广泛应用于安防、交通、工业、军事等领域的信息系统&#xff0c;它通过摄像机、传输线路、监控中心等设备&#xff0c;实现对目标区域的实时监视和控制。然而&#xff0c;监控系统也面临着雷电的威胁&#xff0c;雷电可能通过直击雷、感应雷、雷电波侵入等途径&a…

React实战演练项⽬一需求分析及vite_react搭建项目

React实战演练项⽬一需求分析及项目初始化 需求分析 刚学完React,开始找项目进行上手练习&#xff01; 页面组件拆分&#xff1a; 头部&#xff1a;导航tab、搜索框、登录注册 中间&#xff1a;分类导航、轮播图、新人福利、高单价产品导航 课程分类列表、底部内容、登陆提…

当攻防演练已成常态,企业应该相信西医还是老中医?

在面对疾病时&#xff0c;很多人常常会犹豫不决&#xff0c;不知道应该选择中医还是西医进行治疗。与疾病斗争的过程也是一场“战斗”&#xff0c;需要选择合适的“武器”和策略。有些人认为西医疗效快&#xff0c;能够迅速缓解症状&#xff1b;而另一些人则认为中医治疗更根本…

m1 rvm install 3.0.0 Error running ‘__rvm_make -j8‘

在使用M1 在安装cocopods 前时&#xff0c;安装 rvm install 3.0.0遇到 rvm install 3.0.0 Error running __rvm_make -j8 备注: 该图片是借用其他博客图片&#xff0c;因为我的环境解决完没有保留之前错误信息。 解决方法如下&#xff1a; 1. brew uninstall --ignore-depe…

泛型编程 -- 模板详解

一、模板 在没有模板之前&#xff0c;如果我们写一个swap()两数交换函数&#xff0c;因为我们要支持 int 与int 交换 、double 与 double 交换等等情况&#xff0c;所以要实现swap()函数的多个重载&#xff0c;显得很繁琐&#xff0c;于是就引入了模板。 模板就是在需要模板的地…

idea一键打包docker镜像并推送远程harbor仓库的方法(包含spotify和fabric8两种方法)--全网唯一正确,秒杀99%水文

我看了很多关于idea一键打包docker镜像并推送harbor仓库的文章&#xff0c;不论国内国外的&#xff0c;基本上99%都是瞎写的&#xff0c; 这些人不清楚打包插件原理&#xff0c;然后就是复制粘贴一大篇&#xff0c;写了一堆垃圾&#xff0c;然后别人拿来也不能用。 然后这篇文…

MySQL表操作

1.创建表 创建一个表 表的字符集为utf8&#xff0c;校验规则为utf8_bin 存储引擎为MYisam 2.查看表结构 desc 表名&#xff1b; 3.查看表内容 select * from 表名&#xff1b; 4.查看数据库有几个表 show tables; 附&#xff1a;查看创建表时的语句 show create table 表名…

怎么去掉邮件内容中的回车符

上图是Outlook 截图&#xff0c;可见1指向的总有回车符&#xff1b; 故障原因&#xff1a; 不小心误按了箭头4这个选项&#xff1b; 解决方法&#xff1a; 点击2箭头确保tab展开&#xff1b; 点击3以找到箭头4. 取消勾选或者多次点击&#xff0c;即可解决。

web3资讯及远程工作

各位如果想了解区块链相关的消息可以通过如下网址了解&#xff0c;里面还会有相关职位招聘&#xff08;包括远程工作&#xff09;&#xff0c;还可以在里面进行发帖&#xff0c;进入即可获得1000积分&#xff0c;后期可以兑换一些礼品Cryptosquare

Java简介、基本语法

一、Java简介&#xff1a; Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。 Java主要的特性&#xff1a; 1、Java语言是简单的的&#xff1a; Java语言的语法与C、C语言接近。Java丢弃了C中的一些特性&#xff0c;如操…

android 数独小游戏 经典数独·休闲益智

一款经典数独训练app 标题资源下载 &#xff08;0积分&#xff09;https://download.csdn.net/download/qq_38355313/88544810 首页页面&#xff1a; 1.包含有简单、普通、困难、大师四种难度的数独挑战供选择&#xff1b; 记录页面&#xff1a; 1.记录用户训练过的数独信息&…

HT8313 D/AB切换 音频功率放大器

HT8313具有AB类和D类的自Y切换功能&#xff0c;在受到D类功放EMI干扰困扰时&#xff0c;可随时切换至AB类音频功放模式&#xff08;此时电荷泵升压功能关闭&#xff09;。 HT8313内部固定28dB增益&#xff0c;内置的关断功能使待机电流Z小化&#xff0c;还集成了输出端过流保护…

“说”出一个UI原型稿:来自北邮课堂的一款文心应用

在2023年秋季学期&#xff0c;北京邮电大学联合百度飞桨&#xff0c;设计了“文心一言X产品设计”的集训营主题&#xff0c;并融入到了“移动交互设计”的课程中。在完成结业作业的过程中&#xff0c;同学们将基于文心一言开展产品原型设计与初步开发。 众所周知&#xff0c;产…

容性负载箱与电容器的关系是什么?

容性负载箱用于测试电容器性能的设备&#xff0c;电容器是储存电能的元件&#xff0c;具有储存和释放电荷的能力。容性负载箱通过对电容器施加不同的负载&#xff0c;可以测量电容器的容量、电压响应、损耗等参数。 容性负载箱与电容器的关系主要体现在以下几个方面&#xff1a…

外贸自建站怎么做?做外贸要怎样建设网站?

外贸自建站如何建立&#xff1f;海洋建站的具体步骤有哪些&#xff1f; 通过建立自己的外贸网站&#xff0c;您可以更好地展示公司的产品和服务&#xff0c;吸引更多的潜在客户&#xff0c;提高品牌知名度&#xff0c;拓展海外市场。那么&#xff0c;如何建立一个成功的外贸自…