深度学习入门-4(机器翻译,注意力机制和Seq2seq模型,Transformer)
一、机器翻译
1、机器翻译概念
机器翻译(MT):将一段文本从一种语言自动翻译为另一种语言,用神经网络解决这个问题通常称为神经机器翻译(NMT)。
主要特征:输出是单词序列而不是单个单词。 输出序列的长度可能与源序列的长度不同(主要困难)。
2、数据的处理
-
预处理
将数据集清洗、转化为神经网络的输入minbatch
在数据预处理的过程中,我们首先需要对数据进行清洗,即去除特殊字符(乱码)。 -
分词
单词(字符串)组成的列表 -
建立词典
单词组成的列表—单词id组成的列表 -
载入数据集
3、机器翻译组成模块
(1)Encoder-Decoder框架(编码器-解码器)
Encoder-Decoder 即 编码器-解码器,可以理解是一个设计范式,常应用在Sequence to Sequence模型中。
Encoder和Decoder部分可以是任意的文字,语音,图像,视频数据,模型可以采用CNN、RNN、LSTM、GRU、BLSTM等等。所以基于Encoder-Decoder,我们可以设计出各种各样的应用算法。
作用:用来解决输入、输出不等长的问题,常用在机器翻译、对话系统和生成式任务中。
- encoder:输入到隐藏状态
- decoder:隐藏状态到输出
(2)Sequence to Sequence模型
sequence to sequence模型是一类End-to-End的算法框架,也就是从序列到序列的转换模型框架,是输出的长度不确定时采用的模型。
Seq2Seq一般是通过Encoder-Decoder(编码-解码)框架实现。
训练时的模型:
预测时的模型:
其中Encoder和Decoder都是循环神经网络。
具体结构:
(3)集束搜索(Beam Search)
作用:生成每个时间步的单词。(上图解释了每个单词的生成都相当于做了分类)
(ⅰ)简单贪心搜索(greedy search)
贪心算法找到的是局部最优解而非全局最优解
(ⅱ)维特比算法
将所有单词都试一遍,选择整体分数最高的句子,即全局最优解。
缺点:搜索空间太大
(ⅲ)维特比算法
贪心算法与维特比算法的结合体,是维特比搜索的贪心形式,属于贪心算法,也就是说不能完全得到全局最优解。
以较少的代价在相对受限的搜索空间中找出其最优解,得出的解接近于整个搜索空间中的最优解。
二、注意力机制框架和Seq2seq模型
1、注意力机制的引入
编码器—解码器(seq2seq)的不足:
- 随着所需翻译句子的长度的增加,这种结构的效果会显著下降
- 在seq2seq模型中,解码器只能隐式地从编码器的最终状态中选择相应的信息
2、注意力机制框架
目的:解决以seq2seq的不足,将选择过程显示建模。
Attention 是一种通用的带权池化方法.
输入由两部分构成:询问(query)和键值对(key-value pairs)。
对于一个query来说,attention layer 会与每一个key计算注意力分数并进行权重的归一化,输出的向量o则是value的加权求和,而每个key计算的权重与value一一对应。
Attention步骤:
- 计算注意力分数
- 使用softmax函数获得注意力权重
- 计算输出,即value的加权求和
3、两个常用的注意力层
不同的注意力计算分数是不同的注意力层的主要区别。
(1)点积注意力(The dot product )
The dot product 假设query和keys有相同的维度,通过计算query和key转置的乘积来计算attention score,通常还会除去维度d的平方根减少计算出来的score对维度𝑑的依赖性,如下
相应的,若Q是md的矩阵,即有m个query,K是nd的矩阵,即有n个keys,可通过矩阵计算所有m*n个score:
(2)多层感知机注意力(Multilayer Perceptron Attention)
将q与k映射到相同的维度,Wₖ是hdₖ的矩阵,Wₚ是hdₚ的矩阵
score函数定义为:
4、引入注意力机制的Seq2seq模型
在常规的Seq2seq模型中,只将Encoder最后的输出作为Decoder的输入,引入注意力机制的Seq2seq模型在每个时间步都选择与之相关的编码器信息。
将注意机制添加到sequence to sequence 模型中,以显式地使用权重聚合states。下图展示encoding 和decoding的模型结构,在时间步为t的时候。此刻attention layer保存着encodering看到的所有信息——即encoding的每一步输出。在decoding阶段,解码器的t时刻的隐藏状态被当作query,encoder的每个时间步的hidden states作为key和value进行attention聚合. Attetion model的输出当作成上下文信息context vector,并与解码器输入Dₜ拼接起来一起送到解码器:
5、补充
(1)Softmax屏蔽
在Seq2seq中会将较短的句子使用padding补充到较长句子长度,Softmax屏蔽操作就是为了排除padding对attention的操作。
(2)三维矩阵相乘
如:Z [ i , : , : ] = X [ i , : , : ] * Y [ i , : , : ] ,Z 的第 i 列的矩阵,等于 Y 的第 i 列矩阵与 Y 的第 i 列矩阵的乘积。
更多关于注意力机制的解释可参考:图解神经机器翻译中的注意力机制
三、Transformer
1、Transformer的引入与概念
主流的神经网络架构如卷积神经网络(CNNs)和循环神经网络(RNNs)有以下缺点:
- CNNs 易于并行化,却不适合捕捉变长序列内的依赖关系。
- RNNs 适合捕捉长距离变长序列的依赖,但是却难以实现并行化处理序列。
为了整合CNN和RNN的优势,Vaswani et al., 2017 创新性地使用注意力机制设计了Transformer模型。该模型利用attention机制实现了并行化捕捉序列依赖,并且同时处理序列的每个位置的tokens,上述优势使得Transformer模型在性能优异的同时大大减少了训练时间。
Transformer模型的架构与seq2seq模型相似,Transformer同样基于编码器-解码器架构,其区别主要在于以下三点:
- Transformer blocks:将seq2seq模型重的循环网络替换为了Transformer Blocks,该模块包含一个多头注意力层(Multi-head Attention Layers)以及两个position-wise feed-forward networks(FFN)。对于解码器来说,另一个多头注意力层被用于接受编码器的隐藏状态。
- Add and norm:多头注意力层和前馈网络的输出被送到两个“add and norm”层进行处理,该层包含残差结构以及层归一化。
- Position encoding:由于自注意力层并没有区分元素的顺序,所以一个位置编码层被用于向序列元素里添加位置信息。
2、Transformer模型的组成模块
(1)多头注意力层
自注意力结构
自注意力(self-attention)模型是一个正规的注意力模型,序列的每一个元素对应的key,value,query是完全一致的。如图10.3.2 自注意力输出了一个与输入长度相同的表征序列,与循环神经网络相比,自注意力对每个元素输出的计算是并行的,所以我们可以高效的实现这个模块。
多头注意力层包含个并行的自注意力层,每一个这种层被成为一个head。对每个头来说,在进行注意力计算之前,我们会将query、key和value用三个现行层进行映射,这个注意力头的输出将会被拼接之后输入最后一个线性层进行整合。
(2)基于位置的前馈网络
Transformer 模块另一个非常重要的部分就是基于位置的前馈网络(FFN),它接受一个形状为(batch_size,seq_length, feature_size)的三维张量。Position-wise FFN由两个全连接层组成,他们作用在最后一维上。因为序列的每个位置的状态都会被单独地更新,所以我们称他为position-wise,这等效于一个1x1的卷积
(3)Add and Norm
除了上面两个模块之外,Transformer还有一个重要的相加归一化层,它可以平滑地整合输入和其他层的输出,因此我们在每个多头注意力层和FFN层后面都添加一个含残差连接的Layer Norm层。这里 Layer Norm 与7.5小节的Batch Norm很相似,唯一的区别在于Batch Norm是对于batch size这个维度进行计算均值和方差的,而Layer Norm则是对最后一维进行计算。层归一化可以防止层内的数值变化过大,从而有利于加快训练速度并且提高泛化性能
(4)位置编码
与循环神经网络不同,无论是多头注意力网络还是前馈神经网络都是独立地对每个位置的元素进行更新,这种特性帮助我们实现了高效的并行,却丢失了重要的序列顺序的信息。为了更好的捕捉序列信息,Transformer模型引入了位置编码去保持输入序列元素的位置。
3、编码器
我们已经有了组成Transformer的各个模块,现在我们可以开始搭建了!编码器包含一个多头注意力层,一个position-wise FFN,和两个 Add and Norm层。对于attention模型以及FFN模型,我们的输出维度都是与embedding维度一致的,这也是由于残差连接天生的特性导致的,因为我们要将前一层的输出与原始输入相加并归一化。
4、解码器
Transformer 模型的解码器与编码器结构类似,然而,除了之前介绍的几个模块之外,编码器部分有另一个子模块。该模块也是多头注意力层,接受编码器的输出作为key和value,decoder的状态作为query。与编码器部分相类似,解码器同样是使用了add and norm机制,用残差和层归一化将各个子层的输出相连。
仔细来讲,在第t个时间步,当前输入是query,那么self attention接受了第t步以及前t-1步的所有输入。在训练时,由于第t位置的输入可以观测到全部的序列,这与预测阶段的情形项矛盾,所以我们要通过将第t个时间步所对应的可观测长度设置为t,以消除不需要看到的未来的信息。
自注意力模块理论上可以捕捉任意距离的依赖关系。
在Transformer模型中,注意力头数为h,嵌入向量和隐藏状态维度均为d,那么一个多头注意力层所含的参数量是:
h个注意力头中,每个的参数量为3d ^ 2 ,最后的输出层形状为4hd×d,所以参数量共为4hd^2
归一化层:
- 层归一化有利于加快收敛,减少训练时间成本
- 批归一化(Batch Normalization)对每个神经元的输入数据以mini-batch为单位进行汇总
- 层归一化对一个中间层的所有神经元进行归一化
- 层归一化的效果不会受到batch大小的影响