% !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-2.jpg} % Chapter heading image

%----------------------------------------------------------------------------------------
%	CHAPTER 11
%----------------------------------------------------------------------------------------

\chapter{基于卷积神经网络的模型}

\parinterval 卷积神经网络是一种经典的神经计算模型，在计算机视觉等领域已经得到广泛应用。通过卷积、池化等一系列操作，卷积神经网络可以很好的对输入数据进行特征提取。这个过程也与图像和语言加工中局部输入信号的处理有着天然的联系。而卷积操作也可以被多次执行，形成多层卷积神经网络，进而进行更高层次的特征抽象。

\parinterval 在自然语言处理中，卷积神经网络也是备受关注的模型之一。本章将介绍基于卷积神经网络的机器翻译模型。重点介绍如何利用卷积神经网络构建端到端翻译模型。同时，对一些机器翻译中改进的卷积神经网络结构进行讨论。

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

\section{卷积神经网络}

\parinterval {\small\bfnew{卷积神经网络}}\index{卷积神经网络}（Convolutional Neural Network，CNN）\index{Convolutional Neural Network，CNN} 是一种前馈神经网络，由若干的卷积层与池化层组成。其最早在语音识别任务上提出\upcite{Waibel1989PhonemeRU}，但之后在图像处理领域取得了很好的效果\upcite{LeCun1989BackpropagationAT,726791}。近年来，卷积神经网络已经成为众多语音、语言、图像处理任务的基础框架\upcite{DBLP:journals/corr/HeZRS15,DBLP:conf/cvpr/HuangLMW17,Girshick2015FastR,He2020MaskR}。

\parinterval 图\ref{fig:11-1}展示了全连接层和卷积层的结构对比，可以看到在全连接层中，模型考虑了所有的输入，层输出中的每一个元素都依赖于所有输入。这种全连接层适用于大多数任务，但是当处理图像这种网格数据的时候，规模过大的数据会导致模型参数量过大，难以处理。其次，在一些网格数据中，通常具有局部不变性的特征，比如图像中不同位置的相同物体，语言序列中相同的$n$-gram等。而全连接网络很难提取这些局部不变性特征。为此，一些研究人员提出使用卷积层来替换全连接层。

\parinterval 相比于全连接网络，卷积神经网络最大的特点在于具有{\small\bfnew{局部连接}}\index{局部连接}（Locally Connected）\index{Locally Connected} 和{\small\bfnew{权值共享}}\index{权值共享}（Weight Tying）\index{Weight Tying}的特性。如图\ref{fig:11-1}(b)，卷积层中每个神经元只响应周围部分的局部输入特征，大大减少了网络中的连接数和参数量。另一方面，卷积层使用相同的卷积核对不同位置进行特征提取，换句话说，就是采用权值共享来进一步减少参数量，共享的参数对应于图中相同颜色的连接。

%----------------------------------------------
% 图1.
\begin{figure}[htp]
\centering
%\input{./Chapter11/Figures/figure-f }
\subfigure[全连接层]{\input{./Chapter11/Figures/figure-full-connection-vs-cnn-a}}
\hspace{2cm}
\subfigure[卷积层]{\input{./Chapter11/Figures/figure-full-connection-vs-cnn-b}} 
\caption{全连接层（a）与卷积层（b）的结构对比}
\label{fig:11-1}
\end{figure}
%----------------------------------------------

\parinterval 在自然语言处理领域，卷积神经网络已经得到广泛应用，在文本分类\upcite{Kalchbrenner2014ACN,Kim2014ConvolutionalNN,Ma2015DependencybasedCN}、情感分析\upcite{Santos2014DeepCN,}、语言建模\upcite{Dauphin2017LanguageMW}、机器翻译\upcite{Gehring2017ACE,DBLP:journals/corr/GehringAGYD17,Kaiser2018DepthwiseSC,Wu2019PayLA}等任务中取得不错的成绩。

\parinterval 图\ref{fig:11-2}展示了一个标准的卷积神经网络模块，其中包括了卷积层、激活函数和池化层三个部分。本节将对卷积神经网络中的基本结构进行介绍。

%----------------------------------------------
% 图2.
\begin{figure}[htp]
\centering
\input{./Chapter11/Figures/figure-standard-convolution-neural-network-module}
\caption{标准的卷积神经网络模块（卷积、激活函数、池化）}
\label{fig:11-2}
\end{figure}
%----------------------------------------------

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

\subsection{卷积核与卷积操作}

\parinterval 卷积操作作为卷积神经网络的核心部分，其本质是一种特殊的线性运算。区别于全连接的方式，卷积使用一系列{\small\bfnew{卷积核}}\index{卷积核}（Convolution Kernel，也叫滤波器）\index{Convolution Kernel}\index{滤波器} 对局部输入数据进行特征提取，然后通过在输入数据空间维度上移动卷积核来获取所有位置的特征信息。卷积的输入可以是任意维度形式的数据。由于其在图像处理领域应用最为广泛，这里以二维图像为例对卷积核和卷积操作进行简单介绍。

%----------------------------------------------
% 图3.
\begin{figure}[htp]
\centering
\input{./Chapter11/Figures/figure-convolution-kernel}
\caption{图像卷积中的卷积核}
\label{fig:11-3}
\end{figure}
%----------------------------------------------

\parinterval 在图像卷积中，卷积核是一组$q \times k \times o$的参数（如图\ref{fig:11-3}）。其中$q$和$k$表示卷积核窗口的长度与宽度，分别对应图像中的长和宽两个维度，$q \times k$决定了该卷积核窗口的大小。$o$是该卷积核的深度，它的取值和输入数据通道数保持一致。在这里，通道可以看作图像不同的特征，比如灰色图像只有灰度信息，通道数为1；而RGB格式的图像有3个通道，分别对应红绿蓝三种颜色信息。

%----------------------------------------------
% 图4.
\begin{figure}[htp]
\centering
\input{./Chapter11/Figures/figure-image-convolution}
\caption{图像卷积操作}
\label{fig:11-4}
\end{figure}
%----------------------------------------------

