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
4b7e3a3c
Commit
4b7e3a3c
authored
4 years ago
by
xiaotong
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of 47.105.50.196:NiuTrans/mtbookv2
parents
5e027d60
57796638
隐藏空白字符变更
内嵌
并排
正在显示
9 个修改的文件
包含
56 行增加
和
45 行删除
+56
-45
Chapter10/Figures/mt-history.png
+0
-0
Chapter10/chapter10.tex
+2
-2
Chapter11/chapter11.tex
+20
-19
Chapter12/Figures/figure-position-of-difference-and-layer-regularization-in-the-model.tex
+6
-4
Chapter12/Figures/figure-position-of-feedforward-neural-network-in-the-model.tex
+6
-4
Chapter12/Figures/figure-position-of-self-attention-mechanism-in-the-model.tex
+6
-4
Chapter12/Figures/figure-transformer-input-and-position-encoding.tex
+6
-4
Chapter12/Figures/figure-transformer.tex
+6
-4
Chapter12/chapter12.tex
+4
-4
没有找到文件。
Chapter10/Figures/mt-history.png
查看文件 @
4b7e3a3c
245 KB
|
W:
|
H:
245 KB
|
W:
|
H:
2-up
Swipe
Onion skin
This diff is collapsed.
Click to expand it.
Chapter10/chapter10.tex
查看文件 @
4b7e3a3c
...
@@ -78,13 +78,13 @@
...
@@ -78,13 +78,13 @@
\vspace
{
0.3em
}
\vspace
{
0.3em
}
\item
早在2013年,Nal Kalchbrenner和Phil Blunsom提出了一个基于编码器-解码器结构的新模型
\upcite
{
kalchbrenner-blunsom-2013-recurrent
}
。该模型用卷积神经网络(CNN)将源语言编码成实数向量,之后用循环神经网络(RNN)将连续向量转换成目标语言。这使得模型不需要进行词对齐、特征提取等工作,就能够自动学习源语言的信息。这也是一种端到端学习的方法。不过,这项工作的实现较复杂,而且方法存在梯度消失/爆炸等问题
\upcite
{
HochreiterThe,BENGIO1994Learning
}
,因此并没有成为后来神经机器翻译的基础框架。
\item
早在2013年,Nal Kalchbrenner和Phil Blunsom提出了一个基于编码器-解码器结构的新模型
\upcite
{
kalchbrenner-blunsom-2013-recurrent
}
。该模型用卷积神经网络(CNN)将源语言编码成实数向量,之后用循环神经网络(RNN)将连续向量转换成目标语言。这使得模型不需要进行词对齐、特征提取等工作,就能够自动学习源语言的信息。这也是一种端到端学习的方法。不过,这项工作的实现较复杂,而且方法存在梯度消失/爆炸等问题
\upcite
{
HochreiterThe,BENGIO1994Learning
}
,因此并没有成为后来神经机器翻译的基础框架。
\vspace
{
0.3em
}
\vspace
{
0.3em
}
\item
2014年,Ilya Sutskever等人提出了序列到序列(seq2seq)学习的方法,同时将长短时记忆结构(LSTM)引入到神经机器翻译中,这个方法
解决
了梯度消失/爆炸的问题,并且通过遗忘门的设计让网络选择性地记忆信息,缓解了序列中长距离依赖的问题
\upcite
{
NIPS2014
_
5346
}
。但是该模型在进行编码的过程中,将不同长度的源语言句子压缩成了一个固定长度的向量,句子越长,损失的信息越多,同时该模型无法对输入和输出序列之间的对齐进行建模,因此并不能有效的保证翻译质量。
\item
2014年,Ilya Sutskever等人提出了序列到序列(seq2seq)学习的方法,同时将长短时记忆结构(LSTM)引入到神经机器翻译中,这个方法
缓解
了梯度消失/爆炸的问题,并且通过遗忘门的设计让网络选择性地记忆信息,缓解了序列中长距离依赖的问题
\upcite
{
NIPS2014
_
5346
}
。但是该模型在进行编码的过程中,将不同长度的源语言句子压缩成了一个固定长度的向量,句子越长,损失的信息越多,同时该模型无法对输入和输出序列之间的对齐进行建模,因此并不能有效的保证翻译质量。
\vspace
{
0.3em
}
\vspace
{
0.3em
}
\item
同年Dzmitry Bahdanau等人首次将
{
\small\bfnew
{
注意力机制
}}
\index
{
注意力机制
}
(Attention Mechanism
\index
{
Attention Mechanism
}
)应用到机器翻译领域,在机器翻译任务上对翻译和局部翻译单元之间的对应关系同时建模
\upcite
{
bahdanau2014neural
}
。Bahdanau等人工作的意义在于,使用了更加有效的模型来表示源语言的信息,同时使用注意力机制对两种语言不同部分之间的相互联系进行建模。这种方法可以有效地处理长句子的翻译,而且注意力的中间结果具有一定的可解释性
\footnote
{
比如,目标语言和源语言句子不同单词之间的注意力强度能够在一定程度上反应单词之间的互译程度。
}
。然而相比于前人的神经机器翻译模型,注意力模型也引入了额外的成本,计算量较大。
\item
同年Dzmitry Bahdanau等人首次将
{
\small\bfnew
{
注意力机制
}}
\index
{
注意力机制
}
(Attention Mechanism
\index
{
Attention Mechanism
}
)应用到机器翻译领域,在机器翻译任务上对翻译和局部翻译单元之间的对应关系同时建模
\upcite
{
bahdanau2014neural
}
。Bahdanau等人工作的意义在于,使用了更加有效的模型来表示源语言的信息,同时使用注意力机制对两种语言不同部分之间的相互联系进行建模。这种方法可以有效地处理长句子的翻译,而且注意力的中间结果具有一定的可解释性
\footnote
{
比如,目标语言和源语言句子不同单词之间的注意力强度能够在一定程度上反应单词之间的互译程度。
}
。然而相比于前人的神经机器翻译模型,注意力模型也引入了额外的成本,计算量较大。
\vspace
{
0.3em
}
\vspace
{
0.3em
}
\item
2016年谷歌公司发布了基于多层循环神经网络方法的GNMT系统。该系统集成了当时的神经机器翻译技术,并进行了诸多的改进。它的性能显著优于基于短语的机器翻译系统
\upcite
{
Wu2016GooglesNM
}
,引起了研究者的广泛关注。在之后不到一年的时间里,脸书公司采用卷积神经网络(CNN)研发了新的神经机器翻译系统
\upcite
{
DBLP:journals/corr/GehringAGYD17
}
,实现了比基于循环神经网络(RNN)系统更高的翻译水平,并大幅提升翻译速度。
\item
2016年谷歌公司发布了基于多层循环神经网络方法的GNMT系统。该系统集成了当时的神经机器翻译技术,并进行了诸多的改进。它的性能显著优于基于短语的机器翻译系统
\upcite
{
Wu2016GooglesNM
}
,引起了研究者的广泛关注。在之后不到一年的时间里,脸书公司采用卷积神经网络(CNN)研发了新的神经机器翻译系统
\upcite
{
DBLP:journals/corr/GehringAGYD17
}
,实现了比基于循环神经网络(RNN)系统更高的翻译水平,并大幅提升翻译速度。
\vspace
{
0.3em
}
\vspace
{
0.3em
}
\item
2017年,Ashish Vaswani等人提出了新的翻译模型Transformer。其完全
抛弃了CNN、RNN等结构,仅仅通过自
注意力机制和前馈神经网络,不需要使用序列对齐的循环框架就展示出强大的性能,并且巧妙地解决了翻译中长距离依赖问题
\upcite
{
vaswani2017attention
}
。Transformer是第一个完全基于注意力机制搭建的模型,不仅训练速度更快,在翻译任务上也获得了更好的结果,一跃成为目前最主流的神经机器翻译框架。
\item
2017年,Ashish Vaswani等人提出了新的翻译模型Transformer。其完全
摒弃了循环神经网络和卷积神经网络,仅仅通过多头
注意力机制和前馈神经网络,不需要使用序列对齐的循环框架就展示出强大的性能,并且巧妙地解决了翻译中长距离依赖问题
\upcite
{
vaswani2017attention
}
。Transformer是第一个完全基于注意力机制搭建的模型,不仅训练速度更快,在翻译任务上也获得了更好的结果,一跃成为目前最主流的神经机器翻译框架。
\vspace
{
0.3em
}
\vspace
{
0.3em
}
\end{itemize}
\end{itemize}
...
...
This diff is collapsed.
Click to expand it.
Chapter11/chapter11.tex
查看文件 @
4b7e3a3c
...
@@ -85,17 +85,21 @@
...
@@ -85,17 +85,21 @@
\end{figure}
\end{figure}
%----------------------------------------------
%----------------------------------------------
\parinterval
若设输入矩阵为
$
\mathbi
{
x
}$
,输出矩阵为
$
\mathbi
{
o
}$
,卷积滑动步幅为
$
\textrm
{
stride
}$
,卷积核为
$
\mathbi
{
w
}$
,且
$
\mathbi
{
w
}
\in
\mathbb
{
R
}^{
Q
\times
U
}
$
,那么卷积计算的公式为:
\parinterval
在卷积计算中,不同深度下卷积核不同但是执行操作相同,这里以二维卷积核为例展示具体卷积计算。若设输入矩阵为
$
\mathbi
{
x
}$
,输出矩阵为
$
\mathbi
{
y
}$
,卷积滑动步幅为
$
\textrm
{
stride
}$
,卷积核为
$
\mathbi
{
w
}$
,且
$
\mathbi
{
w
}
\in
\mathbb
{
R
}^{
Q
\times
U
}
$
,那么卷积计算的公式为:
\begin{eqnarray}
\begin{eqnarray}
\mathbi
{
o
}_{
i,j
}
=
\sum
\mathbi
{
x
}_{
[j
\times
\textrm
{
stride
}
:j
\times
\textrm
{
stride
}
+U-1,i
\times
\textrm
{
stride
}
:i
\times
\textrm
{
stride
}
+Q-1]
}
\odot
\mathbi
{
w
}
\mathbi
{
y
}_{
i,j
}
=
\sum
_
s
\sum
_
t (
\mathbi
{
x
}_{
[j
\times
\textrm
{
stride
}
:j
\times
\textrm
{
stride
}
+U-1,i
\times
\textrm
{
stride
}
:i
\times
\textrm
{
stride
}
+Q-1]
}
\odot
\mathbi
{
w
}
)
_{
s,t
}
\label
{
eq:11-1-new
}
\label
{
eq:11-1-new
}
\end{eqnarray}
\end{eqnarray}
\noindent
图
\ref
{
fig:11-4
}
展示了一个简单的卷积操作示例,卷积核大小为
$
2
\times
2
$
,图像大小为
$
3
\times
3
$
,将卷积核在图像上依次进行滑动,滑动步幅为1,根据公式
\eqref
{
eq:11-1-new
}
,图中
输出矩阵第0个值
$
\mathbi
{
o
}_{
0
,
0
}$
的计算为:
\noindent
图
\ref
{
fig:11-4
}
展示了一个简单的卷积操作示例,卷积核大小为
$
2
\times
2
$
,图像大小为
$
3
\times
3
$
,将卷积核在图像上依次进行滑动,滑动步幅为1,根据公式
\eqref
{
eq:11-1-new
}
,图中
蓝色位置
$
\mathbi
{
y
}_{
0
,
0
}$
的计算为:
\begin{eqnarray}
\begin{eqnarray}
\mathbi
{
o
}_{
0,0
}
&
=
&
\sum
\mathbi
{
x
}_{
[0
\times
1:0
\times
1+2-1,0
\times
1:0
\times
1+2-1]
}
\odot
\mathbi
{
w
}
\nonumber
\\
\mathbi
{
y
}_{
0,0
}
&
=
&
\sum
_
s
\sum
_
t (
\mathbi
{
x
}_{
[0
\times
1:0
\times
1+2-1,0
\times
1:0
\times
1+2-1]
}
\odot
\mathbi
{
w
}
)
_{
s,t
}
\nonumber
\\
&
=
&
\sum
\mathbi
{
x
}_{
[0:1,0:1]
}
\odot
\mathbi
{
w
}
\nonumber
\nonumber
\\
&
=
&
\sum
_
s
\sum
_
t (
\mathbi
{
x
}_{
[0:1,0:1]
}
\odot
\mathbi
{
w
}
)
_{
s,t
}
\nonumber
\\
&
=
&
0
\times
0 + 1
\times
1 + 2
\times
3 + 3
\times
4
\nonumber
\\
&
=
&
\sum
_
s
\sum
_
t
\begin{pmatrix}
0
\times
0
&
1
\times
1
\\
3
\times
2
&
4
\times
3
\end{pmatrix}
_{
s,t
}
\nonumber
\\
&
=
&
0
\times
0 + 1
\times
1 + 3
\times
2 + 4
\times
3
\nonumber
\\
&
=
&
19
&
=
&
19
\label
{
eq:11-2-new
}
\label
{
eq:11-2-new
}
\end{eqnarray}
\end{eqnarray}
...
@@ -288,7 +292,7 @@
...
@@ -288,7 +292,7 @@
\parinterval
门控机制在
{
\chapterten
}
中介绍LSTM模型时已经提到过。在LSTM模型中,可以通过引入三个门控单元来控制信息流,使隐层状态能够获得长时间记忆。同时,门控单元的引入简化了不同时间步间状态更新的计算,只包括一些线性计算,缓解了长距离建模中梯度消失的问题。在多层卷积神经网络中,同样可以通过门控机制来起到相同的作用。
\parinterval
门控机制在
{
\chapterten
}
中介绍LSTM模型时已经提到过。在LSTM模型中,可以通过引入三个门控单元来控制信息流,使隐层状态能够获得长时间记忆。同时,门控单元的引入简化了不同时间步间状态更新的计算,只包括一些线性计算,缓解了长距离建模中梯度消失的问题。在多层卷积神经网络中,同样可以通过门控机制来起到相同的作用。
\parinterval
图
\ref
{
fig:11-14
}
是单层门控卷积神经网络的基本结构,
$
\mathbi
{
X
}
\in
\mathbb
{
R
}^{
m
\times
d
}$
为单层网络的输入,
$
\mathbi
{
Y
}
\in
\mathbb
{
R
}^{
m
\times
d
}$
为单层网络的输出,网络结构主要包括卷积计算和GLU非线性单元两部分。
\parinterval
图
\ref
{
fig:11-14
}
是单层门控卷积神经网络的基本结构,
$
\mathbi
{
x
}
\in
\mathbb
{
R
}^{
m
\times
d
}$
为单层网络的输入,
$
\mathbi
{
y
}
\in
\mathbb
{
R
}^{
m
\times
d
}$
为单层网络的输出,网络结构主要包括卷积计算和GLU非线性单元两部分。
%----------------------------------------------
%----------------------------------------------
% 图14.
% 图14.
...
@@ -335,7 +339,7 @@
...
@@ -335,7 +339,7 @@
\subsection
{
残差网络
}
\subsection
{
残差网络
}
\label
{
sec:11.2.3
}
\label
{
sec:11.2.3
}
\parinterval
残差连接是一种训练深层网络的技术,其
结构如图
\ref
{
fig:11-15
}
所示
,即在多层神经网络之间通过增加直接连接的方式,从而将底层信息直接传递给上层。通过增加这样的直接连接,可以让不同层之间的信息传递更加高效,有利于深层神经网络的训练,其计算公式为:
\parinterval
残差连接是一种训练深层网络的技术,其
内容在
{
\chapternine
}
已经进行了介绍
,即在多层神经网络之间通过增加直接连接的方式,从而将底层信息直接传递给上层。通过增加这样的直接连接,可以让不同层之间的信息传递更加高效,有利于深层神经网络的训练,其计算公式为:
\begin{eqnarray}
\begin{eqnarray}
\mathbi
{
h
}^{
l+1
}
= F (
\mathbi
{
h
}^
l) +
\mathbi
{
h
}^
l
\mathbi
{
h
}^{
l+1
}
= F (
\mathbi
{
h
}^
l) +
\mathbi
{
h
}^
l
\label
{
eq:11-3
}
\label
{
eq:11-3
}
...
@@ -343,7 +347,7 @@
...
@@ -343,7 +347,7 @@
\noindent
其中,
$
\mathbi
{
h
}^
l
$
表示
$
l
$
层神经网络的输入向量,
${
F
}
(
\mathbi
{
h
}^
l
)
$
是
$
l
$
层神经网络的运算。如果
$
l
=
2
$
,那么公式
\eqref
{
eq:11-3
}
可以解释为:第3层的输入
$
\mathbi
{
h
}^
3
$
等于第2层的输出
${
F
}
(
\mathbi
{
h
}^
2
)
$
加上第2层的输入
$
\mathbi
{
h
}^
2
$
。
\noindent
其中,
$
\mathbi
{
h
}^
l
$
表示
$
l
$
层神经网络的输入向量,
${
F
}
(
\mathbi
{
h
}^
l
)
$
是
$
l
$
层神经网络的运算。如果
$
l
=
2
$
,那么公式
\eqref
{
eq:11-3
}
可以解释为:第3层的输入
$
\mathbi
{
h
}^
3
$
等于第2层的输出
${
F
}
(
\mathbi
{
h
}^
2
)
$
加上第2层的输入
$
\mathbi
{
h
}^
2
$
。
\parinterval
在ConvS2S中残差连接主要应用于门控卷积神经网络和多跳自注意力机制中,比如在
多层的
门控卷积神经网络中,在每一层的输入和输出之间增加残差连接,具体的数学描述如下:
\parinterval
在ConvS2S中残差连接主要应用于门控卷积神经网络和多跳自注意力机制中,比如在
编码器的多层
门控卷积神经网络中,在每一层的输入和输出之间增加残差连接,具体的数学描述如下:
\begin{eqnarray}
\begin{eqnarray}
%\mathbi{h}_i^l = \funp{v} (\mathbi{W}^l [\mathbi{h}_{i-\frac{k}{2}}^{l-1},...,\mathbi{h}_{i+\frac{k}{2}}^{l-1}] + b_{\mathbi{W}}^l ) + \mathbi{h}_i^{l-1}
%\mathbi{h}_i^l = \funp{v} (\mathbi{W}^l [\mathbi{h}_{i-\frac{k}{2}}^{l-1},...,\mathbi{h}_{i+\frac{k}{2}}^{l-1}] + b_{\mathbi{W}}^l ) + \mathbi{h}_i^{l-1}
\mathbi
{
h
}^{
l+1
}
=
\mathbi
{
A
}^{
l
}
\otimes
\sigma
(
\mathbi
{
B
}^{
l
}
) +
\mathbi
{
h
}^{
l
}
\mathbi
{
h
}^{
l+1
}
=
\mathbi
{
A
}^{
l
}
\otimes
\sigma
(
\mathbi
{
B
}^{
l
}
) +
\mathbi
{
h
}^{
l
}
...
@@ -379,36 +383,33 @@
...
@@ -379,36 +383,33 @@
\noindent
其中,
$
\mathbi
{
h
}_
i
$
表示源语端第
$
i
$
个位置的隐层状态,即编码器在第
$
i
$
个位置的输出。
$
\mathbi
{
s
}_
j
$
表示目标端第
$
j
$
个位置的隐层状态。给定
$
\mathbi
{
s
}_
j
$
和
$
\mathbi
{
h
}_
i
$
,注意力机制通过函数
$
\funp
{
a
}
(
\cdot
)
$
计算目标语言表示
$
\mathbi
{
s
}_
j
$
与源语言表示
$
\mathbi
{
h
}_
i
$
之间的注意力权重
$
\alpha
_{
i,j
}$
,通过加权平均得到当前目标端位置所需的上下文表示
$
\mathbi
{
C
}_
j
$
。其中
$
\funp
{
a
}
(
\cdot
)
$
的具体计算方式在
{
\chapterten
}
已经详细讨论。
\noindent
其中,
$
\mathbi
{
h
}_
i
$
表示源语端第
$
i
$
个位置的隐层状态,即编码器在第
$
i
$
个位置的输出。
$
\mathbi
{
s
}_
j
$
表示目标端第
$
j
$
个位置的隐层状态。给定
$
\mathbi
{
s
}_
j
$
和
$
\mathbi
{
h
}_
i
$
,注意力机制通过函数
$
\funp
{
a
}
(
\cdot
)
$
计算目标语言表示
$
\mathbi
{
s
}_
j
$
与源语言表示
$
\mathbi
{
h
}_
i
$
之间的注意力权重
$
\alpha
_{
i,j
}$
,通过加权平均得到当前目标端位置所需的上下文表示
$
\mathbi
{
C
}_
j
$
。其中
$
\funp
{
a
}
(
\cdot
)
$
的具体计算方式在
{
\chapterten
}
已经详细讨论。
\parinterval
在ConvS2S模型中,解码
端的每一层中都引入了注意力机制,同时通过残差连接的方式将结果作用于上层网络的计算,因此称之为多跳注意力。 ConvS2S模型选取向量乘的方式作为
$
\funp
{
a
}
(
\cdot
)
$
函数具体的数学描述为
:
\parinterval
在ConvS2S模型中,解码
器同样采用堆叠的多层门控卷积网络来对目标语言进行序列建模。区别于编码器,解码器在每一层卷积网络之后引入了注意力机制,用来参考源语言信息。ConvS2S选用了点乘注意力,并且通过类似残差连接的方式将注意力操作的输入与输出同时作用于下一层计算,称为多跳注意力。其具体计算方式如下
:
\begin{eqnarray}
\begin{eqnarray}
\alpha
_{
ij
}^
l =
\frac
{
\textrm
{
exp
}
(
\mathbi
{
d
}_{
j
}^
l
,
\mathbi
{
h
}_
i)
}{
\sum
_{
i
^{
'
}
=1
}^
m
\textrm
{
exp
}
(
\mathbi
{
d
}_{
j
}^
l,
\mathbi
{
h
}_{
i
^{
'
}}
)
}
\alpha
_{
ij
}^
l =
\frac
{
\textrm
{
exp
}
(
\mathbi
{
d
}_{
j
}^
l
\mathbi
{
h
}_
i)
}{
\sum
_{
i
^{
'
}
=1
}^
m
\textrm
{
exp
}
(
\mathbi
{
d
}_{
j
}^
l
\mathbi
{
h
}_{
i
^{
'
}}
)
}
\label
{
eq:11-6-1
}
\label
{
eq:11-6-1
}
\end{eqnarray}
\end{eqnarray}
\noindent
其中,
$
\mathbi
{
d
}_{
j
}^
l
$
表示了第
$
l
$
层的解码端第
$
j
$
个位置的输出状态,
$
\alpha
_{
ij
}^
l
$
代表第
$
l
$
层中源语言第
$
i
$
个位置与目标语言第
$
j
$
个位置之间的注意力权重。需要注意的是,这里
$
\mathbi
{
d
}_{
j
}^
l
$
并不是解码器隐藏层输出的状态
$
\mathbi
{
s
}_{
j
}^{
l
}
$
。而是先将
$
\mathbi
{
s
}_{
j
}^{
l
}$
进行卷积操作,之后与目标语言端的词嵌入
$
\mathbi
{
g
}_
j
$
进行累加得到
$
\mathbi
{
d
}_{
j
}^
l
$
,数学描述如下:
\noindent
不同于公式
\eqref
{
eq:11-5
}
中使用的目标语端隐层表示
$
\mathbi
{
s
}_{
j
-
1
}$
,公式
\eqref
{
eq:11-6-1
}
中的
$
\mathbi
{
d
}_{
j
}^
l
$
同时结合了
$
\mathbi
{
s
}_{
j
}$
的卷积计算结果和目标语端的词嵌入
$
\mathbi
{
g
}_
j
$
,其具体计算公式如下:
\begin{eqnarray}
\begin{eqnarray}
\mathbi
{
d
}_{
j
}^
l
&
=
&
\mathbi
{
W
}_{
d
}^{
l
}
\mathbi
{
z
}_{
j
}^{
l
}
+
\mathbi
{
b
}_{
d
}^{
l
}
+
\mathbi
{
g
}_
j
\\
\mathbi
{
d
}_{
j
}^
l
&
=
&
\mathbi
{
W
}_{
d
}^{
l
}
\mathbi
{
z
}_{
j
}^{
l
}
+
\mathbi
{
b
}_{
d
}^{
l
}
+
\mathbi
{
g
}_
j
\\
\mathbi
{
z
}_
j
^
l
&
=
&
Conv
(
\mathbi
{
s
}_
j
^
l)
\mathbi
{
z
}_
j
^
l
&
=
&
\textrm
{
Conv
}
(
\mathbi
{
s
}_
j
^
l)
\label
{
eq:11-6-2
}
\label
{
eq:11-6-2
}
\end{eqnarray}
\end{eqnarray}
\noindent
其中,
$
\mathbi
{
W
}_{
d
}^{
l
}$
和
$
\mathbi
{
b
}_{
d
}^{
l
}$
是模型参数,同时解码端每一层都使用独立的矩阵参数,
$
Conv
(
\cdot
)
$
表示卷积操作。此外,第
$
l
$
层的上下文表示向量
$
\mathbi
{
C
}_
j
^
l
$
由如下步骤计算得到:将第
$
l
$
层编码端输出
$
\mathbi
{
h
}_
i
$
与源语言的词嵌入表示
$
\mathbi
{
e
}_
i
$
进行累加,之后将累加的结果用注意力权重
$
\alpha
_{
ij
}^
l
$
加权平均,数学描述如下
:
\noindent
其中,
$
\mathbi
{
z
}_
j
^
l
$
表示第
$
l
$
层卷积网络输出中第
$
j
$
个位置的表示,
$
\mathbi
{
W
}_{
d
}^{
l
}$
和
$
\mathbi
{
b
}_{
d
}^{
l
}$
是模型可学习的参数,
$
\textrm
{
Conv
}
(
\cdot
)
$
表示卷积操作。在获得第
$
l
$
层的注意力权重之后,就可以得到对应的一个上下文表示
$
\mathbi
{
C
}_
j
^
l
$
:
\begin{eqnarray}
\begin{eqnarray}
\mathbi
{
C
}_
j
^
l =
\sum
_
i
\alpha
_{
ij
}^
l (
\mathbi
{
h
}_
i +
\mathbi
{
e
}_
i)
\mathbi
{
C
}_
j
^
l =
\sum
_
i
\alpha
_{
ij
}^
l (
\mathbi
{
h
}_
i +
\mathbi
{
e
}_
i)
\label
{
eq:11-7
}
\label
{
eq:11-7
}
\end{eqnarray}
\end{eqnarray}
\noindent
通过结合底层的词嵌入表示,模型可以考虑到每个输入元素独立的信息,更好地帮助模型捕获源语言与目标语言之间的联系。
\noindent
模型使用了更全面的源语言信息,同时考虑了源语言端编码表示
$
\mathbi
{
h
}_
i
$
以及词嵌入表示
$
\mathbi
{
e
}_
i
$
。在获得第
$
l
$
层的上下文向量
$
\mathbi
{
C
}_
j
^
l
$
后,模型将其与
$
\mathbi
{
z
}_
j
^
l
$
相加后送入下一层网络,这个过程可以被描述为:
\parinterval
当得到上下文向量
$
\mathbi
{
C
}_
j
^
l
$
后,将其与
$
\mathbi
{
z
}_
j
^
l
$
相加后送入下一层计算,这种机制也被称为多跳机制。这个过程可以被描述为:
\begin{eqnarray}
\begin{eqnarray}
\mathbi
{
s
}_
j
^{
l+1
}
=
\mathbi
{
C
}_
j
^
l +
\mathbi
{
z
}_
j
^
l
\mathbi
{
s
}_
j
^{
l+1
}
=
\mathbi
{
C
}_
j
^
l +
\mathbi
{
z
}_
j
^
l
\label
{
eq:11-8
}
\label
{
eq:11-8
}
\end{eqnarray}
\end{eqnarray}
\
parinterval
与循环网络中的注意力机制相比,该机制能够帮助模型甄别已经考虑了哪些先前的输入。 也就是说,多跳
注意力机制会考虑模型之前更关注哪些单词,并且之后层中执行多次注意力的“跳跃”。
\
noindent
与循环网络中的注意力机制相比,该机制能够帮助模型甄别已经考虑了哪些先前的输入。也就是说,多跳的
注意力机制会考虑模型之前更关注哪些单词,并且之后层中执行多次注意力的“跳跃”。
%----------------------------------------------------------------------------------------
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
% NEW SUB-SECTION
...
...
This diff is collapsed.
Click to expand it.
Chapter12/Figures/figure-position-of-difference-and-layer-regularization-in-the-model.tex
查看文件 @
4b7e3a3c
...
@@ -16,8 +16,9 @@
...
@@ -16,8 +16,9 @@
\node
[Resnode,anchor=south] (res1) at ([yshift=0.3em]sa1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res1) at ([yshift=0.3em]sa1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[ffnnode,anchor=south] (ffn1) at ([yshift=1em]res1.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[ffnnode,anchor=south] (ffn1) at ([yshift=1em]res1.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[Resnode,anchor=south] (res2) at ([yshift=0.3em]ffn1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res2) at ([yshift=0.3em]ffn1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[inputnode,anchor=north west] (input1) at ([yshift=-1em]sa1.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[inputnode,anchor=north west] (input1) at ([yshift=-1em,xshift=-0.5em]sa1.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[posnode,anchor=north east] (pos1) at ([yshift=-1em]sa1.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[] (add) at ([yshift=-1.6em,xshift=3.5em]sa1.south west)
{$
+
$}
;
\node
[posnode,anchor=north east] (pos1) at ([yshift=-1em,xshift=0.5em]sa1.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[anchor=north] (inputs) at ([yshift=-3em]sa1.south)
{
\scriptsize
{$
\textbf
{
编码器输入: 我
\ \
很
\ \
好
}$}}
;
\node
[anchor=north] (inputs) at ([yshift=-3em]sa1.south)
{
\scriptsize
{$
\textbf
{
编码器输入: 我
\ \
很
\ \
好
}$}}
;
\node
[anchor=south] (encoder) at ([xshift=0.2em,yshift=0.6em]res2.north west)
{
\scriptsize
{
\textbf
{
编码器
}}}
;
\node
[anchor=south] (encoder) at ([xshift=0.2em,yshift=0.6em]res2.north west)
{
\scriptsize
{
\textbf
{
编码器
}}}
;
...
@@ -35,8 +36,9 @@
...
@@ -35,8 +36,9 @@
\node
[ffnnode,anchor=south] (ffn2) at ([yshift=1em]res4.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[ffnnode,anchor=south] (ffn2) at ([yshift=1em]res4.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[Resnode,anchor=south] (res5) at ([yshift=0.3em]ffn2.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res5) at ([yshift=0.3em]ffn2.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[outputnode,anchor=south] (o1) at ([yshift=1em]res5.north)
{
\tiny
{$
\textbf
{
Output layer
}$}}
;
\node
[outputnode,anchor=south] (o1) at ([yshift=1em]res5.north)
{
\tiny
{$
\textbf
{
Output layer
}$}}
;
\node
[inputnode,anchor=north west] (input2) at ([yshift=-1em]sa2.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[inputnode,anchor=north west] (input2) at ([yshift=-1em,xshift=-0.5em]sa2.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[posnode,anchor=north east] (pos2) at ([yshift=-1em]sa2.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[] (add) at ([yshift=-1.6em,xshift=3.5em]sa2.south west)
{$
+
$}
;
\node
[posnode,anchor=north east] (pos2) at ([yshift=-1em,xshift=0.5em]sa2.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[anchor=north] (outputs) at ([yshift=-3em]sa2.south)
{
\scriptsize
{$
\textbf
{
解码器输入:
$
<
$
sos
$
>
$
I am fine
}$}}
;
\node
[anchor=north] (outputs) at ([yshift=-3em]sa2.south)
{
\scriptsize
{$
\textbf
{
解码器输入:
$
<
$
sos
$
>
$
I am fine
}$}}
;
\node
[anchor=east] (decoder) at ([xshift=-1em,yshift=-1.5em]o1.west)
{
\scriptsize
{
\textbf
{
解码器
}}}
;
\node
[anchor=east] (decoder) at ([xshift=-1em,yshift=-1.5em]o1.west)
{
\scriptsize
{
\textbf
{
解码器
}}}
;
\node
[anchor=north] (decoutputs) at ([yshift=1.5em]o1.north)
{
\scriptsize
{$
\textbf
{
解码器输出: I am fine
$
<
$
eos
$
>
$
}$}}
;
\node
[anchor=north] (decoutputs) at ([yshift=1.5em]o1.north)
{
\scriptsize
{$
\textbf
{
解码器输出: I am fine
$
<
$
eos
$
>
$
}$}}
;
...
...
This diff is collapsed.
Click to expand it.
Chapter12/Figures/figure-position-of-feedforward-neural-network-in-the-model.tex
查看文件 @
4b7e3a3c
...
@@ -14,8 +14,9 @@
...
@@ -14,8 +14,9 @@
\node
[Resnode,anchor=south] (res1) at ([yshift=0.3em]sa1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res1) at ([yshift=0.3em]sa1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[ffnnode,anchor=south] (ffn1) at ([yshift=1em]res1.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[ffnnode,anchor=south] (ffn1) at ([yshift=1em]res1.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[Resnode,anchor=south] (res2) at ([yshift=0.3em]ffn1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res2) at ([yshift=0.3em]ffn1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[inputnode,anchor=north west] (input1) at ([yshift=-1em]sa1.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[inputnode,anchor=north west] (input1) at ([yshift=-1em,xshift=-0.5em]sa1.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[posnode,anchor=north east] (pos1) at ([yshift=-1em]sa1.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[] (add) at ([yshift=-1.6em,xshift=3.5em]sa1.south west)
{$
+
$}
;
\node
[posnode,anchor=north east] (pos1) at ([yshift=-1em,xshift=0.5em]sa1.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[anchor=north] (inputs) at ([yshift=-3em]sa1.south)
{
\scriptsize
{$
\textbf
{
编码器输入: 我
\ \
很
\ \
好
}$}}
;
\node
[anchor=north] (inputs) at ([yshift=-3em]sa1.south)
{
\scriptsize
{$
\textbf
{
编码器输入: 我
\ \
很
\ \
好
}$}}
;
\node
[anchor=south] (encoder) at ([xshift=0.2em,yshift=0.6em]res2.north west)
{
\scriptsize
{
\textbf
{
编码器
}}}
;
\node
[anchor=south] (encoder) at ([xshift=0.2em,yshift=0.6em]res2.north west)
{
\scriptsize
{
\textbf
{
编码器
}}}
;
...
@@ -33,8 +34,9 @@
...
@@ -33,8 +34,9 @@
\node
[ffnnode,anchor=south] (ffn2) at ([yshift=1em]res4.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[ffnnode,anchor=south] (ffn2) at ([yshift=1em]res4.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[Resnode,anchor=south] (res5) at ([yshift=0.3em]ffn2.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res5) at ([yshift=0.3em]ffn2.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[outputnode,anchor=south] (o1) at ([yshift=1em]res5.north)
{
\tiny
{$
\textbf
{
Output layer
}$}}
;
\node
[outputnode,anchor=south] (o1) at ([yshift=1em]res5.north)
{
\tiny
{$
\textbf
{
Output layer
}$}}
;
\node
[inputnode,anchor=north west] (input2) at ([yshift=-1em]sa2.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[inputnode,anchor=north west] (input2) at ([yshift=-1em,xshift=-0.5em]sa2.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[posnode,anchor=north east] (pos2) at ([yshift=-1em]sa2.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[] (add) at ([yshift=-1.6em,xshift=3.5em]sa2.south west)
{$
+
$}
;
\node
[posnode,anchor=north east] (pos2) at ([yshift=-1em,xshift=0.5em]sa2.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[anchor=north] (outputs) at ([yshift=-3em]sa2.south)
{
\scriptsize
{$
\textbf
{
解码器输入:
$
<
$
sos
$
>
$
I am fine
}$}}
;
\node
[anchor=north] (outputs) at ([yshift=-3em]sa2.south)
{
\scriptsize
{$
\textbf
{
解码器输入:
$
<
$
sos
$
>
$
I am fine
}$}}
;
\node
[anchor=east] (decoder) at ([xshift=-1em,yshift=-1.5em]o1.west)
{
\scriptsize
{
\textbf
{
解码器
}}}
;
\node
[anchor=east] (decoder) at ([xshift=-1em,yshift=-1.5em]o1.west)
{
\scriptsize
{
\textbf
{
解码器
}}}
;
\node
[anchor=north] (decoutputs) at ([yshift=1.5em]o1.north)
{
\scriptsize
{$
\textbf
{
解码器输出: I am fine
$
<
$
eos
$
>
$
}$}}
;
\node
[anchor=north] (decoutputs) at ([yshift=1.5em]o1.north)
{
\scriptsize
{$
\textbf
{
解码器输出: I am fine
$
<
$
eos
$
>
$
}$}}
;
...
...
This diff is collapsed.
Click to expand it.
Chapter12/Figures/figure-position-of-self-attention-mechanism-in-the-model.tex
查看文件 @
4b7e3a3c
...
@@ -15,8 +15,9 @@
...
@@ -15,8 +15,9 @@
\node
[Resnode,anchor=south] (res1) at ([yshift=0.3em]sa1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res1) at ([yshift=0.3em]sa1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[ffnnode,anchor=south] (ffn1) at ([yshift=1em]res1.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[ffnnode,anchor=south] (ffn1) at ([yshift=1em]res1.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[Resnode,anchor=south] (res2) at ([yshift=0.3em]ffn1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res2) at ([yshift=0.3em]ffn1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[inputnode,anchor=north west] (input1) at ([yshift=-1em]sa1.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[inputnode,anchor=north west] (input1) at ([yshift=-1em,xshift=-0.5em]sa1.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[posnode,anchor=north east] (pos1) at ([yshift=-1em]sa1.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[] (add) at ([yshift=-1.6em,xshift=3.5em]sa1.south west)
{$
+
$}
;
\node
[posnode,anchor=north east] (pos1) at ([yshift=-1em,xshift=0.5em]sa1.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[anchor=north] (inputs) at ([yshift=-3em]sa1.south)
{
\scriptsize
{$
\textbf
{
编码器输入: 我
\ \
很
\ \
好
}$}}
;
\node
[anchor=north] (inputs) at ([yshift=-3em]sa1.south)
{
\scriptsize
{$
\textbf
{
编码器输入: 我
\ \
很
\ \
好
}$}}
;
\node
[anchor=south] (encoder) at ([xshift=0.2em,yshift=0.6em]res2.north west)
{
\scriptsize
{
\textbf
{
编码器
}}}
;
\node
[anchor=south] (encoder) at ([xshift=0.2em,yshift=0.6em]res2.north west)
{
\scriptsize
{
\textbf
{
编码器
}}}
;
...
@@ -34,8 +35,9 @@
...
@@ -34,8 +35,9 @@
\node
[ffnnode,anchor=south] (ffn2) at ([yshift=1em]res4.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[ffnnode,anchor=south] (ffn2) at ([yshift=1em]res4.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[Resnode,anchor=south] (res5) at ([yshift=0.3em]ffn2.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res5) at ([yshift=0.3em]ffn2.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[outputnode,anchor=south] (o1) at ([yshift=1em]res5.north)
{
\tiny
{$
\textbf
{
Output layer
}$}}
;
\node
[outputnode,anchor=south] (o1) at ([yshift=1em]res5.north)
{
\tiny
{$
\textbf
{
Output layer
}$}}
;
\node
[inputnode,anchor=north west] (input2) at ([yshift=-1em]sa2.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[inputnode,anchor=north west] (input2) at ([yshift=-1em,xshift=-0.5em]sa2.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[posnode,anchor=north east] (pos2) at ([yshift=-1em]sa2.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[] (add) at ([yshift=-1.6em,xshift=3.5em]sa2.south west)
{$
+
$}
;
\node
[posnode,anchor=north east] (pos2) at ([yshift=-1em,xshift=0.5em]sa2.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[anchor=north] (outputs) at ([yshift=-3em]sa2.south)
{
\scriptsize
{$
\textbf
{
解码器输入:
$
<
$
sos
$
>
$
I am fine
}$}}
;
\node
[anchor=north] (outputs) at ([yshift=-3em]sa2.south)
{
\scriptsize
{$
\textbf
{
解码器输入:
$
<
$
sos
$
>
$
I am fine
}$}}
;
\node
[anchor=east] (decoder) at ([xshift=-1em,yshift=-1.5em]o1.west)
{
\scriptsize
{
\textbf
{
解码器
}}}
;
\node
[anchor=east] (decoder) at ([xshift=-1em,yshift=-1.5em]o1.west)
{
\scriptsize
{
\textbf
{
解码器
}}}
;
\node
[anchor=north] (decoutputs) at ([yshift=1.5em]o1.north)
{
\scriptsize
{$
\textbf
{
解码器输出: I am fine
$
<
$
eos
$
>
$
}$}}
;
\node
[anchor=north] (decoutputs) at ([yshift=1.5em]o1.north)
{
\scriptsize
{$
\textbf
{
解码器输出: I am fine
$
<
$
eos
$
>
$
}$}}
;
...
...
This diff is collapsed.
Click to expand it.
Chapter12/Figures/figure-transformer-input-and-position-encoding.tex
查看文件 @
4b7e3a3c
...
@@ -14,8 +14,9 @@
...
@@ -14,8 +14,9 @@
\node
[Resnode,anchor=south] (res1) at ([yshift=0.3em]sa1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res1) at ([yshift=0.3em]sa1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[ffnnode,anchor=south] (ffn1) at ([yshift=1em]res1.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[ffnnode,anchor=south] (ffn1) at ([yshift=1em]res1.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[Resnode,anchor=south] (res2) at ([yshift=0.3em]ffn1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res2) at ([yshift=0.3em]ffn1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[inputnode,anchor=north west] (input1) at ([yshift=-1em]sa1.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[inputnode,anchor=north west] (input1) at ([yshift=-1em,xshift=-0.5em]sa1.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[posnode,anchor=north east] (pos1) at ([yshift=-1em]sa1.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[] (add) at ([yshift=-1.6em,xshift=3.5em]sa1.south west)
{$
+
$}
;
\node
[posnode,anchor=north east] (pos1) at ([yshift=-1em,xshift=0.5em]sa1.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[anchor=north] (inputs) at ([yshift=-3em]sa1.south)
{
\scriptsize
{$
\textbf
{
编码器输入: 我
\ \
很
\ \
好
}$}}
;
\node
[anchor=north] (inputs) at ([yshift=-3em]sa1.south)
{
\scriptsize
{$
\textbf
{
编码器输入: 我
\ \
很
\ \
好
}$}}
;
\node
[anchor=south] (encoder) at ([xshift=0.2em,yshift=0.6em]res2.north west)
{
\scriptsize
{
\textbf
{
编码器
}}}
;
\node
[anchor=south] (encoder) at ([xshift=0.2em,yshift=0.6em]res2.north west)
{
\scriptsize
{
\textbf
{
编码器
}}}
;
...
@@ -33,8 +34,9 @@
...
@@ -33,8 +34,9 @@
\node
[ffnnode,anchor=south] (ffn2) at ([yshift=1em]res4.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[ffnnode,anchor=south] (ffn2) at ([yshift=1em]res4.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[Resnode,anchor=south] (res5) at ([yshift=0.3em]ffn2.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res5) at ([yshift=0.3em]ffn2.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[outputnode,anchor=south] (o1) at ([yshift=1em]res5.north)
{
\tiny
{$
\textbf
{
Output layer
}$}}
;
\node
[outputnode,anchor=south] (o1) at ([yshift=1em]res5.north)
{
\tiny
{$
\textbf
{
Output layer
}$}}
;
\node
[inputnode,anchor=north west] (input2) at ([yshift=-1em]sa2.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[inputnode,anchor=north west] (input2) at ([yshift=-1em,xshift=-0.5em]sa2.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[posnode,anchor=north east] (pos2) at ([yshift=-1em]sa2.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[] (add) at ([yshift=-1.6em,xshift=3.5em]sa2.south west)
{$
+
$}
;
\node
[posnode,anchor=north east] (pos2) at ([yshift=-1em,xshift=0.5em]sa2.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[anchor=north] (outputs) at ([yshift=-3em]sa2.south)
{
\scriptsize
{$
\textbf
{
解码器输入:
$
<
$
sos
$
>
$
I am fine
}$}}
;
\node
[anchor=north] (outputs) at ([yshift=-3em]sa2.south)
{
\scriptsize
{$
\textbf
{
解码器输入:
$
<
$
sos
$
>
$
I am fine
}$}}
;
\node
[anchor=east] (decoder) at ([xshift=-1em,yshift=-1.5em]o1.west)
{
\scriptsize
{
\textbf
{
解码器
}}}
;
\node
[anchor=east] (decoder) at ([xshift=-1em,yshift=-1.5em]o1.west)
{
\scriptsize
{
\textbf
{
解码器
}}}
;
\node
[anchor=north] (decoutputs) at ([yshift=1.5em]o1.north)
{
\scriptsize
{$
\textbf
{
解码器输出: I am fine
$
<
$
eos
$
>
$
}$}}
;
\node
[anchor=north] (decoutputs) at ([yshift=1.5em]o1.north)
{
\scriptsize
{$
\textbf
{
解码器输出: I am fine
$
<
$
eos
$
>
$
}$}}
;
...
...
This diff is collapsed.
Click to expand it.
Chapter12/Figures/figure-transformer.tex
查看文件 @
4b7e3a3c
...
@@ -14,8 +14,9 @@
...
@@ -14,8 +14,9 @@
\node
[Resnode,anchor=south] (res1) at ([yshift=0.3em]sa1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res1) at ([yshift=0.3em]sa1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[ffnnode,anchor=south] (ffn1) at ([yshift=1em]res1.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[ffnnode,anchor=south] (ffn1) at ([yshift=1em]res1.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[Resnode,anchor=south] (res2) at ([yshift=0.3em]ffn1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res2) at ([yshift=0.3em]ffn1.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[inputnode,anchor=north west] (input1) at ([yshift=-1em]sa1.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[inputnode,anchor=north west] (input1) at ([yshift=-1em,xshift=-0.5em]sa1.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[posnode,anchor=north east] (pos1) at ([yshift=-1em]sa1.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[] (add) at ([yshift=-1.6em,xshift=3.5em]sa1.south west)
{$
+
$}
;
\node
[posnode,anchor=north east] (pos1) at ([yshift=-1em,xshift=0.5em]sa1.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[anchor=north] (inputs) at ([yshift=-3em]sa1.south)
{
\scriptsize
{$
\textbf
{
编码器输入: 我
\ \
很
\ \
好
}$}}
;
\node
[anchor=north] (inputs) at ([yshift=-3em]sa1.south)
{
\scriptsize
{$
\textbf
{
编码器输入: 我
\ \
很
\ \
好
}$}}
;
\node
[anchor=south] (encoder) at ([xshift=0.2em,yshift=0.6em]res2.north west)
{
\scriptsize
{
\textbf
{
编码器
}}}
;
\node
[anchor=south] (encoder) at ([xshift=0.2em,yshift=0.6em]res2.north west)
{
\scriptsize
{
\textbf
{
编码器
}}}
;
...
@@ -33,8 +34,9 @@
...
@@ -33,8 +34,9 @@
\node
[ffnnode,anchor=south] (ffn2) at ([yshift=1em]res4.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[ffnnode,anchor=south] (ffn2) at ([yshift=1em]res4.north)
{
\tiny
{$
\textbf
{
Feed Forward Network
}$}}
;
\node
[Resnode,anchor=south] (res5) at ([yshift=0.3em]ffn2.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[Resnode,anchor=south] (res5) at ([yshift=0.3em]ffn2.north)
{
\tiny
{$
\textbf
{
Add
\&
LayerNorm
}$}}
;
\node
[outputnode,anchor=south] (o1) at ([yshift=1em]res5.north)
{
\tiny
{$
\textbf
{
Output layer
}$}}
;
\node
[outputnode,anchor=south] (o1) at ([yshift=1em]res5.north)
{
\tiny
{$
\textbf
{
Output layer
}$}}
;
\node
[inputnode,anchor=north west] (input2) at ([yshift=-1em]sa2.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[inputnode,anchor=north west] (input2) at ([yshift=-1em,xshift=-0.5em]sa2.south west)
{
\tiny
{$
\textbf
{
Embedding
}$}}
;
\node
[posnode,anchor=north east] (pos2) at ([yshift=-1em]sa2.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[] (add) at ([yshift=-1.6em,xshift=3.5em]sa2.south west)
{$
+
$}
;
\node
[posnode,anchor=north east] (pos2) at ([yshift=-1em,xshift=0.5em]sa2.south east)
{
\tiny
{$
\textbf
{
Position
}$}}
;
\node
[anchor=north] (outputs) at ([yshift=-3em]sa2.south)
{
\scriptsize
{$
\textbf
{
解码器输入:
$
<
$
sos
$
>
$
I am fine
}$}}
;
\node
[anchor=north] (outputs) at ([yshift=-3em]sa2.south)
{
\scriptsize
{$
\textbf
{
解码器输入:
$
<
$
sos
$
>
$
I am fine
}$}}
;
\node
[anchor=east] (decoder) at ([xshift=-1em,yshift=-1.5em]o1.west)
{
\scriptsize
{
\textbf
{
解码器
}}}
;
\node
[anchor=east] (decoder) at ([xshift=-1em,yshift=-1.5em]o1.west)
{
\scriptsize
{
\textbf
{
解码器
}}}
;
\node
[anchor=north] (decoutputs) at ([yshift=1.5em]o1.north)
{
\scriptsize
{$
\textbf
{
解码器输出: I am fine
$
<
$
eos
$
>
$
}$}}
;
\node
[anchor=north] (decoutputs) at ([yshift=1.5em]o1.north)
{
\scriptsize
{$
\textbf
{
解码器输出: I am fine
$
<
$
eos
$
>
$
}$}}
;
...
...
This diff is collapsed.
Click to expand it.
Chapter12/chapter12.tex
查看文件 @
4b7e3a3c
...
@@ -383,7 +383,7 @@
...
@@ -383,7 +383,7 @@
\section
{
残差网络和层正则化
}
\section
{
残差网络和层正则化
}
\parinterval
Transformer编码器、解码器分别由多层网络组成(通常为6层),每层网络又包含多个子层(自注意力网络、前馈神经网络)。因此Transformer实际上是一个很深的网络结构。再加上点乘注意力机制中包含很多线性和非线性变换;且注意力函数Attention(
$
\cdot
$
)的计算也涉及多层网络,整个网络的信息传递非常复杂。从反向传播的角度来看,每次回传的梯度都会经过若干步骤,容易产生梯度爆炸或者消失。解决这个问题的一种办法就是使用残差连接
\upcite
{
DBLP:journals/corr/HeZRS15
}
,此部分内容已经在
{
\chapter
eleven
}
进行了介绍,这里不再赘述。
\parinterval
Transformer编码器、解码器分别由多层网络组成(通常为6层),每层网络又包含多个子层(自注意力网络、前馈神经网络)。因此Transformer实际上是一个很深的网络结构。再加上点乘注意力机制中包含很多线性和非线性变换;且注意力函数Attention(
$
\cdot
$
)的计算也涉及多层网络,整个网络的信息传递非常复杂。从反向传播的角度来看,每次回传的梯度都会经过若干步骤,容易产生梯度爆炸或者消失。解决这个问题的一种办法就是使用残差连接
\upcite
{
DBLP:journals/corr/HeZRS15
}
,此部分内容已经在
{
\chapter
nine
}
进行了介绍,这里不再赘述。
%\parinterval 解决这个问题的一种办法就是使用残差连接\upcite{DBLP:journals/corr/HeZRS15}。残差连接是一种用来训练深层网络的技术,其结构如图\ref{fig:12-49},即在子层之前通过增加直接连接的方式,将底层信息直接传递给上层。
%\parinterval 解决这个问题的一种办法就是使用残差连接\upcite{DBLP:journals/corr/HeZRS15}。残差连接是一种用来训练深层网络的技术,其结构如图\ref{fig:12-49},即在子层之前通过增加直接连接的方式,将底层信息直接传递给上层。
...
@@ -416,13 +416,13 @@
...
@@ -416,13 +416,13 @@
\parinterval
在Transformer的训练过程中,由于引入了残差操作,将前面所有层的输出加到一起,如公式:
\parinterval
在Transformer的训练过程中,由于引入了残差操作,将前面所有层的输出加到一起,如公式:
\begin{eqnarray}
\begin{eqnarray}
%x_{l+1} = x_l + F (x_l)
%x_{l+1} = x_l + F (x_l)
\mathbi
{
h
}^{
l+1
}
= F (
\mathbi
{
h
}^
l) +
\mathbi
{
h
}^
l
\mathbi
{
x
}^{
l+1
}
= F (
\mathbi
{
x
}^
l) +
\mathbi
{
x
}^
l
\label
{
eq:12-50
}
\label
{
eq:12-50
}
\end{eqnarray}
\end{eqnarray}
\noindent
其中
$
\mathbi
{
h
}^
l
$
表示第
$
l
$
层网络的输入向量,
$
F
(
\mathbi
{
h
}^
l
)
$
是子层运算,这样会导致不同层(或子层)的结果之间的差异性很大,造成训练过程不稳定、训练时间较长。为了避免这种情况,在每层中加入了层正则化操作
\upcite
{
Ba2016LayerN
}
。图
\ref
{
fig:12-50
}
中的红色方框展示了Transformer中残差和层正则化的位置。层正则化的计算公式如下:
\noindent
其中
$
\mathbi
{
x
}^
l
$
表示第
$
l
$
层网络的输入向量,
$
F
(
\mathbi
{
x
}^
l
)
$
是子层运算,这样会导致不同层(或子层)的结果之间的差异性很大,造成训练过程不稳定、训练时间较长。为了避免这种情况,在每层中加入了层正则化操作
\upcite
{
Ba2016LayerN
}
。图
\ref
{
fig:12-50
}
中的红色方框展示了Transformer中残差和层正则化的位置。层正则化的计算公式如下:
\begin{eqnarray}
\begin{eqnarray}
\textrm
{
LN
}
(
\mathbi
{
h
}
) = g
\cdot
\frac
{
\mathbi
{
h
}
-
\mu
}
{
\sigma
}
+ b
\textrm
{
LN
}
(
\mathbi
{
x
}
) = g
\cdot
\frac
{
\mathbi
{
x
}
-
\mu
}
{
\sigma
}
+ b
\label
{
eq:12-51
}
\label
{
eq:12-51
}
\end{eqnarray}
\end{eqnarray}
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论