跟着问题学18——transformer模型详解及代码实战(3)Encode编码器

devtools/2024/12/23 5:05:51/

跟着问题学18——transformer模型详解及代码实战(1)

跟着问题学18——transformer详解(2)多头自注意力机制-CSDN博客

2.3 残差连接

通过自注意力层我们挖掘提取了原始数据的特征,但编码层中会有多个编码器,这会导致网络层数的加深,进而出现梯度消失/爆炸或者网络退化问题,因此,作者在每个自注意力层上引入了ResNet网络的残差结构,并使用了层正则化方法,增强网络的鲁棒性。

在论文中的框架中表示如下图:

用向量可视化的话,如下图:

其中Add代表了Residual Connection,是为了解决多层神经网络训练困难的问题,通过将一部分的前一层的信息无差的传递到下一层,可以有效的提升模型性能——因为对于有些层,我们并不确定其效果是不是正向的。加了残差连接之后,我们相当于将上一层的特征信息X走两条路,一条路通过自注意力层进行变换输出Z,另一条路直接把X传入下一层,再将这两部分的结果进行相加作为下一层的输入。这样的话,其实可以达到这样的效果:我们通过残差连接之后,就算再不济也至少可以保留上一层的信息,这是一个非常巧妙的思路。具体可参考前面讲解的ResNet网络模型。

2.4 层归一化Layer normalization

  经过残差连接结构后,特征向量还不是直接传递给下一层网络,而是又经过了正则化处理。正则化Normalization有很多种,但是它们都有一个共同的目的,那就是把输入特征转化成均值为0方差为1的数据。我们在把数据送入激活函数之前进行normalization(正则化),得到的值大部分会落入非线性函数的线性区,导数远离导数饱和区,避免了梯度消失和梯度爆炸,这样来加速训练收敛过程。归一化技术就是让每一层的分布稳定下来,让后面的层能在前面层的基础上“安心学习”。

正则化目前使用广泛的有2种,一是批正则化 batch normalization,二是层正则化layer normalization,transformer模型(更大点说NLP任务)多是使用层正则化,下面介绍一下二者的区别。

2.4.1批正则化 batch normalization

batch normalization是对一批样本的同一纬度特征做正则化。如下图我们想根据这个batch中的三种特征(身高、体重、年龄)数据进行预测性别,首先我们进行归一化处理,如果是Batch normalization操作则是对每一列特征进行归一化,如下图求一列身高的平均值。

BN特点:强行将数据转为均值为0,方差为1的正态分布,使得数据分布一致,并且避免梯度消失。而梯度变大意味着学习收敛速度快,能够提高训练速度。

2.4.2 层正则化layer normalization

而layer normalization是对单个样本的所有维度特征做正则化。如下表中,如果是Layer normalization则是对每一行(该条数据)的所有特征数据求均值。

2.4.3Transformer为什么用Layer Normalization

从操作上看:BN是对同一个batch内的所有数据的同一个特征数据进行操作;而LN是对同一个样本进行操作。

从特征维度上看:BN中,特征维度数=均值or方差的个数;LN中,一个batch中有batch_size个均值和方差。

如在NLP中上图的C、N、H,W含义:

N:N句话,即batchsize;

C:一句话的长度,即seqlen;

H,W:词向量维度embedding dim。

BN不适合RNN、transformer等序列网络,不适合文本长度不定和batchsize较小的情况,适合于CV中的CNN等网络;

而LN适合用于NLP中的RNN、transformer等网络,因为sequence的长度可能是不一致的。

栗子:如果把一批文本组成一个batch,BN就是对每句话的第一个词进行操作,BN针对每个位置进行缩放就不符合NLP的规律了。而LN则是对一句话的所有词进行操作。

2.5前馈神经网络

编码器中经过自注意力层,残差连接以及层正则化处理后,接下来就是要把挖掘处理后的特征输入到前馈神经网络

前馈网络层FeedForward又对特征做了什么处理呢?前馈网络层做了两次线性变换和一次ReLU激活函数(代码中还有一次dropout),更加深入的提取特征。

前馈全连接层(feed-forward linear layer)基本上就是一堆神经元,每个神经元都与其他神经元相连接。

请看下图,其中a、b、c和d是神经元。这些神经元包含了一些 input(即一些我们想要理解的数据(像素值(pixels)、词嵌入(word embeddings)等))。它们与编号为1的神经元相连。每两个神经元之间的连接都有不同的连接权重值(connection strength)。例如,a-1是0.1,b-1是0.2,等等。具体可以参考前面介绍的传统神经网络

实际上,左列中的所有神经元都与右列中的所有神经元相连。但是为了清晰起见,我没有在图像中展示全部的连接,你需要了解这一情况。就像图中有a-1一样,还应该有a-2、b-2、c-2、d-3等。两个神经元之间的每个连接都有不同的“连接权重”。