\parinterval 图\ref{fig:11-4}展示了一个简单的卷积操作示例，卷积核大小为$2 \times 2 \times 1$，图像大小为$3 \times 3 \times 1$。将卷积核在图像上依次进行滑动，输出中的每一个位置的元素来自于卷积核与输入中对应位置元素的乘积和，比如输出中的$19=0 \times 0 + 1 \times 1 + 2 \times 3 + 3 \times 4$。在图像处理中，通过设计特定的卷积核来进行特征提取，比如图像边缘信息（图\ref{fig:11-5}）。而在卷积神经网络中，只需要指定卷积层中卷积核的数量及大小，卷积核参数通过梯度下降等手段学习得到。这样可以让模型自己学习需要提取哪些特征。

%----------------------------------------------
% 图5.
\begin{figure}[htp]
\centering
%\input{./Chapter11/Figures/figure-dog-1}
\includegraphics[scale=0.3]{./Chapter11/Figures/figure-dog-1.jpg}
\caption{图像通过卷积进行边缘检测}
\label{fig:11-5}
\end{figure}
%----------------------------------------------

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

\subsection{步长与填充}

\parinterval 在卷积操作中，步长是指卷积核每次滑动的距离，和卷积核的大小共同决定了卷积输出的大小，如图\ref{fig:11-6}所示。步长越大，对输入数据的压缩程度越高，其输出的维度越小；反之步长越小，对输入数据的压缩程度越低，同时输出的尺寸和输入越接近。比如使用一个$3 \times 3 \times 1$的卷积核在$6 \times 6 \times 1$的图像上进行卷积，如设置步长为1，其对应的输出大小就为$4 \times 4 \times 1$。这种做法最为简单，但是会导致两个问题；一是在输入数据中，由于边缘区域的像素只会被计算一次，相比于中心区域来说，这些像素被考虑的次数会更少一些，导致图像边缘信息的丢失；二是在经历多次卷积之后，其输出的特征的维度会不断减小，严重影响了模型的泛化能力。

%----------------------------------------------
% 图6.
\begin{figure}[htp]
\centering
\input{./Chapter11/Figures/figure-dimension-transformation}
\caption{卷积操作的维度变换}
\label{fig:11-6}
\end{figure}
%----------------------------------------------

\parinterval 为了解决这两个问题，可以采用填充的操作对图像的边缘进行扩充，填充一些元素，例如0。比如在图\ref{fig:11-7}中，将$6 \times 6 \times 1$的图像填充为$8 \times 8 \times 1$的图像，然后在$8 \times 8 \times 1$的图像上进行卷积操作。这样可以得到与输入数据大小一致的输出结果，同时也缓解了图像边缘信息丢失的问题。

%----------------------------------------------
% 图7.
\begin{figure}[htp]
\centering
\input{./Chapter11/Figures/figure-padding-and-conv}
\caption{填充和卷积操作}
\label{fig:11-7}
\end{figure}
%----------------------------------------------

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

\subsection{池化}

\parinterval 在图\ref{fig:11-2}所示的网络结构中，卷积层输出会通过一个非线性的激活函数，之后会通过{\small\bfnew{池化层}}\index{池化层}（也称为汇聚层）。池化过程和卷积类似，都是根据设定的窗口进行滑动选取局部信息进行计算，不同的是，池化层的计算是无参数化的，不需要额外的权重矩阵。常见的池化操作有{\small\bfnew{最大池化}}\index{最大池化}（Max Pooling）\index{Max Pooling}和{\small\bfnew{平均池化}}\index{平均池化}（Average Pooling）\index{Average Pooling}。前者获取窗口内最大的值，后者则获取窗口内矩阵的平均值。图\ref{fig:11-8}展示了窗口大小为$2 \times 2$，步长为2的两种池化方法的计算过程。

%----------------------------------------------
% 图8.
\begin{figure}[htp]
\centering
%\input{./Chapter11/Figures/figure-f }
\subfigure[最大池化]{\input{./Chapter11/Figures/figure-max-pooling}}
\subfigure[平均池化]{\input{./Chapter11/Figures/figure-average-pooling}}
\caption{池化操作}
\label{fig:11-8}
\end{figure}
%----------------------------------------------

\parinterval 池化计算选取每个滑动窗口内最突出的值或平均值作为局部信息，压缩了卷积层输出的维度大小，有效地减少了神经网络的计算量，是卷积神经网络中必不可少的操作。在网络建模时，通常在较低层时会使用最大池化，仅保留特征中最显著的部分。而当网络更深时，特征信息都具有一定意义，此时包含的语义信息较多，选取平均池化方法更适合。


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

\subsection{面向序列的卷积操作}

\parinterval 对比于图像处理任务中二维图像数据，自然语言处理任务中主要处理一维序列，如单词序列。由于单词序列往往是不定长的，因此很难使用全连接网络处理它。

%----------------------------------------------
% 图9.
\begin{figure}[htp]
\centering
%\input{./Chapter11/Figures/figure-f }
\subfigure[O(n)]{\input{./Chapter11/Figures/figure-structural-comparison-a}}
\subfigure[O(n/k)]{\input{./Chapter11/Figures/figure-structural-comparison-b}}
\caption{串行及层级结构对比}
\label{fig:11-9}
\end{figure}
%----------------------------------------------

\parinterval 针对不定长序列，一种可行的方法是使用之前介绍过的循环神经网络，其本质也是基于权重共享的想法，在不同的时间步复用相同的循环神经网络单元进行处理。但是，循环神经网络最大的弊端在于每一时刻的计算都依赖于上一时刻的结果，因此只能对序列进行串行处理，无法充分利用硬件设备进行并行计算，导致效率相对较低。此外，在处理较长的序列时，这种串行的方式很难捕捉长距离的依赖关系。与之对应的卷积神经网络，由于采用卷积这种局部处理并且共享参数的操作，可以对序列高效地并行处理。同时，针对序列中距离较长的依赖关系，可以通过堆叠多层卷积层来扩大{\small\bfnew{感受野}}\index{感受野} (Receptive Field)\index{Receptive Field}  ，这里感受野指能够影响神经元输出的原始输入数据区域的大小。这种堆叠的层级结构对比串行的方式具有更短的路径及非线性计算（如图\ref{fig:11-9}），更容易进行训练。因此，也有许多研究人员在许多自然语言处理任务上尝试使用卷积神经网络进行序列建模\upcite{Kim2014ConvolutionalNN,Santos2014DeepCN,Kalchbrenner2014ACN,DBLP:conf/naacl/Johnson015,DBLP:conf/naacl/NguyenG15}。

