Encoder是6层结构,每层内部结构相同,都由Multi-Head Attention和Feed Forward组成,而这两层后都带有有一个Add&Norm层,Add&Norm层由 Add 和 Norm 两部分组成, 如下:
graph LR
A[Input Embedding] --Positional Encoding--> B[Multi-head Attention] --> C[Add&Norm] --> D[Feed Forward] --> E[Add&Norm]
style A fill:#eee,stroke:#333,stroke-width:1px;
style C fill:#e,stroke:#333,stroke-width:1px;
style E fill:#e,stroke:#333,stroke-width:1px;
输入Inputs
多头注意力
见Transformer模型-5-MultiHead Attention-笔记
Add & Norm
Add&Norm层由Add和Norm两部分组成,是Transformer的常有层,用于在多头自注意力机制和前馈神经网络之间添加残差连接和归一化操作。
Add指X+MultiHeadAttention(X),是一种残差连接。Norm是Layer Normalization。
这个层是将前一层的输出与前一层的输入相加,并进行归一化,以便更好地传递信息和控制梯度。其作用可以总结为在保持信息流畅性的同时,避免梯度消失或爆炸的问题,从而提高模型的训练效率和性能。
Add&Norm层主要完成以下几件事情:
残差连接:将前一层的输出与前一层的输入相加,得到一个残差向量。
归一化:对残差向量进行归一化,以便更好地传递信息和控制梯度。归一化可以采用不同的方法,如Layer Normalization或Batch Normalization。
线性变换:对归一化后的向量进行线性变换,以便更好地适应下一层的输入。
Add
什么是残差连接
什么是残差连接呢?残差连接就是把网络的输入和输出相加,得到网络的输出为F(x)+xF(x)+x。
分析在网络结构比较深的时候,网络梯度反向传播更新参数时,容易造成梯度消失的问题,但是如果每层的输出都加上一个x的时候,就变成了F(x)+x,对x求导结果为1,所以就相当于每一层求导时都加上了一个常数项’1’,这样就有效解决了梯度消失问题。
Transformer中的残差连接
在Transformer中,数据过Attention层和FFN层后,都会经过一个Add & Norm处理。其中Add为residule block(残差模块) ,数据在这里进行residule connection(残差连接)
残差连接的图表如下所示:
Encoder架构图 | 残差链接方式 |
---|---|
Add是一种残差连接,用于缓解梯度消失,这一概念在ResNet中被提出: |
Add可以让反向传播过程中,有一路的梯度不会经过梯度F(x) 计算(如上右图公式中的第一个F(x)),直接经过后续的处理(传播), 能够保存更多的梯度信息。
有了Add(残差连接)我们可以将网络做的更深。
Norm
什么是Normalization
Norm即为Normalization(标准化)模块,就是把输入数据X,在输送给神经元之前先对其进行平移和伸缩变换,将X的分布规范化成在固定区间范围的标准分布,简单的说就是 将数据统一到固定区间内。变化框架
h=f(g∗x−μα+b)μ:平移参数,δ:缩放参数b:再平移参数,g再缩放参数,得到的数据符合均值为b、方差为g2的分布。h=f(g * frac{x-μ}{α} + b) \
μ:平移参数 ,δ:缩放参数 b :再平移参数, g 再缩放参数,得到的数据符合均值为 b 、方差为g^2 的分布。
Normalization的作用是把数据拉回标准正态分布,因为神经网络的Block大部分都是矩阵运算,一个向量经过矩阵运算后值会越来越大,为了网络的稳定性,我们需要及时把值拉回正态分布。
根据标准化操作的维度Normalization可分为batch Normalization和Layer Normalization,不管用何种维度方式其本质都是为了让数据在相应的维度上归一化,以解决上一层传递的数值千奇百怪的分布的问题。其中BatchNorm是通过对BatchSize这个维度归一化来让分布稳定下来, LayerNorm则是通过对Hidden size这个维度归一化来让某层的分布稳定。
Transformer中Norm
Transformer中采用的是Layer Normalization(层标准化)方式。
Encoder架构图 | 数学公式 |
---|---|
Add的结果经过LN进行层归一化: |
Feed Forword – 前馈神经网络
什么是前馈神经网络
前馈神经网络(Feedforward Neural Network, FNN) 是最早发明的简单人工神经网络。在前馈神经网络中,各神经元分别属于不同的层,每一层的神经元可以接收前一层神经元的信号,并产生信号输出到下一层。第0层称为输入层,最后一层称为输出层,其他中间层称为隐藏层。整个网络中无反馈,信号从输入层向输出层单向传播,可用一个有向无环图表示。
Transformer中的前馈神经网络
Feed Forward 层是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数:
max(0,XW1+b2)W2+B2max(0,XW_1 + b_2) W_2 + B_2
Feed Forward 结果再次经过Add&Norm后,就得到了Encoder的输出:
LayerNorm(X+FeedForward(X))LayerNorm(X + FeedForward(X))
—— 笔记写于:2023年11月07日
Transformer模型详解 – 笔记提纲