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
6ae34f8f
Commit
6ae34f8f
authored
4 years ago
by
xiaotong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wording (sec 16, pre-training)
parent
f106d4ec
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
13 行增加
和
10 行删除
+13
-10
Chapter16/chapter16.tex
+13
-10
没有找到文件。
Chapter16/chapter16.tex
查看文件 @
6ae34f8f
...
...
@@ -233,36 +233,39 @@ g_{t} = \sigma (w^{T}s_{t}^{TM} + b)
\subsubsection
{
2. 预训练(
{
\color
{
red
}
参考文献较少
}
)
}
{
\red
预训练模型ELMo、GPT、BERT等在这里是否要详细介绍?
}
{
\red
预训练模型ELMo、GPT、BERT等在这里是否要详细介绍?
}
{
\color
{
blue
}
还是介绍一下,但是并不是深入讲,要不一些基础的概念大家可能不知道
}
\parinterval
编码器-解码器框架天然就包含了对输入(源语言)和输出(目标语言)进行表示学习的过程。
比如,在编码端需要学习一种分布式表示(Distributed Representation)来表示源语言句子的信息,这种分布式表示既包含单词的表示也包括整个序列的表示。因此,可以使用更大规模的源语言单语数据完成编码器的训练
。
\parinterval
编码器-解码器框架天然就包含了对输入(源语言)和输出(目标语言)进行表示学习的过程。
在编码端,需要学习一种分布式表示来表示源语言句子的信息,这种分布式表示可以包含序列中每个位置的表示结果(见
{
\chapternine
}
)。从结构上看,神经机器翻译所使用的编码器与神经语言模型无异,或者说神经机器翻译的编码器其实就是一个源语言的语言模型。唯一的区别在于,神经机器翻译的编码器并不直接输出源语言句子的生成概率,而传统语言模型是建立在序列生成任务上的。既然神经机器翻译的编码器可以与解码器一起在双语数据上联合训练,那为什么不使用更大规模的数据单独对编码器进行训练呢?或者说,直接使用一个预先训练好的编码器,与机器翻译的解码器配合完成翻译过程
。
\parinterval
实现上述想法的一种手段是
{
\small\sffamily\bfnew
{
预训练
}}
\index
{
预训练
}
(Pre-training)
\index
{
Pre-training
}
。常用的方法是将机器翻译模型中的一部分(比如,编码器)单独提抽取出来,之后用语言建模等方式在大规模单语数据上进行训练。得到优化后的参数后,将其重新放入神经机器翻译模型中,作为模型的初始值。最后,神经机器翻译模型在双语数据上进行
{
\small\sffamily\bfnew
{
微调
}}
\index
{
微调
}
(Fine-tuning)
\index
{
Fine-tuning
}
,以得到最终的翻译模型。图
\ref
{
fig:16-7-xc
}
给出了机器翻译编码器预训练流程的示意图。
\parinterval
实现上述想法的一种手段是
{
\small\sffamily\bfnew
{
预训练
}}
\index
{
预训练
}
(Pre-training)
\index
{
Pre-training
}
(
{
\color
{
red
}
参考文献!
}
)
。常用的方法是将机器翻译模型中的一部分(比如,编码器)单独提抽取出来,之后用语言建模等方式在大规模单语数据上进行训练。得到优化后的参数后,将其重新放入神经机器翻译模型中,作为模型的初始值。最后,神经机器翻译模型在双语数据上进行
{
\small\sffamily\bfnew
{
微调
}}
\index
{
微调
}
(Fine-tuning)
\index
{
Fine-tuning
}
,以得到最终的翻译模型。图
\ref
{
fig:16-7-xc
}
给出了机器翻译编码器预训练流程的示意图。
%----------------------------------------------
\begin{figure}
[htp]
\centering
\input
{
./Chapter16/Figures/figure-encoder-fin
}
\caption
{
机器翻译编码器预训练流程
}
\caption
{
机器翻译编码器预训练流程
(
{
\color
{
red
}
图要重新构思
}
)
}
\label
{
fig:16-7-xc
}
\end{figure}
%-------------------------------------------
\parinterval
预训练的做法相当于
对目标任务进行了简化,将表示模型的学习任务从目标任务中分离出来了。这样,可以学习一种更加通用的模型,具有更好的泛化能力。此外,预训练的任务相比于机器翻译要简单许多,比如语言模型或者句子调序等。将预训练任务的结果作为机器翻译模型的初始值可以减轻目标任务上的学习负担。在第六章中已经介绍了几种基于预训练的模型,如ELMo、GPT和BERT等。这些模型的结构和神经机器翻译是兼容的,比如,BERT使用的也是目前神经机器翻译中主流的Transformer模型。因此,可以直接在神经机器翻译中使用这些开放的预训练模型
。
\parinterval
预训练的做法相当于
将表示模型的学习任务从目标任务中分离出来了。这样,可以在更大规模的数据上学习一种更加通用的模型。此外,预训练的任务相比于机器翻译要更加“简单”,其学习过程相对“容易”。比如,最近非常流行的BERT就是一种基于Transformer结构的预训练模型,它可以给自然语言处理下游任务提供句子的表示结果(
{
\color
{
red
}
参考文献!
}
)。对于机器翻译,预训练可以在单词、句子等多个层次上使用
。
\begin{itemize}
\vspace
{
0.5em
}
\item
{
\small\sffamily\bfnew
{
词嵌入预训练
}}
\item
{
\small\sffamily\bfnew
{
词嵌入预训练
}
(
{
\color
{
red
}
四级标题
}
)
}
{
\red
(词嵌入预训练和语言模型关系不大,是否要放在这儿?)
}
{
\red
(词嵌入预训练和语言模型关系不大,是否要放在这儿?)
}
{
\color
{
blue
}
没问题,用预训练的word embedding的工作还是不少的
}
\parinterval
词嵌入可以被看作是对每个独立单词进行的表示学习,在自然语言处理的众多任务中都扮演着重要角色
\upcite
{
DBLP:journals/corr/abs-1901-09069
}
。因此,可以使用
{
\chapternine
}
介绍的词嵌入方法,在外部单语数据上训练得到词嵌入,并把它作为神经机器翻译系统的词嵌入输入。
\parinterval
词嵌入可以被看作是对每个独立单词进行的表示学习,在自然语言处理的众多任务中都扮演着重要角色
\upcite
{
DBLP:journals/corr/abs-1901-09069
}
(
{
\color
{
red
}
参考文献!
}
)。到目前为止已经有大量的词嵌入学习方法被提出(见
{
\chapternine
}
),因此可以直接应用这些方法在外部单语数据上训练得到词嵌入,并把它作为神经机器翻译系统的词嵌入输入。
\parinterval
需要注意的是,在神经机器翻译中使用预训练的词嵌入有两种方法。一种方法是直接将词嵌入作为固定的输入,也就是在训练机器翻译模型的过程中,并不调整词嵌入的参数。这样做的目的是完全将词嵌入模块独立出来,机器翻译可以被看作是在固定的词嵌入输入上进行的建模,降低了机器翻译系统学习的难度。另一种方法是仍然遵循``预训练+微调''的策略,将词嵌入作为翻译模型的初始值。之后在机器翻译训练过程中,词嵌入模型结果会被进一步更新。近些年,在词嵌入预训练的基础上进行微调的方法受到研究者越来越多的青睐(
{
\color
{
red
}
参考文献!
}
)。因为在实践中发现,完全用单语数据学习的单词表示,与双语上的翻译任务并不完全匹配。目标语言的信息也会影响源语言的表示学习。这时,在预训练词嵌入的基础上进一步进行微调是更加有效的方案。
\parinterval
需要注意的是,在神经机器翻译中使用预训练的词嵌入有两种方法。一种方法是直接将词嵌入作为固定的输入,也就是在训练机器翻译模型的过程中,并不调整词嵌入的参数。这样做的目的是完全将词嵌入模块独立出来,机器翻译可以被看作是在固定的词嵌入输入上进行的建模。另一种方法是仍然遵循``预训练+微调''的策略,将词嵌入作为翻译模型的初始值。之后在机器翻译训练过程中,词嵌入模型结果会被进一步更新。近些年,在词嵌入预训练的基础上进行微调的方法受到研究者越来越多的青睐。
\vspace
{
0.5em
}
\item
{
\small\sffamily\bfnew
{
编码器预训练
}}
\parinterval
编码器在神经机器翻译中的作用是对源语句子中的信息进行抽象和提取,将离散的词序列编码成一组上下文相关的向量表示,本质上就是一个源语言端的句子表示模型。因此,可以使用预训练好的句子级表示模型(比如,BERT和XLM等),来初始化编码器参数。然而在实践中发现,这种参数初始化的方法在一些富资源语种上提升效果并不明显,甚至反而有些下降
\upcite
{
DBLP:journals/corr/abs-2002-06823
}
。原因可能在于预训练模型和编码器虽然都是对句子进行表示,但是由于目标任务不一致,二者的参数状态还是存在区别的。因此,也有一些做法将预训练模型和翻译模型在结构上进行融合,将预训练句子模型作为一个独立的模块来为编码器或者解码器提供句子级表示信息
\upcite
{
DBLP:journals/corr/abs-2002-06823
}
。
\parinterval
编码器在神经机器翻译中的作用是对源语句子中的信息进行抽象和提取。通常这个过程会将离散的词序列编码成一组上下文相关的向量表示,即:序列的每个位置都会有一个向量。句子级预训练模型正是要学习这种序列的表示向量。从学习方式上看,预训练模型可以分为:自回归模型、自编吗模型 xxx
{
\color
{
red
}
找一些综述看看,论文非常多,可以引用一些在这小节。然后进一步描述,稍微介绍一下基本概念和模型结构,还有训练方式
}
预训练的结果可以作为编码器的初始状态。然而在实践中发现,这种参数初始化的方法在一些富资源语种上提升效果并不明显,甚至反而有些下降
\upcite
{
DBLP:journals/corr/abs-2002-06823
}
(
{
\color
{
red
}
参考文献!
}
)。原因可能在于预训练模型和编码器虽然都是对句子进行表示,但是由于目标任务不一致,二者的参数状态还是存在区别的。因此,也有一些做法将预训练模型和翻译模型在结构上进行融合,将预训练句子模型作为一个独立的模块来为编码器或者解码器提供句子级表示信息
\upcite
{
DBLP:journals/corr/abs-2002-06823
}
。
\vspace
{
0.5em
}
\item
{
\small\sffamily\bfnew
{
序列到序列预训练
}}
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论