\parinterval 区别于传统图像上的卷积操作，在面向序列的卷积操作中，卷积核只在序列这一维度进行移动，用来捕捉多连续词之间的特征。需要注意的是，由于单词通常由一个实数向量表示（词嵌入），因此可以将词嵌入的维度看作是卷积操作中的通道数。图\ref{fig:11-10}就是一个基于序列卷积的文本分类模型，模型使用多个不同（包括尺度不同）的卷积核来对序列进行特征提取，得到了多个不同的特征序列。然后使用池化层降低表示维度，得到了一组和序列长度无关的特征表示。基于这组压缩过的特征表示，模型再通过全连接网络和Softmax函数作为相应类别的预测。在这其中卷积层和池化层分别起到了特征提取和状态压缩的作用，将一个不定长的序列转化到一组固定大小的特征表示。

%----------------------------------------------
% 图10.
\begin{figure}[htp]
\centering
\input{./Chapter11/Figures/figure-use-cnn-in-sentence-classification}
\caption{序列卷积在文本分类模型中的应用}
\label{fig:11-10}
\end{figure}
%----------------------------------------------

\parinterval 和其它自然语言处理任务不同的是，机器翻译中需要对序列进行全局表示，换句话说，模型需要捕捉序列中各个位置之间的关系。因此，基于卷积网络的神经机器翻译模型需要堆叠多个卷积层进行远距离的依赖关系的建模。同时，为了在多层网络中维持序列的原有长度，需要在卷积操作前对输入序列进行填充。图\ref{fig:11-11}是一个简单的示例，针对一个长度$M=6$的句子，其隐层表示维度即卷积操作的输入通道数是$O=4$，卷积核大小为$K=3$。首先对序列进行填充，得到一个长度为8的序列，然后使用这些卷积核在这之上进行特征提取。一共使用了$N=4$个卷积核，整体的参数量为$K \times O \times N$，最后的卷积结果为$M \times N$的序列表示。

%----------------------------------------------
% 图11.
\begin{figure}[htp]
\centering
%\input{./Chapter11/Figures/figure-f }
\input{./Chapter11/Figures/figure-use-cnn-in-nmt}
\caption{机器翻译中的序列卷积操作}
\label{fig:11-11}
\end{figure}
%----------------------------------------------
%----------------------------------------------------------------------------------------
%    NEW SECTION
%----------------------------------------------------------------------------------------

\section{基于卷积神经网络的机器翻译模型}

\parinterval 正如之前所讲，卷积神经网络可以用于序列建模，同时具有并行性高和易于学习的特点，一个很自然的想法就是将其用作神经机器翻译模型中的特征提取器。因此，在神经机器翻译被提出之初，研究人员就已经开始利用卷积神经网络对句子进行表示。比较经典的模型是使用卷积神经网络作为源语言句子的编码器，使用循环神经网络作为目标语译文生成的解码器\upcite{kalchbrenner-blunsom-2013-recurrent,Gehring2017ACE}。之后也有研究人员提出完全基于卷积神经网络的翻译模型（ConvS2S）\upcite{DBLP:journals/corr/GehringAGYD17}，或者针对卷积层进行改进，提出效率更高、性能更好的模型\upcite{Kaiser2018DepthwiseSC,Wu2019PayLA}。本节我们将基于ConvS2S模型进行介绍，阐述如何使用卷积神经网络搭建端到端神经机器翻译模型。

\parinterval ConvS2S模型是一种高并行的序列到序列的神经计算模型。该模型分别利用卷积网络对源语言端与目标语言端的输入数据进行特征提取，并使用注意力机制来捕获两个序列之间映射关系。相比于基于多层循环神经网络的GNMT模型\upcite{Wu2016GooglesNM}，其主要优势在于每一层的网络计算是完全并行化的，避免了循环神经网络中计算顺序对时序的依赖。同时，利用多层卷积神经网络的层级结构可以有效的捕捉序列不同位置之间的依赖。即使是远距离依赖，也可以通过若干层卷积单元进行有效的捕捉，而且其信息传递的路径相比循环神经网络更短。除此之外，模型同时使用门控线性单元、残差网络和位置编码等技术来进一步提升模型性能，达到了和GNMT模型相媲美的翻译性能，同时大大缩短了训练时间。

\parinterval 图\ref{fig:11-12}为ConvS2S模型的整体结构示意图，其内部由若干不同的模块组成，包括：

\begin{itemize}
\item {\small\bfnew{位置编码}}（Position Embedding）：图中绿色背景框表示源语端词嵌入部分，相比于RNN中的词嵌入（Word Embedding），该模型还引入了位置编码，帮助模型获得词位置信息。

\item {\small\bfnew{卷积层与门控线性单元}}（Gated Linear Units, GLU）：黄色背景框是卷积模块，这里使用门控线性单元作为非线性函数，之前的研究工作\upcite{Dauphin2017LanguageMW}表明这种非线性函数更适合于序列建模任务。图中为了简化，只展示了一层卷积，但在实际中为了更好地捕获句子信息，通常使用多层卷积叠加计算。

\item {\small\bfnew{残差连接}}\index{残差连接}（Residual Connection）\index{Residual Connection}：对于源语言端和目标语言端的卷积层网络之间，都存在一个从输入到输出的额外连接，即跨层连接\upcite{DBLP:journals/corr/HeZRS15}。该连接方式确保每个隐层输出都能包含输入序列中的更多信息，同时能够有效促进深层网络的信息传递效率。

