% !Mode:: "TeX:UTF-8"
% !TEX encoding = UTF-8 Unicode

%----------------------------------------------------------------------------------------
% 机器翻译：统计建模与深度学习方法
% Machine Translation: Statistical Modeling and Deep Learning Methods
%
% Copyright 2020
% 肖桐(xiaotong@mail.neu.edu.cn) 朱靖波 (zhujingbo@mail.neu.edu.cn)
%----------------------------------------------------------------------------------------

%----------------------------------------------------------------------------------------
%    CONFIGURATIONS
%----------------------------------------------------------------------------------------

\renewcommand\figurename{图}%将figure改为图
\renewcommand\tablename{表}%将figure改为图
\chapterimage{fig-NEU-6.jpg} % Chapter heading image

%----------------------------------------------------------------------------------------
%	CHAPTER 15
%----------------------------------------------------------------------------------------

\chapter{神经机器翻译结构优化}

\parinterval 模型结构的设计是机器翻译系统研发中最重要的部分。在神经机器翻译中，虽然系统研发人员脱离了繁琐的特征工程，但是神经网络结构的设计仍然非常重要。无论是像循环神经网络、Transformer这样的整体架构的设计，还是注意力机制等局部结构的设计，都对机器翻译性能有着很大的影响。

\parinterval 本章主要讨论神经机器翻译中若干结构优化的方向，包括：注意力机制的改进、网络连接优化及深层网络建模、基于树结构的模型、神经网络结构自动搜索等。这些内容可以指导神经机器翻译系统的深入优化，其中涉及的一些模型和方法也可以应用于其他自然语言处理任务。

%----------------------------------------------------------------------------------------
%    NEW SECTION
%----------------------------------------------------------------------------------------

\sectionnewpage
\section{基于自注意力机制的改进}

\parinterval 注意力机制是神经机器翻译成功的关键，因此对相关模型结构的优化是十分重要的研究方向。以Transformer为例，其使用的自注意力模型具有高并行计算与全局建模的能力，目前在机器翻译、语言建模等自然语言处理任务上表现十分突出，也有许多改进工作。例如，在处理长文本序列时（假设文本长度为$N$），由于自注意力模型的时间复杂度为$O(N^2)$。$N$过大时翻译速度很低；同时在机器翻译领域，尽管在Transformer模型的输入中引入了绝对位置编码表示，现有的自注意力机制仍然无法显著捕获局部窗口下不同位置之间的关系；此外一部分研究人员将多头- 自注意力网络机制中多头思想进一步扩展，采用多分支的结构对不同空间特征进行提取，之后对特征进行融合。针对以上问题，本节将介绍注意力机制的优化策略，并重点讨论自注意力模型的若干改进方法。

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{局部信息建模}\label{subsec-15.1.1}

\parinterval 使用循环神经网络进行序列建模时，每一个时刻的计算都依赖于上一时刻的隐层状态。这种模式天然具有一定的时序性，且具有{\small\bfnew{归纳偏置}}\index{归纳偏置}（Inductive Bias）\index{Inductive Bias}的特性\upcite{DBLP:journals/corr/abs-1806-01261}。但是在使用Transformer模型对词序列进行建模时，由于自注意力网络能够直接对当前单词与序列中所有位置的单词进行建模，从而忽略了单词之间的位置关系，缺少了类似于循环或卷积神经网络中局部窗口内的依赖关系。在Transformer中通过引入正余弦函数作为绝对位置编码来区分单词之间的位置关系（见{\chaptertwelve}），仍然无法显著区分局部依赖与长距离依赖。局部依赖指代当前位置的词与周围局部窗口内词之间的内在联系，比较符合人类理解文字的习惯。

\parinterval 针对上述问题，研究人员设计了“相对位置”编码对原有的“绝对位置”编码进行补充，强化了局部依赖\upcite{Dai2019TransformerXLAL,Shaw2018SelfAttentionWR}。伴随着逐层的自注意力机制计算，模型捕获位置信息的能力也逐渐减弱，这种现象在深层网络建模中尤为明显。而利用相对位置编码能够有效地帮助深层神经网络中强化局部窗口下位置信息的表示，并显著地提升模型性能\upcite{li2020shallow}。 下面是具体方法。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{1. 位置编码}

\parinterval 对于一个序列，位置编码是在描述对不同位置的偏置。常见的技术手段除了可以在初始的输入中加入统计的偏置信息，如正余弦函数\upcite{vaswani2017attention}, 也可以在计算每层的注意力权重时加入偏置信息。在介绍相对位置编码之前，首先简要回顾一下自注意力机制的计算流程（见{\chaptertwelve}）。

\parinterval 在传统的自注意力机制中，给定输入的向量序列$\seq{x}=\{\mathbi{x}_1,\mathbi{x}_2,\ldots,\mathbi{x}_m\}$，通过点乘计算得到当前位置单词$i$和序列中所有单词之间的关系：
\begin{eqnarray}
\mathbi{z}_{i} &=& \sum_{j=1}^m \alpha_{ij}(\mathbi{x}_j \mathbi{W}_V)
\label{eq:15-1}
\end{eqnarray}

\noindent 其中，$\mathbi{W}_V$是线性变换矩阵，可以自动学习得到。自注意权重$\alpha_{ij}$通过Softmax函数得到：
\begin{eqnarray}
\alpha_{ij} &=& \frac{\exp \mathbi{e}_{ij}}{\sum_{k=1}^{m} \mathbi{e}_{ik}}
\label{eq:15-2}
\end{eqnarray}

\noindent 这里$\mathbi{e}_{ij}$被定义为：
\begin{eqnarray}
\mathbi{e}_{ij} &=& \frac{(\mathbi{x}_i \mathbi{W}_Q){(\mathbi{x}_j \mathbi{W}_K)}^{T}}{\sqrt{d_k}}
\label{eq:15-3}
\end{eqnarray}

\noindent 其中，$\mathbi{W}_Q$、$\mathbi{W}_K$为模型中的可学习参数，$d_k$为模型中隐层的维度\footnote[1]{在多头注意力中，$d_k$为经过多头分割后每个头的维度。}。这里，可以定义：

\begin{eqnarray}
\mathbi{Q} & = & \mathbi{x} \mathbi{W}_Q \\
\mathbi{K} & = & \mathbi{x} \mathbi{W}_K \\
\mathbi{V} & = & \mathbi{x} \mathbi{W}_V
\end{eqnarray}

\noindent 其中，$\mathbi{x}$为上一层的输出\footnote{这里，$\mathbi{K}$、$\mathbi{Q}$、$\mathbi{V}$的定义与{\chaptertwelve}略有不同，因为在这里的$\mathbi{K}$、$\mathbi{Q}$、$\mathbi{V}$是指对注意力模型输入进行线性变换后的结果，而{\chaptertwelve}中$\mathbi{K}$、$\mathbi{Q}$、$\mathbi{V}$直接表示输入。但是，这两种描述方式本质上是一样的，区别仅仅在于对输入的线性变化是放在输入自身中描述，还是作为输入之后的一个额外操作。}。这样，$\mathbi{e}_{ij}$实际上就是$\mathbi{Q}$和$\mathbi{K}$向量积缩放后的一个结果。

\parinterval 基于上述的注意力机制的计算方式，相对位置建模可以按如下方式实现：

\begin{itemize}
\vspace{0.5em}
\item {\small\bfnew{相对位置编码}}\index{相对位置编码}（Relative Positional Representation）\index{Relative Positional Representation}\upcite{Shaw2018SelfAttentionWR}。核心思想是在能够捕获全局依赖的自注意力机制中引入相对位置信息。该方法可以有效弥补绝对位置编码信息，甚至完全取代位置编码。对于输入元素$\mathbi{x}_i$和$\mathbi{x}_j$之间的联系，可以通过向量$\mathbi{a}_{ij}^V$ 和$\mathbi{a}_{ij}^K$来表示，其中$\mathbi{a}_{ij}^V$...，$\mathbi{a}_{ij}^K$...{\color{red} $\mathbi{a}_{ij}^V$ 和$\mathbi{a}_{ij}^K$必须形式化定义出来，要不别人看不懂。用到的符号必须定义出来！}。于是，注意力模型的计算调整如下：
\begin{eqnarray}
\mathbi{z}_{i} &=& \sum_{j=1}^m \alpha_{ij}(\mathbi{x}_j \mathbi{W}_V + \mathbi{a}_{ij}^V)
\label{eq:15-4}
\end{eqnarray}

\noindent 对比公式\eqref{eq:15-1}，在计算$\mathbi{z}_i$时引入了额外的$\mathbi{a}_{ij}^V$向量来表示位置$i$与位置$j$之间的相对位置。同时在计算注意力权重时对$\mathbi{K}$进行修改，同样引入了$\mathbi{a}_{ij}^K$向量表示位置$i$与位置$j$之间的相对位置。在公式\eqref{eq:15-3}的基础上，注意力权重的计算方式调整为：
\begin{eqnarray}
\mathbi{e}_{ij} &=& \frac{\mathbi{x}_i \mathbi{W}_Q{(\mathbi{x}_j \mathbi{W}_K + \mathbi{a}_{ij}^K )}^{T}}{\sqrt{d_k}} \\
&=& \frac{\mathbi{x}_i \mathbi{W}_Q{(\mathbi{x}_j \mathbi{W}_K)}^{T} + \mathbi{x}_i \mathbi{W}_Q{(\mathbi{a}_{ij}^K )}^{T}}{\sqrt{d_k}}
\label{eq:15-6}
\end{eqnarray}

\noindent 这里通过预先设定的最大相对位置$k$，强化模型对当前词为中心的左右各$k$个词的注意力计算。因此，最终的窗口大小为$2k + 1$。对于边缘位置窗口大小不足$2k$的单词，采用了裁剪的机制，即只对有效的临近词进行建模。举个简单的例子，假设对序列中的第一个单词进行建模，则只需考虑其右侧的$k$个词，因此$\mathbi{a}_{ij}^V$和$\mathbi{a}_{ij}^K$的获取方式为：
\begin{eqnarray}
\mathbi{a}_{ij}^K &=& \mathbi{w}^K_{\textrm{clip}(j-i,k)} \\
\mathbi{a}_{ij}^V &=& \mathbi{w}^V_{\textrm{clip}(j-i,k)} \\
\textrm{clip}(x,k) &=& \max(-k,\min(k,x))
\label{eq:15-9}
\end{eqnarray}

\noindent 其中，{\color{red} $\textrm{clip}$是啥？}，\mathbi{w}是可学习的模型参数，最终得到的相对位置表示为$\mathbi{w}^K = (\mathbi{w}^{K}_{-k},\ldots,\mathbi{w}^K_{k})$，$\mathbi{w}^{V} = (\mathbi{w}^{V}_{-k},\ldots,\mathbi{w}^{V}_{k})$，$\mathbi{w}^{K}_{i},\mathbi{w}^{V}_{i}\in \mathbb{R}^{d_k}$。

\vspace{0.5em}
\item 对相对位置编码可以进一步改进\upcite{Dai2019TransformerXLAL}。由于输入特征是由词嵌入表示与绝对位置编码组成，例如$x_i = \mathbi{E}_{x_i} + \mathbi{U}_i$，$x_j=\mathbi{E}_{x_j} + \mathbi{U}_j$，将其代入将公式\eqref{eq:15-3}中可以得到：
\begin{eqnarray}
\mathbi{e}_{ij} &=& \frac{(\mathbi{E}_{x_i} + \mathbi{U}_i)\mathbi{W}_Q{((\mathbi{E}_{x_j} + \mathbi{U}_j)\mathbi{W}_K)}^{T}}{\sqrt{d_k}}
\label{eq:15-10}
\end{eqnarray}

\noindent 在计算$\mathbi{e}_{ij}$时将其进行展开得到：
\begin{eqnarray}
A_{ij}^{abs} &=& \underbrace{\mathbi{E}_{x_i}\mathbi{W}_Q\mathbi{W}_{K}^{T}\mathbi{E}_{x_j}^{T}}_{\textrm{(a)}} + \underbrace{\mathbi{E}_{x_i}\mathbi{W}_Q\mathbi{W}_{K}^{T}\mathbi{U}_{j}^{T}}_{\textrm{(b)}} + \nonumber \\
& & \underbrace{\mathbi{U}_i\mathbi{W}_Q\mathbi{W}_{K}^{T}\mathbi{E}_{x_j}^{T}}_{\textrm{(c)}} + \underbrace{\mathbi{U}_i\mathbi{W}_Q\mathbi{W}_{K}^{T}\mathbi{U}_{j}^{T}}_{\textrm{(d)}}
\label{eq:15-11}
\end{eqnarray}

\noindent 这里，用$A_{ij}^{abs}$表示使用绝对位置编码时$\mathbi{e}_{ij}$的分子，$\mathbi{E}_{x_i}$与$\mathbi{E}_{x_j}$表示位置$i$与$j$的词嵌入，$\mathbi{W}_Q$与$\mathbi{W}_K$表示线性变换的权重矩阵，$\mathbi{U}_{i}$与$\mathbi{U}_{j}$表示正余弦函数矩阵。为了引入相对位置信息，可以将公式\eqref{eq:15-11}修改为如下形式：
\begin{eqnarray}
A_{ij}^{rel} &=& \underbrace{\mathbi{E}_{x_i}\mathbi{W}_Q\mathbi{W}_{K}^{T}\mathbi{E}_{x_j}^{T}}_{\textrm{(a)}} + \underbrace{\mathbi{E}_{x_i}\mathbi{W}_Q\mathbi{W}_{K}^{T}\mathbi{R}_{i-j}^{T}}_{\textrm{(b)}} + \nonumber \\
& & \underbrace{\mathbi{u}\mathbi{W}_{K,E}^{T}\mathbi{E}_{x_j}^{T}}_{\textrm{(c)}} + \underbrace{\mathbi{v}\mathbi{W}_{K,R}^{T}\mathbi{R}_{i-j}^{T}}_{\textrm{(d)}}
\label{eq:15-12}
\end{eqnarray}

\noindent 其中，$A_{ij}^{rel}$为使用相对位置编码后的表示。公式中各项的含义为：(a)表示基于内容的表征，(b)表示基于内容的位置偏置，(c)表示全局的内容的偏置，(d) 表示全局的位置偏置。公式\eqref{eq:15-11}中的(a)、(b)两项与前面介绍的相对位置编码一致\upcite{Shaw2018SelfAttentionWR}，并针对相对位置编码引入了额外的线性映射矩阵。同时兼顾了全局内容偏置（{\color{red} 啥是全局内容偏置？}）和全局位置偏置，可以更好的利用正余弦函数的归纳偏置特性。

\vspace{0.5em}
\item {\small\bfnew{结构化位置编码}}\index{基于结构化位置编码}（Structural Position Representations）\index{Structural Position Representations}\upcite{DBLP:conf/emnlp/WangTWS19a}。 对比序列化的位置编码手段，引入结构化位置表示。通过对输入句子进行依存句法分析得到句法树，根据叶子结点在句法树中的深度来表示其绝对位置。并在此基础上利用相对位置编码的思想计算节点之间的相对位置信息。

\vspace{0.5em}
\item {\small\bfnew{连续动态系统}}\index{基于连续动态系统}（Continuous Dynamic Model）\index{Continuous Dynamic Model}的位置编码\upcite{Liu2020LearningTE}。使用神经常微分方程\upcite{DBLP:conf/nips/ChenRBD18}{\small\bfnew{求解器}}\index{求解器}（Solver）\index{Solver}来建模位置信息，模型具有更好的归纳偏置能力，可以处理变长的输入样本，同时能够从不同的数据中进行自适应学习。
\vspace{0.5em}
\end{itemize}

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{2. 注意力分布约束}

\parinterval 局部注意力机制的一直是机器翻译中受关注的研究方向\upcite{DBLP:journals/corr/LuongPM15}。通过对自注意力模型中注意力权重的可视化，可以观测到不同位置的词受关注的程度相对平滑。这样建模方式利于全局建模，但一定程度上分散了注意力,造成忽略邻近单词之间的关系。为了提高模型对局部信息的感知，有以下几种方法：

\begin{itemize}
\vspace{0.5em}
\item 引入高斯约束\upcite{Yang2018ModelingLF}。这类方法的核心思想是引入可学习的高斯分布进行局部建模，之后与自注意力机制中计算得到的注意力分布进行融合，如图\ref{fig:15-1}。形式上，可以用自注意力机制中计算得到的中间表示来预测高斯分布的中心和偏差，得到高斯分布$\mathbi{G}$后，累加在模型计算得到的相关性系数之上在进行归一化计算（{\color{red} 这句话没读懂，感觉太绕}），具体的形式如下：{\red{下面图片中的曲线再调整一下}}
\begin{eqnarray}
\mathbi{e}_{ij} &=& \frac{(\mathbi{x}_i \mathbi{W}_Q){(\mathbi{x}_j \mathbi{W}_K)}^{T}}{\sqrt{d_k}} + \mathbi{G}
\label{eq:15-13}
\end{eqnarray}

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-attention-distribution-based-on-gaussian-distribution}
\caption{融合高斯分布的注意力分布}
\label{fig:15-1}
\end{figure}
%-------------------------------------------

