\parinterval{\small\sffamily\bfseries{标量}}\index{标量}(Scalar)\index{Scalar}:标量亦称``无向量'',是一种只具有数值大小而没有方向的量,通俗地说,一个标量就是一个单独的数,这里特指实数\footnote{严格意义上,标量可以是复数等其他形式。这里为了方便讨论,仅以实数为对象。}。一般用小写斜体表示标量。比如,对于$ a=5$,$ a $就是一个标量。
\parinterval{\small\sffamily\bfseries{向量}}\index{向量}(Vector)\index{Vector}:向量是由一组实数组成的有序数组。与标量不同,向量既有大小也有方向。可以把向量看作空间中的点,每个元素是不同坐标轴上的坐标。公式\ref{eq:5-1}和公式\ref{eq:5-2}展示了一个行向量和一个列向量。本章默认使用行向量,如$\mathbf a=(a_1, a_2, a_3)$,$\mathbf a $对应的列向量记为$\mathbf a^{\rm T}$。
\begin{eqnarray}
\mathbf a &=&\begin{pmatrix}
1 & 2 & 5 & 7
\end{pmatrix}\label{eq:5-1}\\
\end{pmatrix}\label{eq:5-1}\\\nonumber\\
\mathbf{a^{\textrm{T}}}&=&\begin{pmatrix}
&1&\\
&2&\\
...
...
@@ -225,7 +226,7 @@
\label{eq:5-2}
\end{eqnarray}
\parinterval{\small\sffamily\bfseries{矩阵}}\index{矩阵}(Matrix)\index{Matrix}:矩阵是一个按照长方阵列排列的实数集合,最早来自于方程组的系数及常数所构成的方阵。在计算机领域,通常将矩阵看作二维数组。我们用粗体的符号$\mathbf a $表示一个矩阵,如果该矩阵有$ m $行$ n $列,那么有$\mathbf a\in R^{m\times n}$。这里,用不加粗的符号来表示矩阵中的元素,其中每个元素都被一个行索引和一个列索引所确定。例如,$ a_{ij}$表示第$ i $行、第$ j $列的矩阵元素。如下,$\mathbf a $就定义了一个2行2列的矩阵。
\parinterval{\small\sffamily\bfseries{矩阵}}\index{矩阵}(Matrix)\index{Matrix}:矩阵是一个按照长方阵列排列的实数集合,最早来自于方程组的系数及常数所构成的方阵。在计算机领域,通常将矩阵看作二维数组。我们用粗体的符号$\mathbf a $表示一个矩阵,如果该矩阵有$ m $行$ n $列,那么有$\mathbf a\in R^{m\times n}$。这里,用不加粗的符号来表示矩阵中的元素,其中每个元素都被一个行索引和一个列索引所确定。例如,$ a_{ij}$表示第$ i $行、第$ j $列的矩阵元素。如下,公式\ref{eq:5-3}中$\mathbf a $定义了一个2行2列的矩阵。
\begin{eqnarray}
\mathbf a & = &\begin{pmatrix}
a_{11}& a_{12}\\
...
...
@@ -246,7 +247,7 @@
\parinterval{\small\sffamily\bfseries{转置}}\index{转置}(Transpose)\index{Transpose}是矩阵的重要操作之一。矩阵的转置可以看作是将矩阵以对角线为镜像进行翻转:假设$\mathbf a $为$ m $行$ n $列的矩阵,第$ i $行、第$ j $ 列的元素是$ a_{ij}$,即:$\mathbf a={(a_{ij})}_{m\times n}$,把$ m\times n $矩阵$\mathbf a $的行换成同序数的列得到一个$ n\times m $矩阵,则得到$\mathbf a $的转置矩阵,记为$\mathbf a^{\rm T}$,其中$ a_{ji}^{\rm T}=a_{ij}$。例如:
\parinterval 矩阵乘法是矩阵运算中最重要的操作之一,为了与矩阵点乘区分,通常也把矩阵乘法叫做矩阵的叉乘。假设$\mathbf a $为$ m\times p $的矩阵,$\mathbf b $为$ p\times n $的矩阵,对$\mathbf a $和$\mathbf b $作矩阵乘法的结果是一个$ m\times n $的矩阵$\mathbf c $,其中矩阵$\mathbf c $中第$ i $行、第$ j $列的元素可以表示为:
\parinterval 矩阵乘法是矩阵运算中最重要的操作之一,为了与矩阵点乘区分,通常也把矩阵乘法叫做矩阵叉乘。假设$\mathbf a $为$ m\times p $的矩阵,$\mathbf b $为$ p\times n $的矩阵,对$\mathbf a $和$\mathbf b $作矩阵乘法的结果是一个$ m\times n $的矩阵$\mathbf c $,其中矩阵$\mathbf c $中第$ i $行、第$ j $列的元素可以表示为:
\parinterval 利用矩阵$\mathbf a\in R^{m\times n}$,可以实现两个有限维欧氏空间的映射函数$f:R^n\rightarrow R^m$。例如$ n $维列向量$\mathbf x ^{\rm T}$与$ m\times n $的矩阵$\mathbf a $,向量$\mathbf x ^{\rm T}$左乘矩阵$\mathbf a $,可将向量$\mathbf x ^{\rm T}$映射为$ m $列向量,对于:
\parinterval 利用矩阵$\mathbf a\in R^{m\times n}$,可以实现两个有限维欧氏空间的映射函数$f:R^n\rightarrow R^m$。例如$ n $维列向量$\mathbf x ^{\rm T}$与$ m\times n $的矩阵$\mathbf a $,向量$\mathbf x ^{\rm T}$左乘矩阵$\mathbf a $,可将向量$\mathbf x ^{\rm T}$映射为$ m $列向量,对于
\parinterval 公式$\mathbf x\cdot\mathbf w+\mathbf b $中的公式中的$\mathbf b $相当于对其进行平移变换。其过程如图\ref{fig:5-13}所示,偏置矩阵$\mathbf b=\begin{pmatrix}0.5&0&0\\0&0&0\\0&0&0\end{pmatrix}$将矩形区域沿x轴向右平移了一段距离。
\parinterval 那激活函数又是什么?神经元在接收到经过线性变换的结果后,通过激活函数的处理,得到最终的输出$\mathbf y $。激活函数的目的是解决实际问题中的非线性变换,线性变换只能拟合直线,而激活函数的加入,使神经网络具有了拟合曲线的能力。 特别是在实际问题中,很多现象都无法用简单的线性关系描述,这时激活函数的非线性就为描述更加复杂的问题提供了工具。常见的非线性函数有Sigmoid、ReLU、Tanh等。如图\ref{fig:5-15}列举了几种激活函数的形式。
\vspace{-0.5em}
\parinterval 那激活函数又是什么?神经元在接收到经过线性变换的结果后,通过激活函数的处理,得到最终的输出$\mathbf y $。激活函数的目的是解决实际问题中的非线性变换,线性变换只能拟合直线,而激活函数的加入,使神经网络具有了拟合曲线的能力。 特别是在实际问题中,很多现象都无法用简单的线性关系描述,这时激活函数的非线性就为描述更加复杂的问题提供了工具。常见的非线性函数有Sigmoid、ReLU、Tanh等。如图\ref{fig:5-15}列举了几种激活函数的形式。\\
\parinterval 对于神经网络中的某层神经元$\mathbf y=f(\mathbf x\cdot\mathbf w+\mathbf b)$,其中$\mathbf w $是权重矩阵,例如$\begin{pmatrix}1&2\\3&4\end{pmatrix}$,$\mathbf b $ 是偏置向量,例如$(1,3)$。在这里,输入$\mathbf x $和输出$\mathbf y $,可以不是简单的向量或是矩阵形式,而是深度学习中更加通用的数学量\ \dash\ {\small\bfnew{张量}}\index{张量}(Tensor)\index{Tensor},比如下式中的几种情况都可以看作是深度学习中定义数据的张量:
\noindent 其中,$ u $为$ v_i $的同型向量,$ c $为任意实数。这个性质非常重要,根据这个性质可以推导出张量的其他定义。
\noindent 其中,$ u $为与$ v_i $形状相同的向量,$ c $为任意实数。这个性质非常重要,根据这个性质可以推导出张量的其他定义。
\parinterval 从我们的物理世界看,如果一个物理量在物体的某个位置上只是一个单值,那么它是一个标量,例如密度;如果一个物理量在同一个位置、从多个方向上看,有不同的值,那么这个物理量就是一个张量,比如物理学中常用的应力的描述就是一个典型的张量。举一个简单的例子:$\mathbf T(\mathbf v,\mathbf u)$是一个三维空间$(\textrm{x},\textrm{y},\textrm{z})$上的2阶张量,其中$\mathbf v $和$\mathbf u $ 是两个向量,如图\ref{fig:5-26}所示,向量$\mathbf v $在某个两两垂直的三维坐标系中可以表示为${(\begin{array}{ccc} a & b & c\end{array})}^{\rm T}$,同理向量$\mathbf u $在某个两两垂直的三维坐标系中可以表示为${(\begin{array}{ccc} a' & b' & c' \end{array})}^{\rm T}$。但在三维空间$(\textrm{x},\textrm{y},\textrm{z})$中,向量$\mathbf v $和向量$\mathbf u $分别被表示为${(\begin{array}{ccc} v_x & v_y & v_z\end{array})}^{\rm T}$和${(\begin{array}{ccc} u_x & u_y & u_z\end{array})}^{\rm T}$。
\parinterval 下面用几个实例来说明搭建神经网络的过程。注意,搭建神经网络的过程本质上就是定义前向计算的过程。首先构造一个单层神经网络。如图\ref{fig:5-39}所示,简单的定义输入、权重和偏置后,定义激活函数为Sigmoid函数,输入$\mathbf x $经过线性变换和激活函数,得到输出$\mathbf y $。
\parinterval 下面用几个实例来说明搭建神经网络的过程。搭建神经网络的过程本质上就是定义前向计算的过程。首先构造一个单层神经网络。如图\ref{fig:5-39}(a)所示,简单的定义输入、权重和偏置后,定义激活函数为Sigmoid函数,输入$\mathbf x $经过线性变换和激活函数,得到输出$\mathbf y $。
\parinterval 图\ref{fig:5-39}(b)是一个构造三层神经网络的程序示例。在第一层中,$\mathbf x $作为输入,$\mathbf h1$作为输出,其中$\mathbf h1={\rm{Sigmoid}}(\mathbf x\cdot\mathbf w1+\mathbf b1)$。在第二层中,$\mathbf h1$作为输入,$\mathbf h2$作为输出,其中$\mathbf h2={\rm{Tanh}}(\mathbf h1\cdot\mathbf w2)$。在第三层中,$\mathbf h2$作为输入,$\mathbf y $作为输出,其中$\mathbf y={\rm{ReLU}}(\mathbf h2\cdot\mathbf w3)$。$\mathbf y $也会作为整个神经网络的输出。
%----------------------------------------------
\begin{figure}[htp]
\centering
\input{./Chapter5/Figures/fig-code-niutensor-one}
\caption{构建单层神经网络的示例}
\caption{构建神经网络的程序示例}
\label{fig:5-39}
\end{figure}
%-------------------------------------------
\parinterval 图\ref{fig:5-40}是一个构造三层神经网络的程序示例。在第一层中,$\mathbf x $作为输入,$\mathbf h1$作为输出,其中$\mathbf h1={\rm{Sigmoid}}(\mathbf x\cdot\mathbf w1+\mathbf b1)$。在第二层中,$\mathbf h1$作为输入,$\mathbf h2$作为输出,其中$\mathbf h2={\rm{Tanh}}(\mathbf h1\cdot\mathbf w2)$。在第三层中,$\mathbf h2$作为输入,$\mathbf y $作为输出,其中$\mathbf y={\rm{ReLU}}(\mathbf h2\cdot\mathbf w3)$。$\mathbf y $也会作为整个神经网络的输出。
\parinterval 图\ref{fig:6-5}是一个应用编码器-解码器结构来解决机器翻译问题的简单实例。给定一个中文句子``我\ 对\ 你\ 感到\ 满意'',编码器会将这句话编码成一个实数向量(0.2,-1,6,5,0.7,-2),这个向量就是源语言句子的``表示''结果。虽然有些不可思议,但是神经机器翻译模型把这个向量等同于输入序列。向量中的数字并没有实际的意义,然而解码器却能从中提取到源语句子中所包含的信息。也有研究者把向量的每一个维度看作是一个``特征'',这样源语言句子就被表示成多个``特征''的联合,而且这些特征可以被自动学习。有了这样的源语言句子的``表示'',解码器可以把这个实数向量作为输入,然后逐词生成目标语句子``I am satisfied with you''。
\parinterval 公式\ref{eq:6-30}展示了最基本的优化策略,也被称为标准的SGD优化器。实际上,训练神经机器翻译模型时,还有非常多的优化器可以选择,在第五章也有详细介绍,这里考虑Adam优化器。 Adam 通过对梯度的{\small\bfnew{一阶矩估计}}\index{一阶矩估计}(First Moment Estimation)\index{First Moment Estimation}和{\small\bfnew{二阶矩估计}}\index{二阶矩估计}(Second Moment Estimation)\index{Second Moment Estimation}进行综合考虑,计算出更新步长。
\parbox{36em}{During Soviet times, if a city’s population topped one million, it would become eligible for its own metro. Planners wanted to brighten the lives of everyday Soviet citizens, and saw the metros, with their tens of thousands of daily passengers, as a singular opportunity to do so. In 1977, Tashkent, the capital of Uzbekistan, became the seventh Soviet city to have a metro built. Grand themes celebrating the history of Uzbekistan and the Soviet Union were brought to life, as art was commissioned and designers set to work. The stations reflected different themes, some with domed ceilings and painted tiles reminiscent of Uzbekistan’s Silk Road mosques, while others ...}
\end{tabular}
};
%译文1--------------mt1
\node[font=\small] (mt1) at ([xshift=0em,yshift=-9.1em]original0.south) {译文1:};
\node[font=\small] (ts1) at ([xshift=0em,yshift=-4em]original1.south) {
\parinterval 回译方法的一个问题是:反向翻译模型的训练只依赖于有限的双语数据,生成的源语言端伪数据的质量难以保证。为此,可以采用{\small\bfnew{迭代式回译}}\index{迭代式回译}(Iterative Back Translation)\index{Iterative Back Translation}的方法,同时利用源语端和目标语端的单语数据,不断通过回译的方式来提升前向和反向翻译模型的性能。图\ref{fig:7-36}展示了迭代式回译的框架。首先使用双语数据训练一个前向翻译模型,然后利用源语言单语数据通过回译的方式来提升反向翻译模型的性能,最后由反向翻译模型和目标端单语数据生成的伪数据来提升前向翻译模型的性能。可以看出,这个往复的过程是闭环的,因此可以一直进行下去,直到两个翻译模型的性能不再提升。
\parinterval 回译方法的一个问题是:反向翻译模型的训练只依赖于有限的双语数据,生成的源语言端伪数据的质量难以保证。为此,可以采用{\small\bfnew{迭代式回译}}\index{迭代式回译}(Iterative Back Translation)\index{Iterative Back Translation}的方法,同时利用源语端和目标语端的单语数据,不断通过回译的方式来提升前向和反向翻译模型的性能。图\ref{fig:7-37}展示了迭代式回译的框架。首先使用双语数据训练一个前向翻译模型,然后利用源语言单语数据通过回译的方式来提升反向翻译模型的性能,最后由反向翻译模型和目标端单语数据生成的伪数据来提升前向翻译模型的性能。可以看出,这个往复的过程是闭环的,因此可以一直进行下去,直到两个翻译模型的性能不再提升。