\item {\small\bfnew{多跳注意力机制}}\index{多跳注意力机制}(Multi-step Attention)\index{Multi-step Attention}：蓝色框内部展示了基于多跳结构的注意力机制模块\upcite{Sukhbaatar2015EndToEndMN}。可以看出使用多跳注意力帮助解码器最后一层卷积模块关注源语言和目标语言信息；同时每一层卷积层都会执行同样的注意力机制，帮助模型获得更多历史信息。下面我们将以此模型为例对基于CNN的机器翻译模型进行介绍。
\end{itemize}

%----------------------------------------------
% 图12.
\begin{figure}[htp]
\centering
\input{./Chapter11/Figures/figure-fairseq-1}
\caption{ConvS2S结构}
\label{fig:11-12}
\end{figure}
%----------------------------------------------

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

\subsection{位置编码}

\parinterval 和基于循环神经网络的翻译模型类似，基于卷积神经网络的翻译模型同样采用词嵌入来进行输入序列的表示，该模型首先将语言序列$\seq{w}=\{w_1,w_2,...,w_m\}$表示为维度大小为$m \times d$的矩阵，其中$m$为序列长度，$d$为词嵌入向量维度。和循环神经网络不同的是，基于卷积神经网络的模型需要对每个输入单词位置进行表示。这是由于，在卷积神经网络中，受限于卷积核的大小，单层的卷积神经网络只能捕捉序列局部的相对位置信息。虽然多层的卷积神经网络可以扩大感受野，但是对全局的位置表示并不充分。而相较于基于卷积神经网络的模型，基于循环神经网络的模型按时间步对输入的序列进行建模，这样间接的对位置信息进行了建模。而词序又是自然语言处理任务中重要信息，因此这里需要单独考虑。

\parinterval 为了更好地引入序列的词序信息，该模型引入了位置编码$\seq{p}=\{p_1,p_2,...,p_m\}$，其中$p_i$的维度大小为$d$，一般和词嵌入维度相等，其中具体数值作为网络可学习的参数。简单来说，位置编码的作用就是对位置信息进行表示，不同序列中的相同位置都对应一个唯一的向量表示。之后将词嵌入矩阵和位置编码进行相加，得到模型的输入向量序列矩阵$\seq{e}=\{w_1+p_1,w_2+p_2,...,w_m+p_m\}$。  实际上也有研究人员发现卷积神经网络本身具备一定的编码位置信息的能力\upcite{Islam2020HowMP}，而这里的额外的位置编码模块可以被看作是对卷积神经网络位置编码能力的一种补充。

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

\subsection{门控卷积网络}

\parinterval 单层卷积神经网络的感受野受限于卷积核的大小，因此只能捕捉序列中局部的上下文信息，不能很好地进行序列建模。为了捕捉更长的长下文信息，最简单的做法就是堆叠多个卷积层。相比于循环神经网络的链式结构，对相同的上下文跨度，多层卷积神经网络的层级结构可以通过更少的非线性计算对其进行建模，缓解了长距离建模中的梯度消失问题。因此，卷积神经网络相对更容易进行训练优化。

\parinterval 在ConvS2S模型中，编码端和解码端分别使用堆叠的门控卷积网络对源语和目标语序列进行建模。门控卷积在传统卷积网络的基础上引入了门控线性单元（Gated Linear Units，GLU）\upcite{Dauphin2017LanguageMW}，通过门控机制对卷积输出进行控制，它在模型中的位置如图\ref{fig:11-13}黄色色方框所示：

%----------------------------------------------
% 图13.
\begin{figure}[htp]
\centering
\input{./Chapter11/Figures/figure-fairseq-2}
\caption{门控卷积网络机制在模型中的位置}
\label{fig:11-13}
\end{figure}
%----------------------------------------------

\parinterval 门控机制在{\chapterten}中介绍LSTM模型时已经提到过：通过引入三个门控单元来控制信息流，使隐层状态能够获得长时间记忆。同时，门控单元的引入简化了不同时间步间状态更新的计算，只包括一些线性计算，缓解了长距离建模中梯度消失的问题。在多层卷积网络中，同样可以通过门控机制来起到相同的作用。

%----------------------------------------------
% 图14.
\begin{figure}[htp]
\centering
\input{./Chapter11/Figures/figure-single-glu}
\caption{单层门控卷积网络结构}
\label{fig:11-14}
\end{figure}
%----------------------------------------------

\parinterval 图\ref{fig:11-14}是单层门控卷积网络的基本结构，$\mathbi{X}\in \mathbb{R}^{m\times d}$为单层网络的输入，$\mathbi{Y} \in \mathbb{R}^{m \times d}$为单层网络的输出，网络结构主要包括卷积计算和GLU非线性单元两部分。如图所示，形式上，卷积操作可以分成两部分，分别使用两个卷积核来得到两个卷积结果：
\begin{eqnarray}
\mathbi{A} = \mathbi{X} \cdot \mathbi{W} + \mathbi{b}_\mathbi{W} \nonumber \\
\mathbi{B} = \mathbi{X} \cdot \mathbi{V} + \mathbi{b}_\mathbi{V} \ \
\label{eq:11-1}
\end{eqnarray}

\noindent 其中$\mathbi{A},\mathbi{B}\in \mathbb{R}^d$，$\mathbi{W}\in \mathbb{R}^d$、$\mathbi{V}\in \mathbb{R}^d$、$\mathbi{b}_\mathbi{W}$，$\mathbi{b}_\mathbi{V} \in \mathbb{R}^d $，$\mathbi{W}$、$\mathbi{V}$在此表示卷积核，$\mathbi{b}_\mathbi{W}$，$\mathbi{b}_\mathbi{V}$为偏置矩阵。在卷积操作之后，引入非线性变换：
\begin{eqnarray}
\mathbi{Y} = \mathbi{A} \otimes \sigma ( \mathbi{B} )
\label{eq:11-2}
\end{eqnarray}

\noindent 其中$\sigma$为sigmoid函数，$\otimes$为按位乘运算。sigmoid将$\mathbi{B}$映射为0-1范围内的实数，用来充当门控。可以看到，门控卷积网络中核心部分就是$\sigma ( \mathbi{B} )$，通过这个门控单元来对卷积输出进行控制，确定保留哪些信息。同时，在梯度反向传播的过程中，这种机制使得不同层之间存在线性的通道，梯度传导更加简单，利于深层网络的训练。这种思想和下一节介绍的残差网络也很类似。