\noindent 其中，$\mathbi{G} \in \mathbb{R}^{m\times m}$，$m$是源语言的句子长度。$\mathbi{G}$中的每个元素$G_{ij}$表示当前单词$\mathbi{x}_j$和预测的中心位置$P_i$之间的关联程度，计算公式如下：
\begin{eqnarray}
G_{ij} &=& - \frac{{(j - P_i)}^2}{2\sigma_i^2}
\label{eq:15-14}
\end{eqnarray}

\noindent 其中，$\sigma_i$（$\sigma_i = \frac{D_i}{2}$）表示偏差。中心位置$P_i$和局部建模窗口大小$D_i$的计算方式如下：
\begin{eqnarray}
\begin{pmatrix} P_i \\ D_i \end{pmatrix} &=& m \cdot \textrm{Sigmoid}(\begin{pmatrix} p_i \\ v_i \end{pmatrix})
\label{eq:15-15}
\end{eqnarray}

\noindent $p_i$和$v_i$为网络计算的中间结果，用如下方式计算：
\begin{eqnarray}
p_i &=& \mathbi{I}_p^T\textrm{Tanh}(\mathbi{W}_p\mathbi{Q}_i) \\
v_i &=& \mathbi{I}_d^T\textrm{Tanh}(\mathbi{W}_p\mathbi{Q}_i)
\label{eq:15-17}
\end{eqnarray}

\noindent 其中\mathbi{W}与\mathbi{I}均为模型中可学习的参数矩阵。

\vspace{0.5em}
\item 多尺度局部建模\upcite{DBLP:conf/aaai/GuoQLXZ20}。不同于上述方法直接作用于注意力分布，这里通过赋予多头不一样的局部感受野（图\ref{fig:15-2}），进而间接地引入局部约束。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-multi-scale-local-modeling}
\caption{多尺度局部建模}
\label{fig:15-2}
\end{figure}
%-------------------------------------------

\noindent 这种受限制的多头注意力计算过程如下：
\begin{eqnarray}
\mathbi{e}_{ij} &=& \frac{(\mathbi{x}_i \mathbi{W}_Q){(C(\mathbi{x}_j \mathbi{W}_K,\omega))}^{T}}{\sqrt{d_k}}
\label{eq:15-18}
\end{eqnarray}

\noindent 其中$C(\mathbi{x}_j \mathbi{W}_K,\omega)$表示根据超参数$\omega$自适应的Key：
\begin{eqnarray}
C(\mathbi{x}_j \mathbi{W}_K,\omega) &=& (\mathbi{x}_{j-\omega},\ldots,\mathbi{x}_{j+\omega})
\label{eq:15-19}
\end{eqnarray}

\noindent 之后在计算注意力输出时同样利用上述思想进行局部约束：
\begin{eqnarray}
\mathbi{z}_i &=& \sum_{j=1}^m \alpha_{ij}C(\mathbi{x}_j \mathbi{W}_V,\omega)
\label{eq:15-20}
\end{eqnarray}

\vspace{0.5em}
\end{itemize}

\parinterval 值得注意的是上述两种添加局部约束的方法都更适用于Transformer模型的底层网络。即在早期计算注意力分布时让模型更倾向于局部信息的捕获，之后伴随着网络的加深逐渐加强全局建模的能力。类似的结论在针对BERT模型的解释性研究工作中也有所提及\upcite{Jawahar2019WhatDB,DBLP:conf/emnlp/Ethayarajh19}。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{3. 卷积vs.注意力}

\parinterval 第十一章已经提到，卷积神经网络能够很好的捕获序列中局部信息。因此，充分的利用卷积神经网络的特性，也是进一步优化注意力模型的一种思路。常见的做法是在Transformer中引入卷积操作，甚至用卷积操作替换自注意力模型。常见的方法有：

\begin{itemize}
\vspace{0.5em}
\item 使用轻量卷积和动态卷积神经网络\upcite{Wu2019PayLA,DBLP:conf/interspeech/GulatiQCPZYHWZW20}。卷积神经网络天然更适用于捕获输入序列不同位置间的局部依赖。这里，分别在编码端和解码端利用轻量卷积或动态卷积神经网络（见{\chapternine}）替换自注意力机制，同时保留目标端的编码-解码注意力机制，一定程度上加强了模型对局部信息的建模能力，同时提高了计算效率。
\vspace{0.5em}
\item 使用1维卷积注意力网络（图\ref{fig:15-3}（b））。可以使用一维的卷积自注意力网络（1D-CSAN）将关注的范围限制在相近的元素窗口中。其形式上十分简单，只需预先设定好局部建模的窗口大小范围D，并在进行注意力权重计算和对Value值进行加权求和时，将其限制在设定好的窗口范围内即可。
\vspace{0.5em}
\item 使用2维卷积注意力网络（图\ref{fig:15-3}（c））。在1维卷积注意力网络的基础上对多个注意力头之间的信息进行了交互建模，打破了注意力头之间的界限。 1D-CDAN的关注区域为$1\times D$，当将其扩展为2维矩形$(N\times D)$，长和宽分别为局部窗口的大小和参与建模的自注意力头的个数。这样，模型可以计算某个头中的第$i$个元素和第$s$个头中的第$j$个元素之间的相关性系数。实现了对不同子空间之间关系的建模，所得到的注意力分布表示了头之间的依赖关系。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-convolutional-attention-network}
\caption{原始卷积注意力模型示意图{\red{原图，要引用}}}
\label{fig:15-3}
\end{figure}
%-------------------------------------------
\end{itemize}

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{多分支结构}

\parinterval 在神经网络模型中，有的模块包含多个平行的组件用来捕捉输入表示的多种不同特征，这种结构被称为{\small\bfnew{多分支}}\index{多分支}（Multi-branch）\index{Multi-branch}结构。多分支结构在图像领域被广泛应用\upcite{DBLP:conf/cvpr/XieGDTH17}，在许多人工设计或者自动搜索获得的网络结构中都有它的身影\upcite{DBLP:conf/icml/SoLL19,DBLP:conf/emnlp/YanMZ20,DBLP:journals/corr/abs-2006-10270}。

\parinterval 在自然语言处理领域，多分支结构同样也有很多应用。比如，{\chapterten}介绍过的基于循环神经网络的翻译模型中，为了更好地对源语言进行表示，编码端可以采用双向循环神经网络。这里双向循环神经网络就可以看作一个两分支的结构，分别用来建模正向序列和反向序列的表示，之后将这两种表示进行拼接得到更丰富的表示。另一个典型的例子是{\chaptertwelve}介绍得多头注意力机制。在Transformer 模型中，多头注意力将输入空间表示分割成多个独立的表示，然后分别进行点积注意力的计算，最后再将多个输出表示拼接后通过线性变化进行不同子空间信息的融合。在这个过程中，多个不同的头对应着不同的特征空间，可以捕捉到不同的特征信息。

\parinterval 近几年，在Transformer的结构基础上，一些研究者探索了更为丰富的多分支结构。下面分别介绍几种在Transformer网络中引入多分支结构的方法：

\begin{itemize}
\vspace{0.5em}
\item Weighted Transformer\upcite{DBLP:journals/corr/abs-1711-02132}。其主要思想是在多头自注意力机制的基础上保留不同表示空间的特征。传统方法使用级联操作并通过线性映射矩阵来融合不同头之间的信息，而Weighted Transformer直接利用线性映射矩阵$\mathbi{W} \in \mathbb{R}^{d_k \times d_{model}}$将维度为$d_k$ 的向量表示映射到$d_{model}$，并赋予适当的权重。之后分别送入每个分支中的前馈神经网络，对得到的不同分支输出进行线性加权。但是，这个模型得计算复杂度要大于标准的Transformer模型。

%----------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.4]{./Chapter15/Figures/figure-weighted-transformer-network-structure.png}
\caption{Weighted Transformer网络结构（{\color{red} 这个图是不是有些太复杂了，读者能看懂？}）}
\label{fig:15-5}
\end{figure}
%-------------------------------------------

\vspace{0.5em}
\item 多分支注意力模型\upcite{DBLP:journals/corr/abs-2006-10270}。相比于Weighted Transformer模型，多分支注意力模型直接利用每个分支独立地进行自注意力网络的计算（图\ref{fig:15-6}）。同时为了避免结构相同的多个多头注意力机制之间的协同适应，使用Branch Dropout在训练过程中随机的丢弃一些分支。

%----------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.4]{./Chapter15/Figures/figure-multi-branch-attention-model.png}
\caption{多分支注意力模型}
\label{fig:15-6}
\end{figure}
%-------------------------------------------

\vspace{0.5em}
\item 多模型集成。例如基于多单元的Transformer模型\upcite{DBLP:conf/emnlp/YanMZ20}，其模型结构如图15.7所示。为了进一步加强不同分支的作用，可以进行序列不同位置表示的交换、使用不同的掩码策略对不同分支的输入进行扰动，保证分支间的多样性与互补性。本质上，所谓的多单元思想与集成学习十分相似，类似于在训练过程中同时训练多个编码器。此外，通过增大子单元之间的结构差异性也能够进一步增大分支之间的多样性\upcite{李北2019面向神经机器翻译的集成学习方法分析}。
\vspace{0.5em}
\end{itemize}

%----------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.4]{./Chapter15/Figures/figure-multi-cell-transformer.png}
\caption{多单元Transformer（{\color{red} 我建议这个图就不用了，因为也没有解释}）}
\label{fig:15-7}
\end{figure}
%-------------------------------------------

\parinterval 此外，在\ref{subsec-15.1.1}节中提到利用的卷积神经网络的方法也可以与自注意力机制形成互补。类似的想法在多分支结构中也有体现，如图图\ref{fig:15-8}所示，可以使用自注意力机制和卷积神经完了过分别提取全局和局部两种依赖关系\upcite{DBLP:conf/iclr/WuLLLH20}。具体的做法是将输入的特征向量切分成等同维度的两部分，之后分别送入两个分支进行计算。其中，全局信息自由注意力机制进行提取，局部信息使用轻量卷积提取\upcite{Wu2019PayLA}。此外，由于每个分支的维度只有原始的一半，采用并行计算方式可以显著缩短模型的运行时间。

%----------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.6]{./Chapter15/Figures/figure-light-weight-transformer-module.png}
\caption{基于自注意力和卷积神经网络的多分支结构（{\color{red} 图里面那些带颜色的块有些复杂，可以不用画}）}
\label{fig:15-8}
\end{figure}
%-------------------------------------------

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{引入循环机制}

\parinterval 前面提到Transformer模型完全摒弃了循环单元与卷积单元，仅通过绝对位置编码来区分序列中的不同位置。另一方面，由于循环神经网络也非常适用于处理序列结构，且其结构成熟、易于优化。因此，将其与Transformer模型融合，一方面发挥循环神经网络简单高效的特点，另一方面发挥Transformer模型在特征提取方面的优势，也是一种非常值得探索的思路（{\color{red} 引用RNMT？}）。

\parinterval 一种方法是，对深层网络的不同层使用循环机制。早在残差网络提出时，研究人员已经开始尝试探讨残差网络成功背后的原因（{\color{red} 参考文献}）。本质上，在卷积神经网络中引入残差连接后，网络从深度上隐性地利用循环的特性。区别在于不同层的参数独立，而非共享。Transformer网络的编码端与解码端分别由$N$个相同结构但参数独立的块堆叠而成，其中编码块与解码块中分别包含2/3个子层。同时，子层之间引入了残差连接保证了网络信息传递的高效性。因此，一个自然的想法是通过共享不同块之间的参数，引入循环神经网络中的归纳偏置\upcite{DBLP:conf/iclr/DehghaniGVUK19}。其中每层的权重是共享的，并引入了基于时序的编码向量用于显著区分不同深度下的时序信息。之后，在训练大容量预训练模型时同样也采取了共享层间参数的方式\upcite{Lan2020ALBERTAL}。
    
\parinterval 另一种方法是，利用循环神经网络对输入序列进行编码，之后通过门控机制将得到的结果与Transformer进行融合\upcite{DBLP:conf/naacl/HaoWYWZT19}。融合机制可以采用顺序计算或并行计算。

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{高效的自注意力模型}

\parinterval 除了机器翻译，Transformer模型同样被广泛应用于自然语言理解、图像处理、语音处理等任务。但是，基于自注意力机制的时间复杂度仍是序列长度$N$的平方项，同时其对内存/显存的消耗巨大，尤其当处理较长序列的文本时，问题尤为严重。因此如何提高Transformer模型的效率也是广泛关注的方向之一。

\parinterval 自注意力机制的时间复杂度较高，正是因为其需要对于序列中的每一个单词计算与其他所有单词的相关性。因此一个自然的想法就是限制自注意力机制的作用范围，大体上可以分为如下几种方式：

\begin{itemize}
\vspace{0.5em}
\item 分块注意力：顾名思义，就是将序列划分为固定大小的片段，在进行注意力机制的计算时，执行注意力计算每个词的表示时只在对应的片段内执行。这样，每一个片段内的注意力计算成本是固定，可以大大降低处理长序列时的总体计算时间。\upcite{DBLP:conf/emnlp/QiuMLYW020,DBLP:conf/iclr/LiuSPGSKS18}。
\vspace{0.5em}
\item 跨步注意力：该模式是一种稀疏的注意力机制，通常会设置一个固定的间隔，也就是说在计算注意力表示时，每隔固定数量的词后将下一个词纳入所需考虑的范围内，参与注意力的计算\upcite{DBLP:journals/corr/abs-2004-05150}。和分片段进行注意力类似，假设最终参与注意力计算的单词个数为$B$，共需要执行$\frac{N}{B}$次注意力计算，可以将计算复杂度缩减为$O(NB)$。
\vspace{0.5em}
\item 内存压缩注意力：这种方式的主要的思想是使用一些合并操作，如卷积，池化等对序列进行下采样，来缩短序列长度。例如，使用{\small\bfnew{跨步卷积}}\index{跨步卷积}（Stride Convolution）\index{Stride Convolution}来减少Key和Value的数量，即减少表示序列长度的维度的大小，Query的数量保持不变，从而减少了注意力矩阵计算时的复杂度\upcite{DBLP:conf/iclr/LiuSPGSKS18}。其具体的计算复杂度取决跨步卷积时步幅的大小$K$，形式上可以理解为每$K$个词做一次特征融合后，将关注的目标缩减为$\frac{N}{K}$，整体的计算复杂度为$O(\frac{N^2}{K})$，相比于前两种方式的对局部进行注意力计算，该方式仍是对全局的建模。
\vspace{0.5em}
\end{itemize}

\parinterval 在不同的任务中，可以根据不同的需求使用不同的注意力模型，甚至可以采用多种注意力模型的结合，比如，对分类任务中的某些特殊标签，如BERT中的<CLS>，需要对全局信息进行整合，因此可以使用全局的注意力模式。而对于其他位置的单词，则可以使用局部注意力提高计算效率。同样的，也可以针对多头机制中的不同注意力头使用不同的注意力的计算方式，或者对不同的头设置不同的局部窗口的大小，以此来增大感受野，在提高模型计算效率的同时使模型保留全局建模能力。

\parinterval 在上面的介绍的方法中都是基于预先设定好的超参来限制注意力机制的作用范围，可以称这些方法是静态的。除此之外还有以数据驱动的，通过模型来学习具体的访问机制可学习模式。比如，可以将序列分块，并对序列中的单词进行排序或者聚类，之后采用稀疏注意力的计算。下面对部分相关的模型进行简单的介绍：

\begin{itemize}
\vspace{0.5em}
\item Reformer模型在计算Key和Value时使用相同的线性映射，共享Key和Value的值\upcite{Kitaev2020ReformerTE}。在实际实验中发现，这种模式并不会影响Transformer模型的性能。其次，Reformer 中为了降低自注意力机制的复杂度，引入了一种{\small\bfnew{局部哈希敏感注意力机制}}\index{局部哈希敏感注意力机制}（LSH Attention）\index{LSH Attention}，其提高效率的方式和固定模式中的局部建模一致，减少注意力机制的计算范围。对于每一个Query，通过局部哈希敏感机制找出和其较为相关的Key，并进行注意力的计算。其基本思路就是距离相近的向量以很大的概率被哈希分配到一个桶内，距离较远的向量被分配到一个桶内的概率则较低。哈希的散列函数为：
\begin{eqnarray}
\mathbi{h}(\mathbi{x}) &=& \arg\max([\mathbi{x}\mathbi{R};-\mathbi{x}\mathbi{R}])
\label{eq:15-21}
\end{eqnarray}

