Datawhale AI 夏令营——从零入门NLP
任务2:从baseline代码详解入门深度学习
1. 环境配置
- 运行环境:使用魔搭平台进行模型训练。
- 需要安装的包:
torchtext
:用于自然语言处理任务,提供数据预处理、词汇构建、序列化和批处理等功能。jieba
:中文分词库。sacrebleu
:用于评估机器翻译质量,计算BLEU得分。spacy
:自然语言处理库,支持多语言分词与训练。
2. 安装spacy语言包
- 使用命令
!python -m spacy download en_core_web_trf
安装英文语言包,但可能安装失败。 - 建议离线安装,下载对应版本的
en_core_web_trf
语言包。 - 安装命令示例:
!pip install -U pip setuptools wheel -i https://pypi.tuna.tsinghua.edu.cn/simple pip install -U 'spacy[cuda12x,transformers,lookups]' -i https://pypi.tuna.tsinghua.edu.cn/simple !pip install ../dataset/en_core_web_trf-3.7.3-py3-none-any.whl
3. 数据预处理
- 清洗和规范化数据:去除无关信息,统一格式,分句和分段。
- 分词:使用jieba对中文进行分词,使用spaCy对英文进行分词。
- 构建词汇表和词向量:从训练数据中构建词汇表,使用预训练或自训练词向量。
- 序列截断和填充:限制序列长度,填充至相同长度。
- 添加特殊标记:添加序列开始和结束标记,未知词标记。
- 数据增强:随机替换或删除词,同义词替换。
- 数据分割:划分训练集、验证集和测试集。
4. 模型训练
- 编码器-解码器模型:用于描述输入输出关系,适用于机器翻译。
- 编码器:由词嵌入层和中间网络层组成,中间层可使用循环神经网络、卷积神经网络、自注意力机制等。
- 解码器:基于编码器输出生成目标语言序列,使用RNN或自注意力机制。
- RNN解码器:使用编码器输出的向量作为初始隐状态,逐词生成目标语言。
5. 注意力机制
- 传统Seq2Seq模型:解码阶段仅依赖编码器的最后一个隐藏状态,不适合长序列。
- 注意力机制:允许解码器在生成每个输出词时,关注编码器产生的所有中间状态。
6. 翻译质量评价
- BLEU:Bilingual Evaluation Understudy,用于自动评估机器翻译质量。
- 评价方法:
- 人工评价:最准确但成本高。
- 有参考答案的自动评价:使用标注的正确译文与系统输出比对。
- 无参考答案的自动评价:估计译文质量,用于快速反馈。
7. 任务要求
- 画出基于注意力机制的GRU神经网络机器翻译:参考基于注意力机制的循环神经网络机器翻译和GRU相关知识。
绘制一个基于注意力机制的 GRU 神经网络机器翻译模型的示意图。该图将展示模型的编码器和解码器结构,以及注意力机制在其中的作用。以下是详细的步骤和示意图:
- 示意图:
以下是使用Mermaid绘制的基于注意力机制的GRU神经网络机器翻译架构示意图:
在这个图中:
- 编码器部分从输入序列开始,经过词嵌入层和多个GRU单元,最终生成隐状态 ( h_1, h_2, \ldots, h_n )。
- 解码器部分从初始隐藏状态 ( s_0 ) 开始,接收当前时间步的输入 ( y_t ),经过词嵌入层和GRU单元更新隐状态 ( s_t ),然后通过注意力机制计算注意力权重和上下文向量 ( c_t ),最终生成输出 ( y_t )。
详细解释
编码器
-
输入序列:
- 输入序列是一个源语言句子,包含若干单词:
x_1, x_2, x_3, ..., x_n
。
- 输入序列是一个源语言句子,包含若干单词:
-
词嵌入层(Emb):
- 输入序列中的每个单词通过词嵌入层转换为向量表示:
Emb(x_1), Emb(x_2), Emb(x_3), ..., Emb(x_n)
。
- 输入序列中的每个单词通过词嵌入层转换为向量表示:
-
GRU层:
- 每个嵌入向量依次输入到GRU单元中,生成隐藏状态:
h_1, h_2, h_3, ..., h_n
。 - 这些隐藏状态捕捉了输入序列的信息。
- 每个嵌入向量依次输入到GRU单元中,生成隐藏状态:
解码器
-
初始隐藏状态:
- 解码器的初始隐藏状态
s_0
通常是编码器最后一个隐藏状态h_n
。
- 解码器的初始隐藏状态
-
当前时间步输入:
- 在解码的每个时间步,解码器输入当前的目标语言单词
y_t
。
- 在解码的每个时间步,解码器输入当前的目标语言单词
-
词嵌入层(Emb):
- 输入的目标语言单词通过词嵌入层转换为向量表示:
Emb(y_t)
。
- 输入的目标语言单词通过词嵌入层转换为向量表示:
-
GRU层:
- 嵌入向量输入到GRU单元中,生成当前时间步的隐藏状态
s_t
。
- 嵌入向量输入到GRU单元中,生成当前时间步的隐藏状态
-
注意力机制:
- 注意力机制根据当前隐藏状态
s_t
计算源语言序列中每个隐藏状态的注意力权重:α_1, α_2, ..., α_n
。 - 这些权重表示解码器在当前时间步需要关注源语言序列的哪些部分。
- 注意力机制根据当前隐藏状态
-
上下文向量(c_t):
- 使用注意力权重和编码器的隐藏状态计算上下文向量
c_t
,总结源语言序列的相关信息。
- 使用注意力权重和编码器的隐藏状态计算上下文向量
-
生成输出:
- 解码器使用当前隐藏状态
s_t
和上下文向量c_t
生成输出单词y_t
。
- 解码器使用当前隐藏状态
总结
- 编码器:将源语言序列编码为一系列隐藏状态。
- 解码器:在每个时间步使用目标语言单词及其嵌入表示,通过GRU和注意力机制生成译文单词。
- 注意力机制:在解码过程中动态地选择源语言序列中的相关部分,从而克服传统Seq2Seq模型在处理长序列时的局限性。
通过引入注意力机制,解码器不再依赖于编码器的最后一个隐藏状态,而是可以在整个源语言序列中自适应地选择需要的信息,从而提高翻译效果。