\parinterval 在ConvS2S模型中，为了保证卷积操作之后的序列长度不变，需要对输入进行填充，这一点已经在之前的章节中讨论过了。因此，在编码端每一次卷积操作前，需要对序列的头部和尾部分别做相应的填充（如图\ref{fig:11-14}输入部分）。而在解码端中，由于需要训练和解码的一致性，模型在训练过程中不能使用未来的信息，需要对未来信息进行屏蔽。从实践角度来看，只需要对解码端输入序列的头部填充$k-1$个空元素，其中$k$为卷积核的宽度（如图\ref{fig:11-14-2}所示）。 

%----------------------------------------------
% 图14-2.
\begin{figure}[htp]
\centering
\input{./Chapter11/Figures/figure-padding-method}
\caption{解码端的填充方法}
\label{fig:11-14-2}
\end{figure}
%----------------------------------------------

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

\subsection{残差网络}

\parinterval 残差连接是一种训练深层网络的技术，其结构如图\ref{fig:11-15}所示，即在子层之间通过增加直接连接的方式，从而将底层信息直接传递给上层。

%----------------------------------------------
% 图15.
\begin{figure}[htp]
\centering
\input{./Chapter11/Figures/figure-residual-network-structure}
\caption{残差网络结构}
\label{fig:11-15}
\end{figure}
%----------------------------------------------

\parinterval 残差连接从广义上讲也叫{\small\bfnew{短连接}}\index{短连接}（Short-cut Connection）\index{Short-cut Connection}，指的是这种短距离的连接。它的思想很简单，就是把层和层之间的距离拉近，进而提高信息传递的效率。如图\ref{fig:11-15}所示，子层1 通过残差连接跳过了子层2，直接和子层3 进行信息传递。使信息传递变得更高效，有效解决了深层网络训练过程中容易出现的梯度消失/爆炸问题，使得深层网络的训练更加容易。其计算公式为：
\begin{eqnarray}
x_{l+1} = x_l + F (x_l)
\label{eq:11-3}
\end{eqnarray}

\noindent 其中，$x_l$表示$l$层网络的输入向量，${F} (x_l)$是子层运算。如果$l=2$，那么公式\eqref{eq:11-3}可以解释为，第3层的输入（$x_3$）等于第2层的输出（${F}(x_2)$）加上第二层的输入（$x_2$）。

\parinterval 在ConvS2S中残差连接主要应用于门控卷积网络和多跳自注意力机制中。为了堆叠更多的卷积网络，在每个卷积网络的输入和输出之间增加残差连接，具体的数学描述如下：
\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}
\label{eq:11-4}
\end{eqnarray}


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

\subsection{多跳注意力机制}

\parinterval ConvS2S模型也采用了注意力机制来获取每个目标语位置相应的源语言上下文信息。其仍然沿用传统的点乘注意力机制，其中图\ref{fig:11-16}蓝色框代表了多跳自注意力机制在模型中的位置。

%----------------------------------------------
% 图16.
\begin{figure}[htp]
\centering
\input{./Chapter11/Figures/figure-fairseq-3}
\caption{多跳自注意力机制在模型中的位置}
\label{fig:11-16}
\end{figure}
%----------------------------------------------

\parinterval 注意力机制早在基于循环神经网络的翻译模型中被广泛使用\upcite{bahdanau2014neural}，用于避免循环神经网络将源语言序列压缩成一个固定维度的向量表示带来的信息损失。另一方面，注意力同样能够帮助解码端区分源语言中不同位置词对当前解码词的贡献权重，其具体的计算过程如下：
\begin{eqnarray}
\mathbi{C}_j = \sum_i \alpha_{i,j} \mathbi{h}_i \\
\alpha_{i,j} = \frac{ \textrm{exp}(a (\mathbi{s}_{j-1},\mathbi{h}_i))  }{\sum_{i'} \textrm{exp}(a(\mathbi{s}_{j-1},\mathbi{h}_{i'}))}
\label{eq:11-5}
\end{eqnarray}

\noindent 其中$\mathbi{h}_i$表示源语端第$i$个位置的隐层状态，$\mathbi{s}_j$表示目标端第$j$个位置的隐层状态。给定$\mathbi{s}_j$和$\mathbi{h}_i$，注意力机制通过函数a($\cdot$)计算目标语言表示$\mathbi{s}_j$与源语言表示$\mathbi{h}_i$之间的注意力权重$\alpha_{i,j}$，通过加权平均得到当前目标端位置所需的上下文表示$\mathbi{C}_j$。其中a($\cdot$)的具体计算方式在{\chapterten}\ref{sec:10.4.2}节已经详细讨论。

\parinterval 对比基于循环神经网络的机器翻译模型(GNMT)仅在解码端的最底层采用注意力机制，在ConvS2S模型中，解码端的每一层中都分别引入了注意力机制，同时通过残差连接的方式将结果作用于上层网络的计算，因此称之为{\small\bfnew{ 多跳注意力}}（Multi-step Attention）。  其中ConvS2S模型选取向量乘的方式作为a($\cdot$)函数具体的数学描述为：
\begin{eqnarray}
\alpha_{ij}^l = \frac{ \textrm{exp} (\mathbi{d}_{j}^l,\mathbi{h}_i) }{\sum_{t=1}^m \textrm{exp} (\mathbi{d}_{j}^l,\mathbi{h}_{i})}
\label{eq:11-6-1}
\end{eqnarray}

\parinterval 其中$\alpha_{ij}^l$代表第$l$层中源语言第$i$个位置与目标语言第$j$个位置之间的注意力权重。从公式中可以看到，在这里并没有选取目标语言段的隐层状态$\mathbi{s}_{j}$直接与源语言端的隐层状态$\mathbi{h}_i$进行向量乘，而是先通过线性变化，之后与目标语言端的词嵌入$\mathbi{g}_j$进行累加得到表示$\mathbi{d}_{j}^l$，具体的数学描述如下：
\begin{eqnarray}
\mathbi{d}_{j}^l = \mathbi{W}_{d}^{l} \mathbi{s}_{j}^{l} + \mathbi{b}_{d}^{l} + \mathbi{g}_j
\label{eq:11-6-2}
\end{eqnarray}

