文章目录
文档如下
链接: 入门以及各部分task文档
文档讲得很详细了,写这篇主要是摘要和写一点自己的思考
入门: 小白零基础 30 分钟速通指南
跟着步骤把baseline跑完就行,不出意外分数应该比较低,翻译效果也很差
Task1:了解机器翻译 & 理解赛题
一、机器翻译的发展历程
基于规则的机器翻译–>基于统计的机器翻译–>基于神经网络机器翻译
二、数据划分
训练集、开发集(也常被称为验证集)和测试集
三、赛题解析
(1)赛事背景
要求通过术语词典进行纠正提高翻译质量。
(2)赛事任务
英文为源语言,中文为目标语言,基于提供的训练数据样本从多语言机器翻译模型的构建与训练,提供最终的翻译结果
(3)赛题数据
-训练集:双语数据 - 中英14万余双语句对
-开发集:英中1000双语句对
-测试集:英中1000双语句对
-术语词典:英中2226条
(4)评估指标
采用BLEU-4 进行评价,BLEU-4 特别指的是在计算时考虑四元组(即连续四个词)的匹配情况。
四、baseline 提升与思考
给了一份调整了参数的baseline
原来:N = 1000,N_EPOCHS = 10
改为了:N = 2000,N_EPOCHS = 50
(N:选择数据集的前N个样本进行训练。
N_EPOCHS:一次epoch是指将所有数据训练一遍的次数。)
分数也从0.1475提升到了0.8339
task1总结:简单易上手,调整了参数的baseline卡好了N和N_EPOCHS,继续加大分数会快速下降,过拟合的问题
Task2:从baseline代码详解入门深度学习
基于 Seq2Seq 的 Baseline 详解
提供了本节使用代码
1.配置环境
按照步骤来就行,上传en_core_web_sm 会有亿点点慢
2. 数据预处理
讲了常见的几个处理步骤
- 清洗和规范化数据
- 分词
- 构建词汇表和词向量
- 添加特殊标记
- 数据增强
- 数据分割
3. 模型训练
(1)编码器-解码器模型
编码其实就是把单词映射到向量空间中,用向量表示单词
编码器由词嵌入层和中间网络层组成:
- 当输入一串单词序列时,词嵌入层(embedding)会将每个单词映射到多维实数表示空间
- 之后中间层会对词嵌入向量进行更深层的抽象,得到输入单词序列的中间表示。中间层的实现方式有很多,比如:循环神经网络、卷积神经网络、自注意力机制等都是模型常用的结构。
(2)基于循环神经网络的机器翻译模型为例讲解整体结构
这部分说得挺繁琐的,其实很简单
①单一的循环神经网络
编码器部分:其实就是把源语言单词按顺序送入到循环神经网络(RNN),模型对应修改并维护其模型内部的隐状态 ,最后当 m 个输入全部被送入到编码器之后,对应的 hm可以认为包含了源语言序列的所有信息
RNN 解码器部分:它接收编码器输出的编码源语言句子信息的向量 hm作为初始隐状态 s0,并使用一个保留的特殊符号作为开始标志解码出目标语言序列的第一个单词 z1,z1 会作为下一个时刻的输入被送入到循环神经网络当中,并按照不断迭代产生后续的预测,最后根据结束的标志结束.
③baseline 代码中实现了一个经典的序列到序列(Seq2Seq)模型,中间层使用的GRU网络,并且网络中加入了注意力机制(Attention Mechanism),请你参考上述基于注意力机制的循环神经网络机器翻译,以及GRU的相关知识,画出基于注意力机制的 GRU 神经网络机器翻译!
还没看,后续补充
缺点:使用一个定长的向量 hm编码整个源语言序列,文本序列长度加长效果肯定变差
②引入注意力机制的循环神经网络
其实就是编码器部分的时候把源语言序列经过编码器输出的向量序列 h1,h2…hm都存起来,而非像之前一样只保留hm,让解码端根据需要,自适应地从这个向量序列中查找信息。
4. 翻译质量评价
不重要,没啥说的,就是一张图
task2总结:seq中采用的rnn需要多次递归,会比较耗时,最后平台总是显示显存不够,没跑出分数,看别人跑出来分数也不高.理论上来transformer的性能本身就是优于seq的,所以个人觉得重点可以放在task3
Task3:基于Transformer解决机器翻译任务
1.Transformer 介绍
(1)对比RNN:
①对于卷积神经网络来说,受限于长文本。如果要对长距离依赖进行描述,需要多层卷积操作,而且不同层之间信息传递也可能有损失,这些都限制了模型的能力。
②对于循环神经网络来说,随着序列长度的增加,编码在隐藏状态中的序列早期的上下文信息被逐渐遗忘。尽管注意力机制的引入在一定程度上缓解了这个问题,但循环网络在编码效率方面仍存在很大的不足之处。
(2)引入Transformer
Transformer通过注意力机制完成对源语言序列和目标语言序列全局依赖的建模。在抽取每个单词的上下文特征时,Transformer 通过自注意力机制(self-attention)衡量上下文中每一个单词对当前单词的重要程度。
(3)基本架构
Transformer的主要组件包括编码器(Encoder)、解码器(Decoder)和注意力层。其核心是利用多头自注意力机制(Multi-Head Self-Attention),使每个位置的表示不仅依赖于当前位置,还能够直接获取其他位置的表示。
从宏观角度来看,Transformer的编码器是由多个相同的层叠加而成的,每个层都有两个子层(子层表示为sublayer)。第⼀个子层是多头自注意力(multi-head self-attention)汇聚;第二个子层是基于位置的前馈网络(positionwise feed-forward network)。主要涉及到如下几个模块:
①. 嵌入表示层
由于 Transfomer 模型不再使用基于循环的方式建模文本输入,无先后顺序,词嵌入中加入位置编码(Positional Encoding)这一特征,其实就是加了位置向量
位置编码的维度和词嵌入向量的维度相同( 均为 d_model),模型通过将二者相加作为模型输入
②.注意力层
把给定由单词语义嵌入及其位置编码叠加得到的作为输入,引入在自注意力机制中涉及到的三个元素:查询 qi(Query),键 ki(Key),值 vi(Value),先对位置 i 查询向量与其他位置的键向量做点积得到匹配分数,得分会除放缩因子sqrt(d)以稳定优化。放缩后的得分经过 Softmax 归一化为概率之后,与其他位置的值向量相乘来聚合希望关注的上下文信息
③.前馈层
接受自注意力子层的输出作为输入,并通过一个带有 Relu 激活函数的两层全连接网络对输入进行更加复杂的非线性变换,以往的训练发现,增大前馈子层隐状态的维度有利于提升最终翻译结果的质量,因此,前馈子层隐状态的维度一般比自注意力子层要大
④.残差连接与层归一化
残差连接与层归一化技术以进一步提升训练的稳定性,
残差连接主要是指使用一条直连通道直接将对应子层的输入连接到输出上去,从而避免由于网络过深在优化过程中潜在的梯度消失问题
层归一化技术被进一步引入每个 Transformer 块的当中,用于将数据平移缩放到均值为 0,方差为 1 的标准分布,层归一化技术可以有效地缓解优化过程中潜在的不稳定、收敛速度慢等问题
⑤.编码器和解码器结构
解码器端比编码器要更复杂一些,原因如下:
编码器仅需要考虑如何融合上下文语义信息即可。而解码端则负责生成目标语言序列,这一生成过程是自回归的,即对于每一个单词的生成过程,仅有当前单词之前的目标语言序列是可以被观测的,因此这一额外增加的掩码是用来掩盖后续的文本信息,以防模型在训练阶段直接看到后续的文本序列进而无法得到有效地训练。
解码器端还额外增加了一个多头注意力(Multi-Head Attention)模块,使用交叉注意力(Cross-attention)方法,同时接收来自编码器端的输出以及当前 Transformer 块的前一个掩码注意力层的输出。它的作用是在翻译的过程当中,为了生成合理的目标语言序列需要观测待翻译的源语言序列是什么。
基于上述的编码器和解码器结构,待翻译的源语言文本,先经过编码器端的每个Transformer 块对其上下文语义的层层抽象,然后输出每一个源语言单词上下文相关的表示。最后解码器端以自回归的方式生成目标语言文本.
2.基于 task2 的 baseline 修改代码
理论看着还好,代码实现只能说看不懂,只能后面对照着研究了
3.其他上分技巧
- 最简单的就是调参,将 epochs 调大一点,使用全部训练集。如果数据量允许,增加模型的深度等等
- 加入术语词典:
- 在模型生成的翻译输出中替换术语,这是最简单的方法
- 整合到数据预处理流程,确保它们在翻译中保持一致
- 在模型内部动态地调整术语的嵌入,这涉及到在模型中加入一个额外的层,该层负责查找术语词典中的术语,并为其生成专门的嵌入向量,然后将这些向量与常规的词嵌入结合使用
- 认真做数据清洗
- 数据扩增:
- 回译(back-translation):将源语言文本先翻译成目标语言,再将目标语言文本翻译回源语言,生成的新文本作为额外的训练数据
- 同义词替换:随机选择句子中的词,并用其同义词替换
- 使用句法分析和语义解析技术重新表述句子,保持原意不变
- 将文本翻译成多种语言后再翻译回原语言,以获得多样化翻译
- 采用更精细的学习率调度策略(baseline我们使用的是固定学习率):
- Noam Scheduler:结合了warmup(预热)阶段和衰减阶段
- Step Decay:最简单的一种学习率衰减策略,每隔一定数量的epoch,学习率按固定比例衰减
- Cosine Annealing:学习率随周期性变化,通常从初始值下降到接近零,然后再逐渐上升
- 自己训练一个小的预训练模型,尽量选择 1B 以下小模型
- 将训练集上训练出来的模型拿到开发集(dev dataset)上 finetune(微调) 可以提高测试集(test dataset)的得分,因为开发集与测试集的分布比较相近
- 在开发集和测试集上训一个语言模型,用这个语言模型给训练集中的句子打分,选出一些高分句子
- 集成学习:训练多个不同初始化或架构的模型,并使用集成方法(如投票或平均)来产生最终翻译。减少单一模型的过拟合风险
建议学习者先尝试第一种方法,提升有限之后可以考虑第二种和第三种方法,理想情况下会得到比较大的提高