\noindent $\mathbi{R}$为随机的矩阵,$[;]$代表拼接操作。当$\mathbi{h}({Query}_i) = \mathbi{h}({Key}_j )$，$i$和$j$为序列中不同位置单词的下标，也就是说，也就是说当两个词的Query和Key落在同一个散列桶时，对其进行注意力的计算。此外，Reformer中还采用了一种{\small\bfnew{可逆残差网络结构}}\index{可逆残差网络结构}（The Reversible Residual Network）\index{The Reversible Residual Network}和分块计算前馈神经网络层机制，即将前馈层的隐层维度拆分多个块后独立计算，最后进行拼接操作，得到前馈层的输出，大幅度减少了内存/显存占用，但由于在反向过程中需要重复计算某些节点，牺牲了一定的计算效率。

\vspace{0.5em}
\item Routing Transformer通过聚类算法对单词进行分组，分别在组内进行自注意力机制的计算\upcite{DBLP:journals/corr/abs-2003-05997}。首先是将Query和Key映射到聚类矩阵$\mathbi{R}$：
\begin{eqnarray}
\mathbi{R} &=& \mathbi{Q} \mathbi{W} + \mathbi{K} \mathbi{W}
\label{eq:15-22}
\end{eqnarray}

\noindent 其中，$\mathbi{W}$为映射矩阵。为了保证每个簇内的单词数量一致，利用聚类算法将$\mathbi{R}$中的向量分配到$\sqrt{N}$个簇中，其中$N$为序列长度，即分别计算$\mathbi{R}$中每个向量与质心的距离，并对每个质心取距离最近的若干个节点。

\vspace{0.5em}
\end{itemize}

\parinterval 另外，在注意力机制中对计算效率影响很大的一个因素是Softmax函数的计算。{\chaptertwelve}已经介绍过自注意力机制的计算公式为：
\begin{eqnarray}
\textrm{Attention}(\mathbi{Q},\mathbi{K},\mathbi{V}) &=& \textrm{Softmax}
 ( \frac{\mathbi{Q}\mathbi{K}^{\textrm{T}}} {\sqrt{d_k}}) \mathbi{V}
\label{eq:15-23}
\end{eqnarray}

\parinterval 由于Softmax函数的存在，首先要进行$\mathbi{Q}\mathbi{K}^{\textrm{T}}$的计算得到$N \times N$的矩阵，其中$N$是序列长度，在对维度为$N \times d_k$的Value进行加权求和时，其时间复杂度便是$O(N^2)$。假设能够移除Softmax操作，便可以将注意力机制的计算调整为$\mathbi{Q}\mathbi{K}^{\textrm{T}}\mathbi{V}$，由于矩阵的运算满足结合律，可以先进行$\mathbi{K}^{\textrm{T}}\mathbi{V}$ 的运算，得到$d_k \times d_k$的矩阵，再左乘$\mathbi{Q}$。在长文本处理中，由于多头机制的存在，一般有$dk \ll N$,所以最终的计算复杂度便可以近似为$O(N)$，从而将注意力机制简化为线性计算\upcite{Katharopoulos2020TransformersAR,DBLP:journals/corr/abs-2009-14794}。

%----------------------------------------------------------------------------------------
%    NEW SECTION
%----------------------------------------------------------------------------------------

\sectionnewpage
\section{网络连接优化及深层网络建模}

\parinterval 除了对Transformer模型中的局部组件进行改进，改进不同层之间的连接方式也十分重要。常见的做法是融合编码/解码的中间层表示得到更丰富的编码/解码输出\upcite{Wang2018MultilayerRF,Wang2019ExploitingSC,Dou2018ExploitingDR,Dou2019DynamicLA}。同时，可以利用稠密连接等更复杂的层间连接方式来强化或替换残差连接，这类方法在图像识别\upcite{DBLP:journals/corr/HeZRS15,DBLP:conf/cvpr/HuangLMW17}、机器翻译\upcite{Bapna2018TrainingDN,Wang2018MultilayerRF,Dou2018ExploitingDR,WangLearning,Dou2019DynamicLA}
等任务上取得了很好的效果。

\parinterval 与此同时，宽网络（如Transformer-Big）在机器翻译、语言模型等任务上表现得十分出色，但伴随而来的是快速增长的参数量与更大的训练代价。同时受限于任务的复杂度与计算设备的算力，进一步探索更宽的网络显然不是特别高效的手段。因此研究人员普遍选择增加神经网络的深度来对句子进行更充分的表示。但是，简单地堆叠很多层Transformer网络并不能带来性能上的提升，反而会面临更加严重的梯度消失/梯度爆炸的问题。这是由于伴随神经网络变深，梯度无法有效地从输出层回传到底层网络，造成网络浅层部分的参数无法得到充分训练\upcite{Bapna2018TrainingDN,WangLearning,DBLP:journals/corr/abs-2002-04745,DBLP:conf/emnlp/LiuLGCH20}。针对这些问题，已经有研究者开始尝试求解，并取得了很好的效果。比如，设计更有利于深层信息传递的网络连接\upcite{Bapna2018TrainingDN,WangLearning}和恰当的参数初始化方法\upcite{huang2020improving,DBLP:conf/emnlp/ZhangTS19}等。

\parinterval 但是，如何设计一个足够“深”的机器翻译模型仍然是业界关注的热点问题之一。此外，伴随着网络的继续变深，将会面临一些新的问题，例如，如何加速深层网络的训练，如何解决深层网络的过拟合问题等。下面将会对以上问题展开讨论。首先对Transformer模型的内部信息流进行详细的讨论。之后分别从模型结构和参数初始化两个角度求解为什么深层网络难以训练，并介绍相应的解决手段。

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{Post-Norm vs Pre-Norm}
\label{sec:post-pre-norm}

\parinterval 为了探究为何深层的Transformer模型很难直接训练，首先对Transformer的模型结构进行简单的回顾，详细内容可以参考{\chaptertwelve}。以Transformer的编码端为例，在多头自注意力网络和前馈神经网络中间，Transformer模型利用残差连接\upcite{DBLP:journals/corr/HeZRS15}和层标准化操作\upcite{Ba2016LayerN}来提高信息的传递效率。Transformer模型大致分为图\ref{fig:15-9}中两种结构\ \dash \ 后作方式的残差单元（Post-Norm）和前作方式的残差单元（Pre-Norm）{\red{（要不要把“pre-norm”之类的英文都改成中文“前作”，标题以及正文中突然用英文有点奇怪）}{\color{blue} 肖：我觉得用英语可以，中文的说法并不是公知的}}。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-post-norm-vs-pre-norm}
\caption{后作 Transformer（Post-Norm Transformer） 与前作 Transformer（Pre-Norm Transformer）}
\label{fig:15-9}
\end{figure}
%-------------------------------------------

\parinterval 令$\mathbi{x}_l$和$\mathbi{x}_{l+1}$表示第$l$个子层的输入和输出\footnote[2]{这里沿用Transformer中的定义，每一层（Layer）包含多个子层（Sub-layer）。比如，对于Transformer编码器，每一层包含一个自注意力子层和一个前馈神经网络子层。所有子层都需要进行层标准化和残差连接。}，$\mathbi{y}_l$表示中间的临时输出；$\textrm{LN}(\cdot)$表示层标准化操作，帮助减少子层输出分布的方差。从而让训练变得更稳定；$F(\cdot)$表示子层所对应的函数，比如前馈神经网络、自注意力网络等。下面分别对Post-Norm和Pre-Norm进行简单的描述。
\begin{itemize}
\vspace{0.5em}
\item Post-Norm：早期的Transformer遵循的是Post-Norm结构\upcite{vaswani2017attention}。也就是层标准化作用于每一子层的输入和输出的残差结果上，如图\ref{fig:15-9}(a)所示。可以表示如下：
\begin{eqnarray}
\mathbi{x}_{l+1} &=& \textrm{LN}(\mathbi{x}_l+F(\mathbi{x}_l;{\bm  \theta_l}))
\label{eq:15-24}
\end{eqnarray}

\noindent 其中，$\bm \theta_l$是子层$l$的参数。
\vspace{0.5em}
\item Pre-Norm：通过调整层标准化的位置，将其放置于每一子层的输入之前，得到了Pre-Norm结构\upcite{DBLP:conf/eccv/HeZRS16}，如图\ref{eq:15-1}(b)所示。这种结构也被广泛应用于最新的Transformer开源系统中\upcite{Vaswani2018Tensor2TensorFN,Ottfairseq,KleinOpenNMT}，公式如下：
\begin{eqnarray}
\mathbi{x}_{l+1} &=& \mathbi{x}_l+F(\textrm{LN}(\mathbi{x}_l);{\bm  \theta_l})
\label{eq:15-25}
\end{eqnarray}
\end{itemize}

\parinterval 从上述公式可以看到Pre-Norm结构可以通过残差路径将底层网络的输出直接暴露给上层网络；另一方面从反向传播的角度看，使用Pre-Norm结构，顶层的梯度可以更容易地反馈到底层网络。这里以一个含有$N$个子层的结构为例。令$Loss$表示整个神经网络输出上的损失，$\mathbi{x}_N$为顶层的输出。对于Post-Norm结构，根据链式法则，损失$Loss$相对于$\mathbi{x}_l$的梯度可以表示为：
\begin{eqnarray}
\frac{\partial Loss}{\partial \mathbi{x}_l} &=& \frac{\partial Loss}{\partial \mathbi{x}_N} \times \prod_{k=l}^{N-1}\frac{\partial \textrm{LN}(\mathbi{y}_k)}{\partial \mathbi{y}_k} \times \prod_{k=l}^{N-1}(1+\frac{\partial F(\mathbi{x}_k;{\bm \theta_k})}{\partial \mathbi{x}_k})
\label{eq:15-26}
\end{eqnarray}

\noindent 其中，$\prod_{k=l}^{N-1}\frac{\partial \textrm{LN}(\mathbi{y}_k)}{\partial \mathbi{y}_k}$表示在反向传播过程中经过层标准化得到的复合函数导数，$\prod_{k=l}^{N-1}(1+\frac{\partial F(\mathbi{x}_k;{\bm \theta_k})}{\partial \mathbi{x}_k})$代表每个子层间残差连接的导数。

\parinterval 类似的，也能得到Pre-Norm结构的梯度计算结果,如下式所示：
\begin{eqnarray}
\frac{\partial Loss}{\partial \mathbi{x}_l} &=& \frac{\partial Loss}{\partial \mathbi{x}_N} \times (1+\sum_{k=l}^{N-1}\frac{\partial F(\textrm{LN}(\mathbi{x}_k);{\bm \theta_k})}{\partial \mathbi{x}_l})
\label{eq:15-27}
\end{eqnarray}

\parinterval 对比公式\eqref{eq:15-26}和公式\eqref{eq:15-27}可以明显发现Pre-Norm结构直接把顶层的梯度$\frac{\partial Loss}{\partial \mathbi{x}_N}$传递给下层，也就如果将公式\eqref{eq:15-27}右侧展开的话，可以发现$\frac{\partial Loss}{\partial \mathbi{x}_l}$中直接含有$\frac{\partial Loss}{\partial \mathbi{x}_N}$的部分。这个性质弱化了梯度计算对模型深度$N$的依赖；而如公式\eqref{eq:15-26}右侧所示，Post-Norm结构会导致一个与$N$相关的多项导数的积，伴随着$N$的增大更容易发生梯度消失和梯度爆炸问题。因此，Pre-Norm结构更适于堆叠多层神经网络的情况。比如，使用Pre-Norm 结构可以很轻松地训练一个30层（60个子层）编码器的Transformer网络，并带来可观的BLEU提升。这个结果相当于标准Transformer编码器深度的6倍，相对的，用Pre-Norm结构训练深层网络的时候，训练结果很不稳定，当编码器深度超过12层后很难完成有效训练\upcite{WangLearning}，尤其是在低精度设备环境下损失函数出现发散情况。这里把使用Pre-Norm的深层Transformer称为Transformer-Deep。

\parinterval 另一个有趣的发现是，使用深层网络后，网络可以更有效地利用较大的学习率和batch size训练，大幅度缩短了模型达到收敛的时间。相比于Transformer-Big等宽网络，Transformer-Deep并不需要太大的隐藏层维度就可以取得更优的翻译品质\upcite{WangLearning}。也就是说，Transformer-Deep是一个更“窄”更“深”的网络。这种结构的参数量比Transformer-Big少，系统运行效率更高。

\parinterval 此外研究人员发现当编码端使用深层网络之后，解码端使用更浅的网络依然能够维持很好的翻译品质。这是由于解码端也会对源语言信息进行加工和抽象，当编码器变深之后，解码器对源语言的加工就不那么重要了，因此可以减少解码器的深度。这样做的一个直接好处是：可以通过减少解码器的深度加快翻译速度。对于一些延时敏感的场景，这种架构是极具潜力的\upcite{DBLP:journals/corr/abs-2006-10369}（{\color{red} 引用李北AAAI论文}）

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{高效信息传递}

\parinterval 尽管使用Pre-Norm结构可以很容易地训练深层Transformer模型，但从信息传递的角度看，Transformer模型中第$l$层的输入仅仅依赖于前一层的输出。虽然残差连接可以跨层传递信息，但是对于很深的网络，整个模型的输入和输出之间仍需要经过很多次残差连接。

\parinterval 为了使上层的网络可以更加方便地访问下层网络的信息，一种方法是直接引入更多的跨层连接。最简单的一种方法是直接将所有层的输出都连接到最上层，达到聚合多层信息的目的\upcite{Bapna2018TrainingDN,Wang2018MultilayerRF,Dou2018ExploitingDR}。另一种更加有效的方式是在网络前向计算的过程中建立当前层表示与之前层表示之间的关系，例如{\small\bfnew{动态线性聚合网络}}\upcite{WangLearning}\index{动态线性聚合网络}（Dynamic Linear Combination of Layers，DLCL）\index{Dynamic Linear Combination of Layers}和动态层聚合方法\upcite{Dou2019DynamicLA}。

\parinterval 两者的共性在于，在每一层的输入中不仅考虑前一层的输出，同时将前面所有层的中间结果（包括词嵌入表示）进行聚合，本质上利用稠密的层间连接提高了网络中信息传递的效率（前向计算和反向梯度计算）。而前者利用线性的层融合手段来保证计算的时效性，主要应用于深层网络任务的训练，理论上等价于常微分方程中的高阶求解方法\upcite{WangLearning}。此外，为了进一步增强上层网络对底层表示的利用，研究人员从多尺度的角度对深层的编码器网络进行分块，并使用GRU网络来捕获不同块之间的联系，得到更高层次的表示。该方法可以看作是对上述动态线性聚合网络的延伸。接下来分别对上述几种改进方法展开讨论。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{1. 使用更多的跨层连接}

\parinterval 图\ref{fig:15-10}描述了引入了更多跨层连接的结构。在网络的前向计算过程中，假设编码端总层数为$N$（{\color{red} 15.1已经用$N$表示句子长度了！}），当完成编码端$N$层的逐层计算后，通过线性平均、加权平均等机制对网络的中间层表示进行融合，得到蕴含所有层信息的表示\mathbi{g}，作为编码-解码注意力机制的输入，与总共有$M$层的解码器共同处理解码信息。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-layer-fusion-method}
\caption{层融合方法}
\label{fig:15-10}
\end{figure}
%-------------------------------------------

\parinterval 这里，令$\mathbi{h}_i$是第$i$层编码端的输出，$\mathbi{s}_j^k$是解码器解码第$j$个单词时第$k$层的输出。层融合机制可以大致划分为如下：

\begin{itemize}
\vspace{0.5em}
\item 线性平均。即平均池化，通过对各层中间表示进行累加之后取平均值。
\begin{eqnarray}
\mathbi{g} &=& \frac{1}{N}\sum_{l=1}^{N}{\mathbi{h}_l}
\label{eq:15-28}
\end{eqnarray}

\vspace{0.5em}
\item 权重平均。在线性平均的基础上，赋予每一个中间层表示相应的权重。权重的值通常采用可学习的参数矩阵$\mathbi{W}$表示，通过反向传播来不断调整每一层的权重比例，通常会略优于线性平均方法。
\begin{eqnarray}
\mathbi{g} &=& \sum_{l=1}^{N}{\mathbi{W}_l\mathbi{h}_l}
\label{eq:15-29}
\end{eqnarray}

\vspace{0.5em}
\item 前馈神经网络。将之前中间层的表示进行级联，之后利用前馈神经网络得到融合的表示。
\begin{eqnarray}
\mathbi{g} &=& \textrm{FNN}([\mathbi{h}_1,\mathbi{h}_2,\ldots,\mathbi{h}_N])
\label{eq:15-30}
\end{eqnarray}

\noindent 其中，$[\cdot]$表示级联操作。这种方式比权重平均具有更复杂的线性运算，同时也引入了非线性变化增加网络的表示能力。
\vspace{0.5em}
\item 基于多跳的自注意力机制。如图\ref{fig:15-11}所示，其做法与前馈神经网络类似，首先将不同层的表示拼接成2维的句子级矩阵表示\footnote[4]{对比1维向量有更强的表示能力\upcite{DBLP:journals/corr/LinFSYXZB17}}。之后利用类似于前馈神经网络的思想将维度为$\mathbb{R}^{d\times N}$的矩阵映射到维度为$\mathbb{R}^{d\times n_{hop}}$的矩阵。
\begin{eqnarray}
\mathbi{o} &=& \sigma ([\mathbi{h}_1,\mathbi{h}_2,\ldots,\mathbi{h}_N]^{T} \cdot \mathbi{W}_1)\mathbi{W}_2
\label{eq:15-31}
\end{eqnarray}

