机器翻译及相关技术
特征
主要特征:输出是单词序列而不是单个单词。 输出序列的长度可能与源序列的长度不同。
encoder-decoder
针对输入输出的序列长度不等的翻译问题
encoder:输入到隐藏状态
decoder:隐藏状态到输出
Sequence to Sequence模型
训练
预测
具体结构
词向量、LSTM
embeding层
损失函数
sequenceMask 忽略 padding
torch.arrange: 返回一个1维张量,长度为 floor((end−start)/step)。包含从start到end,以step为步长的一组序列值(默认步长为1)。
.to(X_len.device): 将返回值放到X_len的计算图上
最后X[~mask] = value中的~,可以看作torch中的取反值,原示例的数据如下:
print(mask)
tensor([[ True, False, False],
[ True, True, False]])
print(~mask)
tensor([[False, True, True],
[False, False, True]])
Beam Search
译名:集束搜索(波束搜索)
这里beam==2
注意力机制
超出2维矩阵的乘法
X 和 Y 是维度分别为 (b,n,m) 和 (b,m,k) 的张量,进行 b 次二维矩阵乘法后得到 Z , 维度为 (b,n,k) 。
Dot Product Attention
The dot product 假设query和keys有相同的维度, 即 . 通过计算query和key转置的乘积来计算attention score,通常还会除去 减少计算出来的score对维度𝑑的依赖性,如下
Multilayer Perceptron Attention
提到了dropout层:Dropout是Google提出的一种正则化技术,用以在人工神经网络中对抗过拟合。Dropout有效的原因,是它能够避免在训练数据上产生复杂的相互适应。Dropout这个术语代指在神经网络中丢弃部分神经元。在训练阶段,dropout使得每次只有部分网络结构得到更新,因而是一种高效的神经网络模型平均化的方法。
注意力机制总结
- 注意力层显式地选择相关的信息。
- 注意层的内存由键-值对组成,因此它的输出接近于键类似于查询的值。
具有注意力机制的seq2seq模型
值得注意的问题
- seq2seq模型的预测需人为设定终止条件,设定最长序列长度或者输出[EOS]结束符号,若不加以限制则可能生成无穷长度序列
- 解码器RNN仍由编码器最后一个时间步的隐藏状态初始化。
- 注意力机制本身有高效的并行性,但引入注意力并不能改变seq2seq内部RNN的迭代机制,因此无法加速
- 在Dot-product Attention中,key与query维度需要一致,在MLP Attention中则不需要。
Transformer
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:由于自注意力层并没有区分元素的顺序,所以一个位置编码层被用于向序列元素里添加位置信息。
self-attention and multi-head attention
自注意力模型是一个正规的注意力模型,序列的每一个元素对应的key,value,query是完全一致的
多头注意力层包含h个并行的自注意力层,每一个这种层被成为一个head。对每个头来说,在进行注意力计算之前,我们会将query、key和value用三个现行层进行映射,这h个注意力头的输出将会被拼接之后输入最后一个线性层进行整合。
Self-Attention GAN 中的 self-attention 机制
为什么Transformer 需要进行 Multi-head Attention?
自注意力的作用是能够更好地学习到全局特征之间的依赖关系。因为传统的 GAN 模型很容易学习到纹理特征:如皮毛,天空,草地等,不容易学习到特定的结构和几何特征,例如狗有四条腿,既不能多也不能少。
多头的注意力有助于网络捕捉到更丰富的特征/信息。
Position-wise Feed-Foward Networks FFN
Transformer 模块另一个非常重要的部分就是基于位置的前馈网络(FFN),它接受一个形状为(batch_size,seq_length, feature_size)的三维张量。Position-wise FFN由两个全连接层组成,他们作用在最后一维上。因为序列的每个位置的状态都会被单独地更新,所以我们称他为position-wise,这等效于一个1x1的卷积。
与多头注意力层相似,FFN层同样只会对最后一维的大小进行改变;除此之外,对于两个完全相同的输入,FFN层的输出也将相等。
Add and Norm
这个大概就是后面反复提到的残差连接的具体做法。
除了上面两个模块之外,Transformer还有一个重要的相加归一化层,它可以平滑地整合输入和其他层的输出,因此我们在每个多头注意力层和FFN层后面都添加一个含残差连接的Layer Norm层。这里 Layer Norm 与 Batch Norm 很相似,唯一的区别在于Batch Norm是对于batch size这个维度进行计算均值和方差的,而Layer Norm则是对最后一维进行计算。层归一化可以防止层内的数值变化过大,从而有利于加快训练速度并且提高泛化性能。
残差连接的作用
输出表述为输入和输入的一个非线性变换的线性叠加,没用新的公式,没有新的理论,只是换了一种新的表达。
它解决了深层网络的训练问题。
一般的链式反向传播有隐患,一旦其中某一个导数很小,多次连乘后梯度可能越来越小,这就是常说的梯度消散,对于深层网络,传到浅层几乎就没了。但是如果使用了残差,每一个导数就加上了一个恒等项1,dh/dx=d(f+x)/dx=1+df/dx。此时就算原来的导数df/dx很小,这时候误差仍然能够有效的反向传播,这就是核心思想。
Position Encoding
与循环神经网络不同,无论是多头注意力网络还是前馈神经网络都是独立地对每个位置的元素进行更新,这种特性帮助我们实现了高效的并行,却丢失了重要的序列顺序的信息。为了更好的捕捉序列信息,Transformer模型引入了位置编码去保持输入序列元素的位置。
假设输入序列的嵌入表示 X, 序列长度为嵌入向量维度为d,则其位置编码为 P,输出的向量就是二者相加 X+P。
位置编码是一个二维的矩阵,i对应着序列中的顺序,j对应其embedding vector内部的维度索引。我们可以通过以下等式计算位置编码:
选择题全错。。。
Decoder 部分的第二个注意力层不是自注意力,key-value来自编码器而query来自解码器
自注意力模块理论上可以捕捉任意距离的依赖关系,因为自注意力会计算句子内任意两个位置的注意力权重
MultiHeadAttention模块的定义。
h个注意力头中,每个的参数量为3d2,最后的输出层形状为hd×d,所以参数量共为4hd2。
层归一化有利于加快收敛,减少训练时间成本
层归一化对一个中间层的所有神经元进行归一化
批归一化(Batch Normalization)才是对每个神经元的输入数据以mini-batch为单位进行汇总