跟着问题学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博客