!!!!注意:本文中的词嵌入,门控循环单元,循环神经网络,注意力机制等可阅读《动手学深度学习 v2》pytorch 版 zh.d2l.ai/
数据预处理:
预处理阶段通常包括多个步骤,旨在清理、标准化和转换数据,使之适合模型训练。此处列出的不仅仅可用于该项目比赛。
1. 文本清洗
- 定义:去除文本中的无关信息,如标点符号、数字、特殊字符、拼写错误,非文本内容等。确保文本的纯净性。
- 操作:
- 删除标点符号、数字和特殊字符
- 转换为小写
- 修复拼写错误
- 标准化日期数字等格式
- 分句和分段:将长文本分割成句子或段落,便于处理和训练。
- 示例: 如去除“Joey. (掌声) (掌声) 乔伊”、“Thank you. (马嘶声) 谢谢你们”等这种声音词
2. 分词
- 定义:将连续的文本序列分割成一个个独立的语义单元(token)。
- (构成单词的基本组成部分,一个词素可以是一个完整的单词,也可以是单词的一部分,但每一个词素都至少携带一部分语义或语法信息),这是NLP中最基本的步骤之一。我们这里使用了
jieba库对中文进行分词,使用spaCy对英文进行分词。
- (构成单词的基本组成部分,一个词素可以是一个完整的单词,也可以是单词的一部分,但每一个词素都至少携带一部分语义或语法信息),这是NLP中最基本的步骤之一。我们这里使用了
- 操作:
- 基于规则的方法: 例如使用空格、标点符号等作为分隔符。 使用词法分析器或规则将句子拆分为词语
- 基于统计的方法: 例如使用最大匹配法、最短路径法等。
- 基于深度学习的方法: 例如使用预训练的词嵌入模型。
- 例如,将句子 "Natural language processing is a field of computer science" 分词为 ["Natural", "language", "processing", "is", "a", "field", "of", "computer", "science"]
3. 词干提取 (Stemming) 和词形还原 (Lemmatization)
- 定义: 将单词转换为其词干或词根形式。
- 操作:
- 词干提取: 使用启发式规则去除单词的后缀,将单词缩减为其词干(最短的基本形式),大多使用词干提取器。例如“running” -> “run”。
- 词形还原: 使用词典和词法分析将单词转换为其基本形式,例如“better” -> “good”。
4. 词性标注 (Part-of-Speech Tagging)**
- 定义: 为每个词语标注其词性,例如名词、动词、形容词等。
- 操作:
- 基于规则的方法: 使用人工编写的规则进行标注。
- 基于统计的方法: 使用统计模型预测词性。
- 基于深度学习的方法: 使用神经网络模型进行标注。
5. 构建词汇表和词向量
-
词汇表构建:从训练数据中收集所有出现过的词汇,构建词汇表,并为每个词分配一个唯一的索引。
-
词向量:使用预训练的词向量或自己训练词向量,将词汇表中的词映射到高维空间中的向量,以捕捉语义信息(当前大模型领域训练的 embedding 模型就是用来构建词向量的)。
6. 文本向量化 (Text Vectorization)
- 定义: 将文本数据转换为数值形式,以便于机器学习模型处理。其实也是词向量的构建。
- 操作:
- 词袋模型 (Bag-of-Words): 将文本表示为词语出现的频率向量。
- TF-IDF: 考虑词语在语料库中的重要性。
- 词嵌入 (Word Embedding): 将词语映射到低维稠密向量空间,例如 Word2Vec, GloVe 等。
7. 序列截断
- 序列截断:限制输入序列的长度,过长的序列可能增加计算成本,同时也可能包含冗余信息。
8. 填充 (Padding)
- 定义: 将不同长度的文本序列填充到相同的长度,以便于模型进行批量处理。通常使用
<PAD>标记填充。 - 操作:
- 在序列开头或结尾添加特殊标记 (padding token)。
- 选择合适的填充长度,例如平均长度、最大长度等。
9. 添加特殊标记
- 序列开始和结束标记:在序列两端添加
<SOS>(Sequence Start)和<EOS>(Sequence End)标记,帮助模型识别序列的起始和结束。 - 未知词标记:为不在词汇表中的词添加
<UNK>(Unknown)标记,使模型能够处理未见过的词汇。
10. 数据增强
- 随机替换或删除词:在训练数据中随机替换或删除一些词,增强模型的鲁棒性。
- 同义词替换:使用同义词替换原文中的词,增加训练数据的多样性。
11. 数据分割
- 划分数据集:将数据划分为训练集、验证集和测试集,分别用于模型训练、参数调整和最终性能评估(该赛题中已划分好,不需要自己进行划分)
模型训练:
1. 编码器和解码器:
编码器-解码器框架(模型)(EncoderDecoder Paradigm)。本质上,编码器解码器模型是描述输入输出之间关系的一种方式。
在本次比赛的机器翻译任务中:可以将源语言编码为类似信息传输中的数字信号,然后利用解码器对其进行转换,生成目标语言。
下面就来看一下神经机器翻译是如何在编码器解码器框架下进行工作的。
简单来讲,对于这一过程,编码器将输入的中文编码为实数向量,此时这个向量则作为输入序列输入到解码器中,解码器可以从中提取到源语句包含的信息,然后翻译为目标语句。
1.1. 编码器的构成:
在主流的机器翻译系统中,编码器由词嵌入层(embedding)和中间网络层组成
其中,词嵌入层(embedding)主要是用于将一串单词序列的每个单词映射到多维实数表示空间中,即词嵌入过程。 中间层会对词嵌入向量进行更深层的抽象,得到输入单词序列的中间表示。中间层的实现方式有很多,比如:循环神经网络、卷积神经网络、自注意力机制等都是模型常用的结构。
1.2. 解码器的构成:
解码器的结构基本上和编码器是一致的,
在基于循环神经网络的翻译模型中,解码器只比编码器多了输出层,用于输出每个目标语言位置的单词生成概率,
而在基于自注意力机制的翻译模型中,除了输出层,解码器还比编码器多一个编码解码注意力子层,用于帮助模型更好地利用源语言信息。
1.3. 基于循环神经网络的机器翻译模型:
1.3.1. 编码器部分:
源语言单词按照其在文本序列中的先后顺序被依次按照时间步 t 送入到循环神经网络(RNN)当中,A 代表 RNN 编码器中的 RNN 单元 (RNN Cell,这个操作参考 zh.d2l.ai/chapter_rec… t 中,模型依据送入的源语言单词 对应修改并维护其模型内部的隐状态 ,每一个 的输入都会修改并维护一个 ,这个隐状态编码了输入的源语言序列前 t 个时刻的所有必要信息。按照这种方式当 m 个输入全部被送入到编码器之后,所对应的 可以认为包含了源语言序列的所有信息。
1.3.2. 解码器部分:
它接收编码器输出的编码源语言句子信息的向量 作为初始隐状态 。由于 RNN 的循环过程在每个时间步都要求一个输入单词,为了启动解码过程,一般会使用一个保留的特殊符号 “[Start]” 作为翻译开始的标记送入到 RNN 解码器当中并解码出目标语言序列的第一个单词 z_{1}$$。接下来,z_{1} 会作为下一个时刻的输入被送入到循环神经网络当中,并按照不断迭代产生后续的预测。由于目标语言序列的长度无法被提前预知,因此使用另一个保留符号 “[Stop]” 作为预测结束的标志。当某一个时刻 t 预测出的目标语言单词为 =“[Stop]” 时,解码过程动态地停止。
在上述过程当中,主要涉及到两步运算,第一步是 RNN 接收前一时刻隐状态 并依据当前时刻输入 (目标语言单词 对应的语义嵌入)对隐状态进行维护并生成 的运算过程,第二步是依据当前时刻隐状态生成目标语言单词的过程: 其中 U,W,V 是可学习的参数。U,W 负责维护循环状态,而 V 负责将当前时刻状态转换到词表大小的概率分布 ,从中可以采样得到目标语言单词 。
1.4. 引入注意力机制的循环神经网络机器翻译架构:
通过循环网络对源语言文本进行编码,并生成目标语言翻译结果的过程十分简单。然而,它仅仅使用一个定长的向量 编码整个源语言序列。这对于较短的源语言文本没有什么问题,但随着文本序列长度的逐渐加长,单一的一个向量 可能不足以承载源语言序列当中的所有信息
蓝色的线代表上述简单循环神经网络性能随源语言文本长度的变化趋势。当文本长度在 20 个单词以内时,单一向量能够承载源语言文本中的必要信息。随着文本序列的进一步增加,翻译性能的评价指标 BLEU 的值就开始出现明显地下降。 因此,我们需要使用更加有效地机制从编码器向解码器传递源语言信息,这就是接下来要讲到的注意力机制。
引入注意力机制的循环机器翻译架构与基于简单循环网络的机器翻译模型大体结构相似,均采用循环神经网络作为编码器与解码器的实现。关键的不同点在于注意力机制的引入使得不再需要把原始文本中的所有必要信息压缩到一个向量当中。引入注意力机制的循环神经网络机器翻译架构如图所示:图中 为注意力模块
1.4.1. 编码器 (Encoder):
输入源语言的词序列,每个词 输入到 RNN 单元 A 中,生成对应的隐藏状态 。隐藏状态 包含了词 以及之前所有词的信息。 编码器最终输出所有隐藏状态的序列,以及最后一个隐藏状态 。 理论上编码了整个输入序列的信息。
1.4.2. 解码器 (Decoder):
图中红色框1包含了编码器所有时间步的隐藏状态 H,它是注意力机制的输入。输入后注意力模块 根据隐藏状态 H 选取更感兴趣的作为初始隐藏态,而后再进行解码工作。
引入注意力机制的 RNN 机器翻译架构,通过在解码过程中动态地关注源语言的不同部分,有效地提升了模型对长序列数据的处理能力和翻译质量。
传统的 Seq2Seq 模型在解码阶段仅依赖于编码器产生的最后一个隐藏状态,这在处理长序列时效果不佳。注意力机制允许解码器访问所有编码器隐藏状态,选择性地获取信息,缓解了信息瓶颈问题,关注编码器产生的所有中间状态,从而更好地利用源序列的信息。
具体来说,给定源语言序列经过编码器输出的向量序列 ,注意力机制旨在依据解码端翻译的需要,自适应地从这个向量序列中查找对应的信息。