\noindent 其中$\mathbi{W}_1 \in \mathbb{R}^{d\times d_a}$，$\mathbi{W}_2 \in \mathbb{R}^{d_a\times n_{hop}}$。之后使用Softmax函数计算不同层在同一维度空间的归一化概率$\mathbi{u}_l$：
\begin{eqnarray}
\mathbi{u}_l &=& \frac{\textrm{exp}(\mathbi{o}_l)}{\sum_i^N{\textrm{exp}(\mathbi{o}_i)}}
\label{eq:15-32}
\end{eqnarray}

\noindent 最后通过向量积操作得到维度为$\mathbb{R}^{d\times n_{hop}}$的稠密表示$\mathbi{v}$。通过单层的前馈神经网络得到最终的融合表示 ：
\begin{eqnarray}
\mathbi{v}_n & = & [\mathbi{h}_1,\mathbi{h}_2,\ldots,\mathbi{h}_N]\cdot \mathbi{u}_l \\
\mathbi{g} & = & \textrm{FNN}([\mathbi{v}_1,\mathbi{v}_2,\ldots,\mathbi{v}_N])
\label{eq:15-34}
\end{eqnarray}
\vspace{0.5em}
\end{itemize}

%----------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.7]{./Chapter15/Figures/figure-layer-fusion-method-2d.png}
\caption{基于多跳注意力机制的层融合}
\label{fig:15-11}
\end{figure}
%-------------------------------------------

\parinterval 上述工作更多应用于浅层的Transformer网络，这种仅在编码端顶部使用融合机制的方法并没有在深层Transformer上得到有效地验证。主要原因是融合机制仅作用于编码端或解码端的顶部，对网络中间层的计算并没有显著提升。因此当网络深度较深时，信息在前向计算和反向更新过程中的传播效率仍然有待提高，但这种“静态”的融合方式也为深层Transformer研究奠定了基础。例如，研究人员提出了透明注意力网络\upcite{Bapna2018TrainingDN}，即在权重平均的基础上，引入了$(N+1)\times (M+1)$的权重矩阵，其中$N$和$M$分别代表编码端与解码端的层数。其核心思想是，让解码端中每一层的编码-解码注意力网络都接收到的不同比例的编码层信息，而不是使用相同的融合表示。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{2. 动态层融合}

\parinterval 那如何进一步提高信息的传递效率？对比层融合方法，本节介绍的动态层融合可以更充分地利用之前层的信息，其网络连接更加稠密，表示能力更强\upcite{Bapna2018TrainingDN,WangLearning,li2020shallow}。以基于Pre-Norm结构的DLCL模型中的编码器为例，具体做法如下：

\begin{itemize}
\vspace{0.5em}
\item 对于每一层的输出$\mathbi{x}_{l}$，对其进行层标准化，得到每一层的信息的表示
\begin{eqnarray}
\mathbi{h}_l &=& \textrm{LN}(\mathbi{x}_{l})
\label{eq:15-35}
\end{eqnarray}
注意，$\mathbi{h}_0$表示词嵌入层的输出，$\mathbi{h}_l(l>0)$表示Transformer网络中最终的各层输出。
\vspace{0.5em}
\item 	定义一个维度为$(N+1)\times (N+1)$的权值矩阵$\mathbi{W}$，矩阵中每一行表示之前各层对当前层计算的贡献度，其中$N$是编码端的层数。令$\mathbi{W}_{l,i}$代表权值矩阵$\mathbi{W}$第$l$行第$i$列的权重，则层聚合的输出为$\mathbi{h}_i$的线性加权和：
\begin{eqnarray}
\mathbi{g}_l &=& \sum_{i=0}^{l}\mathbi{h}_i\times \mathbi{W}_{l,i}
\label{eq:15-36}
\end{eqnarray}
$\mathbi{g}_l$会作为输入的一部分送入第$l+1$层。其网络的结构如图\ref{fig:15-10}所示
\vspace{0.5em}
\end{itemize}

%---------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-dynamic-linear-aggregation-network-structure}
\caption{线性层聚合网络}
\label{fig:15-13}
\end{figure}
%-------------------------------------------

\parinterval 可以看到，权值矩阵$\mathbi{W}$是一个下三角矩阵。开始时，对矩阵参数的每行进行平均初始化，即初始化矩阵$\mathbi{W}_0$的每一行各个位置的值为$\frac{1}{\lambda}, \lambda \in (1,2,\ldots,l+1)$。伴随着神经网络的训练，网络通过反向传播算法来不断更新$\mathbi{W}$中每一行不同位置权重的大小。

\parinterval 动态线性层聚合的一个好处是，系统可以自动学习不同层对当前层的贡献度。在实验中也发现，离当前层更近的部分的贡献度（权重）会更大，如图\ref{fig:15-14}所示，在每一行中颜色越深代表对当前层的贡献度越大，这也是符合直觉的。

\parinterval 对比上述介绍的动态层线性聚合方法，研究人员利用更为复杂的胶囊网络\upcite{Dou2019DynamicLA}，树状层次结构\upcite{Dou2018ExploitingDR}作为层间的融合方式，动态地计算每一层网络的输入。然而，研究人员发现进一步增加模型编码端的深度并不能取得更优的翻译性能。因此如何进一步突破神经网络深度的限制是值得关注的研究方向，类似的话题在图像处理领域也激起了广泛的讨论\upcite{DBLP:conf/nips/SrivastavaGS15,DBLP:conf/icml/BalduzziFLLMM17,DBLP:conf/icml/Allen-ZhuLS19,DBLP:conf/icml/DuLL0Z19}。

%---------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.4]{./Chapter15/Figures/figure-weight-visualization-of-convergence-DLCL-network.png}
\caption{对收敛的DLCL网络进行权重的可视化\upcite{WangLearning}}（{\color{red} 横轴时啥？纵轴是啥？看不清啊，有原图或者数据重新画一下？}）
\label{fig:15-14}
\end{figure}
%-------------------------------------------

\parinterval 沿着动态线性层聚合（DLCL）的思路，研究者进一步提出了{\small\bfnew{多尺度协同框架}}\index{多尺度协同框架}（Multiscale Collaborative Framework）\index{Multiscale Collaborative Framework}。这种方法采用组间协同机制，其核心思想是解码端能够利用对应的编码块输出作为注意力网络的Key和Value进行跨语言间映射，进而达到对编码端不同层次信息的利用。此外，也使用了上下文协同机制对不同层间的长距离依赖进行建模。

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{面向深层模型的参数初始化策略}

\parinterval 对于深层神经机器翻译模型，除了神经网络结构的设计，合适的初始化策略同样十分重要。例如，Transformer中参数矩阵采用了Xavier初始化方法\upcite{pmlr-v9-glorot10a}。该方法可以保证在训练过程中各层激活函数的输出和梯度的方差的一致性，即同时保证正向传播和反向传播时输入和输出的方差相同。但是，这类方法更多地被使用在初始化浅层神经网络，在训练深层Transformer模型时表现不佳\upcite{pmlr-v9-glorot10a}。近期，研究人员针对深层网络的参数初始化问题进行了更加深入的探索，分为以下几种方法。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{1. 基于深度缩放的初始化策略}

\parinterval 随着网络层数的加深，输入的特征要经过很多的线性及非线性变换，受网络中激活函数导数值域范围和连乘操作的影响，常常会带来梯度爆炸或梯度消失的问题。这个问题的原因是过多地堆叠网络无法保证梯度在回传过程中的方差一致性，因此在目前深层模型中采用的很多标准化方式（如层标准化、批次标准化等）都是从方差一致性的角度来解决此问题，即通过将网络各层输出的取值范围控制在激活函数的梯度敏感区域，从而维持网络中梯度传递的稳定性。

\parinterval 为了说明问题，首先来看一看浅层Transformer模型中如何维持梯度的方差一致性。在Transformer的初始化阶段，一般使用Xavier初始化方法对参数矩阵$\mathbi{W}$进行初始化\upcite{pmlr-v9-glorot10a}，具体做法为从一个均匀分布中进行随机采样：
\begin{eqnarray}
\mathbi{W} & \in & \mathbb{R}^{n_i\times n_o} \sim u(-\gamma,\gamma) \\
\gamma     & = & \sqrt{\frac{6}{n_i + n_o}}
\label{eq:15-37}
\end{eqnarray}

\noindent 其中，$u(-\cdot,\cdot)$表示一个均匀分布，$n_i$和$n_o$分别为线性变换$\mathbi{W}$中输入和输出的维度，换句话说，也就是上一层神经元的数量和下一层神经元的数量。通过这种方式可以维持在前向与反向计算过程中输入与输出方差的一致性\upcite{DBLP:conf/iccv/HeZRS15}。

\parinterval 令模型中某层神经元的输出表示为$\mathbi{Z}=\sum_{j=1}^{n_i}{w_j x_j}$，{\color{red} $\textrm{Var}(\cdot)$表示？？？}。此时，两个随机变量乘积的方差展开式为：
\begin{eqnarray}
\textrm{Var}(w_j x_j) &=& E[w_j]^2 \textrm{Var}(x_j) + E[x_j]^2 \textrm{Var}(w_j) + \textrm{Var}(w_j)\textrm{Var}(x_j)
\label{eq:15-38}
\end{eqnarray}

\parinterval {\color{red} 上面这个公式要说明啥？}由于在大多数情况下，现有模型中的各种标准化方法可以维持$E[w_j]^2$和$E[x_j]^2$等于或者近似为0。因此，实际上模型中一层神经元输出的方差可以表示为：

\begin{eqnarray}
\textrm{Var}(\mathbi{Z}) &=& \sum_{j=1}^{n_i}{\textrm{Var}(x_j) \textrm{Var}(w_j)} \nonumber \\
&=& {n_i}\textrm{Var}(\mathbi{W})\textrm{Var}(\mathbi{X})
\label{eq:15-39}
\end{eqnarray}

\parinterval 通过观察公式\eqref{eq:15-39}可以发现，在前向传播的过程中，当$\textrm{Var}(\mathbi{W})=\frac{1}{n_i}$时，可以保证输入和输出空间的分布差异不至于过大。通过计算可以得知，为了保证网络中每一层的输入和输出的方差一致，要求网络在正向传播时$\textrm{Var}(\mathbi{W})=\frac{1}{n_i}$，反向传播时$\textrm{Var}(\mathbi{W})=\frac{1}{n_o}$，通过对两种情况取平均值，控制网络参数$\mathbi{W}$的方差为$\frac{2}{n_i+n_o}$，则可以维持在前向与反向过程中输入与输出方差的一致性。若将参数初始化为一个服从边界为$[-a,b]$的均匀分布，那么其方差为$\frac{{(b+a)}^2}{12}$，为了达到$\mathbi{W}$的取值要求，那么初始化时应有$a=b=\sqrt{\frac{6}{n_i+n_o}}$。

\parinterval 但是随着网络层数的加深，上述初始化得到的参数状态不能很好地约束基于Post-Norm的Transformer的输出方差。当神经网络堆叠很多层时，模型顶层输出的方差较大，同时反向传播时顶层的梯度范数也要大于底层。因此，一个自然的想法是根据网络的深度对不同层的参数矩阵采取不同的初始化方式，进而强化对各层输出方差的约束，可以描述为：
\begin{eqnarray}
\mathbi{W} \in \mathbb{R}^{n_i\times n_o} \sim u(-\gamma \frac{\alpha}{\sqrt{l}},\gamma \frac{\alpha}{\sqrt{l}})
\label{eq:15-40}
\end{eqnarray}

\noindent 其中，$l$为对应的神经网络的层次，$\alpha$为预先设定的超参数来控制缩放的比例。这样，可以通过缩减顶层网络输出分布与输入分布之间的差异，减少顶层网络参数的梯度范数。从而缓解由于网络层堆叠过深所带来的梯度消失问题，保证深层网络能够稳定的训练。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{2. 基于Lipschitz的初始化策略}

\parinterval 在\ref{sec:post-pre-norm}节已经介绍，在Pre-Norm结构中每一个子层的输出为$\mathbi{x}_{l+1}^{pre}=\mathbi{x}_l+\mathbi{y}_l$，其中$\mathbi{x}_l$为当前子层的输入， $\mathbi{y}_l$ 为经过自注意力层或前馈神经网络层计算后得到的子层输出。在Post-Norm结构中，在残差连接之后还要进行层标准化操作，具体的计算流程为：

\begin{itemize}
\vspace{0.5em}
\item 计算输入的均值：${\bm  \mu}=\textrm{mean}⁡(\mathbi{x}_l+\mathbi{y}_l)$
\vspace{0.5em}
\item 计算输入的方差：${\bm  \sigma}=\textrm{std}⁡(\mathbi{x}_l+\mathbi{y}_l)$
\vspace{0.5em}
\item 根据均值和方差对输入进行放缩，其中$\mathbi{w}$和$\mathbi{b}$为可学习参数，用于进一步调整均值和方差到合适的位置，提高网络的表示能力：
\begin{eqnarray}
\mathbi{x}_{l+1}^{post} &=& \frac{\mathbi{x}_l+\mathbi{y}_l-{\bm  \mu}}{\bm  \sigma} \cdot \mathbi{w}+\mathbi{b}
\label{eq:15-41}
\end{eqnarray}
\noindent 将其展开后可得：
\begin{eqnarray}
\mathbi{x}_{l+1}^{post} &=& \frac{\mathbi{w}}{\bm  \sigma} \cdot \mathbi{x}_{l+1}^{pre}-\frac{\mathbi{w}}{\bm  \sigma} \cdot {\bm  \mu}+\mathbi{b}
\label{eq:15-42}
\end{eqnarray}
\vspace{0.5em}
\end{itemize}

\parinterval 可以看到相比于Pre-Norm的计算方式，基于Post-Norm的Transformer中子层的输出为Pre-Norm形式的$\frac{\mathbi{w}}{\bm  \sigma}$倍，当$\frac{\mathbi{w}}{\bm  \sigma}<1.0$时，使残差层的输出较小，输入与输出分布之间差异过大，导致深层Transformer系统难以收敛。因此基于Lipschitz 的初始化策略通过维持条件$\frac{\mathbi{w}}{\bm  \sigma}>1.0$，保证网络输入与输出范数一致，进而缓解梯度消失的问题\upcite{DBLP:conf/acl/XuLGXZ20}。一般情况下，$\mathbi{w}$可以被初始化为1，因此Lipschitz 初始化方法最终的约束条件则为：
\begin{eqnarray}
0.0<{\bm  \sigma} &=& \textrm{std}⁡(\mathbi{x}_l+\mathbi{y}_l) \leq 1.0
\label{eq:15-43}
\end{eqnarray}

\parinterval 为了实现这个目标，可以限制$a \leq \mathbi{x}_l+\mathbi{y}_l \leq a + \Delta a$，在经过推导后可以发现，只要$\Delta a \leq 1.0$即可满足此条件。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{3. T-Fixup初始化策略}

\parinterval 另外一种初始化方法是从神经网络结构与优化器的计算方式入手，通过可视化训练过程中参数的范数发现Post-Norm网络在训练前期（Warmup阶段）难以很精确的估计参数的二阶动量，导致训练不稳定问题\upcite{huang2020improving}。也就是，层标准化是导致深层Transformer难以优化的主要原因之一\upcite{WangLearning}。Post-Norm方式下Transformer的底层网络，尤其是编码端的词嵌入层面临严重的梯度消失问题。导致矛盾的原因在于在不改变层标准化位置的条件下，由于Adam优化器利用滑动平均的方式来估计参数的二阶矩，其方差是无界的。这样，在前期模型只能看到有限数量样本的前提下，其二阶矩很难进行有效的估计。因此反向更新参数时会导致参数的梯度方差过大。

\parinterval 相较于用Pre-Norm代替Post-Norm结构来训练深层网络，也可以通过去除Warmup策略并移除层标准化机制，并针对神经网络中不同的参数矩阵制定了相应的缩放机制来保证训练的稳定\upcite{huang2020improving}。具体的缩放策略如下（{\color{red} 下面的是不是有些太具体了？}）：

