一、Transformer简介:
1. 背景:基于循环或卷积神经网络的序列到序列建模方法在建模文本长程依赖方面都存在一定的局限性。
- 对于卷积神经网络:受限的上下文窗口在建模长文本方面天然地存在不足。
- 对于循环神经网络:随着序列长度的增加,编码在隐藏状态中的序列早期的上下文信息被逐渐遗忘。
Transformer:完全通过注意力机制完成对源语言序列和目标语言序列全局依赖的建模。在抽取每个单词的上下文特征时,Transformer 通过自注意力机制(self-attention)衡量上下文中每一个单词对当前单词的重要程度。
2. 主要组件:编码器(Encoder)、解码器(Decoder)和注意力层。其核心是利用多头自注意力机制(Multi-Head Self-Attention),使每个位置的表示不仅依赖于当前位置,还能够直接获取其他位置的表示。其基本架构如下:
3. 具体层分析:
(1)嵌入表示层:
对于输入文本序列,通过一个输入嵌入层(Input Embedding)将每个单词转换为其相对应的向量表示,并在在词嵌入中加入位置编码(Positional Encoding)。Transformer 模型使用不同频率的正余弦函数如下所示:
其中,pos 表示单词所在的位置,2i和 2i+1 表示位置编码向量中的对应维度,d则对应位置编码的总维度。
优点:
- 导出的位置编码与原词嵌入相加不会使得结果偏离过远而破坏原有单词的语义信息。
- 第pos+k个位置的编码是第pos个位置的编码的线性组合,这就意味着位置编码中蕴含着单词之间的距离信息。
(2)注意力层:
涉及到三个元素:查询 (Query) ,键 (Key) ,值 (Value)。这些权重反映了在编码当前单词的表示时,对于上下文不同部分所需要的关注程度。通过除以放缩后的得分经过 Softmax 归一化为概率之后,与其他位置的值向量相乘来聚合希望关注的上下文信息,并最小化不相关信息的干扰。
(3)前馈层:
接受自注意力子层的输出作为输入,并通过一个带有 Relu 激活函数的两层全连接网络对输入进行更加复杂的非线性变换。前馈子层隐状态的维度一般比自注意力子层要大。
(4)残差连接与层归一化:
指使用一条直连通道直接将对应子层的输入连接到输出上去,从而避免由于网络过深在优化过程中潜在的梯度消失问题。
层归一化技术用于将数据平移缩放到均值为 0,方差为 1 的标准分布,可以有效地缓解优化过程中潜在的不稳定、收敛速度慢等问题。
(5)编码器和解码器结构:
解码器的每个 Transformer 块的第一个自注意力子层额外增加了注意力掩码。这一额外增加的掩码是用来掩盖后续的文本信息,以防模型在训练阶段直接看到后续的文本序列进而无法得到有效地训练。
此外,解码器端还额外增加了一个多头注意力(Multi-Head Attention)模块,在翻译的过程当中,为了生成合理的目标语言序列需要观测待翻译的源语言序列是什么。
4. 简要流程:
待翻译的源语言文本,先经过编码器端的每个Transformer 块对其上下文语义的层层抽象,然后输出每一个源语言单词上下文相关的表示。
解码器端以自回归的方式生成目标语言文本,即在每个时间步 t ,根据编码器端输出的源语言文本表示,以及前 t-1 个时刻生成的目标语言文本,生成当前时刻的目标语言单词。
二、代码实现:已在魔搭社区中实现,此处略。
三、其他改进方式:
1. 调参:
- 将 epochs 调大一点,使用全部训练集。
- 增加模型的深度(更多的编码器/解码器层)或宽度(更大的隐藏层尺寸)。
2. 加入术语词典:
- 在模型生成的翻译输出中替换术语。
- 整合到数据预处理流程。
- 在模型内部动态地调整术语的嵌入。
3. 认真做数据清洗。
4 .数据扩增:
-
回译(back-translation):将源语言文本先翻译成目标语言,再将目标语言文本翻译回源语言,生成的新文本作为额外的训练数据
-
同义词替换:随机选择句子中的词,并用其同义词替换
-
使用句法分析和语义解析技术重新表述句子,保持原意不变
-
将文本翻译成多种语言后再翻译回原语言,以获得多样化翻译
5. 采用更精细的学习率调度策略:
-
Noam Scheduler:结合了warmup(预热)阶段和衰减阶段
-
Step Decay:最简单的一种学习率衰减策略,每隔一定数量的epoch,学习率按固定比例衰减
-
Cosine Annealing:学习率随周期性变化,通常从初始值下降到接近零,然后再逐渐上升
6. 集成学习:训练多个不同初始化或架构的模型,并使用集成方法(如投票或平均)来产生最终翻译。