Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
M
mtbookv2
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
NiuTrans
mtbookv2
Commits
550f7d6d
Commit
550f7d6d
authored
Dec 19, 2020
by
单韦乔
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
13章文字
parent
66b4b545
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
77 行增加
和
44 行删除
+77
-44
Chapter13/chapter13.tex
+44
-44
bibliography.bib
+33
-0
没有找到文件。
Chapter13/chapter13.tex
查看文件 @
550f7d6d
...
...
@@ -46,7 +46,7 @@
\sectionnewpage
\section
{
开放词表
}
\parinterval
人类表达语言的方式是十分多样的,这也体现在单词的构成上,甚至我们都无法想象数据中存在的不同单词的数量。
比如,如果使用简单的分词策略,WMT、CCMT等评测数据的英文词表大小都会在100万以上。当然,这里面也包括很多的数字和字母的混合,还有一些组合词。不过,如果不加限制,机器翻译所面对的词表确实很``大''
。这也会导致系统速度变慢,模型变大。更严重的问题是,测试数据中的一些单词根本就没有在训练数据中出现过,这时会出现OOV翻译问题,即系统无法对未见单词进行翻译。在神经机器翻译中,通常会考虑使用更小的翻译单元来缓解以上问题。
\parinterval
人类表达语言的方式是十分多样的,这也体现在单词的构成上,甚至我们都无法想象数据中存在的不同单词的数量。
即便使用分词策略,在WMT、CCMT等评测数据上,英文词表大小都会在100万以上。当然,这里面也包括很多的数字和字母的混合,还有一些组合词。不过,如果不加限制,机器翻译所面对的词表将会很“大”
。这也会导致系统速度变慢,模型变大。更严重的问题是,测试数据中的一些单词根本就没有在训练数据中出现过,这时会出现OOV翻译问题,即系统无法对未见单词进行翻译。在神经机器翻译中,通常会考虑使用更小的翻译单元来缓解以上问题。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
@@ -54,18 +54,18 @@
\subsection
{
大词表和OOV问题
}
\parinterval
首先来具体看一看神经机器翻译的大词表问题。神经机器翻译模型训练和解码都依赖于源语言和目标语言的词表。在建模中,词表中的每一个单词都会被转换为分布式(向量)表示,即词嵌入。这些向量会作为模型的输入(见
第六章)。如果每个单词都对应一个向量,那么单词的各种变形(时态、语态等)都会导致词表和相应的向量数量的增加。图
\ref
{
fig:7-7
}
展示了一些英语单词的时态语态变化。
\parinterval
首先来具体看一看神经机器翻译的大词表问题。神经机器翻译模型训练和解码都依赖于源语言和目标语言的词表。在建模中,词表中的每一个单词都会被转换为分布式(向量)表示,即词嵌入。这些向量会作为模型的输入(见
{
\chapterten
}
)。如果每个单词都对应一个向量,那么单词的各种变形(时态、语态等)都会导致词表和相应的向量数量的增加。图
\ref
{
fig:13-1
}
展示了一些英语单词的时态语态变化。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter13/Figures/figure-word-change
}
\caption
{
单词时态、语态、单复数的变化
}
\label
{
fig:
7-7
}
\label
{
fig:
13-1
}
\end{figure}
%----------------------------------------------
\parinterval
如果要覆盖更多的翻译现象,词表会不断膨胀,并带来两个问题:
\parinterval
如果要覆盖更多的翻译现象,词表会不断膨胀,并带来
下述
两个问题:
\begin{itemize}
\vspace
{
0.5em
}
...
...
@@ -75,7 +75,7 @@
\vspace
{
0.5em
}
\end{itemize}
\parinterval
理想情况下,机器翻译应该是一个
{
\small\bfnew
{
开放词表
}}
\index
{
开放词表
}
(Open-Vocabulary)
\index
{
Open-Vocabulary
}
的翻译任务。也就是,
不论测试数据中包含什么样的词,机器翻译系统都应该能够正常翻译。但是,现实的情况是,即使不断扩充词表,也不可能覆盖所有可能的单词。这时就会出现OOV问题(集外词问题)
。这个问题在使用受限词表时会更加严重,因为低频词和未见过的词都会被看作OOV单词。这时会将这些单词用<UNK>代替。通常,数据中<UNK>的数量会直接影响翻译性能,过多的<UNK>会造成欠翻译、结构混乱等问题。因此神经机器翻译需要额外的机制解决大词表和OOV问题。
\parinterval
理想情况下,机器翻译应该是一个
{
\small\bfnew
{
开放词表
}}
\index
{
开放词表
}
(Open-Vocabulary)
\index
{
Open-Vocabulary
}
的翻译任务。也就是,
无论测试数据中包含什么样的词,机器翻译系统都应该能够正常翻译。但是,现实的情况是即使不断扩充词表,也不可能覆盖所有可能的单词,即OOV问题,或被称作集外词问题
。这个问题在使用受限词表时会更加严重,因为低频词和未见过的词都会被看作OOV单词。这时会将这些单词用<UNK>代替。通常,数据中<UNK>的数量会直接影响翻译性能,过多的<UNK>会造成欠翻译、结构混乱等问题。因此神经机器翻译需要额外的机制解决大词表和OOV问题。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
@@ -83,20 +83,20 @@
\subsection
{
子词
}
\parinterval
一种解决开放词表翻译问题的方法是改造输出层结构
\upcite
{
garcia-martinez2016factored,DBLP:conf/acl/JeanCMB15
}
,比如,替换原始的Softmax层,用更加高效的神经网络结构进行超大规模词表上的预测。不过
这类方法往往需要对系统进行修改,由于模型结构和训练方法的调整使得系统开发与调试的工作量增加。但是这类方法仍然无法解决OOV问题。
因此在实用系统中并不常用。
\parinterval
一种解决开放词表翻译问题的方法是改造输出层结构
\upcite
{
garcia-martinez2016factored,DBLP:conf/acl/JeanCMB15
}
,比如,替换原始的Softmax层,用更加高效的神经网络结构进行超大规模词表上的预测。不过
,由于模型结构和训练方法的调整使得系统开发与调试的工作量增加,因此使用这类方法时往往需要对系统进行修改,并且这类方法仍然无法解决OOV问题,
因此在实用系统中并不常用。
\parinterval
另一种思路是不改变机器翻译系统,而是从数据处理的角度来缓解OOV问题。既然使用单词会带来数据稀疏问题,那么自然会想到使用更小的单元。比如,把字符作为最小的翻译单元
\footnote
{
中文
中
字符可以被看作是汉字。
}
\ \dash
\
也就是基于字符的翻译模型
\upcite
{
DBLP:journals/tacl/LeeCH17
}
。以英文为例,只需要构造一个包含26个英文字母、数字和一些特殊符号的字符表,便可以表示所有的单词。
\parinterval
另一种思路是不改变机器翻译系统,而是从数据处理的角度来缓解OOV问题。既然使用单词会带来数据稀疏问题,那么自然会想到使用更小的单元。比如,把字符作为最小的翻译单元
\footnote
{
中文
里的
字符可以被看作是汉字。
}
\ \dash
\
也就是基于字符的翻译模型
\upcite
{
DBLP:journals/tacl/LeeCH17
}
。以英文为例,只需要构造一个包含26个英文字母、数字和一些特殊符号的字符表,便可以表示所有的单词。
\parinterval
但是字符级翻译也面临着新的问题
\ \dash\
使用字符增加了系统捕捉不同语言单元之间搭配的难度。假设平均一个单词由5个字符组成,
所处理的序列长度便增大5倍。这使得具有独立意义的不同语言单元需要跨越更远的距离才能产生联系。此外,基于字符的方法也破坏了单词中天然存在的构词规律,或者说破坏了单词内字符的局部依赖。比如,英文单词``telephone''中的``tele''和``phone''
都是有具体意义的词缀,但是如果把它们打散为字符就失去了这些含义。
\parinterval
但是字符级翻译也面临着新的问题
\ \dash\
使用字符增加了系统捕捉不同语言单元之间搭配的难度。假设平均一个单词由5个字符组成,
系统所处理的序列长度便增大5倍。这使得具有独立意义的不同语言单元需要跨越更远的距离才能产生联系。此外,基于字符的方法也破坏了单词中天然存在的构词规律,或者说破坏了单词内字符的局部依赖。比如,英文单词“telephone”中的“tele”和“phone”
都是有具体意义的词缀,但是如果把它们打散为字符就失去了这些含义。
\parinterval
那么有没有一种方式能够兼顾基于单词和基于字符方法的优点呢?常用的手段包括两种,一种是采用字词融合的方式构建词表,将未知单词转换为字符的序列并通过特殊的标记将其与普通的单词区分开来
\upcite
{
luong2016acl
_
hybrid
}
。而另一种方式是将单词切分为
{
\small\bfnew
{
子词
}}
\index
{
子词
}
(Sub-word)
\index
{
Sub-word
}
,它是介于单词和字符中间的一种语言单元表示形式。比如,将英文单词
``doing''切分为``do''+``ing''。对于形态学丰富的语言来说,子词体现了一种具有独立意义的构词基本单元。比如,如图
\ref
{
fig:7-8
}
,子词``do'',和``new''
在可以用于组成其他不同形态的单词。
\parinterval
那么有没有一种方式能够兼顾基于单词和基于字符方法的优点呢?常用的手段包括两种,一种是采用字词融合的方式构建词表,将未知单词转换为字符的序列并通过特殊的标记将其与普通的单词区分开来
\upcite
{
luong2016acl
_
hybrid
}
。而另一种方式是将单词切分为
{
\small\bfnew
{
子词
}}
\index
{
子词
}
(Sub-word)
\index
{
Sub-word
}
,它是介于单词和字符中间的一种语言单元表示形式。比如,将英文单词
“doing”切分为“do”+“ing”。对于形态学丰富的语言来说,子词体现了一种具有独立意义的构词基本单元。比如,如图
\ref
{
fig:13-2
}
,子词“do”,和“new”
在可以用于组成其他不同形态的单词。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter13/Figures/figure-word-root
}
\caption
{
不同单词共享相同的子词(前缀)
}
\label
{
fig:
7-8
}
\label
{
fig:
13-2
}
\end{figure}
%----------------------------------------------
...
...
@@ -120,7 +120,7 @@
\subsection
{
双字节编码(BPE)
}
\parinterval
{
\small\bfnew
{
字节对编码
}}
\index
{
字节对编码
}
或
{
\small\bfnew
{
双字节编码
}}
\index
{
双字节编码
}
(Byte Pair Encoding
,BPE)
\index
{
Byte Pair Encoding,BPE
}
是一种常用的子词词表构建方法
\upcite
{
DBLP:conf/acl/SennrichHB16a
}
。BPE方法最早用于数据压缩,该方法将数据中常见的连续字符串替换为一个不存在的字符,之后通过构建一个替换关系的对应表,对压缩后的数据进行还原。机器翻译借用了这种思想,把子词切分看作是学习对自然语言句子进行压缩编码表示的问题
\upcite
{
Gage1994ANA
}
。其目的是,保证编码后的结果(即子词切分)占用的字节尽可能少。这样,子词单元会尽可能被不同单词复用,同时又不会因为使用过小的单元造成子词切分序列过长。使用BPE算法构建符号合并表可以分为如下几个步骤:
\parinterval
{
\small\bfnew
{
字节对编码
}}
\index
{
字节对编码
}
或
{
\small\bfnew
{
双字节编码
}}
\index
{
双字节编码
}
(Byte Pair Encoding
\index
{
Byte Pair Encoding
}
,BPE)
是一种常用的子词词表构建方法
\upcite
{
DBLP:conf/acl/SennrichHB16a
}
。BPE方法最早用于数据压缩,该方法将数据中常见的连续字符串替换为一个不存在的字符,之后通过构建一个替换关系的对应表,对压缩后的数据进行还原。机器翻译借用了这种思想,把子词切分看作是学习对自然语言句子进行压缩编码表示的问题
\upcite
{
Gage1994ANA
}
。其目的是,保证编码后的结果(即子词切分)占用的字节尽可能少。这样,子词单元会尽可能被不同单词复用,同时又不会因为使用过小的单元造成子词切分序列过长。使用BPE算法构建符号合并表可以分为如下几个步骤:
\begin{itemize}
\vspace
{
0.5em
}
...
...
@@ -128,7 +128,7 @@
\vspace
{
0.5em
}
\item
将分词后的每个单词进行进一步切分,划分为字符序列。同时,在每个单词结尾添加结束符<e>用于标记单词的边界。之后,统计该单词在数据中出现的次数。例如单词low在数据中出现了5次,可以将其记为`l o w <e>:'5。
\vspace
{
0.5em
}
\item
对得到的字符集合进行统计,统计每个单词中2-gram符号出现的频次
\footnote
{
发生合并前,一个字符便是一个符号
}
。之后,选择最高频的2-gram符号,将其合并为新的符号,即新的子词。例如
``A''和``B''连续出现的频次最高,则以``AB''替换所有单词内连续出现的``A''和``B''并将其加入子词词表。这样,``AB''
会被作为一个整体,在之后的过程中可以与其他符号进一步合并。需要注意的是替换和合并不会跨越单词的边界,即只对单个单词进行替换和合并。
\item
对得到的字符集合进行统计,统计每个单词中2-gram符号出现的频次
\footnote
{
发生合并前,一个字符便是一个符号
}
。之后,选择最高频的2-gram符号,将其合并为新的符号,即新的子词。例如
“A”和“B”连续出现的频次最高,则以“AB”替换所有单词内连续出现的“A”和“B”并将其加入子词词表。这样,“AB”
会被作为一个整体,在之后的过程中可以与其他符号进一步合并。需要注意的是替换和合并不会跨越单词的边界,即只对单个单词进行替换和合并。
\vspace
{
0.5em
}
\item
不断重复上一步骤,直到子词词表大小达到预定的大小或者下一个最高频的2-gram字符的频次为1。子词词表大小是BPE的唯一的参数,它用来控制上述子词合并的规模。
\vspace
{
0.5em
}
...
...
@@ -160,7 +160,7 @@
\parinterval
使用BPE方法的策略有很多。不仅可以单独对源语言和目标语言进行子词的切分,也可以联合源语言和目标语言,共同进行子词切分,被称作Joint-BPE
\upcite
{
DBLP:conf/acl/SennrichHB16a
}
。单语BPE比较简单直接,而Joint-BPE则可以增加两种语言子词切分的一致性。对于相似语系中的语言,如英语和德语,常使用Joint-BPE的方法联合构建词表。而对于中英这些差异比较大的语种,则需要独立的进行子词切分。使用子词表示句子的方法可以有效的平衡词汇量,增大对未见单词的覆盖度。像英译德、汉译英任务,使用16k或者32k的子词词表大小便能取得很好的效果。
\parinterval
BPE还有很多变种方法。在进行子词切分时,BPE从最长的子词开始进行切分。这个启发性规则可以保证切分结果的唯一性,实际上,在对一个单词用同一个子词词表切分时,可能存在多种切分方式,如hello,我们可以分割为
``hell''和``o'',也可以分割为``h''和``ello''。这种切分的多样性可以来提高神经机器翻译系统的健壮性
\upcite
{
DBLP:conf/acl/Kudo18
}
。而在T5等预训练模型中
\upcite
{
DBLP:journals/jmlr/RaffelSRLNMZLL20
}
则使用了基于字符级别的BPE。此外,尽管BPE被命名为字节对编码,实际上一般处理的是Unicode编码,而不是字节。在预训练模型GPT2中,也探索了字节级别的BPE,在机器翻译、问答等任务中取得了很好的效果
\upcite
{
radford2019language
}
。
\parinterval
BPE还有很多变种方法。在进行子词切分时,BPE从最长的子词开始进行切分。这个启发性规则可以保证切分结果的唯一性,实际上,在对一个单词用同一个子词词表切分时,可能存在多种切分方式,如hello,我们可以分割为
“hell”和“o”,也可以分割为“h”和“ello”。这种切分的多样性可以用来提高神经机器翻译系统的健壮性
\upcite
{
DBLP:conf/acl/Kudo18
}
。
{
\red
而在T5等预训练模型中
\upcite
{
DBLP:journals/jmlr/RaffelSRLNMZLL20
}
,则使用了基于字符级别的BPE。此外,尽管BPE被命名为字节对编码,实际上一般处理的是Unicode编码,而不是字节。在预训练模型GPT2中,也探索了字节级别的BPE,在机器翻译、问答等任务中取得了很好的效果
\upcite
{
radford2019language
}
}
。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
@@ -168,19 +168,19 @@
\subsection
{
其他方法
}
\parinterval
与基于统计的BPE算法不同,基于Word Piece的子词切分方法则是利用语言模型进行子词词表的构造
{
\red
(Word piece 论文找一下)
}
。本质上,基于语言模型的方法和基于BPE的方法的思路是一样的,即通过合并字符和子词不断生成新的子词。它们的区别仅在于合并子词的方式不同。基于BPE的方法选择出现频次最高的连续字符2-gram合并为新的子词
,而基于语言模型的方法则是根据语言模型输出的概率选择要合并哪些子词。具体来说,基于Word Piece的方法首先将句子切割为字符表示的形式
\upcite
{
DBLP:conf/icassp/SchusterN12
}
,并利用该数据训练一个1-gram语言模型,记为
$
\textrm
{
log
}
\funp
{
P
}
(
\cdot
)
$
。假设两个相邻的子词单元
$
a
$
和
$
b
$
被合并为新的子词
$
c
$
,则整个句子的语言模型得分的变化为
$
\triangle
=
\textrm
{
log
}
\funp
{
P
}
(
c
)-
\textrm
{
log
}
\funp
{
P
}
(
a
)-
\textrm
{
log
}
\funp
{
P
}
(
b
)
$
。这样,可以不断的选择使
$
\triangle
$
最大的两个子词单元进行合并,直到达到预设的词表大小或者句子概率的增量低于某个阈值。
\parinterval
与基于统计的BPE算法不同,基于Word Piece的子词切分方法则是利用语言模型进行子词词表的构造
\upcite
{
DBLP:conf/icassp/SchusterN12
}
。本质上,基于语言模型的方法和基于BPE的方法的思路是一样的,即通过合并字符和子词不断生成新的子词。它们的区别仅在于合并子词的方式不同。
{
\red
基于BPE的方法选择出现频次最高的连续字符2-gram合并为新的子词
}
,而基于语言模型的方法则是根据语言模型输出的概率选择要合并哪些子词。具体来说,基于Word Piece的方法首先将句子切割为字符表示的形式
\upcite
{
DBLP:conf/icassp/SchusterN12
}
,并利用该数据训练一个1-gram语言模型,记为
$
\textrm
{
log
}
\funp
{
P
}
(
\cdot
)
$
。假设两个相邻的子词单元
$
a
$
和
$
b
$
被合并为新的子词
$
c
$
,则整个句子的语言模型得分的变化为
$
\triangle
=
\textrm
{
log
}
\funp
{
P
}
(
c
)-
\textrm
{
log
}
\funp
{
P
}
(
a
)-
\textrm
{
log
}
\funp
{
P
}
(
b
)
$
。这样,可以不断的选择使
$
\triangle
$
最大的两个子词单元进行合并,直到达到预设的词表大小或者句子概率的增量低于某个阈值。
\parinterval
目前比较主流的子词切分方法都是作用于分词后的序列,对一些没有明显词边界且资源稀缺的语种并不友好。相比之下,SentencePiece可以作用于未经过分词处理的输入序列
{
\red
(SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing)
}
,同时囊括了双字节编码和语言模型的子词切分方法,更加灵活易用。
\parinterval
目前比较主流的子词切分方法都是作用于分词后的序列,对一些没有明显词边界且资源稀缺的语种并不友好。相比之下,SentencePiece可以作用于未经过分词处理的输入序列
\upcite
{
kudo2018sentencepiece
}
,同时囊括了双字节编码和语言模型的子词切分方法,更加灵活易用。
\parinterval
通过上述子词切分方法,可以缓解OOV的问题,允许模型利用到一些词法上的信息。然而主流的BPE子词切分方法中,每个单词都对应
唯一的子词切分方式,因此输入的数据经过子词切分后的序列表示也是唯一的。在给定词表的情况下,每句话仍然存在多种切分方式。而经过现有BPE处理后的序列,模型只能接收到单一的表示,可能会阻止模型更好地学习词的组成,不能充分利用单词中的形态学特征。此外,针对切分错误的输入数据表现不够鲁棒,常常会导致整句话的翻译效果极差。为此,研究人员提出一些正则化方法
{
\red
(Subword regularization: Improving neural network translation models with multiple subword candidates;BPE-Dropout: Simple and Effective Subword Regularization)
}
。
\parinterval
通过上述子词切分方法,可以缓解OOV的问题,允许模型利用到一些词法上的信息。然而主流的BPE子词切分方法中,每个单词都对应
一种唯一的子词切分方式,因此输入的数据经过子词切分后的序列表示也是唯一的。在给定词表的情况下,每句话仍然存在多种切分方式。而经过现有BPE处理后的序列,模型只能接收到单一的表示,可能会阻止模型更好地学习词的组成,不能充分利用单词中的形态学特征。此外,针对切分错误的输入数据表现不够鲁棒,常常会导致整句话的翻译效果极差。为此,研究人员提出一些正则化方法
\upcite
{
DBLP:conf/acl/Kudo18,provilkov2020bpe
}
。
\begin{itemize}
\vspace
{
0.5em
}
\item
子词正则化方法
\upcite
{
DBLP:conf/acl/Kudo18
}
。其思想是在训练过程中扰乱确定的子词边界,根据1-gram Language Model
{
\red
(ULM)
}
采样出多种子词切分候选。通过最大化整个句子的概率为目标构建词表
,具体实现上
与上述基于Word Piece的方法略有不同,这里不做详细介绍。
\item
子词正则化方法
\upcite
{
DBLP:conf/acl/Kudo18
}
。其思想是在训练过程中扰乱确定的子词边界,根据1-gram Language Model
{
\red
(ULM)
}
采样出多种子词切分候选。通过最大化整个句子的概率为目标构建词表
。在实现上,
与上述基于Word Piece的方法略有不同,这里不做详细介绍。
\vspace
{
0.5em
}
\item
BPE-Dropout
{
\red
(BPE-Dropout:Simple and Effective Subword Regularization)
}
。在训练时,通过在合并过程中按照一定概率
$
p
${
\red
(这个p能不能改成P)
}
(介于0与1之间)随机丢弃一些可行的合并操作,从而产生不同的子词切分结果,进而增强模型健壮性。而在推断阶段,将p设置为0,等同于标准的BPE。总的来说,上述方法相当于在子词的粒度上对输入的序列进行扰动,进而达到鲁棒性训练的目的。在之后的小节中同样会针对鲁棒性训练进行详细介绍。
\item
BPE-Dropout
\upcite
{
provilkov2020bpe
}
。在训练时,通过在合并过程中按照一定概率
$
p
${
\red
(这个p能不能改成P)
}
(介于0与1之间)随机丢弃一些可行的合并操作,从而产生不同的子词切分结果,进而增强模型健壮性。而在推断阶段,将p设置为0,等同于标准的BPE。总的来说,上述方法相当于在子词的粒度上对输入的序列进行扰动,进而达到鲁棒性训练的目的。在之后的小节中同样会针对鲁棒性训练进行详细介绍。
\vspace
{
0.5em
}
\item
DPE
{
\red
(Dynamic Programming Encoding for Subword Segmentation in Neural Machine Translation )
}
。引入了混合字符-子词的切分方式,将句子的子词分割方式看作一种潜变量,该结构能够利用
{
\small\bfnew
{
动态规划
}}
\index
{
动态规划
}
(Dynamic Programming)
\index
{
Dynamic Programming
}
思想精确地将潜在的子字片段边缘化。解码端的输入是基于字符表示的目标语序列,推断时将每个时间步的输出映射到预先设定好的子词词表之上,得到当前最可能得子词结果。若当前子词长度为
$
m
$
,则接下来的
$
m
$
个时间步的输入为该子词,并在
$
m
$
个时间步后得到下一个切分的子词。
\item
DPE
\upcite
{
he2020dynamic
}
。引入了混合字符-子词的切分方式,将句子的子词分割方式看作一种潜变量,该结构能够利用
{
\small\bfnew
{
动态规划
}}
\index
{
动态规划
}
(Dynamic Programming)
\index
{
Dynamic Programming
}
的
思想精确地将潜在的子字片段边缘化。解码端的输入是基于字符表示的目标语序列,推断时将每个时间步的输出映射到预先设定好的子词词表之上,得到当前最可能得子词结果。若当前子词长度为
$
m
$
,则接下来的
$
m
$
个时间步的输入为该子词,并在
$
m
$
个时间步后得到下一个切分的子词。
\vspace
{
0.5em
}
\end{itemize}
...
...
@@ -254,7 +254,7 @@ R(\mathbf{w}) & = & (\big| |\mathbf{w}| {\big|}_2)^2 \\
\parinterval
从几何的角度看,L1和L2正则项都是有物理意义的。二者都可以被看作是空间上的一个区域,比如,在二维平面上,L1范数表示一个以0点为中心的矩形,L2范数表示一个以0点为中心的圆。因此,优化问题可以被看作是在两个区域(
$
L
(
\mathbf
{
w
}
)
$
和
$
R
(
\mathbf
{
w
}
)
$
)叠加在一起所形成的区域上进行优化。由于L1和L2正则项都是在0点(坐标原点)附近形成的区域,因此优化的过程可以确保参数不会偏离0点太多。也就是说,L1和L2正则项引入了一个先验:模型的解不应该离0点太远。而L1和L2正则项实际上是在度量这个距离。
\parinterval
那为什么要用L1和L2正则项惩罚离0点远的解呢?这还要从模型复杂度谈起。实际上,对于神经机器翻译这样的模型来说,模型的容量是足够的。所谓容量可以被简单的理解为独立参数的个数
\footnote
{
关于模型容量,在
\ref
{
section-13.2
}
节会有进一步讨论。
}
。也就是说,理论上存在一种模型可以完美的描述问题。但是,从目标函数拟合的角度来看,如果一个模型可以拟合很复杂的目标函数,那模型所表示的函数形态也会很复杂。这往往体现在模型中参数的值
``偏大''。比如,用一个多项式函数拟合一些空间中的点,如果希望拟合得很好,各个项的系数往往是非零的。而且为了对每个点进行拟合,通常需要多项式中的某些项具有较大的系数,以获得函数在局部有较大的斜率。显然,这样的模型是很复杂的。而模型的复杂度可以用函数中的参数(比如多项式中各项的系数)的``值''
进行度量,体现出来就是模型参数的范数。
\parinterval
那为什么要用L1和L2正则项惩罚离0点远的解呢?这还要从模型复杂度谈起。实际上,对于神经机器翻译这样的模型来说,模型的容量是足够的。所谓容量可以被简单的理解为独立参数的个数
\footnote
{
关于模型容量,在
\ref
{
section-13.2
}
节会有进一步讨论。
}
。也就是说,理论上存在一种模型可以完美的描述问题。但是,从目标函数拟合的角度来看,如果一个模型可以拟合很复杂的目标函数,那模型所表示的函数形态也会很复杂。这往往体现在模型中参数的值
“偏大”。比如,用一个多项式函数拟合一些空间中的点,如果希望拟合得很好,各个项的系数往往是非零的。而且为了对每个点进行拟合,通常需要多项式中的某些项具有较大的系数,以获得函数在局部有较大的斜率。显然,这样的模型是很复杂的。而模型的复杂度可以用函数中的参数(比如多项式中各项的系数)的“值”
进行度量,体现出来就是模型参数的范数。
\parinterval
因此,L1和L2正则项的目的是防止模型为了匹配少数(噪声)样本而导致模型的参数过大。反过来说,L1和L2正则项会鼓励那些参数值在0点附近的情况。从实践的角度看,这种方法可以很好的对统计模型的训练进行校正,得到泛化能力更强的模型。
...
...
@@ -266,7 +266,7 @@ R(\mathbf{w}) & = & (\big| |\mathbf{w}| {\big|}_2)^2 \\
\parinterval
神经机器翻译在每个目标语位置
$
j
$
会输出一个分布
$
y
_
j
$
,这个分布描述了每个目标语言单词出现的可能性。在训练时,每个目标语言位置上的答案是一个单词,也就对应了One-hot分布
$
\tilde
{
y
}_
j
$
,它仅仅在正确答案那一维为1,其它维均为0。模型训练可以被看作是一个调整模型参数让
$
y
_
j
$
逼近
$
\tilde
{
y
}_
j
$
的过程。但是,
$
\tilde
{
y
}_
j
$
的每一个维度是一个非0即1的目标,这样也就无法考虑类别之间的相关性。具体来说,除非模型在答案那一维输出1,否则都会得到惩罚。即使模型把一部分概率分配给与答案相近的单词(比如同义词),这个相近的单词仍被视为完全错误的预测。
\parinterval
{
\small\bfnew
{
标签平滑
}}
\index
{
标签平滑
}
(Label Smoothing)
\index
{
Label Smoothing
}
的思想很简单
\upcite
{
Szegedy
_
2016
_
CVPR
}
:答案所对应的单词不应该
``独享''
所有的概率,其它单词应该有机会作为答案。这个观点与第二章中语言模型的平滑非常类似。在复杂模型的参数估计中,往往需要给未见或者低频事件分配一些概率,以保证模型具有更好的泛化能力。具体实现时,标签平滑使用了一个额外的分布
$
q
$
,它是在词汇表
$
V
$
上的一个均匀分布,即
$
q
(
k
)=
\frac
{
1
}{
|V|
}$
,其中
$
q
(
k
)
$
表示分布的第
$
k
$
维。然后,答案分布被重新定义为
$
\tilde
{
y
}_
j
$
和
$
q
$
的线性插值:
\parinterval
{
\small\bfnew
{
标签平滑
}}
\index
{
标签平滑
}
(Label Smoothing)
\index
{
Label Smoothing
}
的思想很简单
\upcite
{
Szegedy
_
2016
_
CVPR
}
:答案所对应的单词不应该
“独享”
所有的概率,其它单词应该有机会作为答案。这个观点与第二章中语言模型的平滑非常类似。在复杂模型的参数估计中,往往需要给未见或者低频事件分配一些概率,以保证模型具有更好的泛化能力。具体实现时,标签平滑使用了一个额外的分布
$
q
$
,它是在词汇表
$
V
$
上的一个均匀分布,即
$
q
(
k
)=
\frac
{
1
}{
|V|
}$
,其中
$
q
(
k
)
$
表示分布的第
$
k
$
维。然后,答案分布被重新定义为
$
\tilde
{
y
}_
j
$
和
$
q
$
的线性插值:
\begin{eqnarray}
y
_{
j
}^{
ls
}
&
=
&
(1-
\alpha
)
\cdot
\tilde
{
y
}_
j +
\alpha
\cdot
q
\label
{
eq:13-5
}
...
...
@@ -274,7 +274,7 @@ y_{j}^{ls} &=& (1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\noindent
这里
$
\alpha
$
表示一个系数,用于控制分布
$
q
$
的重要性。
$
y
_{
j
}^{
ls
}$
会被作为最终的答案分布用于模型的训练。
\parinterval
标签平滑实际上定义了一种
``软''
标签,使得所有标签都可以分到一些概率。一方面可以缓解数据中噪声的影响,另一方面目标分布会更合理(显然,真实的分布不应该是One-hot分布)。图
\ref
{
fig:13-12
}
展示了标签平滑前后的损失函数计算结果的对比。
\parinterval
标签平滑实际上定义了一种
“软”
标签,使得所有标签都可以分到一些概率。一方面可以缓解数据中噪声的影响,另一方面目标分布会更合理(显然,真实的分布不应该是One-hot分布)。图
\ref
{
fig:13-12
}
展示了标签平滑前后的损失函数计算结果的对比。
%----------------------------------------------
\begin{figure}
[htp]
...
...
@@ -293,9 +293,9 @@ y_{j}^{ls} &=& (1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\subsection
{
Dropout
}
\parinterval
神经机器翻译模型是一种典型的多层神经网络模型。每一层网络都包含若干神经元,负责接收前一层所有神经元的输出,并进行诸如乘法、加法等变换,并有选择的使用非线性的激活函数,最终得到当前层每个神经元的输出。从模型最终预测的角度看,每个神经元都在参与最终的预测。理想的情况下,我们希望每个神经元都能相互独立的做出
``贡献''。这样的模型会更加健壮,因为即使一部分神经元不能正常工作,其它神经元仍然可以独立做出合理的预测。但是,随着每一层神经元数量的增加以及网络结构的复杂化,研究者发现神经元之间会出现
{
\small\bfnew
{
相互适应
}}
\index
{
相互适应
}
(Co-Adaptation)
\index
{
Co-Adaptation
}
的现象。所谓相互适应是指,一个神经元对输出的贡献与同一层其它神经元的行为是相关的,也就是说这个神经元已经适应到它周围的``环境''
中。
\parinterval
神经机器翻译模型是一种典型的多层神经网络模型。每一层网络都包含若干神经元,负责接收前一层所有神经元的输出,并进行诸如乘法、加法等变换,并有选择的使用非线性的激活函数,最终得到当前层每个神经元的输出。从模型最终预测的角度看,每个神经元都在参与最终的预测。理想的情况下,我们希望每个神经元都能相互独立的做出
“贡献”。这样的模型会更加健壮,因为即使一部分神经元不能正常工作,其它神经元仍然可以独立做出合理的预测。但是,随着每一层神经元数量的增加以及网络结构的复杂化,研究者发现神经元之间会出现
{
\small\bfnew
{
相互适应
}}
\index
{
相互适应
}
(Co-Adaptation)
\index
{
Co-Adaptation
}
的现象。所谓相互适应是指,一个神经元对输出的贡献与同一层其它神经元的行为是相关的,也就是说这个神经元已经适应到它周围的“环境”
中。
\parinterval
相互适应的好处在于神经网络可以处理更加复杂的问题,因为联合使用两个神经元要比单独使用每个神经元的表示能力强。这也类似于传统机器学习任务中往往会设计一些高阶特征,比如自然语言序列标注中对bi-gram和tri-gram的使用。不过另一方面,相互适应会导致模型变得更加
``脆弱''
。因为相互适应的神经元可以更好的描述训练数据中的现象,但是在测试数据上,由于很多现象是未见的,细微的扰动会导致神经元无法适应。具体体现出来就是过拟合问题。
\parinterval
相互适应的好处在于神经网络可以处理更加复杂的问题,因为联合使用两个神经元要比单独使用每个神经元的表示能力强。这也类似于传统机器学习任务中往往会设计一些高阶特征,比如自然语言序列标注中对bi-gram和tri-gram的使用。不过另一方面,相互适应会导致模型变得更加
“脆弱”
。因为相互适应的神经元可以更好的描述训练数据中的现象,但是在测试数据上,由于很多现象是未见的,细微的扰动会导致神经元无法适应。具体体现出来就是过拟合问题。
\parinterval
Dropout是解决这个问题的一种常用方法
\upcite
{
DBLP:journals/corr/abs-1207-0580
}
。方法很简单,在训练时随机让一部分神经元停止工作,这样每次参数更新中每个神经元周围的环境都在变化,它就不会过分适应到环境中。图
\ref
{
fig:13-13
}
中给出了某一次参数训练中使用Dropout之前和之后的状态对比。
...
...
@@ -308,7 +308,7 @@ y_{j}^{ls} &=& (1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\end{figure}
%----------------------------------------------
\parinterval
具体实现时,可以设置一个参数
$
p
\in
(
0
,
1
)
$
。在每次参数更新所使用的前向和反向计算中,每个神经元都以概率
$
p
$
停止工作。相当于每层神经网络会有以
$
p
$
为比例的神经元被
``屏蔽''
掉。每一次参数更新中会随机屏蔽不同的神经元。图
\ref
{
fig:13-14
}
给出了Dropout方法和传统方法计算方式的对比。
\parinterval
具体实现时,可以设置一个参数
$
p
\in
(
0
,
1
)
$
。在每次参数更新所使用的前向和反向计算中,每个神经元都以概率
$
p
$
停止工作。相当于每层神经网络会有以
$
p
$
为比例的神经元被
“屏蔽”
掉。每一次参数更新中会随机屏蔽不同的神经元。图
\ref
{
fig:13-14
}
给出了Dropout方法和传统方法计算方式的对比。
%----------------------------------------------
\begin{figure}
[htp]
...
...
@@ -329,7 +329,7 @@ y_{j}^{ls} &=& (1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\subsection
{
Layer Dropout
}
\parinterval
随时网络层数的增多,相互适应也会出现在不同层之间。特别是在引入残差网络之后,不同层的输出可以进行线性组合,因此不同层之间的相互影响会更加直接。对于这个问题,也可以使用Dropout的思想对不同层进行屏蔽。比如,可以使用一个开关来控制一个层能否发挥作用,这个开关以概率
$
p
$
被随机关闭,即该层有为
$
p
$
的可能性不工作。图
\ref
{
fig:13-15
}
展示了Transformer多层网络引入Layer Dropout 前后的情况。可以看到,使用Layer Dropout后,开关M会被随机打开或者关闭,以达到屏蔽某一层计算的目的。由于使用了残差网络,关闭每一层相当于
``跳过''
这一层网络,因此Layer Dropout并不会影响神经网络中数据流的传递。
\parinterval
随时网络层数的增多,相互适应也会出现在不同层之间。特别是在引入残差网络之后,不同层的输出可以进行线性组合,因此不同层之间的相互影响会更加直接。对于这个问题,也可以使用Dropout的思想对不同层进行屏蔽。比如,可以使用一个开关来控制一个层能否发挥作用,这个开关以概率
$
p
$
被随机关闭,即该层有为
$
p
$
的可能性不工作。图
\ref
{
fig:13-15
}
展示了Transformer多层网络引入Layer Dropout 前后的情况。可以看到,使用Layer Dropout后,开关M会被随机打开或者关闭,以达到屏蔽某一层计算的目的。由于使用了残差网络,关闭每一层相当于
“跳过”
这一层网络,因此Layer Dropout并不会影响神经网络中数据流的传递。
%----------------------------------------------
\begin{figure}
[htp]
...
...
@@ -340,7 +340,7 @@ y_{j}^{ls} &=& (1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\end{figure}
%----------------------------------------------
\parinterval
Layer Dropout可以被理解为在一个深网络(即原始网络)中随机采样出一个由若干层网络构成的
``浅''网络。不同``浅''
网络所对应的同一层的模型参数是共享的。这也达到了对指数级子网络高效训练的目的。需要注意的是,在推断阶段,每层的输出需要乘以
$
1
-
p
$
,确保训练时每层输出的期望和解码是一致的。Layer Dropout可以非常有效的缓解深层网路中的过拟合问题。在
\ref
{
subsection-13.2
}
节还会看到Layer Dropout可以成功地帮助我们训练Deep Transformer模型。
\parinterval
Layer Dropout可以被理解为在一个深网络(即原始网络)中随机采样出一个由若干层网络构成的
“浅”网络。不同“浅”
网络所对应的同一层的模型参数是共享的。这也达到了对指数级子网络高效训练的目的。需要注意的是,在推断阶段,每层的输出需要乘以
$
1
-
p
$
,确保训练时每层输出的期望和解码是一致的。Layer Dropout可以非常有效的缓解深层网路中的过拟合问题。在
\ref
{
subsection-13.2
}
节还会看到Layer Dropout可以成功地帮助我们训练Deep Transformer模型。
%----------------------------------------------------------------------------------------
% NEW SECTION
...
...
@@ -349,11 +349,11 @@ y_{j}^{ls} &=& (1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\sectionnewpage
\section
{
增大模型容量
}
\label
{
section-13.2
}
\parinterval
神经机器翻译是一种典型的多层神经网络。一方面,可以通过设计合适的网络连接方式和激活函数来捕捉复杂的翻译现象;另一方面,越来越多的可用数据让模型能够得到更有效的训练。在训练数据较为充分的情况下,设计更加
``复杂''
的模型成为了提升系统性能的有效手段。比如,Transformer模型有两个常用配置Transformer-Base和Transformer-Big。其中,Transformer-Big比Transformer-Base使用了更多的神经元,相应的翻译品质更优
\upcite
{
NIPS2017
_
7181
}
。
\parinterval
神经机器翻译是一种典型的多层神经网络。一方面,可以通过设计合适的网络连接方式和激活函数来捕捉复杂的翻译现象;另一方面,越来越多的可用数据让模型能够得到更有效的训练。在训练数据较为充分的情况下,设计更加
“复杂”
的模型成为了提升系统性能的有效手段。比如,Transformer模型有两个常用配置Transformer-Base和Transformer-Big。其中,Transformer-Big比Transformer-Base使用了更多的神经元,相应的翻译品质更优
\upcite
{
NIPS2017
_
7181
}
。
\parinterval
那么是否还有类似的方法可以改善系统性能呢?答案显然是肯定的。这里,把这类方法统称为基于大容量模型的方法。在传统机器学习的观点中,神经网络的性能不仅依赖于架构设计,同样与容量密切相关。那么什么是模型的
{
\small\bfnew
{
容量
}}
\index
{
容量
}
(Capacity)
\index
{
Capacity
}
?简单理解,容量是指神经网络的参数量,即神经元之间连接权重的个数。另一种定义是把容量看作神经网络所能表示的假设空间大小
\upcite
{
DBLP:journals/nature/LeCunBH15
}
,也就是神经网络能表示的不同函数所构成的空间。
\parinterval
而学习一个神经网络就是要找到一个
``最优''
的函数,它可以准确地拟合数据。当假设空间变大时,训练系统有机会找到更好的函数,但是同时也需要依赖更多的训练样本才能完成最优函数的搜索。相反,当假设空间变小时,训练系统会更容易完成函数搜索,但是很多优质的函数可能都没有被包含在假设空间里。这也体现了一种简单的辩证思想:如果训练(搜索)的代价高,会有更大的机会找到更好的解;另一方面,如果想少花力气进行训练(搜索),那就设计一个小一些的假设空间,在小一些规模的样本集上进行训练,当然搜索到的解可能不是最好的。
\parinterval
而学习一个神经网络就是要找到一个
“最优”
的函数,它可以准确地拟合数据。当假设空间变大时,训练系统有机会找到更好的函数,但是同时也需要依赖更多的训练样本才能完成最优函数的搜索。相反,当假设空间变小时,训练系统会更容易完成函数搜索,但是很多优质的函数可能都没有被包含在假设空间里。这也体现了一种简单的辩证思想:如果训练(搜索)的代价高,会有更大的机会找到更好的解;另一方面,如果想少花力气进行训练(搜索),那就设计一个小一些的假设空间,在小一些规模的样本集上进行训练,当然搜索到的解可能不是最好的。
\parinterval
在很多机器翻译任务中,训练数据是相对充分的。这时增加模型容量是提升性能的一种很好的选择。常见的方法有三种:
...
...
@@ -401,7 +401,7 @@ y_{j}^{ls} &=& (1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\subsection
{
深网络
}
\parinterval
虽然,理论上宽网络有能力拟合任意的函数,但是获得这种能力的代价是非常高的。在实践中,往往需要增加相当的宽度,以极大的训练代价才能换来少量的性能提升。当神经网络达到一定宽度后这种现象更为严重。
``无限''
增加宽度显然是不现实的。
\parinterval
虽然,理论上宽网络有能力拟合任意的函数,但是获得这种能力的代价是非常高的。在实践中,往往需要增加相当的宽度,以极大的训练代价才能换来少量的性能提升。当神经网络达到一定宽度后这种现象更为严重。
“无限”
增加宽度显然是不现实的。
\parinterval
因此,另一种思路是使用更深的网络以增加模型的容量。深网络是指包含更多层的神经网络。相比宽网络的参数量随着宽度呈平方增长,深网络的参数量随着深度呈线性增长。这带给深网络一个优点:在同样参数量下可以通过更多的非线性变换来对问题进行描述。这也赋予了深网络对复杂问题建模的能力。比如,在图像识别领域,很多先进的系统都是基于很深的神经网络,甚至在一些任务上最好的的结果需要1000 层以上的神经网络。
...
...
@@ -432,7 +432,7 @@ y_{j}^{ls} &=& (1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\end{figure}
%----------------------------------------------
\parinterval
不过,深网络容易发生梯度消失和梯度爆炸问题。因此在使用深网络时,训练策略的选择是至关重要的。实际上,标准的Transformer模型已经是不太
``浅''
的神经网络,因此里面使用了残差连接来缓解梯度消失等问题。此外,为了避免过拟合,深层网络的训练也要与Dropout等正则化策略相配合,并且需要设计恰当的参数初始化方法和学习率调整策略。关于构建深层神经机器翻译的方法,本章
\ref
{
subsection-7.5.1
}
节还会有进一步讨论。
\parinterval
不过,深网络容易发生梯度消失和梯度爆炸问题。因此在使用深网络时,训练策略的选择是至关重要的。实际上,标准的Transformer模型已经是不太
“浅”
的神经网络,因此里面使用了残差连接来缓解梯度消失等问题。此外,为了避免过拟合,深层网络的训练也要与Dropout等正则化策略相配合,并且需要设计恰当的参数初始化方法和学习率调整策略。关于构建深层神经机器翻译的方法,本章
\ref
{
subsection-7.5.1
}
节还会有进一步讨论。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
@@ -442,7 +442,7 @@ y_{j}^{ls} &=& (1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\parinterval
如前所述,神经机器翻译的原始输入是单词序列,包括源语言端和目标语言端。模型中的输入层将这种离散的单词表示转换成实数向量的表示,也就是常说的
{
\small\bfnew
{
词嵌入
}}
\index
{
词嵌入
}
(Embedding)
\index
{
Embedding
}
。从实现的角度来看,输入层其实就是从一个词嵌入矩阵中提取对应的词向量表示,这个矩阵两个维度大小分别对应着词表大小和词嵌入的维度。词嵌入的维度也代表着模型对单词刻画的能力。因此适当增加词嵌入的维度也是一种增加模型容量的手段。通常,词嵌入和隐藏层的维度是一致的,这种设计也是为了便于系统实现。
\parinterval
当然,并不是说词嵌入的维度一定越大就越好。本质上,词嵌入是要在一个多维空间上有效的区分含有不同语义的单词。如果词表较大,更大的词嵌入维度会更有意义,因为需要更多的
``特征''
描述更多的语义。当词表较小时,增大词嵌入维度可能不会带来增益,相反会增加系统计算的负担。另一种策略是,动态选择词嵌入维度,比如,对于高频词使用较大的词嵌入维度,而对于低频词则使用较小的词嵌入维度
\upcite
{
DBLP:conf/iclr/BaevskiA19
}
。这种方法可以用同样的参数量处理更大的词表。
\parinterval
当然,并不是说词嵌入的维度一定越大就越好。本质上,词嵌入是要在一个多维空间上有效的区分含有不同语义的单词。如果词表较大,更大的词嵌入维度会更有意义,因为需要更多的
“特征”
描述更多的语义。当词表较小时,增大词嵌入维度可能不会带来增益,相反会增加系统计算的负担。另一种策略是,动态选择词嵌入维度,比如,对于高频词使用较大的词嵌入维度,而对于低频词则使用较小的词嵌入维度
\upcite
{
DBLP:conf/iclr/BaevskiA19
}
。这种方法可以用同样的参数量处理更大的词表。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
@@ -458,7 +458,7 @@ y_{j}^{ls} &=& (1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\subsection
{
大批量训练
}
\parinterval
在第六章已经介绍了神经机器翻译模型需要使用梯度下降方法进行训练。其中,一项非常重要的技术就是
{
\small\bfnew
{
小批量训练
}}
\index
{
小批量训练
}
(Mini-batch Training)
\index
{
Mini-batch Training
}
,即每次使用多个样本来获取梯度并对模型参数进行更新。这里将每次参数更新使用的多个样本集合称为批次,将样本的数量称作批次的大小。在机器翻译中,通常用批次中的源语言/目标语言单词数或者句子数来表示批次大小。理论上,过小的批次会带来训练的不稳定,而且参数更新次数会大大增加。因此,很多研究者尝试增加批次大小来提高训练的稳定性。在Transformer模型中,使用更大的批次已经被验证是有效的。这种方法也被称作大批量训练。不过,这里所谓
`` 大''
批量是一个相对的概念。下面就一起看一看如何使用合适的批次大小来训练神经机器翻译模型。
\parinterval
在第六章已经介绍了神经机器翻译模型需要使用梯度下降方法进行训练。其中,一项非常重要的技术就是
{
\small\bfnew
{
小批量训练
}}
\index
{
小批量训练
}
(Mini-batch Training)
\index
{
Mini-batch Training
}
,即每次使用多个样本来获取梯度并对模型参数进行更新。这里将每次参数更新使用的多个样本集合称为批次,将样本的数量称作批次的大小。在机器翻译中,通常用批次中的源语言/目标语言单词数或者句子数来表示批次大小。理论上,过小的批次会带来训练的不稳定,而且参数更新次数会大大增加。因此,很多研究者尝试增加批次大小来提高训练的稳定性。在Transformer模型中,使用更大的批次已经被验证是有效的。这种方法也被称作大批量训练。不过,这里所谓
“ 大”
批量是一个相对的概念。下面就一起看一看如何使用合适的批次大小来训练神经机器翻译模型。
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
...
...
@@ -524,7 +524,7 @@ y_{j}^{ls} &=& (1-\alpha) \cdot \tilde{y}_j + \alpha \cdot q
\item
按词数构建批次:对比按照句长生成批次,按词数生成批次可以防止某些批次中句子整体长度特别长或者特别短的情况,保证不同批次之间整体的词数处于大致相同的范围,这样所得到的梯度也是可比较的。通常的做法是根据源语言词数、目标语言词数,或者源语言词数与目标语言词数的最大值等指标生成批次。
\vspace
{
0.5em
}
\item
按课程学习的方式:考虑样本的
``难度''也是生成批次的一种策略。比如,可以使用
{
\small\bfnew
{
课程学习
}}
\index
{
课程学习
}
(Curriculum Learning)
\index
{
Curriculum Learning
}
的思想
\upcite
{
DBLP:conf/icml/BengioLCW09
}
,让系统先学习``简单''的样本,之后逐渐增加样本的难度,达到循序渐进的学习。具体来说,可以利用句子长度、词频等指标计算每个批次的``难度''
,记为
$
d
$
。 之后,选择满足
$
d
\leq
c
$
的样本构建一个批次。这里,
$
c
$
表示难度的阈值,它可以随着训练的执行不断增大。
\item
按课程学习的方式:考虑样本的
“难度”也是生成批次的一种策略。比如,可以使用
{
\small\bfnew
{
课程学习
}}
\index
{
课程学习
}
(Curriculum Learning)
\index
{
Curriculum Learning
}
的思想
\upcite
{
DBLP:conf/icml/BengioLCW09
}
,让系统先学习“简单”的样本,之后逐渐增加样本的难度,达到循序渐进的学习。具体来说,可以利用句子长度、词频等指标计算每个批次的“难度”
,记为
$
d
$
。 之后,选择满足
$
d
\leq
c
$
的样本构建一个批次。这里,
$
c
$
表示难度的阈值,它可以随着训练的执行不断增大。
\vspace
{
0.5em
}
\end{itemize}
...
...
@@ -670,11 +670,11 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{\textrm{S}}\sum_{(\ma
\sectionnewpage
\section
{
知识精炼
}
\label
{
subsection-7.5.3
}
\parinterval
理想的机器翻译系统应该是品质好、速度块、存储占用少。不过现实的机器翻译系统往往需要用运行速度和存储空间来换取翻译品质,比如,
\ref
{
subsection-7.3.2
}
节提到的增大模型容量的方法就是通过增加模型参数量来达到更好的函数拟合效果,但是这也导致系统变得更加笨拙。在很多场景下,这样的模型甚至无法使用。比如,Transformer-Big等
``大''
模型通常在专用GPU服务器上运行,在手机等受限环境下仍很难应用。
\parinterval
理想的机器翻译系统应该是品质好、速度块、存储占用少。不过现实的机器翻译系统往往需要用运行速度和存储空间来换取翻译品质,比如,
\ref
{
subsection-7.3.2
}
节提到的增大模型容量的方法就是通过增加模型参数量来达到更好的函数拟合效果,但是这也导致系统变得更加笨拙。在很多场景下,这样的模型甚至无法使用。比如,Transformer-Big等
“大”
模型通常在专用GPU服务器上运行,在手机等受限环境下仍很难应用。
\parinterval
另一方面,直接训练
``小''模型的效果往往并不理想,其翻译品质与``大''
模型相比仍有比较明显的差距。比如,在Transformer中,使用一个48层的编码器要比传统的6层编码器在BLEU上高出1-2个点,而且两者翻译结果的人工评价的区别也十分明显。
\parinterval
另一方面,直接训练
“小”模型的效果往往并不理想,其翻译品质与“大”
模型相比仍有比较明显的差距。比如,在Transformer中,使用一个48层的编码器要比传统的6层编码器在BLEU上高出1-2个点,而且两者翻译结果的人工评价的区别也十分明显。
\parinterval
面对小模型难以训练的问题,一种有趣的想法是把
``大''模型的知识传递给``小''模型,让``小''模型可以更好的进行学习。这类似于,教小孩子学习数学,是请一个权威数学家(数据中的标准答案),还是请一个小学数学教师(``大''
模型)。这就是知识精炼的基本思想。
\parinterval
面对小模型难以训练的问题,一种有趣的想法是把
“大”模型的知识传递给“小”模型,让“小”模型可以更好的进行学习。这类似于,教小孩子学习数学,是请一个权威数学家(数据中的标准答案),还是请一个小学数学教师(“大”
模型)。这就是知识精炼的基本思想。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
@@ -682,23 +682,23 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{\textrm{S}}\sum_{(\ma
\subsection
{
什么是知识精炼
}
\parinterval
通常,知识精炼可以被看作是一种知识迁移的手段
\upcite
{
Hinton2015Distilling
}
。如果把
``大''模型的知识迁移到``小''模型,这种方法的直接结果就是
{
\small\bfnew
{
模型压缩
}}
\index
{
模型压缩
}
(Model Compression)
\index
{
Model Compression
}
。当然,理论上也可以把``小''模型的知识迁移到``大''模型,比如,将迁移后得到的``大''模型作为初始状态,之后继续训练该模型,以期望取得加速收敛的效果。不过,在实践中更多是使用``大''模型到``小''
模型的迁移,这也是本节讨论的重点。
\parinterval
通常,知识精炼可以被看作是一种知识迁移的手段
\upcite
{
Hinton2015Distilling
}
。如果把
“大”模型的知识迁移到“小”模型,这种方法的直接结果就是
{
\small\bfnew
{
模型压缩
}}
\index
{
模型压缩
}
(Model Compression)
\index
{
Model Compression
}
。当然,理论上也可以把“小”模型的知识迁移到“大”模型,比如,将迁移后得到的“大”模型作为初始状态,之后继续训练该模型,以期望取得加速收敛的效果。不过,在实践中更多是使用“大”模型到“小”
模型的迁移,这也是本节讨论的重点。
\parinterval
知识精炼基于两个假设:
\begin{itemize}
\vspace
{
0.5em
}
\item
``知识''
在模型间是可迁移的。也就是说,一个模型中蕴含的规律可以被另一个模型使用。最典型的例子就是预训练模型(见
\ref
{
subsection-7.2.6
}
)。使用单语数据学习到的表示模型,在双语的翻译任务中仍然可以发挥很好的作用。也就是,把单语语言模型学习到的知识迁移到双语翻译中对句子表示的任务中;
\item
“知识”
在模型间是可迁移的。也就是说,一个模型中蕴含的规律可以被另一个模型使用。最典型的例子就是预训练模型(见
\ref
{
subsection-7.2.6
}
)。使用单语数据学习到的表示模型,在双语的翻译任务中仍然可以发挥很好的作用。也就是,把单语语言模型学习到的知识迁移到双语翻译中对句子表示的任务中;
\vspace
{
0.5em
}
\item
模型所蕴含的
``知识''比原始数据中的``知识''
更容易被学习到。比如,机器翻译中大量使用的回译(伪数据)方法,就把模型的输出作为数据让系统进行学习。
\item
模型所蕴含的
“知识”比原始数据中的“知识”
更容易被学习到。比如,机器翻译中大量使用的回译(伪数据)方法,就把模型的输出作为数据让系统进行学习。
\vspace
{
0.5em
}
\end{itemize}
\parinterval
这里所说的第二个假设对应了机器学习中的一大类问题
\ \dash
\
{
\small\bfnew
{
学习难度
}}
\index
{
学习难度
}
(Learning Difficulty)
\index
{
Learning Difficulty
}
。所谓难度是指:在给定一个模型的情况下,需要花费多少代价对目标任务进行学习。如果目标任务很简单,同时模型与任务很匹配,那学习难度就会降低。如果目标任务很复杂,同时模型与其匹配程度很低,那学习难度就会很大。在自然语言处理任务中,这个问题的一种表现是:在很好的数据中学习的模型的翻译质量可能仍然很差。即使训练数据是完美的,但是模型仍然无法做到完美的学习。这可能是因为建模的不合理,导致模型无法描述目标任务中复杂的规律。也就是纵然数据很好,但是模型学不到其中的
``知识''
。在机器翻译中这个问题体现的尤为明显。比如,在机器翻译系统
$
n
$
-best结果中挑选最好的译文(成为Oracle)作为训练样本让系统重新学习,系统仍然达不到Oracle的水平。
\parinterval
这里所说的第二个假设对应了机器学习中的一大类问题
\ \dash
\
{
\small\bfnew
{
学习难度
}}
\index
{
学习难度
}
(Learning Difficulty)
\index
{
Learning Difficulty
}
。所谓难度是指:在给定一个模型的情况下,需要花费多少代价对目标任务进行学习。如果目标任务很简单,同时模型与任务很匹配,那学习难度就会降低。如果目标任务很复杂,同时模型与其匹配程度很低,那学习难度就会很大。在自然语言处理任务中,这个问题的一种表现是:在很好的数据中学习的模型的翻译质量可能仍然很差。即使训练数据是完美的,但是模型仍然无法做到完美的学习。这可能是因为建模的不合理,导致模型无法描述目标任务中复杂的规律。也就是纵然数据很好,但是模型学不到其中的
“知识”
。在机器翻译中这个问题体现的尤为明显。比如,在机器翻译系统
$
n
$
-best结果中挑选最好的译文(成为Oracle)作为训练样本让系统重新学习,系统仍然达不到Oracle的水平。
\parinterval
知识精炼本身也体现了一种
``自学习''的思想。即利用模型(自己)的预测来教模型(自己)。这样既保证了知识可以向更轻量的模型迁移,同时也避免了模型从原始数据中学习难度大的问题。虽然``大''模型的预测中也会有错误,但是这种预测是更符合建模的假设的,因此``小''模型反倒更容易从不完美的信息中学习
\footnote
[15]
{
很多时候,``大''模型和``小''模型都是基于同一种架构,因此二者对问题的假设和模型结构都是相似的。
}
到更多的知识。类似于,刚开始学习围棋的人从职业九段身上可能什么也学不到,但是向一个业余初段的选手学习可能更容易入门。另外,也有研究表明:在机器翻译中,相比于``小''模型,``大''
模型更容易进行优化,也更容易找到更好的模型收敛状态。因此在需要一个性能优越,存储较小的模型时,也会考虑将大模型压缩得到更轻量模型的手段
\upcite
{
DBLP:journals/corr/abs-2002-11794
}
。
\parinterval
知识精炼本身也体现了一种
“自学习”的思想。即利用模型(自己)的预测来教模型(自己)。这样既保证了知识可以向更轻量的模型迁移,同时也避免了模型从原始数据中学习难度大的问题。虽然“大”模型的预测中也会有错误,但是这种预测是更符合建模的假设的,因此“小”模型反倒更容易从不完美的信息中学习
\footnote
[15]
{
很多时候,“大”模型和“小”模型都是基于同一种架构,因此二者对问题的假设和模型结构都是相似的。
}
到更多的知识。类似于,刚开始学习围棋的人从职业九段身上可能什么也学不到,但是向一个业余初段的选手学习可能更容易入门。另外,也有研究表明:在机器翻译中,相比于“小”模型,“大”
模型更容易进行优化,也更容易找到更好的模型收敛状态。因此在需要一个性能优越,存储较小的模型时,也会考虑将大模型压缩得到更轻量模型的手段
\upcite
{
DBLP:journals/corr/abs-2002-11794
}
。
\parinterval
通常把
``大''模型看作的传授知识的``教师'',被称作
{
\small\bfnew
{
教师模型
}}
\index
{
教师模型
}
(Teacher Model)
\index
{
Teacher Model
}
;把``小''模型看作是接收知识的``学生''
,被称作
{
\small\bfnew
{
学生模型
}}
\index
{
学生模型
}
(Student Model)
\index
{
Student Model
}
。比如,可以把Transformer-Big看作是教师模型,把Transformer-Base看作是学生模型。
\parinterval
通常把
“大”模型看作的传授知识的“教师”,被称作
{
\small\bfnew
{
教师模型
}}
\index
{
教师模型
}
(Teacher Model)
\index
{
Teacher Model
}
;把“小”模型看作是接收知识的“学生”
,被称作
{
\small\bfnew
{
学生模型
}}
\index
{
学生模型
}
(Student Model)
\index
{
Student Model
}
。比如,可以把Transformer-Big看作是教师模型,把Transformer-Base看作是学生模型。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
@@ -760,7 +760,7 @@ L_{\textrm{seq}} = - \textrm{logP}_{\textrm{s}}(\hat{\mathbf{y}} | \mathbf{x})
\begin{itemize}
\vspace
{
0.5em
}
\item
固定教师模型,通过减少模型容量的方式设计学生模型。比如,可以使用容量较大的模型作为教师模型(如:Transformer-Big或Transformer-Deep),然后通过将神经网络变
``窄''、变``浅''
的方式得到学生模型。我们可以用Transformer-Big做教师模型,然后把Transformer-Big的解码器变为一层网络,作为学生模型。
\item
固定教师模型,通过减少模型容量的方式设计学生模型。比如,可以使用容量较大的模型作为教师模型(如:Transformer-Big或Transformer-Deep),然后通过将神经网络变
“窄”、变“浅”
的方式得到学生模型。我们可以用Transformer-Big做教师模型,然后把Transformer-Big的解码器变为一层网络,作为学生模型。
\vspace
{
0.5em
}
\item
固定学生模型,通过模型集成的方式设计教师模型。可以组合多个模型生成更高质量的译文(见
\ref
{
subsection-7.4.3
}
节)。比如,融合多个Transformer-Big模型(不同参数初始化方式),之后学习一个Transformer-Base模型。
\vspace
{
0.5em
}
...
...
bibliography.bib
查看文件 @
550f7d6d
...
...
@@ -6206,6 +6206,39 @@ author = {Yoshua Bengio and
year = {2018}
}
@inproceedings{DBLP:conf/icassp/SchusterN12,
author = {Mike Schuster and
Kaisuke Nakajima},
title = {Japanese and Korean voice search},
pages = {5149--5152},
publisher = {IEEE International Conference on Acoustics, Speech and Signal Processing},
year = {2012}
}
@inproceedings{kudo2018sentencepiece,
title={SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing},
author={Taku {Kudo} and John {Richardson}},
publisher={Conference on Empirical Methods in Natural Language Processing},
pages={66--71},
year={2018}
}
@inproceedings{provilkov2020bpe,
title={BPE-Dropout: Simple and Effective Subword Regularization},
author={Ivan {Provilkov} and Dmitrii {Emelianenko} and Elena {Voita}},
publisher={Annual Meeting of the Association for Computational Linguistics},
pages={1882--1892},
year={2020}
}
@inproceedings{he2020dynamic,
title={Dynamic Programming Encoding for Subword Segmentation in Neural Machine Translation},
author={Xuanli {He} and Gholamreza {Haffari} and Mohammad {Norouzi}},
publisher={Annual Meeting of the Association for Computational Linguistics},
pages={3042--3051},
year={2020}
}
%%%%% chapter 13------------------------------------------------------
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论