\begin{itemize}
\vspace{0.5em}
\item 类似于标准的Transformer初始化方式，使用Xavier初始化方式来初始化除了词嵌入以外的所有参数矩阵。词嵌入矩阵服从$\mathbb{N}(0,d^{-\frac{1}{2}})$的高斯分布，其中$d$代表词嵌入的维度。
\vspace{0.5em}
\item 对编码器中自注意力模型中$\mathbi{W}^V$和$\mathbi{W}^o$矩阵以及前馈神经网络中所有参数矩阵进行缩放因子为$0.67 {N}^{-\frac{1}{4}}$的缩放，其中{\color{red} $\mathbi{W}^V$为...???}$\mathbi{W}^o$是注意力操作中的参数矩阵（见{\chaptertwelve}） 。
\vspace{0.5em}
\item 对解码器中注意力模型中的$\mathbi{W}^V$和$\mathbi{W}^o$以及前馈神经网络中所有参数矩阵进行缩放因子为$(9 {M})^{-\frac{1}{4}}$的缩放。
\vspace{0.5em}
\end{itemize}

\parinterval 这种初始化方法由于没有Warmup策略，学习率会直接从峰值根据参数的更新次数进行退火，大幅度增大了网络收敛的时间。如何进一步解决该初始化方法下的模型收敛速度是比较关键的课题。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{4. ADMIN初始化策略}

\parinterval 也有研究发现Post-Norm结构在训练过程中过度依赖于残差支路，在训练初期很容易发生参数梯度方差过大的现象\upcite{DBLP:conf/emnlp/LiuLGCH20}。经过理论分析和实验验证发现，底层网络发生梯度消失虽然是导致训练不稳定的重要因素，但并不是唯一因素。例如，梯度消失的主要故障点在于使用基于Post-Norm 的解码器。尽管通过调整模型结构解决梯度消失问题，模型训练不稳定的问题仍然没有很好地解决。进一步对基于Pre-Norm模型的输入与输出进行分析，研究人员发现其输入与输出之间方差的变换率为$O(\log N)$，其中$N$ 为编码器层数（{\color{red} 前面提到了$N$作为句子长度了}）。为了解决Post-Norm 结构在训练初期过于依赖残差支路的问题。可以使用两阶段的初始化方法来间接控制其输入与输出之间的方差，并将方差约束在$O(\log N)$内。这里，可以重新定义子层之间的残差连接如下：
\begin{eqnarray}
\mathbi{x}_{l+1} &=& \mathbi{x}_l \cdot {\bm  \omega_{l+1}} + F_{l+1}(\mathbi{x}_l)
\label{eq:15-44}
\end{eqnarray}

\noindent 其两阶段的初始化方法如下所示：

\begin{itemize}
\vspace{0.5em}
\item Profiling阶段：${\bm  \omega_{l+1}} = 1$，只进行网络的前向计算，无需进行网络的梯度计算。在训练样本上计算$F_{l+1}(\mathbi{x}_l)$的方差
\vspace{0.5em}
\item 	Initialization阶段：通过Profiling阶段得到的$F_{l+1}(\mathbi{x}_l)$的方差来初始化$\bm  \omega_{l+1}$：
\begin{eqnarray}
{\bm  \omega_{l+1}} &=& \sqrt{\sum_{j<l}\textrm{Var}[F_{l+1}(\mathbi{x}_l)]}
\label{eq:15-45}
\end{eqnarray}
\vspace{0.5em}
\end{itemize}

\parinterval 这种动态地参数初始化方法不受限于具体的模型结构，方法的稳定性更优。

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{深层网络的训练加速}

\parinterval 尽管窄而深的神经网络比宽网络有更快的收敛速度\upcite{WangLearning}，但伴随着训练数据的增加，以及模型进一步的加深，神经网络的训练代价成为不可忽视的问题。例如，在几千万甚至上亿的双语平行句对上训练一个48层的Transformer模型需要几周的时间才能达到收敛\footnote[6]{训练时间的估算是在单台8卡Titan V GPU服务器上得到的}。因此，在保证模型性能不变的前提下如何高效地完成深层网络的训练也是至关重要的。在实践中能够发现，深层网络中相邻层之间具有一定的相似性。因此，一个想法是：可以通过不断复用浅层网络的参数来初始化更深层的网络，渐进式的训练深层网络，避免从头训练整个网络，进而达到加速深层网络训练的目的。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{1. 渐进式训练}

\parinterval 所谓渐进式训练是指从浅层网络开始，在训练过程中逐渐增加训练的深度。一种比较简单的方法是将网络分为浅层部分和深层部分，之后分别进行训练，最终达到提高模型翻译性能的目的\upcite{DBLP:conf/acl/WuWXTGQLL19}。

\parinterval 另一种方式是动态构建深层网络，并尽可能复用浅层网络的训练结果。假设开始的时候模型包含$l$层网络，然后训练这个模型至收敛。之后，直接拷贝这$l$层网络（包括参数），并堆叠出一个$2l$层的模型。之后继续训练，重复这个过程。进行$n$次之后就得到了$n\times l$层的模型。图\ref{fig:15-15}给出了在编码器上使用渐进式训练的示意图。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-progressive-training}
\caption{渐进式深层网络训练过程}
\label{fig:15-15}
\end{figure}
%-------------------------------------------

\parinterval 渐进式训练的好处在于深层模型并不是从头开始训练。每一次堆叠，都相当于利用“浅”模型给“深”模型提供了一个很好的初始点，这样深层模型的训练会更加容易。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{2. 分组稠密连接}

\parinterval 很多研究者已经发现深层网络不同层之间的稠密连接能够很明显地提高信息传递的效率\upcite{WangLearning,DBLP:conf/cvpr/HuangLMW17,Dou2018ExploitingDR,DBLP:conf/acl/WuWXTGQLL19}。与此同时，对之前层信息的不断复用有助于得到更好的表示，但也带来了计算代价过大的问题。由于动态线性层聚合方法（DLCL）在每一次聚合时都需要重新计算之前每一层表示对当前层网络输入的贡献度，因此伴随着编码端整体深度的不断增加，这部分的计算代价变得不可忽略。例如，一个基于动态层聚合的48层Transformer模型的训练时间比不使用动态层聚合慢近1.9倍。同时，缓存中间结果也增加了显存的使用量，尽管使用了半精度计算，每张12G显存的GPU上计算的词也不能超过2048个，这导致训练开销急剧增大。

\parinterval 缓解这个问题的一种方法是使用更稀疏的层间连接方式。其核心思想与动态线性层聚合是类似的，不同点在于可以通过调整层之间连接的稠密程度来降低训练代价。比如，可以将每$p$层分为一组，之后动态线性层聚合只在不同组之间进行。这样，通过调节$p$值的大小可以控制神经网络中连接的稠密程度，作为一种训练代价与翻译性能之间的权衡。显然，标准的Transformer模型\upcite{vaswani2017attention} 和DLCL模型\upcite{WangLearning}都可以看作是该方法的一种特例。如图\ref{fig:15-16}所示：当$p=1$时，每一个单独的块被看作一个独立的组，这等价于基于动态层聚合的DLCL模型；当$p=\infty$时，这等价于正常的Transformer模型。值得注意的是，如果配合渐进式训练。在分组稠密连接中可以设置$p$等于模型层数$h$。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-sparse-connections-between-different-groups}
\caption{不同组之间的稀疏连接}
\label{fig:15-16}
\end{figure}
%-------------------------------------------

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{3. 学习率重置}

\parinterval 尽管渐进式训练策略与分组稠密连接结构可以加速深层网络的训练，但使用传统的学习率衰减策略会导致训练深层模型时的学习率较小，因此模型无法快速地达到收敛状态，同时也影响最终的模型性能。

\parinterval  图\ref{fig:15-17}中的红色曲线描绘了在WMT英德翻译任务上标准Transformer模型的学习率曲线，可以看到当模型训练到40k步时，网络的学习率对比峰值有明显的差距，而此时刚开始训练最终的深层模型，过小的学习率并不利于后期深层网络的充分训练。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-learning-rate}
\caption{学习率重置vs从头训练的学习率曲线}
\label{fig:15-17}
\end{figure}
%-------------------------------------------

\parinterval 针对该问题的一个解决方案是修改学习率曲线的衰减策略。图中蓝色的曲线是修改后的学习率曲线。首先在训练的初期让网络快速的达到学习率的峰值（线性递增），之后的每一次从$p$层网络变为$2p$层网络时，都会将当前的学习率值重置到峰值点。之后，根据训练的步数对其进行相应的衰减。具体的步骤如下：
\begin{itemize}
\vspace{0.5em}
\item 在训练的初期，模型会先经历一个学习率预热的过程：
\begin{eqnarray}
lr &=& d_{model}^{-0.5}\cdot step\_num \cdot warmup\_steps^{-0.5}
\label{eq:15-46}
\end{eqnarray}
\noindent 这里，$step\_num$表示参数更新的次数，$warmup\_step$表示预热的更新次数，$d_{model}^{-0.5}$表示Transformer模型的隐层大小，$lr$是学习率。
\vspace{0.5em}
\item 	在之后的迭代训练过程中，每当进行新的迭代，学习率都会重置到峰值，之后进行相应的衰减：
\begin{eqnarray}
lr &=& d_{model}^{-0.5}\cdot step\_num^{-0.5}
\label{eq:15-47}
\end{eqnarray}
\noindent 这里$step\_num$代表学习率重置后更新的步数。
\vspace{0.5em}
\end{itemize}

\parinterval 综合使用渐进式训练、分组稠密连接、学习率重置策略可以在保证在翻译品质不变的前提下，缩减近$40\%$的训练时间\upcite{li2020shallow}。同时，加速比伴随着模型的加深与数据集的增大也会进一步地扩大。

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{深层网络的健壮性训练}


\parinterval 伴随着网络的加深，还会面临另外一个比较严峻的问题\ \dash \ 过拟合。由于参数量的增大，深层网络的输入与输出分布之间的差异也会越来越大，然而不同子层之间的{\small\bfnew{相互适应}}\index{相互适应}（Co-adaptation）\index{Co-adaptation}也会更加的明显，这将导致任意子层网络对其他子层的依赖过大。这种现象在训练阶段是有帮助的，因为不同子层可以协同工作从而更好地拟合训练数据。然而这种方式也降低了模型的泛化能力，即深层网络更容易陷入过拟合问题。

\parinterval 通常，可以使用Dropout手段用来缓解过拟合问题（见{\chapterthirteen}）。不幸的是,尽管目前Transformer模型使用了多种Dropout手段（如Residual Dropout、Attention Dropout、 ReLU Dropout等），过拟合问题在深层网络中仍然存在。从图\ref{fig:15-18}中可以看到，深层网络比浅层网络在训练集和校验集的困惑度上都有显著的优势，然而网络在训练一段时间后出现校验集困惑度上涨的现象，说明模型已经过拟合于训练数据。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-wmt16}
\caption{浅层网络(左)与深层网络（右）在WMT16英德翻译任务的校验集与训练集的困惑度}
\label{fig:15-18}
\end{figure}
%-------------------------------------------

\parinterval 在{\chapterthirteen}提到的Layer Dropout方法可以有效地缓解这个问题。以编码端为例， Layer Dropout的过程可以被描述为：在训练过程中，对自注意力子层或前馈神经网络子层进行随机丢弃，以减少不同子层之间的相互适应。这里选择Pre-Norm结构作为基础架构，它可以被描述为：
\begin{eqnarray}
\mathbi{x}_{l+1} &=& F(\textrm{LN}(\mathbi{x}_l)) + \mathbi{x}_l
\label{eq:15-48}
\end{eqnarray}

\noindent 其中，$\textrm{LN}( \cdot )$表示层标准化函数， $F( \cdot )$表示自注意力机制或者前馈神经网络，$\mathbi{x}_l$表示第$l$个子层的输出。之后，使用一个掩码$\textrm{Mask}$（值为0或1）来控制每个子层是正常计算还是丢弃。于是，该子层的计算公式可以被重写为：
\begin{eqnarray}
\mathbi{x}_{l+1} &=& \textrm{Mask} \cdot F(\textrm{LN}(\mathbi{x}_l))+\mathbi{x}_l
\label{eq:15-49}
\end{eqnarray}

\noindent $\textrm{Mask}=0$代表该子层被丢弃，而$\textrm{Mask}=1$代表正常进行当前子层的计算。图\ref{fig:15-19}展示了这个方法与标准Pre-Norm结构之间的区别。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-sublayer-skip}
\caption{标准的Pre-Norm结构与基于随机跳跃子层的Pre-Norm结构}
\label{fig:15-19}
\end{figure}
%-------------------------------------------

\parinterval 除此之外，在残差网络中，研究人员已经发现底层神经网络的作用是对输入进行抽象，而上层神经网络通过对底层神经网络计算得到的表示进行不断地修正来拟合训练目标，因此底层神经网络的计算结果对最终的输出有很大的影响\upcite{DBLP:journals/corr/GreffSS16}。该结论同样适用于Transformer模型，比如，在训练中，残差支路以及底层的梯度范数通常比较大，这也间接表明底层神经网络在整个优化的过程中需要更大的更新。考虑到这个因素，在设计每一个子层被丢弃的概率时可以采用自底向上线性增大的策略，保证底层的网络相比于顶层更容易保留下来。

%----------------------------------------------------------------------------------------
%    NEW SECTION
%----------------------------------------------------------------------------------------

\sectionnewpage
\section{基于树结构的模型}

\parinterval 在统计机器翻译时代，使用句法树是一种非常有效的机器翻译建模手段（见{\chaptereight}）。由于句法树是人类运用语言的高级抽象结果，使用句法树可以非常有效地帮助机器翻译系统捕捉句子的结构。将这种知识引入到机器翻译中，能使得翻译系统在译文语法正确性以及流畅度等方面获得进一步的提升，同时也可以消除译文中的歧义，进而得到更准确的译文。在神经机器翻译中，虽然标准的框架大多基于词串，但是引入句法树结构仍然很有潜力\upcite{DBLP:conf/acl/LiXTZZZ17}。具体来说，由于神经机器翻译模型缺少对于句子结构的理解，会导致一些明显的翻译问题：

\begin{itemize}
\vspace{0.5em}
\item 过度翻译问题，如：
\begin{equation}
\textrm{“ 两/个/女孩 ”}\ \to \ \textrm{“ two girls and two girls ”} \nonumber
\end{equation}

\vspace{0.5em}
\item 翻译不连贯问题，如：
\begin{equation}
\textrm{“ 新生/银行/申请/上市 ”}\ \to \ \textrm{“ new listing bank ”} \nonumber
\end{equation}

\vspace{0.5em}
\end{itemize}

\parinterval 显然，神经机器翻译系统并没有按照合理的句法结构生成译文。也就是说，模型并没有理解句子的结构\upcite{DBLP:conf/acl/LiXTZZZ17}。甚至对于一些语言差异很大的语言对，会出现将介词短语翻译成一个词的情况。虽然可以通过不同的手段对上述问题进行求解，但是使用句法树是最直接的一种解决问题的方法\upcite{DBLP:conf/acl/EriguchiHT16}。

\parinterval 那么在神经机器翻译中，如何将这种离散化的树结构融入到基于分布式表示的翻译模型中呢？目前主流的神经机器翻译模型由编码器和解码器构成，有以下两种策略：

\begin{itemize}
\vspace{0.5em}
\item 将句法树结构加入到编码端，使得编码端更加充分地表示源语言句子；
\vspace{0.5em}
\item 将句法树结构加入到解码端，使得翻译模型能生成更符合句法的译文。
\vspace{0.5em}
\end{itemize}

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{编码端使用句法信息}

\parinterval 对基于循环神经网络的翻译模型来说，在源语言端引入树结构可以带来明显的性能提升\upcite{DBLP:conf/acl/EriguchiHT16}。其基本思路是将源语言句子编码成一个二叉树结构\footnote[7]{所有句法树都可以通过二叉化转化为二叉树（见{\chaptereight}）。}，树节点的信息是由左子树和右子树变换而来，如公式\eqref{eq:15-50}所示,式中$\mathbi{h}_l$和$\mathbi{h}_r$分别代表了左孩子节点和右孩子节点的隐藏状态，通过一个非线性函数$f_\textrm{tree}$得到父节点的隐藏状态$\mathbi{h}_p$。
\begin{eqnarray}
\mathbi{h}_p &=& f_\textrm{tree}(\mathbi{h}_l,\mathbi{h}_r)
\label{eq:15-50}
\end{eqnarray}

\parinterval 图\ref{fig:15-20}展示了一个基于树结构的神经机器翻译编码器，这些编码器由下自上组成了一个树型结构，这种树结构的具体连接形式由句法分析决定。其中$\mathbi{h}_1,\mathbi{h}_2,\ldots,\mathbi{h}_n$相当于原始RNN中隐藏节点，$\mathbi{h}_{n+1},\mathbi{h}_{n+2},\ldots,\mathbi{h}_{2n-1}$由其左右子节点通过公式\eqref{eq:15-50}计算得到。在计算注意力的时候，不同于{\chapterten}的计算方式，基于树结构的编码器模型利用编码端树结构中的所有节点计算上下文向量$\mathbi{C}$,如公式\eqref{eq:15-51}。
\begin{eqnarray}
\mathbi{C}_j &=& \sum_{i=1}^{n}\alpha_{i,j}\mathbi{h}_i + \sum_{i=n+1}^{2n-1}\alpha_{i,j}\mathbi{h}_i
\label{eq:15-51}
\end{eqnarray}

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-encoder-tree-structure-modeling}
\caption{编码端树结构建模}
\label{fig:15-20}
\end{figure}
%-------------------------------------------s

