动手学深度学习——机器翻译与数据集

张开发
2026/4/14 12:16:34 15 分钟阅读

分享文章

动手学深度学习——机器翻译与数据集
1. 前言前面我们已经把循环神经网络这条线基本走完了RNNGRULSTM深层循环神经网络双向循环神经网络到这里一个很自然的问题就来了这些序列模型到底能拿来做什么更完整、更经典的任务答案就是机器翻译Machine Translation机器翻译是序列建模中最经典的任务之一。它的目标非常直观把一种语言的句子自动翻译成另一种语言的句子。例如英文 → 中文中文 → 英文法语 → 英语而在真正训练机器翻译模型之前第一步必须先解决数据从哪里来数据长什么样怎么预处理所以这一节的重点其实有两个什么是机器翻译任务机器翻译数据集如何组织与处理2. 什么是机器翻译机器翻译可以简单理解为把一个源语言序列映射成一个目标语言序列。例如源句子i love deep learning目标句子我 喜欢 深度 学习你会发现它和前面的语言模型不一样。语言模型做的是根据前文预测下一个 token机器翻译做的是根据一整句源语言生成另一种语言的一整句目标语言所以机器翻译不是单纯的“续写”而是一个典型的序列到序列sequence to sequence任务3. 机器翻译为什么比语言模型更难语言模型通常是在同一种语言内部建模。例如根据前面的中文词预测后面的中文词根据前面的英文字符预测下一个英文字符而机器翻译难得多因为它需要同时处理两种语言之间的关系3.1 两边词表不同英文和中文不是同一个 token 空间。3.2 句子长度不一定相同英文一句 5 个词翻译成中文可能是 6 个词也可能 4 个词。3.3 语序可能不同不同语言在表达顺序上常常不一致。3.4 不只是词对词替换翻译更多时候是语义映射不是简单逐词替换。所以机器翻译本质上要求模型学会跨语言的序列映射能力4. 机器翻译任务的输入和输出是什么机器翻译任务通常由成对句子组成。也就是说数据集里每个样本一般不是一条句子而是源语言句子 目标语言句子例如go . - va ! hi . - salut ! run ! - cours ! i lost . - jai perdu .这里左边是英文右边是法语。所以机器翻译数据集和前面语言模型数据集最大的区别在于语言模型数据通常是一条长文本序列主要做下一个 token 预测。机器翻译数据通常是成对平行句子主要做输入序列到输出序列的映射。5. 什么是平行语料Parallel Corpus机器翻译训练最核心的数据叫平行语料Parallel Corpus所谓平行语料就是同一个意思用两种语言分别表达并一一对齐形成句对。例如i am cold .↔jai froid .he is my friend .↔il est mon ami .这类“源句子-目标句子”配对就是机器翻译最基本的监督数据。所以你可以理解成机器翻译就是在学习“句对映射规则”。6. 李沐这里为什么要先讲数据集因为机器翻译模型和前面字符级语言模型不一样它的数据复杂很多。至少要先解决下面这些问题6.1 句子怎么切分源语言和目标语言都要分词。6.2 词表怎么建两边要分别建词表不是共用一个词表。6.3 长度怎么统一神经网络训练时通常需要把一个 batch 中的样本整理成规则张量。6.4 句子结束标记怎么加模型要知道一句话什么时候结束。所以在机器翻译中数据处理本身就是建模的一半准备工作。7. 机器翻译数据集长什么样李沐这里常见的机器翻译教学数据会是一个文本文件每一行包含源语言句子制表符\t目标语言句子例如go .\tva ! hi .\tsalut ! run !\tcours !这里\t左边是源句子\t右边是目标句子所以读取机器翻译数据时最基础的一步就是按行读取再按制表符分成源句子和目标句子8. 为什么要做文本预处理和前面的文本预处理一样机器翻译数据也需要先清洗。常见处理包括全部转小写统一空格处理标点和特殊字符去掉不规范格式例如英文里Go.和go .Hi!和hi !如果不统一处理后面分词和建词表会很混乱。所以机器翻译数据的预处理本质上和前面一样也是为了把自然语言整理成稳定、可建模的 token 序列9. 为什么机器翻译要分别处理源语言和目标语言这是和语言模型非常不同的一点。在机器翻译中输入句子来自源语言输出句子来自目标语言它们通常不是同一套词。所以我们通常要分别得到源语言 token 序列例如英文分词结果。目标语言 token 序列例如法语分词结果。然后分别建立源语言词表目标语言词表因为模型的输入空间和输出空间本来就是两套系统。10. 机器翻译为什么要加特殊 token在机器翻译中常常会在目标句子里加入一些特殊符号例如bosbeginning of sequence句子开始eosend of sequence句子结束padpadding补齐占位unk未知词这些特殊 token 非常重要。bos告诉解码器现在开始生成句子了。eos告诉模型句子到这里结束。pad用于把不同长度句子补到同样长度。unk用于处理词表外 token。这说明机器翻译的数据不只是“分词就完了”还要为后面的序列生成过程服务。11. 为什么要有eos这个符号在机器翻译里特别重要。因为翻译输出句子长度并不是固定的。模型必须学会什么时候该停下来例如输入一句很短的话输出也许很短输入一句长句输出也许更长如果没有eos模型就不知道何时结束生成。所以eos本质上是目标序列的停止信号12. 为什么要做 padding神经网络训练通常是按 batch 做的。但机器翻译中的句子长度天然不一致有的句子只有 3 个词有的句子有 10 个词有的句子更长而 batch 张量通常要求同一维长度一致。所以就需要把短句子补齐。例如i am fine eos pad pad he is a student eos这样两句就能放进同一个 batch 里。所以 padding 的本质是让不同长度序列可以组成规则张量13. padding 会不会影响训练会所以通常不能把pad当成正常 token 一样处理。因为pad只是补位置不是真实语言内容。所以在训练时常常要在 loss 计算中忽略 padding 部分或通过有效长度 mask 屏蔽 padding 位置这也是为什么机器翻译数据处理中常常还会同时保存每条句子的有效长度valid length14. 为什么机器翻译常常要限制最大长度在教学或基础实现中常常会设置一个最大时间步长度例如num_steps 10这意味着太长的句子可能被截断太短的句子会被 pad 到 10这样做的原因主要有两个第一便于 batch 训练所有样本统一长度更容易组成张量。第二降低训练成本特别长的句子会让训练更慢也更不稳定。所以在入门实现中用固定长度裁剪/补齐是很常见的做法。15. 机器翻译数据预处理的大致流程是什么如果把整节内容串起来机器翻译数据预处理大致就是下面这条线第一步读取原始句对数据按行读取每行切成源句子和目标句子。第二步文本清洗统一大小写、标点空格等格式。第三步分词把源句和目标句分别切成 token 序列。第四步构建词表分别为源语言和目标语言建立词表。第五步加特殊 token特别是目标序列中的eos等。第六步转成索引序列把 token 变成数字。第七步统一长度截断或 padding 到固定num_steps。第八步生成 batch形成适合模型训练的输入张量。这就是机器翻译数据进入神经网络之前的完整准备链条。16. 和前面的语言模型数据相比有什么根本不同这个对比很重要。语言模型输入和输出来自同一种语言输出通常就是输入右移一位数据可以看成一条连续长序列机器翻译输入和输出来自两种不同语言输出不是简单右移输入数据单位是“句对”不是单条长文本流所以机器翻译不能直接套前面的“右移一个 token”思路它本质上是一个序列映射到另一个序列这就是后面为什么要引出编码器-解码器架构。17. 李沐这一节最想让你理解什么这一节最核心的不是让你死记某个数据集名字而是让你先建立下面几个认识第一机器翻译是典型的序列到序列任务不是简单语言模型。第二训练数据是平行语料句对数据单位是源句-目标句配对。第三源语言和目标语言要分别建词表不能混成一套。第四padding、bos、eos都是必须考虑的因为模型要真正学会“开始、生成、结束”。第五这一节是在为后面的编码器-解码器做准备数据准备好之后下一步才轮到模型架构。18. 本节总结这一节我们学习了机器翻译与数据集核心内容可以总结为以下几点。18.1 机器翻译是一个序列到序列任务输入是一种语言的句子输出是另一种语言的句子。18.2 机器翻译训练依赖平行语料也就是成对对齐的源句子和目标句子。18.3 源语言和目标语言通常要分别处理和建词表因为它们属于不同 token 空间。18.4 机器翻译中常见特殊 token 很重要包括boseospadunk18.5 为了 batch 训练通常需要统一句子长度因此会用到截断、padding 和有效长度管理。19. 学习感悟这一节特别重要因为它让你意识到机器翻译真正难的地方不只是模型结构而是它从一开始就在处理“两套语言系统之间的映射”。这和前面的语言模型很不一样。语言模型更像在同一种语言里找规律而机器翻译则是在做跨语言的序列对齐与重表达所以从数据层面开始机器翻译就已经明显更复杂了。也正因为如此后面的编码器-解码器架构才会显得那么自然——因为输入序列和输出序列本来就不再是同一个东西。20. 下一节预告按照你的目录接下来就是动手学深度学习——编码器-解码器架构这也是机器翻译里最经典的基础框架之一。它要回答的问题就是如何把一个输入序列编码成语义表示再一步步解码成目标序列你继续发“继续”我就接着给你写《动手学深度学习——编码器-解码器架构》。

更多文章