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
718c1174
Commit
718c1174
authored
Dec 28, 2020
by
单韦乔
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
13章和第一章的图
parent
b3eaedb5
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
12 行增加
和
12 行删除
+12
-12
Chapter1/Figures/figure-zh-sentences-into-en-sentences.tex
+2
-2
Chapter13/chapter13.tex
+10
-10
没有找到文件。
Chapter1/Figures/figure-zh-sentences-into-en-sentences.tex
查看文件 @
718c1174
...
...
@@ -92,7 +92,7 @@
}
{
\draw
[double,->,thick,ublue]
(e3.south)--([yshift=-1.2em]e3.south) node[pos=0.5,right,xshift=0.2em,yshift=0.2em] (step1)
{
\color
{
red
}{
\tiny
{
用
‘你’替换‘他’
}}}
;
\draw
[double,->,thick,ublue]
(e3.south)--([yshift=-1.2em]e3.south) node[pos=0.5,right,xshift=0.2em,yshift=0.2em] (step1)
{
\color
{
red
}{
\tiny
{
用
“你”替换“他”
}}}
;
\draw
[->,dotted,thick,red]
([xshift=-0.1em]entry2.east)..controls +(east:4) and +(west:4)..([yshift=-0.6em,xshift=-0.5em]e3.south) ;
}
...
...
@@ -122,7 +122,7 @@
}
{
\draw
[double,->,thick,ublue]
(e3.south)--([yshift=-1.2em]e3.south) node[pos=0.5,right,xshift=0.2em,yshift=0.2em] (step1)
{
\color
{
red
}{
\tiny
{
用
‘满意’替换‘高兴’
}}}
;
\draw
[double,->,thick,ublue]
(e3.south)--([yshift=-1.2em]e3.south) node[pos=0.5,right,xshift=0.2em,yshift=0.2em] (step1)
{
\color
{
red
}{
\tiny
{
用
“满意”替换“高兴”
}}}
;
\draw
[->,dotted,thick,red]
([xshift=-1.2em,yshift=-0.6em]entry3.north east)..controls +(east:2) and +(west:3)..([yshift=-0.6em,xshift=-0.5em]e3.south) ;
}
...
...
Chapter13/chapter13.tex
查看文件 @
718c1174
...
...
@@ -158,7 +158,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
}
。
{
\red
而在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
}
。
而在T5等预训练模型中
\upcite
{
DBLP:journals/jmlr/RaffelSRLNMZLL20
}
,则使用了基于字符级别的BPE。此外,尽管BPE被命名为字节对编码,但是改方法在实现上一般处理的是Unicode编码,而不是字节。因此在预训练模型GPT2中,也探索了字节级别的BPE,这种方法在机器翻译、自动问答等任务中取得了很好的效果
\upcite
{
radford2019language
}
。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
@@ -166,7 +166,7 @@
\subsection
{
其他方法
}
\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
与基于统计的BPE算法不同,基于Word Piece的子词切分方法则是利用语言模型进行子词词表的构造
\upcite
{
DBLP:conf/icassp/SchusterN12
}
。本质上,基于语言模型的方法和基于BPE的方法的思路是一样的,即通过合并字符和子词不断生成新的子词。它们的区别仅在于合并子词的方式不同。
基于BPE的方法选择出现频次最高的连续字符,并将该字符合并为新的子词
,而基于语言模型的方法则是根据语言模型输出的概率选择要合并哪些子词。具体来说,基于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
目前比较主流的子词切分方法都是作用于分词后的序列,对一些没有明显词边界且资源稀缺的语种并不友好。相比之下,Sentence Piece可以作用于未经过分词处理的输入序列
\upcite
{
kudo2018sentencepiece
}
,同时囊括了双字节编码和语言模型的子词切分方法,更加灵活易用。
...
...
@@ -174,7 +174,7 @@
\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
\upcite
{
provilkov2020bpe
}
。在训练时,通过在合并过程中按照一定概率
$
p
$
(介于0与1之间)随机丢弃一些可行的合并操作,从而产生不同的子词切分结果,进而增强模型健壮性。而在推断阶段,将
$
p
$
设置为0,等同于标准的BPE。总的来说,上述方法相当于在子词的粒度上对输入的序列进行扰动,进而达到增加训练健壮性的目的。
\vspace
{
0.5em
}
...
...
@@ -375,7 +375,7 @@ R(\mathbf{w}) & = & (\big| |\mathbf{w}| {\big|}_2)^2 \\
\parinterval
一个好的对抗样本应该具有这种性质:对文本做最少的修改,并最大程度地保留原文的语义。一种简单的实现方式是对文本加噪声。这里,噪声可以分为自然噪声和人工噪声
\upcite
{
DBLP:conf/iclr/BelinkovB18
}
。自然噪声一般是指人为的在语料库中收集自然出现的错误,如输入错误、拼写错误等。人为噪声是通过多种方式来处理文本,例如,可以通过固定的规则或是使用噪声生成器,在干净的数据中以一定的概率引入不同类型的噪声,如:拼写、表情符号、语法错误等
\upcite
{
DBLP:conf/naacl/VaibhavSSN19,DBLP:conf/naacl/AnastasopoulosL19,DBLP:conf/acl/SinghGR18
}
;此外,也可以在文本中加入人为设计过的毫无意义的单词序列,以此来分散模型的注意(
{
\color
{
red
}
啥是分散模型的注意?
}
)。
\parinterval
除了单纯的在文本中引入各种扰动外,还可以通过文本编辑的方式
构建对抗样本,在不改变语义的情况下尽可能修改文本
\upcite
{
DBLP:journals/corr/SamantaM17,DBLP:conf/ijcai/0002LSBLS18
}
,从而生成对抗样本。文本的编辑方式主要包括交换,插入,替换和删除操作。图
\ref
{
fig:13-20
}
给出了一些通过上述方式生成的对抗样本
。
\parinterval
除了单纯的在文本中引入各种扰动外,还可以通过文本编辑的方式
,在不改变语义的情况下尽可能修改文本,从而构建对抗样本
\upcite
{
DBLP:journals/corr/SamantaM17,DBLP:conf/ijcai/0002LSBLS18
}
。文本的编辑方式主要包括交换,插入,替换和删除操作。表
\ref
{
fig:13-20
}
给出了一些通过文本编辑的方式来生成对抗样本的例子
。
%----------------------------------------------
\begin{figure}
[htp]
...
...
@@ -386,7 +386,7 @@ R(\mathbf{w}) & = & (\big| |\mathbf{w}| {\big|}_2)^2 \\
\end{figure}
%----------------------------------------------
\parinterval
{
\red
形式上,可以利用FGSM
\upcite
{
DBLP:journals/corr/GoodfellowSS14
}
等算法,验证文本中每一个单词对语义的贡献度,同时为每一个单词构建候选池,包括单词的近义词,拼写错误词,同音词等。对于贡献度较低的词,如语气词,副词等,可以使用插入、删除操作进行扰动。对于文本序列中其他的单词,可以在候选池中选择相应的单词进行替换。其中,交换操作可以是基于词级别的,比如交换序列中的单词,也可以是基于字符级别的,比如交换单词中的字符
\upcite
{
DBLP:conf/coling/EbrahimiLD18
}
。重复的进行不同的编辑操作,直至误导模型做出错误的判断。
}
\parinterval
形式上,可以利用如FGSM
\upcite
{
DBLP:journals/corr/GoodfellowSS14
}
等算法,验证文本中每一个单词对语义的贡献度,同时为每一个单词构建一个候选池,包括该单词的近义词,拼写错误词,同音词等。对于贡献度较低的词,如语气词,副词等,可以使用插入、删除操作进行扰动。
{
\red
对于文本序列中其他的单词,可以在候选池中选择相应的单词并进行替换。(前面时贡献度低的,这里是其他词,感觉没有必要区分说明呀)
}
其中,交换操作可以是基于词级别的,比如交换序列中的单词,也可以是基于字符级别的,比如交换单词中的字符
\upcite
{
DBLP:conf/coling/EbrahimiLD18
}
。重复的进行上述的编辑操作,直至编辑出的文本可以误导模型做出错误的判断。
\parinterval
在基于语义的方法中,除了通过不同的算法修改输入以外,也可以通过神经网络模型增加扰动。例如,在机器翻译中常用的回译技术,也是生成对抗样本的一种有效方式。回译就是,通过反向模型将目标语言翻译成源语言,并将翻译得到的双语数据用于模型训练。除了翻译模型,语言模型也可以用于生成对抗样本。
{
\red
前面
}
已经介绍过,语言模型可以用于检测句子的流畅度,它根据上文预测当前位置可能出现的单词。因此,此时可以使用语言模型预测出当前位置最可能出现的多个单词,并用这些词替换序列中原本的单词。在机器翻译任务中,可以通过与神经机器翻译系统联合训练,共享词向量矩阵的方式得到语言模型。
{
\red
(引用)
}
...
...
@@ -406,15 +406,15 @@ R(\mathbf{w}) & = & (\big| |\mathbf{w}| {\big|}_2)^2 \\
\vspace
{
0.5em
}
\item
除了引入标准的噪声外,还可以根据模型所存在的具体问题,构建不同的扰动。例如,针对输入中包含同音字错误导致的模型输出误差较大的问题,可以将单词的发音转换为一个包含
$
n
$
个发音单元的发音序列,如音素,音节等。并训练相应的嵌入矩阵将每一个发音单元转换为对应的向量表示。对发音序列中发音单元的嵌入表示进行平均后,得到当前单词的发音表示。最后将词嵌入与单词的发音表示进行加权求和,并将结果作为模型的输入
\upcite
{
DBLP:conf/acl/LiuMHXH19
}
。通过这种方式可以提高模型对同音异形词的健壮性,得到更准确的翻译结果。此外除了在词嵌入层增加扰动,例如,在端到端模型中的编码端输出中引入额外的噪声,能起到与在层输入中增加扰动相类似的效果,增强了模型训练的健壮性
\upcite
{
DBLP:conf/acl/LiLWJXZLL20
}
。
\vspace
{
0.5em
}
\item
此外还可以使用基于梯度的方法来生成对抗样本。例如,可以利用替换词与原始单词词向量之间的差值,以及候选词的梯度之间的相似度来生成对抗样本
\upcite
{
DBLP:conf/acl/ChengJM19
}
,具体的计算方式如下:
{
\red
下面的是sin还是sim,而且文字中是
正弦把
?下面三角是不是delta
}
\item
此外还可以使用基于梯度的方法来生成对抗样本。例如,可以利用替换词与原始单词词向量之间的差值,以及候选词的梯度之间的相似度来生成对抗样本
\upcite
{
DBLP:conf/acl/ChengJM19
}
,具体的计算方式如下:
{
\red
下面的是sin还是sim,而且文字中是
余弦
?下面三角是不是delta
}
\begin{eqnarray}
{
\mathbi
{
x
}
'
}_
i
&
=
&
\arg\max
_{
\mathbi
{
x
}
\in
\nu
_{
\mathbi
{
x
}}
}
\textrm
{
sim
}
(
\funp
{
e
}
(
\mathbi
{
x
}
)-
\funp
{
e
}
(
\mathbi
{
x
}_
i),
\mathbi
{
g
}_{
\mathbi
{
x
}_
i
}
)
{
\mathbi
{
x
}
'
}_
i
&
=
&
\arg\max
_{
\mathbi
{
x
}
\in
V
}
\textrm
{
sim
}
(
\funp
{
e
}
(
\mathbi
{
x
}
)-
\funp
{
e
}
(
\mathbi
{
x
}_
i),
\mathbi
{
g
}_{
\mathbi
{
x
}_
i
}
)
\label
{
eq:13-9
}
\\
\mathbi
{
g
}_{
\mathbi
{
x
}_
i
}
&
=
&
\
Delta
_{
\funp
{
e
}
(
\mathbi
{
x
}_
i)
}
-
\log
\funp
{
P
}
(
\mathbi
{
y
}
|
\mathbi
{
x
}
;
\theta
)
\mathbi
{
g
}_{
\mathbi
{
x
}_
i
}
&
=
&
\
bigtriangledown
_{
\funp
{
e
}
(
\mathbi
{
x
}_
i)
}
-
\log
\funp
{
P
}
(
\mathbi
{
y
}
|
\mathbi
{
x
}
;
\theta
)
\label
{
eq:13-10
}
\end{eqnarray}
\noindent
其中,
$
\mathbi
{
x
}_
i
$
为输入中第
$
i
$
个词,
$
\mathbi
{
g
}_{
\mathbi
{
x
}_
i
}$
为对应的梯度向量,
$
\funp
{
e
}
(
\cdot
)
$
用于获取词向量,
$
\textrm
{
sim
}
(
\cdot
,
\cdot
)
$
用于评估两个向量之间距离的函数
{
\red
(很多符号没有解释,
$
∇
_
(
e
(
x
_
i
))
$
是什么?等等)
}
,
$
\nu
_{
\mathbi
{
x
}}$
为源语的词表(
{
\color
{
red
}
词表一般用大V
}
)
。但是,由于对词表中所有单词进行枚举时,计算成本较大。因此利用语言模型选择最可能的
$
n
$
个词作为候选,进而缩减匹配范围,并从中采样出源语词进行替换是一种更有效地方式。同时,为了保护模型不受解码器预测误差的影响,此时需要对模型目标端的输入做出同样的调整。与在源语端操作不同的地方时,此时会将公式
\eqref
{
eq:13-10
}
中的损失替换为
$
-
\log
\funp
{
P
}
(
\mathbi
{
y
}
|
\mathbi
{
x
}
'
)
$
。同时,在如何利用语言模型选择候选和采样方面,也做出了相应的调整。在进行对抗性训练时,在原有的训练损失上增加了三个额外的损失,最终的训练目标为:
\noindent
其中,
$
\mathbi
{
x
}_
i
$
为输入中第
$
i
$
个词,
$
\mathbi
{
g
}_{
\mathbi
{
x
}_
i
}$
为对应的梯度向量,
$
\funp
{
e
}
(
\cdot
)
$
用于获取词向量,
$
\textrm
{
sim
}
(
\cdot
,
\cdot
)
$
用于评估两个向量之间距离的函数
{
\red
$
\bigtriangledown
_{
\funp
{
e
}
(
\mathbi
{
x
}_
i
)
}$
是什么?
}
,
$
V
$
为源语的词表
。但是,由于对词表中所有单词进行枚举时,计算成本较大。因此利用语言模型选择最可能的
$
n
$
个词作为候选,进而缩减匹配范围,并从中采样出源语词进行替换是一种更有效地方式。同时,为了保护模型不受解码器预测误差的影响,此时需要对模型目标端的输入做出同样的调整。与在源语端操作不同的地方时,此时会将公式
\eqref
{
eq:13-10
}
中的损失替换为
$
-
\log
\funp
{
P
}
(
\mathbi
{
y
}
|
\mathbi
{
x
}
'
)
$
。同时,在如何利用语言模型选择候选和采样方面,也做出了相应的调整。在进行对抗性训练时,在原有的训练损失上增加了三个额外的损失,最终的训练目标为:
\begin{eqnarray}
Loss(
\theta
_{
\textrm
{
mt
}}
,
\theta
_{
\textrm
{
lm
}}^{
\mathbi
{
x
}}
,
\theta
_{
\textrm
{
lm
}}^{
\mathbi
{
y
}}
)
&
=
&
Loss
_{
\textrm
{
clean
}}
(
\theta
_{
\textrm
{
mt
}}
) + Loss
_{
\textrm
{
lm
}}
(
\theta
_{
\textrm
{
lm
}}^{
\mathbi
{
x
}}
) +
\nonumber
\\
&
&
Loss
_{
\textrm
{
robust
}}
(
\theta
_{
\textrm
{
mt
}}
) + Loss
_{
\textrm
{
lm
}}
(
\theta
_{
\textrm
{
lm
}}^{
\mathbi
{
y
}}
)
...
...
@@ -429,7 +429,7 @@ Loss_{\textrm{robust}}(\theta_{\textrm{mt}}) &=& \frac{1}{N}\sum_{(\mathbi{x},\
\end{itemize}
\parinterval
无论是黑盒方法还是白盒方法,本质上都是通过增加噪声使得模型训练更加健壮。类似的思想在很多机器学习方法中都有体现,比如,最大熵模型中使用高斯噪声就是常用的增加模型健壮性的手段之一
\upcite
{
chen1999gaussian
}{
\red
这篇文章再找一下
}
。而在深度学习时代下,对抗训练将问题定义为:有意识地构造出系统容易出错的样本,并使用这种样本训练系统,以此增加系统的抗干扰能力。
\parinterval
无论是黑盒方法还是白盒方法,本质上都是通过增加噪声使得模型训练更加健壮。类似的思想在很多机器学习方法中都有体现,比如,最大熵模型中使用高斯噪声就是常用的增加模型健壮性的手段之一
\upcite
{
chen1999gaussian
}{
\red
这篇文章
的bib
再找一下
}
。而在深度学习时代下,对抗训练将问题定义为:有意识地构造出系统容易出错的样本,并使用这种样本训练系统,以此增加系统的抗干扰能力。
%----------------------------------------------------------------------------------------
% NEW SECTION
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论