\noindent 其中$\mathbi{d}_{j}^l$表示了第$l$层的解码端输出状态，$\mathbi{W}_{d}^{l}$和$\mathbi{b}_{d}^{l}$是模型的可学习的参数，同时解码端每一层都使用独立的矩阵参数。此外，第$l$层的上下文表示$\mathbi{C}_j^l$由第$l$层编码端输出$\mathbi{h}_i$与源语言的词嵌入表示$\mathbi{e}_i$的累加结果与计算得到的注意力权重$\alpha_{ij}^l$的加权平均结果，具体的数学描述如下：
\begin{eqnarray}
\mathbi{C}_j^l = \sum_i \alpha_{ij}^l (\mathbi{h}_i + \mathbi{e}_i)
\label{eq:11-7}
\end{eqnarray}

\noindent 通过结合底层的词嵌入表示，模型可以考虑到每个输入元素独立的信息，更好的帮助模型捕获源语言与目标语言之间的联系。

\parinterval 当得到上下文向量$\mathbi{C}_j^l$后，将其与$\mathbi{s}_j^l$相加后送入下一层计算，这种机制也被称为多跳机制，具体的数学描述如下：
\begin{eqnarray}
\mathbi{C}_j^{l+1} = \mathbi{C}_j^l + \mathbi{s}_j^l
\label{eq:11-8}
\end{eqnarray}

\parinterval 与循环网络中的注意力机制相比，该机制能够帮助模型甄别已经考虑了哪些先前的输入。 也就是说，多跳的注意力机制会考虑模型之前更关注哪些单词，并且之后层中执行多次注意力的“跳跃”。

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

\subsection{训练与推断}

\parinterval 与基于循环神经网络的翻译模型一致，ConvS2S在经过计算之后得到目标端当前位置在整个词表上的概率分布，用此表示这个位置出现不同单词的可能性，并以交叉熵函数作为损失函数来衡量模型预测分布与标准分布之间的差异。采用基于梯度的方法，通过前向与反向的计算得到所有参数的梯度信息，并对网络中的参数进行更新。

\parinterval ConvS2S同样有针对性的应用了很多工程方面的调整，主要包括：
\begin{itemize}
\item ConvS2S使用了{\small\bfnew{Nesterov加速梯度下降法}}（NAG），动量累计的系数设置为0.99，当梯度范数超过0.1时重新进行规范化\upcite{Sutskever2013OnTI}；

\item ConvS2S中设置学习率为0.25，每当模型在校验集上的困惑度不再下降时，便在每轮的训练后将学习率降低一个数量级，直至学习率小于一定的阈值（如0.0004）。
\end{itemize}

\parinterval Nesterov加速梯度下降法和{\chapternine}介绍的Momentum梯度下降法类似，都使用了历史梯度信息，区别在于使用的梯度不是来自于当前参数位置，而是按照之前梯度方向更新一小步的位置。这种方式可以更好的“预测未来”，提前调整更新速率，具体如下：
\begin{eqnarray}
\textrm{Momentum：} \mathbi{v}_t = \beta \mathbi{v}_{t-1} + (1-\beta)\frac{\partial J(\mathbi{w})}{\partial \mathbi{w}_t} \\
\textrm{参数更新：} \mathbi{w}_{t+1} = \mathbi{w} - \alpha \mathbi{v}_t \ \   \ \   \ \   \ \   \ \   \ \
\label{eq:11-9}
\end{eqnarray}

\noindent 其中$\mathbi{w}_t$表示第$t$步更新时的模型参数；$J(\mathbi{w})$表示损失函数均值期望的估计；$\frac{\partial J(\mathbi{w})}{\partial \mathbi{w}_t}$将指向$J(\mathbi{w})$在$\mathbi{w}$处变化最大的方向，即梯度方向；$\alpha$ 为学习率。$\mathbi{v}_t$则为损失函数在前$t-1$步更新中累积的梯度动量，利用超参数$\beta$控制累积的范围。

\parinterval 在Nesterov加速梯度下降法中，使用的梯度不是来自于当前参数位置，而是按照之前梯度方向更新一小步的位置，以便于更好的“预测未来”，提前调整更新速率，因此，其动量的更新方式为：
\begin{eqnarray}
\textrm{Nesterov：} \mathbi{v}_t = \beta \mathbi{v}_{t-1} + (1-\beta)\frac{\partial J(\mathbi{w})}{\partial (\mathbi{w}_{t} -\alpha \beta \mathbi{v}_{t-1} )}
\label{eq:11-10}
\end{eqnarray}

\parinterval 在数学本质上，NAG其实是利用了二阶导数的信息，因此可以做到“向前看”，加速收敛过程\upcite{Bengio2013AdvancesIO}。为了模型的稳定训练。ConvS2S也采用了一些网络正则化和参数初始化的策略，使得模型在前向计算和反向计算过程中方差尽可能保持一致。

\parinterval 此外，ConvS2S为了进一步提升模型的训练效率及性能，还使用了小批量训练，即每次从样本中选择出一小部分数据进行训练。同时，ConvS2S模型中也使用了Dropout方法\upcite{JMLR:v15:srivastava14a}。除了在词嵌入层和解码器输出层应用Dropout外，ConvS2S还对卷积块的输入层应用了Dropout。

\parinterval ConvS2S的推断过程与第十章中描述的推断过程一样。其基本思想是：依靠源语言句子和前面已经生成的译文单词来预测下一个译文单词。这个过程也可以结合贪婪搜索或者束搜索等解码策略\upcite{Sennrich2016ImprovingNM}。

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

\section{局部模型的改进}