\parinterval $\mathbi{C}_j$代表生成第$j$个目标语言单词所需的源语言信息{\red{（见10.4.1）}}，这样的好处是编码端能更加方便地将一个短语结构表示成一个单元，进而在解码端映射成一个整体。比如，对于英文句子：
\begin{equation}
\textrm{“ I am having a cup of green tea. ”} \nonumber
\end{equation}

\noindent 可以翻译成：
\begin{equation}
\textrm{“私は緑茶を飲んでいます”} \nonumber
\end{equation}

\noindent 其中，“a cup of green tea”实际上只对应目标语言“緑茶”一个词。使用句法树后，“a cup of green tea”会作为树中一个节点，这样可以更好地把它作为一个整体进行翻译。

\parinterval 虽然这种自底向上的单向树结构取得了一定的效果，证明了句法信息能够帮助源语言端学到更好的表示结果，但是每个树节点的状态里并不能包含树中其它位置的信息。也就是说，从每个节点上看，其表示结果没有很好的利用上下文。因此，有研究者提出了双向树编码器\upcite{Yang2017TowardsBH,DBLP:conf/acl/ChenHCC17}，将自下而上和自上而下的信息传递方式应用于句法树的表示，这样增加了树中每个节点对其覆盖的子树以及周围上下文的建模能力。如图\ref{fig:15-21}所示，图中$\mathbi{h}^\textrm{up}$和$\mathbi{h}^\textrm{down}$分别代表向上传输节点和向下传输节点的隐藏状态，虚线框代表了$\mathbi{h}^\textrm{up}$和$\mathbi{h}^\textrm{down}$会拼接到一起，并作为这个节点的整体表示参与注意力计算。此外，这种方法也有利于改进覆盖度模型\upcite{TuModeling}{\red{（见14.2.2）}}。

%----------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.4]{./Chapter15/Figures/figure-encoder-of-bidirectional-tree-structure.png}
\caption{双向树结构编码端}
\label{fig:15-21}
\end{figure}
%-------------------------------------------

\parinterval 不同于直接对树结构进行编码，另一种方法是将词语、句法信息等信息直接转换为特征向量拼接到一起，作为机器翻译系统的输入\upcite{DBLP:conf/wmt/SennrichH16}。这种方法的优点在于，句法信息可以无缝融入到现有神经机器翻译框架，对系统结构的修改很小。以基于循环神经网络的翻译模型为例，对于输入序列的$i$个单词，可以用公式\eqref{eq:15-52}计算其表示向量$\mathbi{h}_i$时添加特征向量：
\begin{eqnarray}
\mathbi{h}_i &=& \textrm{tanh}(\mathbi{W}(\|_{k=1}^{|F|}\mathbi{E}_h x_{ik}) + \mathbi{U}\mathbi{h}_{i-1})
\label{eq:15-52}
\end{eqnarray}

\noindent 其中，$\mathbi{W}$是转换矩阵，$\mathbi{U}$是权重矩阵，$F$代表了特征的数量，而$\mathbi{E}$是一个特征矩阵，它包含了不同种类特征的数量，$x_{ik}$代表了第$i$个词在第$k$种特征中所表达的值，$\|$操作为拼接操作。公式\eqref{eq:15-52}将从共$F$个特征向量连接成固定大小的向量，作为编码端的输入。这种方法可以很容易地融合如词根，子词，形态，词性以及依存标签等特征。

\parinterval 此外是否有更有效的方法，将句法信息融入到编码端呢？如图\ref{fig:15-22}(a)所示，对于英文“I love dogs”，有如下句法解析树：

%----------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.5]{./Chapter15/Figures/figure-parsing-tree-of-a-sentence.png}
\caption{一个句子的句法解析树}
\label{fig:15-22}
\end{figure}
%-------------------------------------------

\parinterval 对于该句法解析树，可以使用$w_i$表示句法解析树中第$i$个单词，如图\ref{fig:15-22}(b)所示。使用$l_j$表示句法解析树中第$j$个语法标签，如图\ref{fig:15-22}(c)所示。通过观察句法树的结构可以看出，对一个单词来说，句法树中该单词的父节点代表了该单词最精确的句法信息，因此一个直观的想法是直接使用单词父节点的句法信息与原始的词信息构造出新的融合表示${\mathbi{h}'}_i$，并使用这种新的表示计算上下文向量$\mathbi{C}$，如公式\eqref{eq:15-53}所示：
\begin{eqnarray}
\mathbi{C}_j &=& \sum_{i=1}^m \alpha_{i,j} {\mathbi{h}'}_i
\label{eq:15-53}
\end{eqnarray}

\parinterval 其中，$m$是源语言句子的长度。基于这种想法，有如下几种实现方式\upcite{DBLP:conf/acl/LiXTZZZ17}：

\begin{itemize}
\vspace{0.5em}
\item 平行结构。利用两个编码端构成平行结构，分别对源语言词汇和线性化的句法树进行建模，之后在词语RNN和句法RNN中寻找句法解析树中每个词汇以及他们的父节点，将他们的隐层状态相融合，得到新的表示。如图\ref{fig:15-23}(a)所示，图中$\mathbi{h}_{w_i}$为词$w_i$在词语RNN中的隐藏状态，$\mathbi{h}_{l_j}$为树结构标签$l_i$在句法RNN中的隐藏状态，其中如果词语$w_i$是标签$l_j$在句法树中的子节点，则将$\mathbi{h}_{w_i}$和$\mathbi{h}_{l_j}$向量拼接到一起作为这个词的新表示${\mathbi{h}'}_i$；
\vspace{0.5em}
\item 分层结构。将句法RNN与源语言单词的词嵌入向量进行融合，如图\ref{fig:15-23}(b)所示，其中$\mathbi{e}_{w_i}$为第$i$个词的词嵌入。类似地，如果$w_i$词语是$l_j$标签在句法树中的子节点，则将$\mathbi{e}_{w_i}$和$\mathbi{h}_{l_j}$向量拼接到一起作为词语RNN的输入，输出得${\mathbi{h}'}_i$直接参与注意力计算；
\vspace{0.5em}
\item 混合结构。使用混合结构的方式在编码端融入句法信息，首先对图\ref{fig:15-22}(a)中句法解析树进行先序遍历，将句法标签和源语言单词融合到同一个序列中，得到如图\ref{fig:15-23}(c)所示序列，之后使用同一个RNN结构处理这些表示，然后使用源语言词汇位置的隐藏信息参与注意力的计算。有趣的是，相比于前两种方法，使用混合结构的方式不仅参数量最少而且最为有效\upcite{DBLP:conf/acl/LiXTZZZ17}。
\vspace{0.5em}
\end{itemize}

%----------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.5]{./Chapter15/Figures/figure-three-fusion-methods-of-tree-structure-information-1.png}
\includegraphics[scale=0.5]{./Chapter15/Figures/figure-three-fusion-methods-of-tree-structure-information-2.png}
\includegraphics[scale=0.5]{./Chapter15/Figures/figure-three-fusion-methods-of-tree-structure-information-3.png}
\caption{三种对树结构信息的融合方式}
\label{fig:15-23}
\end{figure}
%-------------------------------------------

\parinterval 总的来说，对于在源语言端使用句法信息的情况，由于句法信息的生成依赖于句法分析装置，因此句法分析的错误会在很大程度上影响源语言句子的表示结果。如果获得的句法信息不够精确，可能会对翻译系统带来负面的作用。此外，也有研究发现基于词串的神经机器翻译模型本身就能学习到源语言的句法信息\upcite{DBLP:conf/emnlp/ShiPK16}，这表明了神经机器翻译模型也有一定的归纳句法的能力。除了循环神经网络结构，也有学者探索如何在Transformer中引入树结构信息。比如，可以在计算编码端自注意力分布的时候，将词与词之间的依存变换成距离表示作为额外的语法信息融入到注意力计算中\upcite{DBLP:conf/acl/BugliarelloO20}。

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{解码端使用句法信息}\label{subsec-15.3.2}

\parinterval 也有大量的工作探索如何将句法树加入到解码端中。一种最直接的方式是将目标语言句法树结构进行线性化，这样目标语言句子就变成了一个含有句法信息的序列，神经机器翻译系统不需要进行修改即可完成训练\upcite{Aharoni2017TowardsSN}。

%----------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.5]{./Chapter15/Figures/figure-syntax-tree-linearization-example.png}
\caption{句法树线性化示例}
\label{fig:15-24}
\end{figure}
%-------------------------------------------

\parinterval 图\ref{fig:15-24}展示了一个目标语言句法树经过线性化后的结果。这种方法的最大优点是简单、易于实现，而且同时适用于在源语言和目标语言引入句法树的情况。不过，这种方法的问题是，推断时预测的目标语言串可能并不对应合理的句法树结构，此时需要额外的模块对结果进行修正或者调整，以得到合理的译文。

\parinterval 另一种方式是直接使用目标语言句法树完成翻译建模。与源语言句法树的建模不同，目标语言句法树的生成伴随着译文的生成，因此无法像源语言端一样将整个句法树一次输入。这样译文生成问题本质上就变成了目标语言树结构的生成，从这个角度说，这个过程与统计机器翻译中串到树的模型是类似的（见{\chaptereight}）。树结构的生成有很多种策略，基本的思想均是根据已经生成的局部结构预测新的局部结构，并将这些局部结构拼装成更大的结构，直到得到完整的句法树结构\upcite{DBLP:conf/iclr/Alvarez-MelisJ17}。

\parinterval 实现目标语言句法树生成的一种手段是将形式文法扩展到神经网络模型。这样，我们可以使用形式文法描述句法树的生成过程（见{\chapterthree}），同时利用分布式表示来进行建模和学习。比如，可以使用基于循环神经网络的文法描述方法，把句法分析过程看作是一个循环神经网络的执行过程\upcite{DBLP:conf/naacl/DyerKBS16}。这个过程对应一个移进-规约分析过程\upcite{aho1972theory}，因此句法分析实质上就是一个移进-规约动作序列。这样（目标语言）句法树就可以通过基于循环神经网络的移进-规约过程实现。

\parinterval 另一种方式从多任务角度出发，用多个解码端共同完成目标语言句子的生成\upcite{DBLP:journals/corr/LuongLSVK15}。图\ref{fig:15-25}展示了由一个编码器（汉语）和多个解码器组成的序列生成模型。其中不同解码器分别负责不同的任务：第一个用于预测翻译结果，即翻译任务；第二个用于预测句法结构；第三个用于重新生成源语言序列，进行自编码。其设计思想是各个任务之间能够相互辅助，使得编码器的表示能包含更多的信息，进而让多个任务都获得性能提升。这种方法也可以使用多个编码器，其思想是类似的。{\red{图中改成编码器}}

%----------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.7]{./Chapter15/Figures/figure-multi-task-structure.png}
\caption{多任务结构}
\label{fig:15-25}
\end{figure}
%-------------------------------------------

\parinterval 针对上述两种在解码端融入句法信息的方法，也有研究者提出过以下问题：紧密的融合词串和句法结构的学习是否优于多任务学习？以及目标语言句法信息的引入是否真的帮助到了机器翻译？\upcite{DBLP:conf/wmt/NadejdeRSDJKB17}。为了回答这个问题，研究者尝试利用{\small\bfnew{CCG}}\index{CCG}（Combinatory Categorial Grammar）\index{Combinatory Categorial Grammar}中的supertags作为句法信息，并比较了直接将CCG标签与句子进行融合（如图\ref{fig:15-24}）和将句子与标签分开作为多任务（如图\ref{fig:15-25}）两种融合方式进行训练，最后发现第一种方式是更加有效的。

\parinterval 虽然融合树结构和目标语言词串的方法优于基于多任务的方法，但是前者会导致解码端的序列过长，因此会面临难以训练的问题。为了缓解这种现象可以在这两种方法之间设计两个循环神经网络结构，一个生成句子，另一个生成树结构\upcite{DBLP:conf/acl/WuZYLZ17,DBLP:journals/corr/abs-1808-09374}。以生成目标语言依存树为例，生成依存树的循环神经网络仍然是一个移进-规约序列的生成模型。另一个循环神经网络负责预测目标语言词序列，它只有在第一个循环神经网络移进操作的时候才会预测一下词，同时会将当前词状态作为信息送入到第一个循环神经网络中。整个过程如图\ref{fig:15-26}所示，其中$\mathbi{h}_i^\textrm{action}$表示动作RNN的隐藏层状态，$\mathbi{h}_i^\textrm{word}$表示词语RNN的隐藏层状态。动作RNN会结合词语RNN的状态预测出“移位”，“左规约”，“右规约”三种动作，只有当动作RNN预测出“移位”操作时，词语RNN才会预测下一时刻的词语。最后词语RNN预测出结束符号<eos>时，整个过程结束。需要注意的是，这种方法并不依赖循环神经网络结构，也可以将其替换为Transformer等结构来完成序列的生成。

%----------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.5]{./Chapter15/Figures/figure-parallel-RNN-structure.png}
\caption{平行RNN结构}
\label{fig:15-26}
\end{figure}
%-------------------------------------------

\parinterval 相较于在编码端融入句法信息，在解码端融入句法信息更为困难。由于解码过程存在着前向依赖，因此树结构信息与词语的生成反而是一个相互影响的过程，如果严格按照给定的树结构翻译，即先生成结构再根据结构生成标签，那么一旦结构有误解码结果就会受到影响，而如果用一种不太严格的方式，即将树结构和目标语言一起预测，树结构对译文的预测作用又会减弱。在统计机器翻译中，句法信息究竟应该使用到什么程度已经有一些讨论\upcite{Tong2016Syntactic}，而在神经机器翻译中，如何更有效地引入树结构信息以及如何平衡树结构信息与词串的作用还有待进一步确认。

%----------------------------------------------------------------------------------------
%    NEW SECTION
%----------------------------------------------------------------------------------------

\sectionnewpage
\section{基于结构搜索的翻译模型优化}

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{神经网络结构搜索}

\parinterval 目前为止，对模型的很多改良都来自于研究人员自身的经验及灵感。从某种意义上说，很多时候，模型结构的优化依赖于研究人员的经验，包括其对任务的理解以及自身的想象力。此外所设计出的模型结构还需要在对应任务上进行实验，优秀的模型往往需要很长时间的探索与验证。因此，人们希望在无需外部干预的情况下，让计算机自动地找到最适用于当前任务的神经网络模型结构，这种方法被称作{\small\bfnew{神经架构搜索}}\index{神经架构搜索}（Neural Architecture Search）\index{Neural Architecture Search}，在神经网络模型中有时也被称作{\small\bfnew{神经网络结构搜索}}\index{神经网络结构搜索}或{\small\bfnew{网络结构搜索}}\index{网络结构搜索}\upcite{DBLP:conf/iclr/ZophL17,DBLP:conf/cvpr/ZophVSL18,Real2019AgingEF}。

\parinterval 网络结构搜索属于{\small\bfnew{自动机器学习}}\index{自动机器学习}（Automated Machine Learning）\index{Automated Machine Learning}的范畴，其目的是根据对应任务上的数据找到最合适的模型结构。在这个过程中，模型结构就像神经网络中的参数一样被自动地学习出来。以机器翻译任务为例，通过网络结构搜索方法能够以Transformer模型为基础，对神经网络结构进行自动优化，找到更适用于机器翻译任务的模型结构。图\ref{fig:15-27}(a) 展示了人工设计的Transformer编码器的局部结构，图\ref{fig:15-27}(b) 给出对该结构使用进化算法优化后得到的结构图\upcite{DBLP:conf/icml/SoLL19}。可以看到，使用网络结构搜索方法得到的模型中，出现了与人工设计的结构不同的跨层连接，同时还搜索到了全新的多分支网络结构。这种结构也是人工不易设计出来的。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-encoder-structure-of-transformer-model-optimized-by-nas}
\caption{传统Transformer以及通过网络结构搜索方法优化后的Transformer模型编码器结构}
\label{fig:15-27}
\end{figure}
%-------------------------------------------

\parinterval 那么网络结构搜索究竟是一种什么样的技术呢？实际上，人类一直希望能够自动化、快速地解决自己所遇到的问题。机器学习也是为了达到这个目的所产生的技术。如图\ref{fig:15-28}所示，机器学习方法可以看做是一个黑盒模型，这个模型能够根据人类所提供的输入自动给出所期望的输出，这里的输入和输出既可以是图像信息，也可以是自然语言领域中的文字。在传统机器学习方法中，研究者需要设计大量的特征来描述待解决的问题，即“特征工程”。在深度学习时代，神经网络模型可以完成特征的抽取和学习，但是却需要人工设计神经网络结构，这项工作仍然十分繁重。因此一些科研人员开始思考，能否将设计模型结构的工作也交由机器自动完成？深度学习方法中模型参数能够通过梯度下降等方式进行自动优化，那么模型结构是否可以也看做是一种特殊的参数，使用搜索算法自动找到最适用于当前任务的模型结构？

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-evolution-and-change-of-ml-methods}
\caption{机器学习方法的演化与变迁}
\label{fig:15-28}
\end{figure}
%-------------------------------------------