尽管全连接层(Fully connected layers)的使用非常广泛,但也存在一个很大的缺点——它们是线性层(linear layers),只能进行线性变换和线性计算。全连接层可以进行加法和乘法运算,但无法以“创造性”的方式转换输入(input)。有时候,仅仅增加计算量是不够的,需要以完全不同的思考方式来解决问题。

激活函数能够帮助我们进行非线性变换(non-linear transformation)。例如,将一个数字列表[1, 4, -3, 5.6]转换为概率分布,就是Softmax激活函数的作用。该激活函数能够将这些数字转换为[8.29268754e-03, 1.66563082e-01, 1.51885870e-04, 8.24992345e-01]这样的输出。这5个数字相加等于1。虽然这些数字看起来有些混乱,但 e-03 表示第一个数字(8)在小数点后3个零开始(例如0.00,然后是82926。实际上该数字是0.00829268754)。这个Softmax激活函数将整数转换为0到1之间的浮点数,转换后的浮点数仍然保持了原始整数之间的相对大小关系。这种保持相对大小关系的特性在统计学中非常有用。

还有其他类型的激活函数,其中最常用的之一是ReLU(修正线性单元)。这是一种非常简单(同时也非常有用)的激活函数,它能够将任何负数转化为0,而非负数保持不变。非常简单且实用。如果我将列表[1, -3, 2]输入ReLU函数,会得到[1, 0, 2]。

所以前馈网络层的作用是:通过线性变换,先将数据映射到高纬度的空间再映射到低纬度的空间,提取了更深层次的特征。如图:

FeedForward的计算公式如下:

2.6 Eecode模块

如上已经介绍完毕一个编码器的结构,论文中将6个相同的编码器堆叠在一起就构成了编码模块。如下图是2个编码器堆叠在一起的形式。

参考资料

The Illustrated Transformer – Jay Alammar – Visualizing machine learning one concept at a time.

李宏毅transformer视频课程

https://zhuanlan.zhihu.com/p/338817680

Transformer:注意力机制(attention)和自注意力机制(self-attention)的学习总结_注意力机制和自注意力机制-CSDN博客

10.1. 注意力提示 — 动手学深度学习 2.0.0 documentation

深度学习】batch normalization和layer normalization区别_layer normalization和batch normalization-CSDN博客


http://www.ppmy.cn/devtools/144590.html

相关文章

火山引擎FORCE:智算能力全面升级

火山引擎智算专场 : 有幸参加 2024年 12月18日 在 上海国际博览中心 15:00~17:00的 智算专场。 这里 火山引擎智算专场图片 : 火山引擎智算专场内容 : 火山引擎图片 智算专场:乘云之势,智启未…

Java中ArrayList和LinkedList的区别?

在 Java 中,ArrayList和LinkedList都是实现了List接口的集合类,用于存储和操作有序的元素集合。它们在内部实现和性能特性上存在一些显著的区别,以下是对这两者的详细比较: 底层数据结构 ArrayList:基于数组实现&…

android studio更改应用图片,和应用名字。

更改应用图标,和名字 先打开AndroidManifest.xml文件。 更改图片文件名字( 右键-->构建-->重命名(R))

html 中 表格和表单的关系与区别

在 HTML 中&#xff0c;表格 (<table>) 和表单 (<form>) 是两种常用于展示数据和收集用户输入的元素。它们具有不同的功能和结构。以下是关于这两者的详细介绍&#xff1a; 1. HTML 表格&#xff08;<table>&#xff09; 表格用于展示结构化的数据&#xf…

Libevent实现TCP客户端服务器

Libevent实现TCP客户端服务器 17-libevent实现Tcp服务器流程_bilibili_哔哩哔哩_bilibili 文章目录 Libevent实现TCP客户端服务器1.服务器端实现流程2.服务器端代码实现3.客户端实现流程4.客户端代码实现 1.服务器端实现流程 1.创建 event_base 2.创建服务器连接监听器 evc…

服务器运行Vue项目

1.配置nodejs 1.wget获取到nodejs的压缩包 修改成自己需要的版本的下载链接。右键点击&#xff0c;复制下载链接即可。 wget https://nodejs.org/dist/v20.18.1/node-v20.18.1-linux-x64.tar.xz2.解压 tar xf node-v20.18.1-linux-x64.tar.xz3.移动目录 mkdir /usr/local/l…

速通Python 第二节

一、动态类型特性 在 Python 中 , 一个变量是什么类型 , 是可以在 " 程序运行 " 过程中发生变化的 . 这个特性称为 " 动态类型 " a 10 print(type(a)) a hello print(type(a) 在程序执行过程中, a 的类型刚开始是 int, 后面变成了 str. C/Java 这…

ISP算法之黑电平BLC校正

黑电平形成原因 Sensor本身问题 CMOS Sensor本身的电路会存在暗电流(dark current)&#xff0c;在没有光照条件下&#xff0c;感光器件等也会存在流动的电流&#xff0c;在光敏二极管器的伏安特性曲线中反向截止区电流并不为零&#xff08;如下图&#xff09;。导致在Sensor遮…