\parinterval 在序列建模中，卷积神经网络可以通过参数共享，高效地捕捉局部上下文特征，如图\ref{fig:11-11}所示。但是通过进一步分析可以发现，在标准卷积操作中包括了不同词和不同通道之间两种信息的交互，每个卷积核都是对相邻词的不同通道进行卷积，参数量为$K \times O$。其中$K$为卷积核大小，$O$为输入的通道数，即单词表示的维度大小。因此$N$个卷积核总共的参数量为$K \times O \times N$。这里涉及卷积核大小、输入通道数和输出通道数三个维度，因此计算复杂度较高。为了进一步提升计算效率，降低参数量，一些研究人员提出{\small\bfnew{深度可分离卷积}}\index{深度可分离卷积}（Depthwise Separable Convolution）\index{Depthwise Separable Convolution}，将空间维度和通道间的信息交互分离成深度卷积（也叫逐通道卷积，Depthwise Convolution）\index{逐通道卷积，Depthwise Convolution}和{\small\bfnew{逐点卷积}} \index{逐点卷积}（Pointwise Convolution）\index{Pointwise Convolution} 两部分\upcite{Chollet2017XceptionDL,Howard2017MobileNetsEC}。除了直接将深度可分离卷积应用到神经机器翻译中\upcite{Kaiser2018DepthwiseSC}，研究人员提出使用更高效的{\small\bfnew{轻量卷积}}\index{轻量卷积}（Lightweight Convolution）\index{Lightweight Convolution}和{\small\bfnew{动态卷积}}\index{动态卷积}（Dynamic convolution）\index{Dynamic convolution}来进行不同词之间的特征提取\upcite{Wu2019PayLA}。本节将主要介绍这些改进的卷积操作。在后续章节中也会看到这些模型在神经机器翻译中的应用。

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

\subsection{深度可分离卷积}
\label{sec:11.3.1}

\parinterval 根据前面介绍，可以看到卷积神经网络容易处理在局部检测和位置不变的特征。对于特定的表达，比如地点、情绪等，使用卷积神经网络能达到不错的识别效果，因此它常被用在文本分类中\upcite{Minaee2020DeepLB}。不过机器翻译所面临的情况更复杂，除了局部句子片段信息，我们还希望模型能够捕获句子结构，语义等信息。虽然单层卷积神经网络在文本分类中已经取得了很好的效果\upcite{Kim2014ConvolutionalNN}，神经机器翻译等任务仍然需要有效的卷积神经网络。随着深度可分离卷积在机器翻译中的探索\upcite{Kaiser2018DepthwiseSC}，更复杂且高效的网络结构被设计出来，获得了比ConS2S\upcite{DBLP:journals/corr/GehringAGYD17}更好的性能。

%----------------------------------------------
% 图17.
\begin{figure}[htp]
\centering
\input{./Chapter11/Figures/figure-standard}
\caption{标准卷积、深度卷积和逐点卷积}
\label{fig:11-17}
\end{figure}
%----------------------------------------------

\parinterval 深度可分离卷积\upcite{Sifre2013RotationSA}由深度卷积和逐点卷积两部分结合而成。图\ref{fig:11-17}展示了标准卷积、深度卷积和逐点卷积的对比，为了方便显示，图中只画出了部分连接。

\parinterval 给定输入序列表示$\seq{X} = \{ \mathbi{x}_1,\mathbi{x}_2,...,\mathbi{x}_m \}$，其中$m$为序列长度，$\mathbi{x}_i \in \mathbb{R}^{O} $ ，$O$ 即输入序列的通道数。为了获得与输入序列长度相同的卷积输出结果，首先需要进行填充。为了方便描述，这里在输入序列尾部填充 $K-1$ 个元素，其对应的卷积结果为$\seq{Z} = \{ \mathbi{z}_1,\mathbi{z}_2,...,\mathbi{z}_m \}$。在标准卷积中，$ \mathbi{z}_i^\textrm{std} \in \mathbb{R}^N$ （std是standard的缩写），N为卷积核的个数，也就是标准卷积输出序列的通道数。针对$ \mathbi{z}_i^\textrm{std} $ 中的第$n$个通道$ \mathbi{z}_{i,n}^\textrm{std}$，标准卷积具体计算方式如下：
\begin{eqnarray}
\mathbi{z}_{i,n}^\textrm{std} = \sum_{o=1}^{O} \sum_{k=0}^{K-1} \mathbi{W}_{k,o,n}^\textrm{std} \mathbi{x}_{i+k,o}
\label{eq:11-11}
\end{eqnarray}

\noindent 其中 $\mathbi{W}^\textrm{std} \in \mathbb{R}^{K \times O \times N} $ 为标准卷积的参数。可以看出，标准卷积中每个输出元素需要考虑卷积核尺度内所有词的所有特征，参数量相对较多，对应图\ref{fig:11-17}中的连接数也最多。

\parinterval 相应的，深度卷积只考虑不同词之间的依赖性，而不考虑不同通道之间的关系，相当于使用$O$个卷积核逐个通道对不同的词进行卷积操作。因此深度卷积不改变输出的表示维度，输出序列表示的通道数与输入序列一致，其计算方式如下（dw是depth wise的缩写）：
\begin{eqnarray}
\mathbi{z}_{i,o}^\textrm{dw} = \sum_{k=0}^{K-1} \mathbi{W}_{k,o}^\textrm{dw} \mathbi{x}_{i+k,o}
\label{eq:11-12}
\end{eqnarray}

\noindent 其中 $\mathbi{z}_i^\textrm{dw} \in \mathbb{R}^{O}$ ，$\mathbi{W}^\textrm{dw} \in \mathbb{R}^{K \times O}$，参数量只涉及卷积核大小及输入表示维度。

\parinterval 与深度卷积互为补充的是，逐点卷积只考虑不同通道之间的依赖性，而不考虑不同词之间的依赖。换句话说，逐点卷积对每个词表示做了一次线性变换，将输入表示从 $\mathbb{R}^{O}$ 的空间映射到 $\mathbb{R}^{N}$的空间，计算方式如下（pw是position wise的缩写）：
\begin{eqnarray}
\mathbi{z}_{i,n}^\textrm{pw} &=& \sum\nolimits_{o=1}^{O} \mathbi{W}_{o,n}^\textrm{pw} \mathbi{x}_{i,o} \nonumber \\
                      &=& \mathbi{x}_i \mathbi{W}^\textrm{pw}