\parinterval 于是，就诞生了网络结构搜索这个研究方向。早在上世纪八十年代，研究人员就开始使用进化算法对神经网络结构进行设计\upcite{DBLP:conf/icga/MillerTH89}，之后也有很多研究人员对基于进化算法的结构搜索进行了探索\upcite{mandischer1993representation,koza1991genetic,DBLP:conf/ijcnn/Dodd90,DBLP:conf/nips/HarpSG89,DBLP:journals/compsys/Kitano90,DBLP:conf/icec/SantosD94}。近些年，随着深度学习技术的发展，神经网络结构搜索这个方向也重新走进更多人的视线中，受到了来自计算机视觉、自然语言处理多个领域的关注与应用。

\parinterval 目前网络结构搜索技术尚且处于相对初级的阶段，不过在近些年该方向已经在很多任务中受到关注。例如，在WMT19国际机器翻译比赛中，有参赛单位使用了基于梯度的结构搜索方法改进翻译模型\upcite{DBLP:conf/nips/LuoTQCL18}。此外，在语言建模等任务中也大量应用了结构搜索技术，并取得了很好的结果\upcite{DBLP:conf/icml/PhamGZLD18,DBLP:conf/iclr/LiuSY19,DBLP:conf/acl/LiHZXJXZLL20,DBLP:conf/emnlp/JiangHXZZ19}。下面将对结构搜索的基本方法和其在机器翻译中的应用进行介绍。

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{结构搜索的基本方法}

\parinterval 对于网络结构搜索而言，其目标在于通过数据驱动的方式自动地找到最合适的模型结构。以机器翻译这类有监督任务为例，对于给定的具有$K$个训练样本的训练集合$\{(\mathbi{x}_{1},\mathbi{y}_{1}),\ldots,(\mathbi{x}_{n},\mathbi{y}_{n})\}$（其中$\mathbi{x}_{i}$表示的是第$i$个样本的输入数据，$\mathbi{y}_{i}$表示该样本的目标标签值），网络结构搜索过程可以被建模为，根据数据找到最佳模型结构$\hat{a}$的过程，如下所示：
\begin{eqnarray}
\hat{a} &=& \arg\max_{a}\sum_{i=1}^{n}{\funp{P}(\mathbi{y}_{i}|\mathbi{x}_{i};a)}
\label{eq:15-54}
\end{eqnarray}

\noindent 公式中$\funp{P}(\mathbi{y}_{i}|\mathbi{x}_{i};a)$为模型$a$观察到数据$\mathbi{x}_{i}$后预测为标签$\mathbi{y}_{i}$的概率，而模型结构$a$本身可以看作是输入$\mathbi{x}$到输出$\mathbi{y}$的映射函数。因此可以简单的把模型$a$看作根据$\mathbi{x}$预测$\mathbi{y}$的一个函数，记为：
\begin{eqnarray}
a(\mathbi{x}) &=& \funp{P}(\cdot|\mathbi{x})
\label{eq:15-55}
\end{eqnarray}

\noindent 其中，$\funp{P}(\cdot|\mathbi{x})$表示在所有译文句子上的一个分布。图\ref{fig:15-29}展示了神经网络结构搜索方法的主要流程，主要包括三个部分：

\begin{itemize}
\vspace{0.5em}
\item 设计搜索空间：理论上,网络结构搜索的搜索空间应由所有的潜在模型结构构成（图\ref{fig:15-29}）。在这种情况下，如果不对候选模型结构进行限制的话，搜索空间会十分庞大。因此，在实际的结构搜索过程中，往往会针对特定任务设计一个搜索空间，这个搜索空间是全体结构空间的一个子集，之后的搜索过程将在这个子空间中进行。如图\ref{fig:15-29}中的搜索空间所示，该空间由循环神经网络构成，其中候选的模型包括人工设计的LSTM、GRU等模型结构，也包括其他潜在的循环神经网络结构。
\vspace{0.5em}
\item 选择搜索策略：在设计好搜索空间之后，结构搜索的过程将选择一种合适的策略，对搜索空间进行探索。不同于模型参数的学习，模型结构本身不存在直接可计算的关联，所以很难通过传统的最优化算法对其进行学习。因此，搜索策略往往选择采用遗传算法或强化学习等方法，这些方法间接地对模型结构进行设计或优化\upcite{DBLP:conf/icml/SoLL19,DBLP:conf/aaai/RealAHL19,DBLP:conf/icml/RealMSSSTLK17,DBLP:conf/iclr/ElskenMH19,DBLP:conf/iclr/ZophL17,DBLP:conf/cvpr/ZophVSL18,DBLP:conf/icml/PhamGZLD18,DBLP:conf/iclr/BakerGNR17,DBLP:conf/cvpr/TanCPVSHL19,DBLP:conf/iclr/LiuSVFK18}。 不过近些年来也有研究人员开始尝试将模型结构建模为超网络中的参数，这样即可使用基于梯度的方式直接对最优结构进行搜索\upcite{DBLP:conf/nips/LuoTQCL18,DBLP:conf/iclr/LiuSY19,DBLP:conf/iclr/CaiZH19,DBLP:conf/cvpr/LiuCSAHY019,DBLP:conf/cvpr/WuDZWSWTVJK19,DBLP:conf/iclr/XieZLL19,DBLP:conf/uai/LiT19,DBLP:conf/cvpr/DongY19,DBLP:conf/iclr/XuX0CQ0X20,DBLP:conf/iclr/ZelaESMBH20,DBLP:conf/iclr/MeiLLJYYY20}。
\vspace{0.5em}
\item 进行性能评估：在搜索到模型结构之后需要对其性能进行验证，确定当前时刻模型结构的性能优劣。但是对于结构搜索任务来说，由于搜索过程中会产生大量的中间模型结构，如果直接对所有可能的结构进行评价，其时间代价是难以接受的。因此在结构搜索任务中也有很多研究人员尝试如何快速获取模型性能（绝对性能或相对性能）\upcite{DBLP:conf/nips/LuoTQCL18,DBLP:journals/jmlr/LiJDRT17,DBLP:conf/eccv/LiuZNSHLFYHM18}。
\vspace{0.5em}
\end{itemize}

%----------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.22]{./Chapter15/Figures/figure-main-flow-of-neural-network-structure-search.png}
\caption{神经网络结构搜索的主要流程}
\label{fig:15-29}
\end{figure}
%-------------------------------------------

\parinterval 下面将对网络结构搜索任务中搜索空间、搜索策略以及性能评估几个方向进行简单介绍。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{1. 搜索空间}

\parinterval 对搜索空间建模是结构搜索任务中的基础部分。如图\ref{fig:15-30}所示，结构空间中包含着所有潜在的模型结构，虽然可以假设这些模型结构都是等概率出现的，不过面对同一个任务时，这些模型就有了不同的性能表现。例如，卷积神经网络非常适合处理图像数据，而类似Transformer这类的模型结构在自然语言处理领域中更具优势。此外，由于不同网络结构之间往往存在局部结构的复用，因此在结构空间中不同结构的距离也不一致。

\parinterval 如图\ref{fig:15-30}所示，基于自注意力机制的模型结构往往聚在一起，而基于循环神经网络和基于卷积神经网络的各类模型之间的距离也相对较近。因此，在研究人员设计搜索空间的时候，为了增加找到最优结构的可能性，往往会根据经验或者实验来确定当前任务下易产出高性能模型结构的区域，并将这个区域作为结构搜索任务中的搜索空间。以自然语言处理任务为例，最初的网络结构搜索工作主要对基于循环神经网络构成的搜索空间进行探索\upcite{DBLP:conf/iclr/ZophL17,DBLP:conf/icml/PhamGZLD18,DBLP:conf/iclr/LiuSY19}，而近些年，针对Transformer模型结构的研究工作也引起了研究人员的广泛关注\upcite{DBLP:conf/icml/SoLL19,DBLP:journals/taslp/FanTXQLL20,DBLP:conf/ijcai/ChenLQWLDDHLZ20,DBLP:conf/acl/WangWLCZGH20}。

%----------------------------------------------
\begin{figure}[htp]
\centering
\includegraphics[scale=0.6]{./Chapter15/Figures/figure-relationship-between-structures-in-structural-space.jpg}
\caption{结构空间内结构之间的关系}
\label{fig:15-30}
\end{figure}
%-------------------------------------------

\parinterval 设计搜索空间时另一个很重要的问题是如何表示一个网络结构。在目前的结构搜索方法中，通常将模型结构分为整体框架和内部结构（元结构）两部分。整体框架将若干内部结构的输出按照特定的方式组织起来，最终得到模型输出。如图\ref{fig:15-31}中循环神经网络模型结构，黄色部分即为内部结构，红色部分为整体框架。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-whole-structure-and-internal-structure-in-rnn}
\caption{循环神经网络模型中的整体结构和内部结构}
\label{fig:15-31}
\end{figure}
%-------------------------------------------

\parinterval 具体来说，内部结构负责的是计算出$t$时刻的循环单元输出$\mathbi{h}_t$，如下所示：
\begin{eqnarray}
\mathbi{h}_t &=& \pi(\hat{\mathbi{h}}_{t-1},\hat{\mathbi{x}_t})
\label{eq:15-56}
\end{eqnarray}

\parinterval 其中函数$\pi(\cdot)$即为结构表示中的内部结构，而循环单元之间的组织方式（即整体框架）则决定了循环单元的输入信息，也就是上式中的循环单元表示$\hat{\mathbi{h}}_{t-1}$和输入表示$\hat{\mathbi{x}}_{t}$。理论上二者均能获得对应时刻之前所有的表示信息，因此可表示为：
\begin{eqnarray}
\hat{\mathbi{h}}_{t-1} &=& f(\mathbi{h}_{[0,t-1]};\mathbi{x}_{[1,t-1]}) \\
\hat{\mathbi{x}_t} &=& g(\mathbi{x}_{[1,t]};\mathbi{h}_{[0,t-1]})
\label{eq:15-58}
\end{eqnarray}

\noindent 其中$\mathbi{h}_{[0,t-1]} = \{\mathbi{h}_0,\ldots,\mathbi{h}_{t-1}\}$，$\mathbi{x}_{[1,t-1]} = \{\mathbi{x}_1,\ldots,\mathbi{x}_{t-1}\}$，函数$f(\cdot)$和$g(\cdot)$即为循环神经网络模型中的整体框架。

\parinterval 可以看到，整体框架和内部结构共同组成了神经网络的模型结构。因此,在搜索过程中,确定了整体框架以及内部结构也就确定了搜索空间。

\begin{itemize}
\vspace{0.5em}
\item 整体框架：如图\ref{fig:15-30}所示，在不同任务下，不同结构往往会有不同的建模能力，类似的结构在结构空间中相对集中。因此在搜索空间的设计中，根据不同的任务特点，整体框架会选择在该任务上已经得到验证的经验性结构，这能够更快速地定位到更有潜力的搜索空间。比如，对于图像任务来说，一般会将卷积神经网络设计为候选搜索空间\upcite{DBLP:conf/iclr/ElskenMH19,DBLP:conf/icml/PhamGZLD18,DBLP:conf/iclr/LiuSY19,DBLP:conf/eccv/LiuZNSHLFYHM18,DBLP:conf/icml/CaiYZHY18}，而对于包括机器翻译在内的自然语言处理任务而言，则会更倾向于使用循环神经网络或基于自注意力机制的Transformer模型附近的结构空间作为搜索空间\upcite{DBLP:conf/icml/SoLL19,DBLP:conf/iclr/ZophL17,DBLP:conf/icml/PhamGZLD18,DBLP:conf/iclr/LiuSY19,DBLP:journals/taslp/FanTXQLL20,DBLP:conf/ijcai/ChenLQWLDDHLZ20,DBLP:conf/acl/WangWLCZGH20}。 此外，也可以拓展搜索空间以覆盖更多网络结构\upcite{DBLP:conf/acl/LiHZXJXZLL20}。
\vspace{0.5em}
\item 	内部结构：由于算力限制，网络结构搜索任务通常使用经验性的架构作为模型的整体框架，之后对内部结构堆叠进而得到完整的模型结构。对于内部结构的设计需要考虑到搜索过程中的最小搜索单元，以及搜索单元之间的连接方式。最小搜索单元指的是在结构搜索过程中可被选择的最小独立计算单元（或被称为搜索算子、操作），在不同搜索空间的设计中，最小搜索单元的颗粒度各有不同，较小的搜索粒度主要包括如矩阵乘法、张量缩放等基本数学运算\upcite{DBLP:journals/corr/abs-2003-03384}，中等粒度的搜索单元包括常见的激活函数，如ReLU、Tanh等\upcite{DBLP:conf/iclr/LiuSY19,DBLP:conf/acl/LiHZXJXZLL20,Chollet2017XceptionDL}，较大颗粒度的搜索单元为局部结构，如注意力机制、层标准化等人工设计的经验性结构\upcite{DBLP:conf/icml/SoLL19,DBLP:conf/nips/LuoTQCL18,DBLP:journals/taslp/FanTXQLL20}。不过，对于搜索颗粒度的问题，目前还缺乏有效的方法针对不同任务进行自动优化。
\vspace{0.5em}
\end{itemize}

\parinterval 实际上，使用“整体+局部”的两层搜索空间表示模型的原因在于：结构搜索任务过于复杂，无法有效的遍历原始的搜索空间。如果存在足够高效的搜索策略，搜索空间的表示也可能会发生变化，比如，对任意的网络结构使用统一的表示方式。理论上讲，这样的搜索空间可以涵盖更多的潜在模型结构。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{2. 搜索策略}

\parinterval 在定义好搜索空间之后，如何进行网络结构的搜索也同样重要。该过程被称为搜索策略的设计，其主要目的是根据已找到的模型结构计算出下一个最有潜力的模型结构，为保证模型有效性，在一些方法中也会引入外部知识（如经验性的模型结构或张量运算规则）对搜索过程进行剪枝。目前常见的搜索策略一般包括基于进化算法、强化学习、贝叶斯优化、梯度的方法等方式，不同的搜索策略一般也和搜索空间中的结构建模方式相关。

\begin{itemize}
\vspace{0.5em}
\item 进化算法：进化算法最初被用来对神经网络模型结构以及权重参数进行优化\upcite{DBLP:conf/icga/MillerTH89,DBLP:journals/tnn/AngelineSP94,stanley2002evolving,DBLP:journals/alife/StanleyDG09}。虽然随着最优化算法的发展，近年来，对于网络参数的学习更多地采用梯度下降法的方式，但是进化算法仍被用于对模型结构进行优化\upcite{DBLP:conf/aaai/RealAHL19,DBLP:conf/icml/RealMSSSTLK17,DBLP:conf/iclr/ElskenMH19,DBLP:conf/ijcai/SuganumaSN18,Real2019AgingEF,DBLP:conf/iclr/LiuSVFK18,DBLP:conf/iccv/XieY17}。 从结构优化的角度来说，一般是将模型结构看做遗传算法中种群的个体，使用轮盘赌或锦标赛等抽取方式，对种群中的结构进行取样作为亲本，之后通过亲本模型的突变产生新的模型结构，最终对这些新的模型结构进行适应度评估\ref{subsubsec-15.4.2.3}。根据模型结构在校验集上的性能确定是否将其加入种群，整个过程如图\ref{fig:15-32}所示。进化算法中结构的突变主要指的是对模型中局部结构的改变，如增加跨层连接、替换局部操作等。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-structure-search-based-on-evolutionary-algorithm}
\caption{基于进化算法的结构搜索}
\label{fig:15-32}
\end{figure}
%-------------------------------------------

\vspace{0.5em}
\item 	强化学习：近些年随着强化学习在各领域中的广泛应用，研究人员逐渐将该方法引入到神经网络的结构学习中。例如，将网络结构的设计看做是一种序列生成任务，使用字符序列对网络结构进行表述，通过使用强化学习训练的循环神经网络对该序列（目标任务网络结构）进行预测，从而为目标任务生成高效的网络结构\upcite{DBLP:conf/iclr/ZophL17}。基于强化学习的结构搜索方法过程如图\ref{fig:15-33}所示，其中智能体可以看做是一个用于生成模型结构的生成模型，该模型将产生智能体认为的最适用于当前任务的模型结构，强化学习中的动作在这里指的是由智能体产生一个模型结构，而环境对应着当前任务。当环境获得模型结构后，环境将输出当前任务下该模型的输出以及对输出结果的评价，二者分别对应强化学习中的状态和奖励，接下来这两个信息将反馈给智能体，让结构生成器更好地了解该状态下生成的模型结果，进而对结构生成的模式进行调整，然后生成更优的模型结构。对于基于强化学习的结构搜索策略来说，不同研究工作的差异主要集中在如何表示生成网络这个过程，以及如何对结构生成器进行优化\upcite{DBLP:conf/iclr/ZophL17,DBLP:conf/cvpr/ZophVSL18,DBLP:conf/iclr/BakerGNR17,DBLP:conf/cvpr/ZhongYWSL18}。{\red{（下图转录时，主体改成智能体）}}

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-structure-search-based-on-reinforcement-learning}
\caption{基于强化学习的结构搜索}
\label{fig:15-33}
\end{figure}
%-------------------------------------------

