Commit 19043049 by xiaotong

minor updates of the outline

parent a2910ddf
......@@ -29,3 +29,4 @@ Book/mt-book-xelatex.bcf
Book/mt-book-xelatex.idx
Book/mt-book-xelatex.run.xml
Book/mt-book-xelatex.synctex(busy)
Book/mt-book-xelatex.pdf
......@@ -578,7 +578,7 @@ His house is on the south bank of the river.
\parinterval 《统计自然语言处理》\cite{宗成庆2013统计自然语言处理}由中国科学院自动化所宗成庆教授所著,其中全面介绍了统计自然语言处理的基本概念、理论方法和最新研究进展,既有对基础知识和理论模型的介绍,也有对相关问题的研究背景、实现方法和技术现状的详细阐述。可供从事自然语言处理、机器翻译等研究的相关人员参考。
\parinterval Ian Goodfellow、Yoshua Bengio,Aaron Courville三位机器学习领域的学者所写的《深度学习》\cite{HeatonIan}也是值得一读的参考书。其讲解了有关深度学习常用的方法,其中很多都会在深度学习模型设计和使用中用到。同时在《深度学习》应用一章中也简单讲解了神经机器翻译的任务定义和发展过程。
\parinterval Ian Goodfellow、Yoshua Bengio,Aaron Courville三位机器学习领域的学者所写的《Deep Learning》\cite{HeatonIan}也是值得一读的参考书。其讲解了有关深度学习常用的方法,其中很多都会在深度学习模型设计和使用中用到。同时在《Deep Learning》应用一章中也简单讲解了神经机器翻译的任务定义和发展过程。
\parinterval 《Neural Network Methods in Natural Language Processing》\cite{Goldberg2017Neural}是Yoav Goldberg编写的面向自然语言处理的深度学习参考书。相比《深度学习》,该书聚焦在自然语言处理中的深度学习方法,内容更加易读。
......
......@@ -144,7 +144,7 @@ NMT & $ 21.7^{\ast}$ & $18.7^{\ast}$ & -1
SPB & 11.420 & 398 & 3.5 &84.5 \\
NMT & 11.284 & 173 & $1.5^{\ast}$ & $88.3^{\ast}$ \\
\end{tabular}
\end{table}
%--------------------------------------
......@@ -164,7 +164,7 @@ NMT & $ 21.7^{\ast}$ & $18.7^{\ast}$ & -1
&68.6 &Combo-4 \\
2 &62.1 &eference-WMT \\
\end{tabular}
\end{table}
%--------------------------------------
......@@ -186,7 +186,7 @@ NMT & $ 21.7^{\ast}$ & $18.7^{\ast}$ & -1
Layer-Wise Coordination &Xu等 &2018 &29 \\
Transformer-RPR &Shaw等 &2018 &29.2 \\
Transformer-DLCL &Wang等 &2019 &29.3 \\
\end{tabular}
\end{tabular}
\end{table}
%--------------------------------------
......@@ -278,7 +278,7 @@ NMT & $ 21.7^{\ast}$ & $18.7^{\ast}$ & -1
\parinterval 为了对编码器-解码器框架和神经机器翻译的运行过程有一个直观的认识,这里演示一个简单的翻译实例。我们采用标准的循环神经网络作为编码器和解码器的结构。假设系统的输入和输出为:
\begin{example}
\quad
\quad
源语(中文)输入:``我''、``很''、``好''、``<eos>''
......@@ -333,7 +333,7 @@ NMT & $ 21.7^{\ast}$ & $18.7^{\ast}$ & -1
\rule{0pt}{13pt} 传统统计方法 &设计翻译特征 \\
\rule{0pt}{13pt} 神经网络方法 &设计网络架构 \\
\end{tabular}
\end{table}
%--------------------------------------
......@@ -356,9 +356,9 @@ NMT & $ 21.7^{\ast}$ & $18.7^{\ast}$ & -1
\rule{0pt}{16pt} 2014 & Bahdanau等 & Neural Machine Translation by Jointly Learning to Align and Translate \\
\rule{0pt}{16pt} 2014 & Cho等 & On the Properties of Neural Machine Translation \\
\rule{0pt}{16pt} 2015 & Jean等 & On Using Very Large Target Vocabulary for Neural Machine Translation \\
\rule{0pt}{16pt} 2015 & Luong等 & Effective Approches to Attention-based Neural Machine Translation
\rule{0pt}{16pt} 2015 & Luong等 & Effective Approches to Attention-based Neural Machine Translation
\end{tabular}
\end{table}
%--------------------------------------
......@@ -387,7 +387,7 @@ NMT & $ 21.7^{\ast}$ & $18.7^{\ast}$ & -1
中午没吃饭,又刚打了一下午篮球,我现在很饿,我想\underline{\quad \quad \quad}
\end{example}
%\vspace{0.5em}
%\centerline{中午没吃饭,又刚打了一下午篮球,我现在很饿,我想\underline{\quad \quad \quad} 。}
%\centerline{中午没吃饭,又刚打了一下午篮球,我现在很饿,我想\underline{\quad \quad \quad} 。}
%\vspace{0.5em}
\parinterval 显然,根据上下文中提到的``没吃饭''、``很饿'',最佳的答案是``吃 饭''或者``吃 东西''。也就是,对序列中某个位置的答案进行预测时我们需要记忆当前时刻之前的序列信息,因此,循环神经网络(Recurrent Neural Network, RNN)应运而生。实际上循环神经网络有着极为广泛的应用,例如语音识别、语言建模以及我们要介绍的神经机器翻译。
......@@ -452,7 +452,7 @@ NMT & $ 21.7^{\ast}$ & $18.7^{\ast}$ & -1
$\textrm{P}({y_j | \mathbf{s}_{j-1} ,y_{j-1},C})$由softmax实现,softmax的输入是循环神经网络$j$时刻的输出。在具体实现时,$C$可以被简单的作为第一个时刻循环单元的输入,即,当$j=1$时,解码器的循环神经网络会读入编码器最后一个隐层状态$ \mathbf{h}_m$(也就是$C$),而其它时刻的隐层状态不直与$C$相关。最终,$\textrm{P} (y_j | \mathbf{y}_{<j},\mathbf{x})$被表示为:
\begin{equation}
\textrm{P} (y_j | \mathbf{y}_{<j},\mathbf{x}) \equiv
\textrm{P} (y_j | \mathbf{y}_{<j},\mathbf{x}) \equiv
\left \{ \begin{array}{ll}
\textrm{P} (y_j |C ,y_{j-1}) &j=1 \\
\textrm{P} (y_j|\mathbf{s}_{j-1},y_{j-1}) \quad &j>1
......@@ -544,13 +544,13 @@ $\textrm{P}({y_j | \mathbf{s}_{j-1} ,y_{j-1},C})$由softmax实现,softmax的
\end{figure}
%----------------------------------------------
\parinterval 为了进一步理解softmax的计算过程,来看一个简单的例子。假设我们的词表为[吃饭,睡觉,学习],当我们预测下一个译文单词时,我们将循环神经网络的输出通过矩阵$\mathbf{W_o}$映射到词表大小的向量,得到$\mathbf{\tau}=$[-3,1.5,2.7],此时我们使用softmax激活函数将其进行归一化:
\parinterval 为了进一步理解softmax的计算过程,来看一个简单的例子。假设我们的词表为[吃饭,睡觉,学习],当我们预测下一个译文单词时,我们将循环神经网络的输出通过矩阵$\mathbf{W_o}$映射到词表大小的向量,得到$\mathbf{\tau}=$[-3,1.5,2.7],此时我们使用softmax激活函数将其进行归一化:
\begin{equation}
\textrm{softmax}(\mathbf{\tau})=
\left( \begin{array}{c}
\frac{0.05}{0.05+4.48+14.88} \\
\frac{4.48}{0.05+4.48+14.88} \\
\frac{14.88}{0.05+4.48+14.88}
\frac{14.88}{0.05+4.48+14.88}
\end{array} \right)
=
\left( \begin{array}{c}
......@@ -717,7 +717,7 @@ $\textrm{P}({y_j | \mathbf{s}_{j-1} ,y_{j-1},C})$由softmax实现,softmax的
% 图3.10
\begin{figure}[htp]
\centering
\input{./Chapter6/Figures/figure-Double-layer-RNN} \hspace{10em}
\input{./Chapter6/Figures/figure-Double-layer-RNN} \hspace{10em}
\caption{双层循环神经网络}
\label{fig:6-18}
\end{figure}
......@@ -735,7 +735,7 @@ $\textrm{P}({y_j | \mathbf{s}_{j-1} ,y_{j-1},C})$由softmax实现,softmax的
中午没吃饭,又刚打了一下午篮球,我现在很饿,我想\underline{\quad \quad \quad}
\end{example}
%\vspace{0.5em}
%\centerline{中午没吃饭,又刚打了一下午篮球,我现在很饿,我想\underline{\quad \quad \quad} 。 }
%\centerline{中午没吃饭,又刚打了一下午篮球,我现在很饿,我想\underline{\quad \quad \quad} 。 }
%\vspace{0.5em}
\noindent 我们之所以能想到在横线处填``吃饭''、``吃东西''很有可能是因为看到了``没吃饭''、 ``很饿''等关键信息。也就是这些关键的片段对我们预测缺失的单词起着关键性作用。而预测``吃饭''与前文中的``中午“、``又''之间的联系似乎不那么紧密。也就是说,在我们在形成 ``吃饭''的逻辑时,在潜意识里会更注意``没吃饭''、``很饿''等关键信息。也就是我们的关注度并不是均匀的分布在整个句子上的。
......@@ -885,7 +885,7 @@ $\textrm{a}(\cdot)$可以被看作是目标语表示和源语言表示的一种`
\rule{0pt}{16pt} $\textrm{``have''} = \argmax_{y_1}\mathrm{P}(y_1 | {\red \mathbf{C}} , y_0)$ &$\textrm{``have''} = \argmax_{y_1}\mathrm{P}(y_1 | {\red \mathbf{C}_1} , y_0)$ \\
\rule{0pt}{16pt} $\textrm{``you''} = \argmax_{y_2}\mathrm{P}(y_2 | \mathbf{s}_1 , y_1)$ &$\textrm{``you''} = \argmax_{y_2}\mathrm{P}(y_2 | \mathbf{s}_1, {\red \mathbf{C}_2} , y_1)$ \\
\end{tabular}
\end{table}
%--------------------------------------
%%%%%%%%%%%%%%%%%%
......@@ -937,7 +937,7 @@ $\textrm{a}(\cdot)$可以被看作是目标语表示和源语言表示的一种`
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{神经机器翻译模型的训练}\index{Chapter6.3.5}
\subsection{训练}\index{Chapter6.3.5}
\parinterval 在第五章中,我们已经介绍了神经网络的训练方法。其中最常用的是基于梯度的方法,即:使用一定量样本进行神经网络的前向计算,之后进行反向计算,并得到所有参数的梯度信息,再使用下面的规则进行参数更新:
\begin{equation}
\mathbf{w}_{step+1} = \mathbf{w}_{step} - \alpha \cdot \frac{\partial L(\mathbf{w}_{step})} {\partial \mathbf{w}_{step} }
......@@ -994,7 +994,7 @@ L(\mathbf{Y},\hat{\mathbf{Y}}) = \sum_{j=1}^n L_{ce}(\mathbf{y}_j,\hat{\mathbf{y
\rule{0pt}{13pt} Adam &一套配置包打天下 &不算差,但没到极限 \\
\rule{0pt}{13pt} SGD &换一个任务就得调 &效果杠杠的 \\
\end{tabular}
\end{table}
%--------------------------------------
......@@ -1058,11 +1058,11 @@ L(\mathbf{Y},\hat{\mathbf{Y}}) = \sum_{j=1}^n L_{ce}(\mathbf{y}_j,\hat{\mathbf{y
\rule{0pt}{13pt} 数据并行 &并行度高,理论上有多大的batch就可以有多少个设备并行计算 &模型不能大于当个设备的极限 \\
\rule{0pt}{13pt} 模型并行 &可以对很大的模型进行运算 &只能有限并行,比如多少层就多少个设备 \\
\end{tabular}
\end{table}
%--------------------------------------
\parinterval 常用的多设备并行化加速方法有数据并行和模型并行,其优缺点的简单对比如表\ref{tab:adv and disadv between Data parallel and model parallel }所示。数据并行是指把同一个batch的不同样本分到不同设备上进行并行计算。其优点是并行度高,理论上有多大的batch就可以有多少个设备并行计算,但模型体积不能大于单个设备容量的极限。而模型并行是指把``模型''切分成若干模块后分配到不同设备上并行计算。其优点是可以对很大的模型进行运算,但只能有限并行,比如我们按层对模型进行分割,那么有多少层就需要多少个设备,同时这两种方法可以一起使用进一步提高神经网络的训练速度。具体来说:
\parinterval 常用的多设备并行化加速方法有数据并行和模型并行,其优缺点的简单对比如表\ref{tab:adv and disadv between Data parallel and model parallel }所示。数据并行是指把同一个batch的不同样本分到不同设备上进行并行计算。其优点是并行度高,理论上有多大的batch就可以有多少个设备并行计算,但模型体积不能大于单个设备容量的极限。而模型并行是指把``模型''切分成若干模块后分配到不同设备上并行计算。其优点是可以对很大的模型进行运算,但只能有限并行,比如我们按层对模型进行分割,那么有多少层就需要多少个设备,同时这两种方法可以一起使用进一步提高神经网络的训练速度。具体来说:
\begin{itemize}
\item 数据并行。如果一台设备能完整放下一个神经机器翻译模型,那么数据并行可以把一个大batch均匀切分成$n$个小batch,然后分发到$n$个设备上并行计算,最后把结果汇总,相当于把运算时间变为原来的${1}/{n}$,数据并行的过程如图\ref{fig:6-29}所示。不过,需要注意的是,多设备并行需要对数据在不同设备间传输,特别是多个GPU的情况,设备间传输的带宽十分有限,设备间传输数据往往会造成额外的时间消耗\cite{Zhang2017Fast}。通常,数据并行的训练速度无法随着设备数量增加呈线性增长。不过这个问题也有很多优秀的解决方案,比如采用多个设备的异步训练,但是这些内容已经超出本章的内容,因此这里不做过多讨论。
......@@ -1096,11 +1096,11 @@ L(\mathbf{Y},\hat{\mathbf{Y}}) = \sum_{j=1}^n L_{ce}(\mathbf{y}_j,\hat{\mathbf{y
\ref{fig:6-30}以三层循环网络为例展示了对句子``你 很 不错 。''进行模型并行的过程。其中,每一层网络都被放到了一个设备上。当模型根据已经生成的第一个词``你''后预测下一个词时(\ref{fig:6-30}(a)),同层的下一个时刻的计算和对``你''的第二层的计算就可以同时开展(\ref{fig:6-30}(b))。以此类推,就完成了模型的并行计算。
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{神经机器翻译模型的推断}\index{Chapter6.3.6}
\subsection{推断}\index{Chapter6.3.6}
\parinterval 神经机器翻译的推断是指:利用已经训练好的模型对新的源语言句子进行翻译的过程。具体来说,首先利用编码器生成源语言句子的表示,之后利用解码器预测目标语译文。也就是,对于源语言句子$\mathbf{x}$,生成一个使翻译概率$\textrm{P}(\mathbf{y} | \mathbf{x})$最大的目标语译文$\hat{\mathbf{y}}$,如下(详细过程见\ref{sec:6.3.1}节):
\begin{eqnarray}
\begin{array}{ll} \hat{\mathbf{y}} &= \argmax_y \textrm{P}(\mathbf{y} | \mathbf{x}) \\
&= \argmax_y \prod_{j=1}^n \textrm{P}(y_j | \mathbf{y}_{<j},\mathbf{x})
&= \argmax_y \prod_{j=1}^n \textrm{P}(y_j | \mathbf{y}_{<j},\mathbf{x})
\end{array}
\label{eqC6.33}
\end{eqnarray}
......@@ -1114,7 +1114,7 @@ L(\mathbf{Y},\hat{\mathbf{Y}}) = \sum_{j=1}^n L_{ce}(\mathbf{y}_j,\hat{\mathbf{y
\noindent 其中,$\hat{y}_j$表示位置$j$概率最高的单词,$\hat{\mathbf{y}}_{<j} = \{ \hat{y}_1,...,\hat{y}_{j-1} \}$表示已经生成的最优译文单词序列。也就是,我们把最优的译文看作是所有位置上最优单词的组合。显然,这是一个贪婪的搜索(greedy search),因为我们无法保证$\{ \hat{y}_1,...,\hat{y}_{n} \}$是全局最优解。一种缓解这个问题的方法是,在每步中引入更多的候选。我们定义$\hat{y}_{jk} $表示在目标语第$j$个位置排名在第$k$位的单词。在每一步,我们可以生成$K$个最可能的单词,而不是1个,这个过程可以被描述为
\begin{equation}
\{ \hat{y}_{j1},...,\hat{y}_{jk} \} = \argmax_{ \{ \hat{y}_{j1},...,\hat{y}_{jk} \} }
\{ \hat{y}_{j1},...,\hat{y}_{jk} \} = \argmax_{ \{ \hat{y}_{j1},...,\hat{y}_{jk} \} }
\textrm{P}(y_j | \{ \hat{\mathbf{y}}_{<{j^{\textrm{*}}}} \},\mathbf{x})
\label{eqC6.35}
\end{equation}
......@@ -1235,14 +1235,14 @@ L(\mathbf{Y},\hat{\mathbf{Y}}) = \sum_{j=1}^n L_{ce}(\mathbf{y}_j,\hat{\mathbf{y
\caption{GNMT与当时最优秀的模型}
\label{tab:gnmt vs state-of-the-art models}
\begin{tabular}{l l l l}
\multicolumn{1}{l|}{\multirow{2}{*}{\#}} & \multicolumn{2}{c}{\textbf{BLEU}} & \multirow{2}{*}{\textbf{CPU decoding time}} \\
\multicolumn{1}{l|}{\multirow{2}{*}{\#}} & \multicolumn{2}{c}{\textbf{BLEU}} & \multirow{2}{*}{\textbf{CPU decoding time}} \\
\multicolumn{1}{l|}{} & \textbf{EN-DE} & \textbf{EN-FR} & \\ \hline
\multicolumn{1}{l|}{PBMT} & 20.7 & 37.0 & - \\
\multicolumn{1}{l|}{RNNSearch} & 16.5 & - & - \\
\multicolumn{1}{l|}{LSTM(6 layers)} & - & 31.5 & - \\
\multicolumn{1}{l|}{Deep-Att} & 20.6 & 37.7 & - \\
\multicolumn{1}{l|}{GNMT} & 24.6 & 39.0 & 0.2s per sentence \\
%\multicolumn{4}{l}{GNMT versus previous state-of-the-art models}
%\multicolumn{4}{l}{GNMT versus previous state-of-the-art models}
\end{tabular}
\end{table}
%--------------------------------------
......@@ -1260,13 +1260,13 @@ L(\mathbf{Y},\hat{\mathbf{Y}}) = \sum_{j=1}^n L_{ce}(\mathbf{y}_j,\hat{\mathbf{y
\centering
\caption{ RNN、CNN、Transformer的对比\cite{NIPS2017_7181} }
\label{tab:rnn vs cnn vs trf}
\begin{tabular}{l | l l l}
\begin{tabular}{l | l l l}
%\rule{0pt}{20pt} \textbf{Layer Type} &\parbox{5em}{\textbf{Complexity per Layer} }&\parbox{6em}{\textbf{Sequential Operations} } &\parbox{6em}{\textbf{Maximum Path Length}}\\ \hline
\rule{0pt}{20pt} Layer Type & \begin{tabular}[l]{@{}l@{}}Complexity\\ per Layer\end{tabular} & \begin{tabular}[l]{@{}l@{}}Sequential\\ Operations\end{tabular} & \begin{tabular}[l]{@{}l@{}}Maximum\\ Path Length\end{tabular} \\ \hline
\rule{0pt}{13pt}Self-Attention &$O(n^2\cdot d)$ &$O(1)$ &$O(1)$ \\
\rule{0pt}{13pt}Recurrent &$O(n \cdot d^2)$ &$O(n)$ &$O(n)$ \\
\rule{0pt}{13pt}Convolutional &$O(k\cdot n \cdot d^2)$ &$O(1)$ &$O(\mathrm{log}_k(n))$ \\
\rule{0pt}{13pt}Self-Attention(restricted) &$O(r \cdot n \cdot d)$ &$O(1)$ &$O(n/r)$
\rule{0pt}{13pt}Self-Attention(restricted) &$O(r \cdot n \cdot d)$ &$O(1)$ &$O(n/r)$
\end{tabular}
\end{table}
%--------------------------------------
......@@ -1281,13 +1281,13 @@ L(\mathbf{Y},\hat{\mathbf{Y}}) = \sum_{j=1}^n L_{ce}(\mathbf{y}_j,\hat{\mathbf{y
\label{tab:performence form different models}
\begin{tabular}{l l l l}
\multicolumn{1}{l|}{\multirow{2}{*}{\#}} & \multicolumn{2}{c}{BLEU} & \multirow{2}{*}{\parbox{6em}{Training Cost(FLOPs)}} \\
\multicolumn{1}{l|}{\multirow{2}{*}{\#}} & \multicolumn{2}{c}{BLEU} & \multirow{2}{*}{\parbox{6em}{Training Cost(FLOPs)}} \\
\multicolumn{1}{l|}{} & EN-DE & EN-FR & \\ \hline
\multicolumn{1}{l|}{GNMT+RL} & 24.6 & 39.92 & 1.4$\times 10^{20}$ \\
\multicolumn{1}{l|}{ConvS2S} & 25.16 & 40.46 & 1.5$\times 10^{20}$ \\
\multicolumn{1}{l|}{MoE} & 26.03 & 40.56 & 1.2$\times 10^{20}$ \\
\multicolumn{1}{l|}{Transformer(Big)} & \textbf{28.4} & \textbf{41.8} & 2.3$\times 10^{19}$ \\
%\multicolumn{4}{l}{Transformer versus previous state-of-the-art models}
\multicolumn{1}{l|}{Transformer(Big)} & \textbf{28.4} & \textbf{41.8} & 2.3$\times 10^{19}$ \\
%\multicolumn{4}{l}{Transformer versus previous state-of-the-art models}
\end{tabular}
\end{table}
%--------------------------------------
......@@ -1335,7 +1335,7 @@ L(\mathbf{Y},\hat{\mathbf{Y}}) = \sum_{j=1}^n L_{ce}(\mathbf{y}_j,\hat{\mathbf{y
\parinterval 举个例子,如图\ref{fig:6-36}所示,一个汉语句子包含5个词。这里,我们用$\mathbf{h}$(``你'')表示``你''当前的表示结果。如果把``你''看作目标,这时$\mathrm{query}$就是$\mathbf{h}$(``你''),$\mathrm{key}$$\mathrm{value}$\\是图中所有位置的表示,即:{$\mathbf{h}$(``你'')、$\mathbf{h}$(``什么'')、$\mathbf{h}$(``也'')、$\mathbf{h}$(``没'')、$\mathbf{h}$(``学'')}。在自注意力模型中,首先计算$\mathrm{query}$$\mathrm{key}$的相关度,这里用$\alpha_i$表示$\mathbf{h}$(``你'')和位置$i$的表示之间的相关性。然后,把$\alpha_i$作为权重,对不同位置上的$\mathrm{value}$进行加权求和。最终,得到新的表示结果$\tilde{\mathbf{h}}$ (``你'' ):
\begin{equation}
\tilde{\mathbf{h}} (\textrm{``你''} ) = \alpha_0 {\mathbf{h}} (\textrm{``你''} )
+ \alpha_1 {\mathbf{h}} (\textrm{``什么 ''})
+ \alpha_1 {\mathbf{h}} (\textrm{``什么 ''})
+ \alpha_2 {\mathbf{h}} (\textrm{``也''} )
+ \alpha_3 {\mathbf{h}} (\textrm{``没''} )
+\alpha_4 {\mathbf{h}} (\textrm{``学''} )
......@@ -1363,7 +1363,7 @@ L(\mathbf{Y},\hat{\mathbf{Y}}) = \sum_{j=1}^n L_{ce}(\mathbf{y}_j,\hat{\mathbf{y
\parinterval 以上操作就构成了Transformer的一层,各个模块执行的顺序可以简单描述为:Self-Attention -> Residual Connection -> Layer Normalization -> Feed Forward Network -> Residual Connection -> Layer Normalization。编码器可以包含多个这样的层,比如,我们可以构建一个六层编码器,每层都只执行上面的操作。最上层的结果作为整个编码的结果,会被传入解码器。
\parinterval 解码器的结构与编码器十分类似。它也是由若干层组成,每一层包含编码器中的所有结构,即:自注意力子层、前馈神经网络子层、残差连接和层正则化模块。此外,为了捕捉源语言的信息,解码器又引入了一个额外的\textbf{编码-解码注意力子层}(encoder-decoder attention sub-layer)。这个新的子层,可以帮助模型使用源语言句子的表示信息生成目标语不同位置的表示。编码-解码注意力子层仍然基于自注意力机制,因此它和自注意力子层的结构是相同的,只是$\mathrm{query}$$\mathrm{key}$$\mathrm{value}$的定义不同。比如,在解码端,自注意力子层的$\mathrm{query}$$\mathrm{key}$$\mathrm{value}$是相同的,它们都等于解码端每个位置的表示。而在编码-解码注意力子层中,$\mathrm{query}$是解码端每个位置的表示,而$\mathrm{key}$$\mathrm{value}$是相同的,等于编码端每个位置的表示。图\ref{fig:6-37}给出了这两种不同注意力子层输入的区别。
\parinterval 解码器的结构与编码器十分类似。它也是由若干层组成,每一层包含编码器中的所有结构,即:自注意力子层、前馈神经网络子层、残差连接和层正则化模块。此外,为了捕捉源语言的信息,解码器又引入了一个额外的\textbf{编码-解码注意力子层}(encoder-decoder attention sub-layer)。这个新的子层,可以帮助模型使用源语言句子的表示信息生成目标语不同位置的表示。编码-解码注意力子层仍然基于自注意力机制,因此它和自注意力子层的结构是相同的,只是$\mathrm{query}$$\mathrm{key}$$\mathrm{value}$的定义不同。比如,在解码端,自注意力子层的$\mathrm{query}$$\mathrm{key}$$\mathrm{value}$是相同的,它们都等于解码端每个位置的表示。而在编码-解码注意力子层中,$\mathrm{query}$是解码端每个位置的表示,而$\mathrm{key}$$\mathrm{value}$是相同的,等于编码端每个位置的表示。图\ref{fig:6-37}给出了这两种不同注意力子层输入的区别。
%----------------------------------------------
% 图3.30
......@@ -1429,7 +1429,7 @@ L(\mathbf{Y},\hat{\mathbf{Y}}) = \sum_{j=1}^n L_{ce}(\mathbf{y}_j,\hat{\mathbf{y
\label{eqC6.42}
\end{equation}
\noindent 式中PE($\cdot$)表示位置编码的函数,$pos$表示单词的位置,$i$代表位置编码向量中的第几维。因为,正余弦函数的编码各占一半,因此当位置编码的维度为512时,$i$的范围是0-255。在Transformer中,位置编码的维度和词嵌入向量的维度相同,模型通过将二者相加作为模型输入,如图\ref{fig:6-41}所示。
\noindent 式中PE($\cdot$)表示位置编码的函数,$pos$表示单词的位置,$i$代表位置编码向量中的第几维。因为,正余弦函数的编码各占一半,因此当位置编码的维度为512时,$i$的范围是0-255。在Transformer中,位置编码的维度和词嵌入向量的维度相同,模型通过将二者相加作为模型输入,如图\ref{fig:6-41}所示。
%----------------------------------------------
% 图3.10
......@@ -1562,7 +1562,7 @@ L(\mathbf{Y},\hat{\mathbf{Y}}) = \sum_{j=1}^n L_{ce}(\mathbf{y}_j,\hat{\mathbf{y
%-------------------------------------------------------
\begin{eqnarray}
\begin{array}{ll}
\textrm{MultiHead}&(\mathbf{Q}, \mathbf{K} , \mathbf{V}) =
\textrm{MultiHead}&(\mathbf{Q}, \mathbf{K} , \mathbf{V}) =
\textrm{Concat} (\mathbf{head}_1, ... , \mathbf{head}_h ) \mathbf{W}^o \\
&\textrm{where} \mathbf{head}_i =\textrm{Attention} (\mathbf{Q}\mathbf{W}_i^Q ,
\mathbf{K}\mathbf{W}_i^K , \mathbf{V}\mathbf{W}_i^V )
......@@ -1649,7 +1649,7 @@ x_{l+1} = x_l + \digamma (x_l)
\noindent 其中,$\mathbf{W}_1$$\mathbf{W}_2$$\mathbf{b}_1$$\mathbf{b}_2$为模型的参数。通常情况下,前馈神经网络的隐层维度要比注意力部分的隐层维度大,比如,注意力部分的隐层维度为512,前馈神经网络部分的隐层维度为2048。当然,继续增大前馈神经网络的隐层大小,比如设为4096,甚至8192,还可以带来性能的增益,但是前馈部分的存储消耗较大,需要更大规模GPU设备的支持。因此在具体实现时,往往需要在翻译准确性和存储/速度之间找到一个平衡。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Transformer的训练}\index{Chapter6.4.9}
\subsection{训练}\index{Chapter6.4.9}
\parinterval 与前面介绍的神经机器翻译模型的训练一样,Transformer的训练流程为:首先对模型进行初始化,然后在编码器输入包含结束符的源语言单词序列。前面已经介绍过,解码端每个位置单词的预测都要依赖已经生成的序列。我们在解码端输入包含起始符号的目标语序列,通过起始符号预测目标语的第一个单词,用真实的目标语第一个单词去预测第二个单词,以此类推,然后用真实的目标语序列和预测的结果比较,计算它的损失。损失越小说明模型的预测越接近真实输出。然后利用反向传播来调整模型中的参数。Transformer使用了交叉熵损失函数(Cross Entropy Loss),如图\ref{fig:6-51}。由于Transformer将任意时刻输入信息之间的距离拉近为1,摒弃了RNN中每一个时刻的计算都要基于前一时刻的计算这种具有时序性的训练方式,因此Transformer中训练的不同位置可以并行化训练,大大提高了训练效率。
%----------------------------------------------
......@@ -1707,7 +1707,7 @@ lrate = d_{model}^{-0.5} \cdot \textrm{min} (step^{-0.5} , step \cdot warmup\_st
\item 标签平滑(Label Smoothing):在计算损失的过程中,需要用预测概率去拟合真实概率。在分类任务中,往往使用one-hot向量代表真实概率,即真实答案位置那一维对应的概率为1,其余维为0,而拟合这种概率分布会造成两个问题:1)无法保证模型的泛化能力,容易造成过拟合;2) 1和0概率鼓励所属类别和其它类别之间的差距尽可能加大,会造成模型过于相信预测的类别。因此Transformer里引入标签平滑\cite{Szegedy_2016_CVPR}来缓解这种现象,简单的说就是给正确答案以外的类别分配一定的概率,而不是采用非0即1的概率。这样,可以学习一个比较平滑的概率分布,从而提升泛化能力,防止过拟合。\\
\end{itemize}
\parinterval 不同的Transformer可以适应不同的任务,常见的Transformer模型有Transformer Base、Transformer Big和Transformer Deep\cite{NIPS2017_7181}\cite{WangLearning},具体设置如下:
\parinterval 不同的Transformer可以适应不同的任务,常见的Transformer模型有Transformer Base、Transformer Big和Transformer Deep\cite{NIPS2017_7181}\cite{WangLearning},具体设置如下:
\begin{itemize}
\item Transformer Base:标准的Transformer结构,解码器编码器均包含6层,隐层维度为512,前馈神经网络维度为2048,多头注意力机制为8头,Dropout设为0.1。
......@@ -1739,7 +1739,7 @@ Transformer Deep(48层) & 30.2 & 43.1 & 194$\times 10^{6}$
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Transformer的推断}\index{Chapter6.4.10}
\subsection{推断}\index{Chapter6.4.10}
\parinterval Transformer解码器生成目标语的过程和前面介绍的循环网络翻译模型类似,都是从左往右生成,且下一个单词的预测依赖已经生成的上一个单词。其具体推断过程如图\ref{fig:6-54}所示,其中$\mathbf{C}_i$是编解码注意力的结果,解码器首先根据``<eos>''和$\mathbf{C}_1$生成第一个单词``how'',然后根据``how''和$\mathbf{C}_2$生成第二个单词``are'',以此类推,当解码器生成``<eos>''时结束推断。
\parinterval 但是,Transformer在推断阶段无法对所有位置进行并行化操作,因为对于每一个目标语单词都需要对前面所有单词进行注意力操作,因此它推断速度非常慢。可以采用的加速手段有:低精度\cite{DBLP:journals/corr/CourbariauxB16}、Cache(缓存需要重复计算的变量)\cite{DBLP:journals/corr/abs-1805-00631}、共享注意力网络等\cite{Xiao2019SharingAW}
......@@ -1878,7 +1878,7 @@ c(0|\mathbf{s},\mathbf{t}) = \sum_{\mathbf{a}}(\textrm{p}_{\theta}(\mathbf{s},\m
c(1|\mathbf{s},\mathbf{t}) = \sum_{\mathbf{a}}(\textrm{p}_{\theta}(\mathbf{s},\mathbf{a}|\mathbf{t}) \times \varphi_0)
\label{eq:1.6}
\end{eqnarray}
%----------------------------------------------
%----------------------------------------------
\parinterval 进一步,
\begin{eqnarray}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论