\label{eq:11-13}
\end{eqnarray}

\parinterval 表\ref{tab:11-1}展示了这几种不同类型卷积的参数量，深度可分离卷积通过将标准卷积进行分解，降低了整体模型的参数量。在相同参数量的情况下，深度可分离卷积可以采用更大的卷积窗口，考虑序列中更大范围的依赖关系。因此相比于标准卷积，深度可分离卷积具有更强的表示能力，在机器翻译任务中也能获得更好的性能。

%----------------------------------------------
\begin{table}[htp]
\centering
\caption{不同类型卷积的参数量对比（$K$表示卷积核大小，$O$表示输入通道数，$N$表示输出通道数）\upcite{StahlbergNeural}}
\label{tab:11-1}
\begin{tabular}{l | l}
卷积类型 & 参数量 \\ \hline
\rule{0pt}{12pt}标准卷积 & $K \times O \times N$ \\
深度卷积 & $K \times O$ \\
逐点卷积 & $O \times N$ \\
深度可分离卷积 & $K \times O + O \times N $
\end{tabular}
\end{table}
%----------------------------------------------

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

\subsection{轻量卷积和动态卷积}

\parinterval 深度可分离卷积将标准卷积分成两部分，其中深度卷积的作用就是用来捕捉相邻词之间的依赖关系，这和基于自注意力机制的模型（{\chaptertwelve}）类似。基于深度卷积，一些研究人员提出了轻量卷积和动态卷积，用来替换注意力机制，并将其应用于基于自注意力机制的模型中\upcite{Wu2019PayLA}。同时，卷积操作的线性复杂度使得它具有较高的运算效率，相比注意力机制的平方复杂度，卷积操作是一种更加“轻量”的方法。接下来分别介绍轻量卷积与动态卷积的思想。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{1. 轻量卷积}

\parinterval 在序列建模的模型中，一个很重要的模块就是对序列中不同位置信息的提取，如ConvS2S中的卷积网络等。虽然考虑局部上下文的卷积神经网络只在序列这一维度进行操作，具有线性的复杂度，但是由于标准卷积操作中考虑了不同通道的信息交互，整体复杂度依旧较高。一种简化的策略就是采取通道独立的卷积操作，也就是\ref{sec:11.3.1}节中介绍的深度卷积。

\parinterval 在神经机器翻译模型中，多层表示的维度通常一致，即$O=N=d$。因此，深度卷积可以使得卷积网络参数量从 $d^2K$ 降到$dK$（参考表\ref{tab:11-1}）。从形式上来看，深度卷积和注意力很类似，区别在于注意力机制考虑了序列全局上下文信息，权重来自于当前位置对其他位置的“注意力”，而深度卷积中仅考虑了局部的上下文信息，权重采用了在不同通道上独立的固定参数。为了进一步降低参数量，轻量卷积共享了部分通道的卷积参数。如图\ref{fig:11-18}所示，深度卷积中4种颜色的连接代表了4个通道上独立的卷积核，而轻量卷积中，第一和第三通道，第二和第四通道采用了共享的卷积核参数。通过共享，可以将参数量压缩到$mK$，其中压缩比例为$d/m$。

%----------------------------------------------
% 图18.
\begin{figure}[htp]
\centering
\input{./Chapter11/Figures/figure-deep-vs-light}
\caption{深度卷积vs轻量卷积}
\label{fig:11-18}
\end{figure}
%----------------------------------------------

\parinterval 此外，和标准卷积不同的是，卷积之前需要先对卷积参数进行归一化，具体计算过程如下（lw是Lightweight的缩写）：
\begin{eqnarray}
\mathbi{z}_{i,o}^\textrm{lw} &=& \sum_{k=0}^{K-1} \textrm{Softmax}(\mathbi{W}^\textrm{lw})_{k,[\frac{oh}{d}]} \mathbi{x}_{i+k,o}
\label{eq:11-14}
\end{eqnarray}

\noindent 其中$\mathbi{z}_i^\textrm{lw} \in \mathbb{R}^d $，$\mathbi{W}^\textrm{lw} \in \mathbb{R}^{K\times h}$。在这里，轻量卷积用来捕捉相邻词的特征，通过Softmax可以在保证关注到不同词的同时，对输出大小进行限制。

%----------------------------------------------------------------------------------------
%    NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
\subsubsection{2. 动态卷积}

\parinterval 轻量卷积和动态卷积的概念最早都是在图像领域被提出，大大减少的卷积网络模型中的参数和计算量\upcite{726791,Taigman2014DeepFaceCT,Chen2015LocallyconnectedAC}。虽然轻量卷积在存储和速度上具有优势，但其参数量的减少也导致了其表示能力的下降，损失了一部分模型性能。为此，研究人员提出了动态卷积，旨在不增加网络深度和宽度的情况下来增强模型的表示能力，其思想就是根据输入来动态地生成卷积参数\upcite{Wu2019PayLA,Chen2020DynamicCA}。

\parinterval 在轻量卷积中，模型使用的卷积参数是静态的，与序列位置无关， 维度大小为$m\times k$；而在动态卷积中，为了增强模型的表示能力，卷积参数来自于当前位置输入的变换，具体如下：
\begin{eqnarray}
\funp{f} (\mathbi{X}_i) = \sum_{c=1}^d \mathbi{W}_{:.:.c}\mathbi{X}_{i,c}
\label{eq:11-15}
\end{eqnarray}

\parinterval 这里采用了最简单的线性变换，其中$\mathbi{X}$为二维的序列表示，$i$和$c$分别对应序列中不同的位置以及不同的通道，$\mathbi{W} \in \mathbb{R}^{m \times k \times d}$为变换矩阵，最后生成的$\funp{f} (\mathbi{X}_i)$就是与输入相关的卷积核参数。通过这种方式，模型可以根据不同位置的表示来确定如何关注其他位置信息的“权重”，更好地提取序列信息。同时，相比于注意力机制中两两位置确定出来的注意力权重，动态卷积线性复杂度的做法具有更高的计算效率。










