1. 前言

前面我们已经把循环神经网络这条线基本走完了:

  • RNN

  • GRU

  • LSTM

  • 深层循环神经网络

  • 双向循环神经网络

到这里,一个很自然的问题就来了:

这些序列模型到底能拿来做什么更完整、更经典的任务?

答案就是:

机器翻译(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 .    ->  j'ai perdu .

这里左边是英文,右边是法语。

所以机器翻译数据集和前面语言模型数据集最大的区别在于:

语言模型数据

通常是一条长文本序列,主要做下一个 token 预测。

机器翻译数据

通常是成对平行句子,主要做输入序列到输出序列的映射。


5. 什么是平行语料(Parallel Corpus)

机器翻译训练最核心的数据叫:

平行语料(Parallel Corpus)

所谓平行语料,就是:

同一个意思,用两种语言分别表达,并一一对齐形成句对。

例如:

  • i am cold .j'ai 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

在机器翻译中,常常会在目标句子里加入一些特殊符号,例如:

  • <bos>:beginning of sequence,句子开始

  • <eos>:end of sequence,句子结束

  • <pad>:padding,补齐占位

  • <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 length)


14. 为什么机器翻译常常要限制最大长度

在教学或基础实现中,常常会设置一个最大时间步长度,例如:

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 很重要

包括:

  • <bos>

  • <eos>

  • <pad>

  • <unk>

18.5 为了 batch 训练,通常需要统一句子长度

因此会用到截断、padding 和有效长度管理。


19. 学习感悟

这一节特别重要,因为它让你意识到:

机器翻译真正难的地方,不只是模型结构,而是它从一开始就在处理“两套语言系统之间的映射”。

这和前面的语言模型很不一样。
语言模型更像在同一种语言里找规律,
而机器翻译则是在做:

跨语言的序列对齐与重表达

所以从数据层面开始,机器翻译就已经明显更复杂了。

也正因为如此,后面的编码器-解码器架构才会显得那么自然——
因为输入序列和输出序列本来就不再是同一个东西。


20. 下一节预告

按照你的目录,接下来就是:

动手学深度学习——编码器-解码器架构

这也是机器翻译里最经典的基础框架之一。
它要回答的问题就是:

如何把一个输入序列编码成语义表示,再一步步解码成目标序列?

你继续发“继续”,我就接着给你写 《动手学深度学习——编码器-解码器架构》

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