\vspace{0.5em}
\item 	梯度方法：在基于进化算法和强化学习的结构搜索策略中，往往将模型结构看作是离散空间中的若干点，搜索策略通过诸如“进化”或“激励”等方式促进种群或者结构生成器产生更好的模型结构。相对而言，这种方式并未直接对模型结构进行优化。不同于这些方法，有研究人员尝试在连续空间中对模型结构进行表示\upcite{DBLP:conf/iclr/LiuSY19}，这种方式将模型结构建模为超网络中的权重，使用基于梯度的最优化方法对权重进行优化，最终达到搜索结构的目的，如图\ref{fig:15-34}所示。相对进化算法以及强化学习方法而言，这种方式更加直接，在搜索过程中的算力消耗以及时间消耗上也更少，因此也吸引了很多研究人员对梯度方法进行不断探索\upcite{DBLP:conf/cvpr/WuDZWSWTVJK19,DBLP:conf/iclr/XuX0CQ0X20,DBLP:conf/acl/LiHZXJXZLL20,DBLP:conf/emnlp/JiangHXZZ19}。
\vspace{0.5em}

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-structure-search-based-on-gradient-method}
\caption{基于梯度方法的结构搜索}
\label{fig:15-34}
\end{figure}
%-------------------------------------------

\end{itemize}

\parinterval 除了上述提到的基于进化算法、强化学习以及梯度的方法之外，还有很多其他的结构搜索策略，例如，基于贝叶斯优化的方法、基于随机搜索的方法。贝叶斯优化的方法在搜索结构超参数中表现优异，能够在给定模型结构的基础上找到最适用于当前任务的超参数\upcite{DBLP:conf/icml/BergstraYC13,DBLP:conf/ijcai/DomhanSH15,DBLP:conf/icml/MendozaKFSH16,DBLP:journals/corr/abs-1807-06906}，同时基于随机搜索的方法也在一些结构搜索任务中引起研究人员的注意\upcite{DBLP:conf/uai/LiT19,li2020automated,DBLP:conf/cvpr/BenderLCCCKL20}。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{3. 性能评估}\label{subsubsec-15.4.2.3}

\parinterval 由于结构搜索过程中会产生大量的中间结构，因此，如何快速评估这些结构的性能优劣是非常关键的。通常有三类方法可以快速评估的模型性能。

\begin{itemize}
\vspace{0.5em}
\item 数据以及超参数的调整：一种常见的方法是从数据和超参数的角度简化模型训练难度。具体来说，可采取的策略包括使用更少量、更容易建模的数据作为训练集合\upcite{DBLP:conf/aistats/KleinFBHH17,DBLP:journals/corr/ChrabaszczLH17}。比如，图像任务中，使用低分辨率数据对模型进行训练及评估。在自然语言处理任务中，可以选择更容易建模的口语领域数据进行实验。在超参数的调整方面，也可以通过减少模型训练轮数、减少模型的层数、减少每层中神经元数量等方式来简化模型参数，达到加速训练、评估的目的\upcite{DBLP:conf/cvpr/ZophVSL18,Real2019AgingEF,DBLP:journals/corr/abs-1807-06906}。上述两种方法虽然不能准确地评价模型的绝对性能，但是其结果已经能够对搜索起到一定指示作用，并帮助结构搜索策略对结构生成的过程进行调优。
\vspace{0.5em}
\item 现有参数的继承及复用：另一类方法希望从训练过程的角度出发，在现有的模型参数基础上，继续优化中间过程产生的模型结构，快速达到收敛状态后进行性能评估\upcite{DBLP:conf/icml/RealMSSSTLK17,DBLP:conf/iclr/ElskenMH19,DBLP:conf/icml/CaiYZHY18,DBLP:conf/aaai/CaiCZYW18,DBLP:conf/iclr/ElskenMH18}。这种方式无需从头训练中间结构，通过“热启动”的方式对模型参数进行优化，大幅减少性能评估过程的时间消耗。此外对于前文提到的基于梯度的结构搜索方法，由于将众多候选模型结构建模在同一个超网络中，因此在完成超网络的参数优化时，其子模型的模型参数也得到了优化，通过这种共享参数的方式也能够快速对网络结构的性能进行评估\upcite{DBLP:conf/icml/PhamGZLD18,DBLP:conf/iclr/XieZLL19,DBLP:conf/iclr/LiuSY19,DBLP:conf/iclr/CaiZH19,DBLP:conf/nips/SaxenaV16,DBLP:conf/icml/BenderKZVL18}。
\vspace{0.5em}
\item 模型性能的预测：从加速性能评估过程的角度来看，模型性能预测也是一个具有潜力的方法。这种方式使用少量训练过程中的性能变化曲线来预估模型是否具有潜力，从而快速终止低性能模型的训练过程，节约更多训练时间\upcite{DBLP:conf/ijcai/DomhanSH15,DBLP:conf/iclr/KleinFSH17,DBLP:conf/iclr/BakerGRN18}。除了根据性能变化曲线预测模型性能之外，也有研究人员根据局部结构的性能预测整体结构性能，这种方式也能更快速地了解结构搜索过程中中间结构的表示能力\upcite{DBLP:conf/eccv/LiuZNSHLFYHM18}。
\vspace{0.5em}
\end{itemize}

%----------------------------------------------------------------------------------------
%    NEW SUB-SECTION
%----------------------------------------------------------------------------------------

\subsection{机器翻译任务下的结构搜索}

\parinterval 目前来说，网络结构搜索方法在包括图像、自然语言处理等领域中方兴未艾。对于自然语言处理的任务来说，网络结构搜索方法更多是在语言建模、命名实体识别等简单任务上进行的尝试\upcite{DBLP:conf/acl/LiHZXJXZLL20,DBLP:conf/emnlp/JiangHXZZ19}。其中，大多数工作是在基于循环神经网络的模型结构上进行探索，相较目前在机器翻译领域中广泛使用的Transformer模型结构来说，它们在性能上并没有体现出绝对优势。此外，由于机器翻译任务的复杂性，针对基于Transformer的机器翻译模型的结构搜索方法会更少一些。不过仍有部分工作在机器翻译任务上取得了很好的表现。例如，在WMT19机器翻译比赛中，神经网络结构优化方法在多个任务上取得了很好的成绩\upcite{DBLP:conf/nips/LuoTQCL18,DBLP:conf/wmt/XiaTTGHCFGLLWWZ19}。对于结构搜索在机器翻译领域的应用目前主要包括两个方面，分别是对模型性能的改进以及模型效率的优化：

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{1. 模型性能改进}

\parinterval 结构搜索任务中一个非常重要的目标是找到更加适用于当前任务的模型结构。目前来看，有两种思路：1）对模型中局部结构的搜索；2）对局部结构组合方式的优化。

\begin{itemize}
\vspace{0.5em}
\item 搜索模型中的局部结构：在机器翻译任务中，一种典型的局部模型结构搜索方法是面向激活函数的搜索\upcite{DBLP:conf/iclr/RamachandranZL18}。该方法将激活函数看作是简单函数的若干次复合使用，图\ref{fig:15-35}是激活函数结构的一个示例，其中核心单元由两个输入、两个一元函数（如绝对值、幂方运算等）和一个二元函数（如乘法、取最大值运算等）组成。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-activation-function-swish-structure-diagram}
\caption{激活函数结构图}
\label{fig:15-35}
\end{figure}
%-------------------------------------------

\noindent 此外，还有方法将为深层神经网络找到更合适的激活函数作为搜索的目标\upcite{DBLP:conf/iclr/RamachandranZL18}，通过基于强化学习的搜索策略对激活函数空间进行探索，找到了若干新的激活函数，之后通过对这些激活函数在包括图像分类、机器翻译等任务上进行实验，确定了Swish激活函数在深层神经网络上的有效性，函数公式如下式所示，函数曲线如图\ref{fig:15-36}所示。
\begin{eqnarray}
f(x) &=& x \cdot \delta(\beta x) \\
\delta(z) &=& {(1 + \exp{(-z)})}^{-1}
\label{eq:15-60}
\end{eqnarray}

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-swish-function-image}
\caption{Swish函数图像}
\label{fig:15-36}
\end{figure}
%-------------------------------------------

\noindent 相比传统人工设计的激活函数ReLU而言，Swish函数在多个机器翻译的测试集上具有更优的性能表现，同时使用该函数不要求对原本的模型结构进行更多修改，非常容易实现。

\vspace{0.5em}
\item 搜索模型中局部结构的组合：在基于Transformer模型的网络结构搜索任务中，对于局部结构的组合方式的学习也受到了很多关注，其中包括基于进化算法的方法和基于梯度对现有Transformer模型结构进行改良的方法\upcite{DBLP:conf/icml/SoLL19,DBLP:journals/taslp/FanTXQLL20}。与前文所述的对局部结构的改良不同，此处更多地是对现有经验性的局部结构进行组合，找到最佳的整体结构。在模型结构的表示方法上，这些方法会根据先验知识为搜索单元设定一个部分框架，如每当信息传递过来之后先进行层标准化，之后再对候选位置上的操作使用对应的搜索策略进行搜索。另外这类方法也会在Transformer结构中引入多分支结构，一个搜索单元的输出可以被多个后续单元所使用，这种方式有效扩大了结构搜索过程中的搜索空间，能够在现有Transformer结构的基础上找到更优的模型结构。对模型中结构组合方式的学习如图\ref{fig:15-37}所示。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-learning-of-local-structure-combination}
\caption{局部结构组合方式的学习}
\label{fig:15-37}
\end{figure}
%-------------------------------------------

\vspace{0.5em}
\end{itemize}

\parinterval 此外对模型结构中超参数的自动搜索同样能够有效提升模型的性能\upcite{DBLP:journals/corr/abs-2009-02070}。Transformer模型虽然已经在机器翻译任务中获得了非常优异的性能，不过如果希望稳定训练该模型还需要选取合适的超参数。与此同时，在不同翻译任务使用Transformer模型的时候，也需要调整超参数以及局部结构\footnote[8]{如层标准化的位置，注意力操作的过程中是否进行缩放，注意力操作的头数，激活函数等}，因此面向超参数的搜索同样能够帮助研究人员快速找到最适用的模型结构。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------

\subsubsection{2. 模型效率优化}

\parinterval 网络结构搜索方法除了能够提高机器翻译模型性能之外，也能够优化模型执行效率。从实用的角度出发，一些研究人员尝试在进行结构搜索的同时考虑设备的计算能力，希望找到更适合对应设备算力的模型结构。同时也有一些研究人员专注于对大规模的模型进行压缩，加速其在推断过程中的效率，这方面的工作不仅限于在机器翻译模型上，也有部分工作对基于注意力机制的预训练模型进行压缩。

\begin{itemize}
\vspace{0.5em}
\item 面向特定设备的模型结构优化：随着终端设备算力日益增强，在小设备上直接进行机器翻译的需求也日益增大。虽然简单地削减Transformer模型的超参数能够让翻译模型在低算力设备上运行，不过研究人员仍希望得到更适用于当前设备的翻译模型。因此一些研究人员开始尝试使用结构搜索方法改良Transformer模型，一些研究人员尝试在结构优化的过程中将设备的算力作为一个约束，为不同硬件设备（如CPU、GPU等设备）发现更加有效的结构\upcite{DBLP:conf/acl/WangWLCZGH20}。例如可以将搜索空间中各种基于Transformer结构的变体建模在同一个超网络中，通过权重共享的方式进行训练。使用设备算力约束子模型，并通过进化算法对子模型进行搜索，搜索到适用于目标设备的模型结构，整个过程如图\ref{fig:15-38}所示。该方法搜索到的模型能够在保证模型性能不变前提下获得较大的效率提升。

%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter15/Figures/figure-model-structure-optimization-framework-for-specific-equipment}
\caption{面向特定设备的模型结构优化框架}
\label{fig:15-38}
\end{figure}
%-------------------------------------------

\vspace{0.5em}
\item 模型压缩：此外，在不考虑设备算力的情况下，也有一些研究人员通过结构搜索方法对基于Transformer的预训练模型进行压缩。例如，将Transformer模型拆分为若干小组件，然后通过基于采样的结构搜索方法对压缩后的模型结构进行搜索，尝试找到最优且高效的推断模型\upcite{DBLP:journals/corr/abs-2008-06808}。类似的，也有研究者在基于BERT的预训练模型上通过结构搜索方法进行模型压缩，通过基于梯度的结构搜索方法，针对不同的下游任务将BERT模型压缩为小模型\upcite{DBLP:conf/ijcai/ChenLQWLDDHLZ20}。
\vspace{0.5em}
\end{itemize}

\parinterval 虽然由于算力等条件的限制，导致目前很多网络结构搜索方法并没有直接在机器翻译任务中进行实验，但是这些方法并没有被限制在特定任务上。例如，可微分结构搜索方法被成功的用于学习更好的循环单元结构，这类方法完全可以应用在机器翻译任务上，不过大部分工作并没有在这个任务上进行尝试。此外，受到自然语言处理领域预训练模型的启发，一些研究人员也表示网络结构预搜索可能是一个极具潜力的方向，也有研究人员尝试在大规模语言模型上进行结构搜索\upcite{DBLP:conf/acl/LiHZXJXZLL20}，然后将搜索到的模型结构应用于更多的自然语言处理任务中，这种方式有效提升了模型结构的可复用性。同时，相较于在特定任务下受限的数据集合中所得到的信息，从大规模单语数据中能获取到更加充分的信息，因此能够更好地指导模型结构的设计。此外，对于机器翻译任务而言，结构的预搜索同样是一个值得关注的研究方向。

%----------------------------------------------------------------------------------------
%    NEW SECTION
%----------------------------------------------------------------------------------------

\sectionnewpage
\section{小结及深入阅读}

\parinterval 除了上述介绍的多分支网络，还可以通过多尺度的思想来对输入的特征表示进行分级表示，引入短语的信息\upcite{DBLP:conf/emnlp/HaoWSZT19}。此外，在对自注意力网络中的注意力权重分布进行修改时，同样可以根据不同的缩放比例对序列中的实词与虚词进行区分\upcite{DBLP:conf/emnlp/Lin0RLS18}。

\parinterval 高效地Transformer：针对处理长文本数据时面临庞大的时间复杂度问题，除了上述章节介绍的方法，研究人员通过简化网络的结构来构建更高效地Transformer结构\upcite{DBLP:journals/corr/abs-2004-05150,DBLP:journals/corr/abs-2006-04768,DBLP:journals/corr/abs-2009-14794}。

\parinterval  ODE工作（图像）

\parinterval 结构搜索技术是模型结构优化的一种方法，在近些年愈加得到广泛的关注。其中搜索策略作为衔接搜索空间和评价方法的关键步骤，在整个结构搜索方法中扮演着非常重要的角色，不同类型的搜索策略也决定了搜索过程能够在怎样的搜索空间中进行、性能评估如何帮助完成搜索等。除前文详细介绍的基于进化算法、强化学习以及梯度的方法外，基于贝叶斯优化以及随机搜索的方式同样能够有效对搜索空间进行探索。贝叶斯优化的方式已经在超参数优化领域中取得一定成绩，而对于结构搜索任务来说，也有相关研究人员尝试使用基于树的模型来对模型结构以及超参数进行协同优化\upcite{DBLP:conf/nips/BergstraBBK11,DBLP:conf/lion/HutterHL11,DBLP:conf/icml/BergstraYC13,DBLP:conf/ijcai/DomhanSH15,DBLP:conf/icml/MendozaKFSH16,DBLP:journals/corr/abs-1807-06906}。随机搜索的方法在很多工作中被作为基线，这种方式在搜索空间中随机对搜索单元进行选择及操作，最终通过组合或进化等方式找到适用于于当前任务的模型结构\upcite{li2020automated,DBLP:conf/cvpr/BenderLCCCKL20,DBLP:conf/uai/LiT19}。对于结构搜索任务来说如何提升目前搜索策略的稳定性\upcite{DBLP:conf/iccv/ChenXW019,DBLP:conf/icml/ChenH20,DBLP:conf/iclr/XuX0CQ0X20}，如何在更大的搜索空间\upcite{DBLP:conf/iclr/XieZLL19,DBLP:conf/acl/LiHZXJXZLL20,DBLP:conf/iclr/CaiZH19}、更多的任务中进行搜索\upcite{DBLP:conf/emnlp/JiangHXZZ19,DBLP:conf/icml/SoLL19}等问题成为结构搜索方法中亟待解决的重要问题。
