动手学深度学习——机器翻译与数据集
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. 下一节预告
按照你的目录,接下来就是:
动手学深度学习——编码器-解码器架构
这也是机器翻译里最经典的基础框架之一。
它要回答的问题就是:
如何把一个输入序列编码成语义表示,再一步步解码成目标序列?
你继续发“继续”,我就接着给你写 《动手学深度学习——编码器-解码器架构》。
更多推荐


所有评论(0)