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
c700a9a4
Commit
c700a9a4
authored
Jan 14, 2021
by
单韦乔
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
15章文字
parent
0b640bc4
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
8 行增加
和
9 行删除
+8
-9
Chapter15/Figures/figure-learning-rate.tex
+1
-1
Chapter15/chapter15.tex
+7
-8
没有找到文件。
Chapter15/Figures/figure-learning-rate.tex
查看文件 @
c700a9a4
...
@@ -15,7 +15,7 @@
...
@@ -15,7 +15,7 @@
]
]
\addplot
[red,line width=1.25pt]
coordinates
{
(0,0) (1.6,2) (1.8,1.888) (2,1.787) (2.5,1.606) (3,1.462) (3.5,1.3549) (4,1.266) (4.5,1.193) (5,1.131)
}
;
\addplot
[red,line width=1.25pt]
coordinates
{
(0,0) (1.6,2) (1.8,1.888) (2,1.787) (2.5,1.606) (3,1.462) (3.5,1.3549) (4,1.266) (4.5,1.193) (5,1.131)
}
;
\addlegendentry
{
\scriptsize
原始学习率
}
\addlegendentry
{
\scriptsize
原始
的
学习率
}
%\addplot[red,line width=1.25pt] coordinates {(0,0) (8000,0.002) (10000,0.00179) (12000,0.00163) (12950,0.001572)};
%\addplot[red,line width=1.25pt] coordinates {(0,0) (8000,0.002) (10000,0.00179) (12000,0.00163) (12950,0.001572)};
\addplot
[blue,line width=1.25pt]
coordinates
{
(0,0) (0.8,2) (0.9906,1.7983)
}
;
\addplot
[blue,line width=1.25pt]
coordinates
{
(0,0) (0.8,2) (0.9906,1.7983)
}
;
%\addplot[red,line width=1.25pt] coordinates {(0,0) (8000,0.002) (9906,0.0017983)};
%\addplot[red,line width=1.25pt] coordinates {(0,0) (8000,0.002) (9906,0.0017983)};
...
...
Chapter15/chapter15.tex
查看文件 @
c700a9a4
...
@@ -690,9 +690,9 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
...
@@ -690,9 +690,9 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\vspace
{
0.5em
}
\vspace
{
0.5em
}
\item
类似于标准的Transformer初始化方式,使用Xavier初始化方式来初始化除了词嵌入以外的所有参数矩阵。词嵌入矩阵服从
$
\mathbb
{
N
}
(
0
,d
^{
-
\frac
{
1
}{
2
}}
)
$
的高斯分布,其中
$
d
$
代表词嵌入的维度。
\item
类似于标准的Transformer初始化方式,使用Xavier初始化方式来初始化除了词嵌入以外的所有参数矩阵。词嵌入矩阵服从
$
\mathbb
{
N
}
(
0
,d
^{
-
\frac
{
1
}{
2
}}
)
$
的高斯分布,其中
$
d
$
代表词嵌入的维度。
\vspace
{
0.5em
}
\vspace
{
0.5em
}
\item
对编码器中自注意力
子层的参数矩阵以及前馈神经网络子层
中所有参数矩阵进行缩放因子为
$
0
.
67
{
L
}^{
-
\frac
{
1
}{
4
}}$
的缩放,
$
M
$
为编码器层数。
\item
对编码器中自注意力
机制的参数矩阵以及前馈神经网络
中所有参数矩阵进行缩放因子为
$
0
.
67
{
L
}^{
-
\frac
{
1
}{
4
}}$
的缩放,
$
M
$
为编码器层数。
\vspace
{
0.5em
}
\vspace
{
0.5em
}
\item
对解码器中全部注意力
子层的参数矩阵以及前馈神经网络子层
中所有参数矩阵进行缩放因子为
$
(
9
{
M
}
)
^{
-
\frac
{
1
}{
4
}}$
的缩放,其中
$
L
$
为解码器层数。
\item
对解码器中全部注意力
机制的参数矩阵以及前馈神经网络
中所有参数矩阵进行缩放因子为
$
(
9
{
M
}
)
^{
-
\frac
{
1
}{
4
}}$
的缩放,其中
$
L
$
为解码器层数。
\vspace
{
0.5em
}
\vspace
{
0.5em
}
\end{itemize}
\end{itemize}
...
@@ -742,7 +742,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
...
@@ -742,7 +742,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\parinterval
所谓渐进式训练是指从浅层神经网络开始,在训练过程中逐渐增加模型的深度。一种比较简单的方法是将模型分为浅层部分和深层部分,之后分别进行训练,最终达到提高模型翻译性能的目的
\upcite
{
DBLP:conf/acl/WuWXTGQLL19
}
。
\parinterval
所谓渐进式训练是指从浅层神经网络开始,在训练过程中逐渐增加模型的深度。一种比较简单的方法是将模型分为浅层部分和深层部分,之后分别进行训练,最终达到提高模型翻译性能的目的
\upcite
{
DBLP:conf/acl/WuWXTGQLL19
}
。
\parinterval
另一种方式是动态构建深层模型,并尽可能复用浅层部分的训练结果
\upcite
{
li2020shallow
}
。假设开始的时候模型包含
$
l
$
层神经网络,然后训练这个模型至收敛。之后,直接拷贝这
$
l
$
层神经网络(包括参数),并堆叠出一个
$
2
l
$
层的模型。之后继续训练,重复这个过程。进行
$
n
$
次之后就得到了
$
(
n
+
1
)
l
$
层的模型。图
\ref
{
fig:15-15
}
给出了在编码器上使用渐进式训练的示意图。
\parinterval
另一种方式是动态构建深层模型,并尽可能复用浅层部分的训练结果
\upcite
{
li2020shallow
}
。假设开始的时候模型包含
$
l
$
层神经网络,然后训练这个模型至收敛。之后,直接拷贝这
$
l
$
层神经网络(包括参数),并堆叠出一个
$
2
l
$
层的模型。之后继续训练,重复这个过程。进行
$
n
$
次之后就得到了
$
(
n
+
1
)
\times
l
$
层的模型。图
\ref
{
fig:15-15
}
给出了在编码器上使用渐进式训练的示意图。
%----------------------------------------------
%----------------------------------------------
\begin{figure}
[htp]
\begin{figure}
[htp]
...
@@ -761,7 +761,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
...
@@ -761,7 +761,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\subsubsection
{
2. 分组稠密连接
}
\subsubsection
{
2. 分组稠密连接
}
\parinterval
很多研究工作已经发现深层模型不同层之间的稠密连接能够很明显地提高信息传递的效率
\upcite
{
WangLearning,DBLP:conf/cvpr/HuangLMW17,Dou2018ExploitingDR,DBLP:conf/acl/WuWXTGQLL19
}
。与此同时,对之前层信息的不断复用有助于得到更好的表示,但也带来了计算代价过大的问题。在动态线性层聚合方法(DLCL)中,每一次聚合时都需要重新计算之前每一层表示对当前层输入的贡献度,因此伴随着编码器整体深度的增加,这部分的计算代价变得不可忽略。例如,一个基于动态层聚合的48层Transformer模型比不使用动态层聚合进行训练慢近2倍。同时,缓存中间结果也增加了显存的使用量。比如,即使在使用半精度计算的情况,每张12G显存的GPU上计算的词也不能超过2048个,这导致训练开销急剧增大。
\parinterval
很多研究工作已经发现深层模型不同层之间的稠密连接能够很明显地提高信息传递的效率
\upcite
{
WangLearning,DBLP:conf/cvpr/HuangLMW17,Dou2018ExploitingDR,DBLP:conf/acl/WuWXTGQLL19
}
。与此同时,对之前层信息的不断复用有助于得到更好的表示,但也带来了计算代价过大的问题。在动态线性层聚合方法(DLCL)中,每一次聚合时都需要重新计算之前每一层表示对当前层输入的贡献度,因此伴随着编码器整体深度的增加,这部分的计算代价变得不可忽略。例如,一个基于动态层聚合的48层Transformer模型比不使用动态层聚合进行训练慢近2倍。同时,缓存中间结果也增加了显存的使用量。比如,即使在使用半精度计算的情况
下
,每张12G显存的GPU上计算的词也不能超过2048个,这导致训练开销急剧增大。
\parinterval
缓解这个问题的一种方法是使用更稀疏的层间连接方式。其核心思想与动态线性层聚合是类似的,不同点在于可以通过调整层之间连接的稠密程度来降低训练代价。比如,可以将每
$
p
$
层分为一组,之后动态线性层聚合只在不同组之间进行。这样,通过调节
$
p
$
值的大小可以控制神经网络中连接的稠密程度,作为一种训练代价与翻译性能之间的权衡。显然,标准的Transformer模型
\upcite
{
vaswani2017attention
}
和DLCL模型
\upcite
{
WangLearning
}
都可以看作是该方法的一种特例。如图
\ref
{
fig:15-16
}
所示:当
$
p
=
1
$
时,每一个单独的块被看作一个独立的组,它等价于基于动态层聚合的DLCL模型;当
$
p
=
\infty
$
时,它等价于正常的Transformer模型。值得注意的是,如果配合渐进式训练。在分组稠密连接中可以设置
$
p
$
等于模型层数。
\parinterval
缓解这个问题的一种方法是使用更稀疏的层间连接方式。其核心思想与动态线性层聚合是类似的,不同点在于可以通过调整层之间连接的稠密程度来降低训练代价。比如,可以将每
$
p
$
层分为一组,之后动态线性层聚合只在不同组之间进行。这样,通过调节
$
p
$
值的大小可以控制神经网络中连接的稠密程度,作为一种训练代价与翻译性能之间的权衡。显然,标准的Transformer模型
\upcite
{
vaswani2017attention
}
和DLCL模型
\upcite
{
WangLearning
}
都可以看作是该方法的一种特例。如图
\ref
{
fig:15-16
}
所示:当
$
p
=
1
$
时,每一个单独的块被看作一个独立的组,它等价于基于动态层聚合的DLCL模型;当
$
p
=
\infty
$
时,它等价于正常的Transformer模型。值得注意的是,如果配合渐进式训练。在分组稠密连接中可以设置
$
p
$
等于模型层数。
...
@@ -780,7 +780,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
...
@@ -780,7 +780,7 @@ C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}
\subsubsection
{
3. 学习率重置
}
\subsubsection
{
3. 学习率重置
}
\parinterval
尽管渐进式训练策略与分组稠密连接结构可以加速深层模型的训练,但使用传统的学习率衰减策略会导致训练深层模型时的学习率较小,因此模型无法快速地达到收敛状态,同时也影响最终的模型性能。
\parinterval
尽管渐进式训练策略与分组稠密连接结构
都
可以加速深层模型的训练,但使用传统的学习率衰减策略会导致训练深层模型时的学习率较小,因此模型无法快速地达到收敛状态,同时也影响最终的模型性能。
\parinterval
图
\ref
{
fig:15-17
}
中的红色曲线描绘了在WMT英德翻译任务上标准Transformer模型的学习率曲线,可以看到当模型训练到40k步时,学习率对比峰值有明显的差距,而此时刚开始训练最终的深层模型,过小的学习率并不利于后期深层网络的充分训练。
\parinterval
图
\ref
{
fig:15-17
}
中的红色曲线描绘了在WMT英德翻译任务上标准Transformer模型的学习率曲线,可以看到当模型训练到40k步时,学习率对比峰值有明显的差距,而此时刚开始训练最终的深层模型,过小的学习率并不利于后期深层网络的充分训练。
...
@@ -822,7 +822,7 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
...
@@ -822,7 +822,7 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
\subsection
{
深层模型的健壮性训练
}
\subsection
{
深层模型的健壮性训练
}
\parinterval
伴随着网络的加深,还会面临另外一个比较严峻的问题
\ \dash
\
过拟合。由于参数量的增大,深层模型的输入与输出分布之间的差异也会越来越大,然而不同子层之间的相互适应也会更加的明显,这将导致任意子层网络对其他子层的依赖过大。这种现象在训练阶段是有帮助的,因为不同子层可以协同工作从而更好地拟合训练数据。然而这种方式也降低了模型的泛化能力,即深层模型更容易陷入过拟合问题。
\parinterval
伴随着网络的加深,
模型的训练
还会面临另外一个比较严峻的问题
\ \dash
\
过拟合。由于参数量的增大,深层模型的输入与输出分布之间的差异也会越来越大,然而不同子层之间的相互适应也会更加的明显,这将导致任意子层网络对其他子层的依赖过大。这种现象在训练阶段是有帮助的,因为不同子层可以协同工作从而更好地拟合训练数据。然而这种方式也降低了模型的泛化能力,即深层模型更容易陷入过拟合问题。
\parinterval
通常,可以使用Dropout手段用来缓解过拟合问题(见
{
\chapterthirteen
}
)。不幸的是,尽管目前Transformer模型使用了多种Dropout手段(如Residual Dropout、Attention Dropout、 ReLU Dropout等),过拟合问题在深层模型中仍然存在。从图
\ref
{
fig:15-18
}
中可以看到,深层模型比浅层模型在训练集和校验集的困惑度上都有明显的优势,然而模型在训练一段时间后出现校验集困惑度上涨的现象,说明模型已经过拟合于训练数据。
\parinterval
通常,可以使用Dropout手段用来缓解过拟合问题(见
{
\chapterthirteen
}
)。不幸的是,尽管目前Transformer模型使用了多种Dropout手段(如Residual Dropout、Attention Dropout、 ReLU Dropout等),过拟合问题在深层模型中仍然存在。从图
\ref
{
fig:15-18
}
中可以看到,深层模型比浅层模型在训练集和校验集的困惑度上都有明显的优势,然而模型在训练一段时间后出现校验集困惑度上涨的现象,说明模型已经过拟合于训练数据。
...
@@ -836,7 +836,6 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
...
@@ -836,7 +836,6 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
%-------------------------------------------
%-------------------------------------------
\parinterval
{
\chapterthirteen
}
提到的Layer Dropout方法可以有效地缓解这个问题。以编码器为例, Layer Dropout的过程可以被描述为:在训练过程中,对自注意力子层或前馈神经网络子层进行随机丢弃,以减少不同子层之间的相互适应。这里选择Pre-Norm结构作为基础架构,它可以被描述为:
\parinterval
{
\chapterthirteen
}
提到的Layer Dropout方法可以有效地缓解这个问题。以编码器为例, Layer Dropout的过程可以被描述为:在训练过程中,对自注意力子层或前馈神经网络子层进行随机丢弃,以减少不同子层之间的相互适应。这里选择Pre-Norm结构作为基础架构,它可以被描述为:
\begin{eqnarray}
\begin{eqnarray}
\mathbi
{
x
}_{
l+1
}
&
=
&
F(
\textrm
{
LN
}
(
\mathbi
{
x
}_
l)) +
\mathbi
{
x
}_
l
\mathbi
{
x
}_{
l+1
}
&
=
&
F(
\textrm
{
LN
}
(
\mathbi
{
x
}_
l)) +
\mathbi
{
x
}_
l
\label
{
eq:15-48
}
\label
{
eq:15-48
}
...
@@ -859,7 +858,7 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
...
@@ -859,7 +858,7 @@ lr &=& d_{\textrm{model}}^{-0.5}\cdot step\_num^{-0.5}
\end{figure}
\end{figure}
%-------------------------------------------
%-------------------------------------------
\parinterval
除此之外,在残差网络中,研究人员已经发现底层神经网络的作用是对输入进行抽象表示,而上层神经网络进一步修正这种表示来拟合训练目标,因此底层神经网络对模型最终的输出有很大的影响
\upcite
{
DBLP:journals/corr/GreffSS16
}
。该结论同样适用于Transformer模型,比如,在训练中,残差支路以及底层的梯度范数通常比较大,这也间接表明底层神经网络在整个优化的过程中需要更大的更新。考虑到这个因素,在设计每一个子层被丢弃的概率时,可以采用自底向上线性增大的策略,保证底层的神经网络相比于顶层更容易保留下来。
\parinterval
除此之外,在残差网络中,研究人员已经发现底层神经网络的作用是对输入进行抽象表示,而上层神经网络
会
进一步修正这种表示来拟合训练目标,因此底层神经网络对模型最终的输出有很大的影响
\upcite
{
DBLP:journals/corr/GreffSS16
}
。该结论同样适用于Transformer模型,比如,在训练中,残差支路以及底层的梯度范数通常比较大,这也间接表明底层神经网络在整个优化的过程中需要更大的更新。考虑到这个因素,在设计每一个子层被丢弃的概率时,可以采用自底向上线性增大的策略,保证底层的神经网络相比于顶层更容易保留下来。
%----------------------------------------------------------------------------------------
%----------------------------------------------------------------------------------------
% NEW SECTION
% NEW SECTION
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论