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
2631bdd6
Commit
2631bdd6
authored
Sep 09, 2020
by
曹润柘
Browse files
Options
Browse Files
Download
Plain Diff
合并分支 'caorunzhe' 到 'master'
Caorunzhe 查看合并请求
!171
parents
4c220ec5
854fd490
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
5 行增加
和
5 行删除
+5
-5
Chapter10/chapter10.tex
+5
-5
没有找到文件。
Chapter10/chapter10.tex
查看文件 @
2631bdd6
...
...
@@ -377,7 +377,7 @@ NMT & $ 21.7^{\ast}$ & $18.7^{\ast}$ & -1
\parinterval
可以说循环神经网络和注意力机制构成了当时神经机器翻译的标准框架。比较有代表性的工作是谷歌公司于2016年上线的谷歌神经机器翻译系统(GNMT),它是由多层循环神经网络(长短时记忆模型)以及注意力机制搭建,且在当时来看性能很强劲的翻译模型
\upcite
{
Wu2016GooglesNM
}
。这项工作也引起了广泛的关注(图
\ref
{
fig:10-8
}
),甚至可以被看作是神经机器翻译进入飞速发展时期的一个重要的标志。在GNMT推出后,很多企业也推出了基于循环神经网络的神经机器翻译系统,出现了百花齐放的局面。
\parinterval
本节将会从基于循环神经网络的翻译模型
和注意力机制
入手,介绍神经机器翻译的基本方法。同时也会以GNMT系统为例,对神经机器翻译的其他相关技术进行讨论。
\parinterval
本节将会从基于循环神经网络的翻译模型入手,介绍神经机器翻译的基本方法。同时也会以GNMT系统为例,对神经机器翻译的其他相关技术进行讨论。
%----------------------------------------------
\begin{figure}
[htp]
...
...
@@ -402,7 +402,7 @@ NMT & $ 21.7^{\ast}$ & $18.7^{\ast}$ & -1
\parinterval
显然,根据上下文中提到的“没吃饭”、“很饿”,最佳的答案是“吃 饭”或者“吃 东西”。也就是,对序列中某个位置的答案进行预测时需要记忆当前时刻之前的序列信息,因此,
{
\small\bfnew
{
循环神经网络
}}
\index
{
循环神经网络
}
(Recurrent Neural Network, RNN)
\index
{
Recurrent Neural Network, RNN
}
应运而生。实际上循环神经网络有着极为广泛的应用,例如语音识别、语言建模以及即将要介绍的神经机器翻译。
\parinterval
第
五
章已经对循环神经网络的基本知识进行过介绍。这里再回顾一下。简单来说,循环神经网络由循环单元组成。对于序列中的任意时刻,都有一个循环单元与之对应,它会融合当前时刻的输入和上一时刻循环单元的输出,生成当前时刻的输出。这样每个时刻的信息都会被传递到下一时刻,这也间接达到了记录历史信息的目的。比如,对于序列
$
\seq
{
x
}
=
\{
x
_
1
, x
_
2
,..., x
_
m
\}
$
,循环神经网络会按顺序输出一个序列
$
\vectorn
{
h
}
=
\{
\vectorn
{
h
}_
1
,
\vectorn
{
h
}_
2
,...,
\vectorn
{
h
}_
m
\}
$
,其中
$
\vectorn
{
h
}_
i
$
表示
$
i
$
时刻循环神经网络的输出(通常为一个向量)。
\parinterval
第
九
章已经对循环神经网络的基本知识进行过介绍。这里再回顾一下。简单来说,循环神经网络由循环单元组成。对于序列中的任意时刻,都有一个循环单元与之对应,它会融合当前时刻的输入和上一时刻循环单元的输出,生成当前时刻的输出。这样每个时刻的信息都会被传递到下一时刻,这也间接达到了记录历史信息的目的。比如,对于序列
$
\seq
{
x
}
=
\{
x
_
1
, x
_
2
,..., x
_
m
\}
$
,循环神经网络会按顺序输出一个序列
$
\vectorn
{
h
}
=
\{
\vectorn
{
h
}_
1
,
\vectorn
{
h
}_
2
,...,
\vectorn
{
h
}_
m
\}
$
,其中
$
\vectorn
{
h
}_
i
$
表示
$
i
$
时刻循环神经网络的输出(通常为一个向量)。
\parinterval
图
\ref
{
fig:10-9
}
展示了一个循环神经网络处理序列问题的实例。当前时刻循环单元的输入由上一个时刻的输入和当前时刻的输入组成,因此也可以理解为,网络当前时刻计算得到的输出是由之前的序列共同决定的,即网络在不断地传递信息的过程中记忆了历史信息。以最后一个时刻的循环单元为例,它在对“开始”这个单词的信息进行处理时,参考了之前所有词(“<sos>
\
让
\
我们”)的信息。
...
...
@@ -905,7 +905,7 @@ L(\vectorn{Y},\widehat{\vectorn{Y}}) = \sum_{j=1}^n L_{\textrm{ce}}(\vectorn{y}_
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\vspace
{
1.0em
}
\subsubsection
{
贪婪搜索
}
\subsubsection
{
1.
贪婪搜索
}
\vspace
{
0.6em
}
\parinterval
图
\ref
{
fig:10-32
}
展示了一个基于贪婪方法的神经机器翻译解码过程。每一个时间步的单词预测都依赖于其前一步单词的生成。在解码第一个单词时,由于没有之前的单词信息,会用<sos>进行填充,作为起始的单词,且会用一个零向量(可以理解为没有之前时间步的信息)表示第0步的中间层状态。
\vspace
{
0.8em
}
...
...
@@ -937,7 +937,7 @@ L(\vectorn{Y},\widehat{\vectorn{Y}}) = \sum_{j=1}^n L_{\textrm{ce}}(\vectorn{y}_
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection
{
束搜索
}
\subsubsection
{
2.
束搜索
}
\vspace
{
0.5em
}
\parinterval
束搜索是一种启发式图搜索算法。相比于全搜索,它可以减少搜索所占用的空间和时间,在每一步扩展的时候,剪掉一些质量比较差的结点,保留下一些质量较高的结点。具体到机器翻译任务,对于每一个目标语位置,束搜索选择了概率最大的前
$
K
$
个单词进行扩展(其中
$
K
$
叫做束宽度,或简称为束宽)。如图
\ref
{
fig:10-34
}
所示,假设
\{
$
y
_
1
, y
_
2
,..., y
_
n
$
\}
表示生成的目标语序列,且
$
K
=
3
$
,则束搜索的具体过程为:在预测第一个位置时,可以通过模型得到
$
y
_
1
$
的概率分布,选取概率最大的前3个单词作为候选结果(假设分别为“have”, “has”, “it”)。在预测第二个位置的单词时,模型针对已经得到的三个候选结果(“have”, “has”, “it”)计算第二个单词的概率分布。例如,可以在将“have”作为第二步的输入,计算
$
y
_
2
$
的概率分布。此时,译文序列的概率为
...
...
@@ -963,7 +963,7 @@ L(\vectorn{Y},\widehat{\vectorn{Y}}) = \sum_{j=1}^n L_{\textrm{ce}}(\vectorn{y}_
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection
{
长度惩罚
}
\subsubsection
{
3.
长度惩罚
}
\parinterval
这里用
$
\funp
{
P
}
(
\vectorn
{
y
}
|
\vectorn
{
x
}
)
=
\prod
_{
j
=
1
}^
n
\funp
{
P
}
(
y
_
j |
\vectorn
{
y
}_{
<j
}
,
\vectorn
{
x
}
)
$
作为翻译模型。直接实现这个公式有一个明显的缺点:当句子过长时乘法运算容易产生溢出,也就是多个数相乘可能会产生浮点数无法表示的运算结果。为了解决这个问题,可以利用对数操作将乘法转换为加法,得到新的概率公式:
$
\textrm
{
log
}
\funp
{
P
}
(
\vectorn
{
y
}
|
\vectorn
{
x
}
)
=
\sum
_{
j
=
1
}^
n
\textrm
{
log
}
\funp
{
P
}
(
y
_
j |
\vectorn
{
y
}_{
<j
}
,
\vectorn
{
x
}
)
$
,对数函数不会改变函数的单调性,因此在具体实现时,通常用
$
\textrm
{
log
}
\funp
{
P
}
(
\vectorn
{
y
}
|
\vectorn
{
x
}
)
$
表示句子的得分,而不用
$
\funp
{
P
}
(
\vectorn
{
y
}
|
\vectorn
{
x
}
)
$
。
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论