奢侈品电商网站首页设计,陕西建设网官网登录入口,百度竞价托管公司,青岛建设工程管理信息网基于RNN和CNN的翻译模型#xff0c;在处理文字序列时有个问题#xff1a;它们对序列中不同位置之间的依赖关系的建模并不直接。以CNN的为例#xff0c;如果要对长距离依赖进行描述#xff0c;需要多层卷积操作#xff0c;而且不同层之间信息传递也可能有损失#xff0c;这…基于RNN和CNN的翻译模型在处理文字序列时有个问题它们对序列中不同位置之间的依赖关系的建模并不直接。以CNN的为例如果要对长距离依赖进行描述需要多层卷积操作而且不同层之间信息传递也可能有损失这些都限制了模型的能力。
为了更好地描述文字序列研究人员提出了一种新的模型 Transformer。 Transformer 并不依赖任何循环单元或者卷积单元而是使用一种被称作自注意力网络的结构来对序列进行表示。自注意力可以非常高效的描述任意距离之间的依赖关系因此非常适合处理语言文字序列。
Transformer 一经提出就受到了广泛关注现在已经成为了机器翻译中最先进的架构之一。
一、自注意力机制
在RNN中处理文字序列如果想建立wm 和 w1 之间的关系需要 m−1 次信息传递。对于长序列来说词汇之间信息传递距离过长会导致信息在传递过程中丢失同时这种按顺序建模的方式也使得系统对序列的处理十分缓慢。
自注意力机制直接建立单词 wm与前 m−1 个单词之间的关系即 wm 与序列中所有其他单词的距 离都是 1。这种方式很好地解决了长距离依赖问题同时由于单词之间的联系都是相互独立的因此也大大提高了模型的并行度。 自注意力机制也可以被看作是一个序列表示模型。
比如对于每个目标位置 j都生成一个与之对应的源语言句子表示它的形式如下 Cj Sum(αi,jhi) 。其中hi 为源语言句子每个位置的表示结果 αi,j 是目标位置 j 对 hi 的注意力权重。
以源语言句子为例自注意力机制将序列中每个位置的表示 hi 看作 query查询并且将所有位置的表示看作 key键和 value 值。自注意力模型通过计算当前位置与所有位置的匹配程度也就是在注意力机制中提到的注意力权重来对各个位置的 value 进行加权求和。得到的结果可以被看作是在这个句子中当前位置的抽象表示。 这个过程可以叠加多次形成多层注意力模型对输入序列中各个位置进行更深层的表示。
在自注意力机制中并不是使用类似RNN的记忆能力去访问历史信息。序列中所有单词之间的信息都是通过同一种操作query 和 key 的相关度进行处理。这样表示结果 h˜(他) 在包含“他”这个单词的信息的同时也包含了序列中其他词的信息。
也就是序列中每一个位置的表示结果中都包含了其他位置的信息。从这个角度说 h˜(他) 已经不再是单词“他”自身的表示结果而是一种在单词“他”的位置上的全局信息的表示。
通常也把生成 h˜(wi) 的过程看作特征提取而实现这个过程的模型被称为特征提取器。
二、Transformer架构
2.1 Transformer优势
Transformer 模型仅仅使用自注意力机制和标准的前馈神经网络完全不依赖任何循环单元或者卷积操作。很好地解决了单词间长距离依赖的问题。自注意力机制非常适合在 GPU 上进行并行化因此模型训练的速度更快。
Transformer 也可以当作一种表示模型被大量地使用在NLP的其他领域甚至图像处理和语音处理中也能看到它的影子。比如目前非常流行的 BERT 等预训练模型就是基于 Transformer。
Transformer 在 WMT英德和英法机器翻译任务上的性能。它能用更少的计算量FLOPs达到比其他模型更好的翻译品质。 Transformer 并不简单等同于自注意力机制。 Transformer 模型还包含了很多优秀的技术比如多头注意力、新的训练学习率调整策略等等。这些因素一起组成了真正的 Transformer。
2.2 总体结构 自注意力子层Self-Attention Sub-layer使用自注意力机制对输入的序列进行新的表示
前馈神经网络子层Feed-Forward Sub-layer使用全连接的前馈神经网络对输入向量序列进行进一步变换
残差连接标记为“Add”对于自注意力子层和前馈神经网络子层都有一个从输入直接到输出的额外连接也就是一个跨子层的直连。残差连接可以使深层网络的信息传递更为有效
层标准化Layer Normalization自注意力子层和前馈神经网络子层进行最终输出之前会对输出的向量进行层标准化规范结果向量取值范围这样易于后面进一步的处理。 以上操作就构成了 Transformer 的一层各个模块执行的顺序可以简单描述为
Self-Attention → Residual Connection → Layer Normalization → Feed Forward Network → Residual Connection → Layer Normalization。
解码器中引入了一个额外的编码-解码注意力子层EncoderDecoder Attention Sub-layer。这个新的子层可以帮助模型使用源语言句子的表示信息生成目标语言不同位置的表示。编码-解码注意力子层仍然基于自注意力机制因此它和自注意力子层的结构是相同的只是 query、 key、 value 的定义不同。
2.3 位置编码
采用自注意力机制对源语言和目标语言序列进行处理时直接对当前位置和序列中的任意位置进行建模忽略了词之间的顺序关系。为了解决这个问题Transformer 在原有的词向量输入基础上引入了位置编码来表示单词之间的顺序关系。它是Transformer 成功的一个重要因素。
位置编码的计算方式有很多种 Transformer 使用不同频率的正余弦函数式中 PE(·) 表示位置编码的函数 pos 表示单词的位置 i 代表位置编码向量中的第几维 dmodel 是 Transformer 的一个基础参数表示每个位置的隐层大小。 在Transformer 中位置编码的维度和词嵌入向量的维度相同均为 dmodel模型通过 将二者相加作为模型输入。 为什么通过这种计算方式可以很好的表示位置信息有几方面原因。
首先正余弦函数是具有上下界的周期函数用正余弦函数可将长度不同的序列的位置编 码的范围都固定到 [−1,1]这样在与词的编码进行相加时不至于产生太大差距。
另外位置编码的不同维度对应不同的正余弦曲线这为多维的表示空间赋予一定意义。
最后根据三角函数的性质对于任意固定的偏移量 k PE(pos k) 能被表示成 PE(pos) 的线性函数换句话说位置编码可以表示词之间的距离。
在实践中发现位置编码对 Transformer 系统的性能有很大影响。对其进行改进也会带来进一步的性能提升。
2.4 基于点乘的多头注意力机制
Transformer 模型摒弃了循环单元和卷积等结构完全基于注意力机制来构造模型其中包含着大量的注意力计算。比如可以通过自注意力机制对源语言和目标语言序列进行信息提取并通过编码-解码注意力对双语句对之间的关系进行建模。而这些模块都是由基于点乘的多头注意力机制实现的。
2.4.1 点乘注意力机制
自注意力机制中至关重要的是获取相关性系数也就是在融合不同位置的表示向量时各位置的权重。 Transformer 模型采用了一种基于点乘的方法来计算相关性系数。这种方法也称为缩放的点乘注意力Scaled Dot-product Attention机制。
在注意力机制的计算过程中包含三个重要的参数分别是 querykey 和 value。将目标语言每个位置的表示视为编码-解码注意力机制的 Q源语言句子的表示视为 K 和V。在得到 Q K 和 V 后便可以进行注意力的运算这个过程可以被形式化为 通过对 Q 和 K 的转置进行矩阵乘法操作计算得到一个维度大小为 L × L 的相关性矩阵即 QK_T它表示一个序列上任意两个位置的相关性。再通过系数 1/√dk进行放缩操作放缩可以减少相关性矩阵的方差具体体现在运算过程中实数矩阵中的数值不会过大有利于模型训练。在此基础上通过对相关性矩阵累加一个掩码矩阵 Mask来屏蔽掉矩阵中的无用信息。
然后使用 Softmax 函数对相关性矩阵在行的维度上进行归一化操作这可以理解为对第 i 行进行归一化结果对应了 V 中不同位置上向量的注意力权重。对于 value的加权求和可以直接用相关性系数和 V 进行矩阵乘法得到即 Softmax(√QKdkT Mask)和 V 进行矩阵乘。最终得到自注意力的输出它和输入的 V 的大小是一模一样的。 2.4.2 多头注意力机制 (Multi-head Attention)
“多头”可以理解成将原来的 Q、 K、 V 按照隐层维度平均切分成多份。假设切分 h份那么最终会得到 Q {Q1,...,Qh} K {K1,...,Kh} V {V1,...,Vh}。多头注意力就是用每一个切分得到的 Q K V 独立的进行注意力计算即第 i 个头的注意力计算结果 headi Attention(Qi,Ki,Vi)。
多头注意力的计算过程 多头注意力机制的好处是允许模型在不同的表示子空间里学习。在很多实验中发现不同表示空间的头捕获的信息是不同的比如在使用 Transformer 处理自然语言时有的头可以捕捉句法信息有的头可以捕捉词法信息。
2.4.3 掩码操作
掩码Mask的目的是对向量中某些值进行掩盖避免无关位置的数值对运算造成影响。 Transformer 中的掩码主要应用在注意力机制中的相关性系数计算具体方式是在相关性系数矩阵上累加一个掩码矩阵。该矩阵在需要掩码的位置的值为负无穷 −inf具体实现时是一个非常小的数比如 −1e9其余位置为 0这样在进行了 Softmax 归一化操作之后被掩码掉的位置计算得到的权重便近似为 0也就是说对无用信息分配的权重为 0从而避免了其对结果产生影响。
Transformer 包含两种掩码
a.句长补全掩码Padding Mask
训练样本中每个批次内序列的长度不一样为了方便对批次内序列进行矩阵表示需要进行对齐操作即在较短的序列后面填充 0 来占位padding 操作。
b.未来信息掩码Future Mask
对于解码器来说由于在预测的时候是自左向右进行的即第 t 时刻解码器的输出只能依赖于 t 时刻之前的输出。且为了保证训练解码一致避免在训练过程中观测到目标语言端每个位置未来的信息因此需要对未来信息进行屏蔽。
具体的做法是构造一个上三角值全为-inf 的 Mask矩阵。即在解码器计算中在当前位置通过未来信息掩码把序列之后的信息屏蔽掉了避免了 t 时刻之后的位置对当前的计算产生影响。
2.5 残差网络和层标准化
在 Transformer 的训练过程中为了避免产生梯度爆炸或者消失引入了残差操作将前面所有层的输出加到一起。但为了避免不同层或子层的结果之间的差异性较大造成训练过程不稳定、训练时间较长在每层中加入了层标准化操作。
在 Transformer 中经常使用的层标准化操作有两种结构分别是后标准化Post norm和前标准化Pre-norm。后标准化中先进行残差连接再进行层标准化而前标准化则是在子层输入之前进行层标准化操作。在很多实践中已经发现前标准化的方式更有利于信息传递因此适合训练深层的 Transformer 模型。 2.6 前馈全连接网络子层
Transformer 全连接网络的作用主要体现在将经过注意力操作之后的表示映射到新的空间中新的空间会有利于接下来的非线性变换等操作。实验证明去掉全连接网络会对模型的性能造成很大影响。 Transformer 的全连接前馈神经网络包含两次线性变换和一次非线性变换ReLU 激活函数:ReLU(x) max(0,x)每层的前馈神经网络参数不共享。
通常情况下前馈神经网络的隐层维度要比注意力部分的隐层维度大而且研究人员发现这种设置对 Transformer 是至关重要的。比如注意力部分的隐层维度为 512前馈神经网络部分的隐层维度为 2048。继续增大前馈神经网络的隐层大小比如设为 4096甚至 8192还可以带来性能的增益但是前馈部分的存储消耗较大需要更大规模 GPU 设备的支持。因此在具体实现时往往需要在翻译准确性和存储/速度之间找到一个平衡。
2.7 训练
2.7.1 训练优化器配置
在训练优化器方面需要注意以下几点
• Transformer 使用 Adam 优化器优化参数并设置 β1 0.9 β2 0.98 ϵ 10−9
• Transformer 在学习率中同样应用了学习率预热Warmup策略。
• 小批量训练Mini-batch Training每次从样本中选择一小部分数据进行训练。这种方法的收敛较快同时易于提高设备的利用率。批次大小通常设置为 2048 或 4096。每一个批次中的句子并不是随机选择的模型通常会根据句子长度进行排序选取长度相近的句子组成一个批次。这样做可以减少 padding 数量提高训练效率。
• Dropout为了避免过拟合Transformer 加入了 Dropout 操作。这四个地方用到了Dropout词嵌入和位置编码、残差连接、注意力操作和前馈神经网络。 Dropout比例通常设置为 0.1。
• 标签平滑Label Smoothing简单的说就是给正确答案以外的类别分配一定的概率而不是采用非 0 即 1 的概率。这样可以学习一个比较平滑的概率分布从而提升泛化能力。
2.7.2 模型具体配置
常见的 Transformer 模型有 TransformerBase、 Transformer Big 和 Transformer Deep具体设置如下
• Transformer Base标准的 Transformer 结构解码器编码器均包含 6 层隐层维度为 512前馈神经网络维度为 2048多头注意力机制为 8 头 Dropout 设为 0.1。
• Transformer Big为了提升网络的容量使用更宽的网络。在 Base 的基础上增大隐层维度至 1024前馈神经网络的维度变为 4096多头注意力机制为 16 头Dropout 设为 0.3。
• Transformer Deep加深编码器网络层数可以进一步提升网络的性能它的参数设置与 Transformer Base 基本一致但是层数增加到 48 层同时使用 Pre-Norm作为层标准化的结构。 2.8 推断
Transformer 解码器生成译文词序列的过程和其它神经机器翻译系统类似都是从左往右生成且下一个单词的预测依赖已经生成的单词。
Transformer 在推断阶段无法对所有位置进行并行化操作因为对于每一个目标语言单词都需要对前面所有单词进行注意力操作因此它推断速度非常慢。可以采用的加速手段有 Cache缓存需要重复计算的变量、低精度计算、共享注意力网络等。