\parinterval 人工神经网络的第一个发展阶段是在二十世纪40年代到70年代,这个时期的人工神经网络还停留在利用线性模型模拟生物神经元的阶段,比如使用线性加权函数来描述输入$\mathbf x $和输出$ y $ 之间的联系:$y=x_1\cdot w_1+\dots+ x_n \cdot w_n $。举一个简单例子,输入$\mathbf x $是某个地区的坐标和时间,输出$ y $是该地区的温度,尽管真实的问题可能要复杂的多,但是线性模型确实有能力去拟合简单的函数关系。
\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 $与$ m\times n $的矩阵$\mathbf a $,向量$\mathbf x $左乘矩阵$\mathbf a $,可将向量$\mathbf x $映射为$ 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 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},比如下式中的几种情况都可以看作是深度学习中定义数据的张量:
\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},比如下式中的几种情况都可以看作是深度学习中定义数据的张量:
\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 从我们的物理世界看,如果一个物理量在物体的某个位置上只是一个单值,那么它是一个标量,例如密度;如果一个物理量在同一个位置、从多个方向上看,有不同的值,那么这个物理量就是一个张量,比如物理学中常用的应力的描述就是一个典型的张量。举一个简单的例子:$\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 将矩阵乘法扩展到高阶张量中:一个张量$\mathbf x $若要与矩阵$\mathbf w $做矩阵乘法,则$\mathbf x $的第一维度需要与$\mathbf w $的行数大小相等,即:若张量$\mathbf x $的形状为$\cdot\times n $,$\mathbf w $须为$ n\times\cdot$的矩阵。如下是一个例子:
\parinterval 将矩阵乘法扩展到高阶张量中:一个张量$\mathbf x $若要与矩阵$\mathbf w $做矩阵乘法,则$\mathbf x $的最后一维度需要与$\mathbf w $的行数大小相等,即:若张量$\mathbf x $的形状为$\cdot\times n $,$\mathbf w $须为$ n\times\cdot$的矩阵。如下是一个例子:
\item$\mathbf s+\mathbf b $中的单元加就是对张量中的每个位置都进行加法。在本例中$\mathbf s $是形状为$(1:4,1:4,1:2)$的3阶张量,而$\mathbf b $是含有4个元素的向量,在形状不同的情况下是怎样进行单元加的呢?在这里需要引入{\small\sffamily\bfseries{广播机制}}\index{广播机制}:如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失或长度为1的维度上进行,它是深度学习框架中常用的计算方式。来看一个具体的例子,如图\ref{fig:5-28}所示,$\mathbf s $是一个$2\times4$的矩阵而$\mathbf b $是一个长度为4的向量,这两者进行单元加运算时,广播机制会将$\mathbf b $沿第一个维度复制后,再与$\mathbf s $做加法运算。
\item$\mathbf s+\mathbf b $中的单元加就是对张量中的每个位置都进行加法。在上例中$\mathbf s $是形状为$(1:4,1:4,1:2)$的3阶张量,而$\mathbf b $是含有4个元素的向量,在形状不同的情况下是怎样进行单元加的呢?在这里需要引入{\small\sffamily\bfseries{广播机制}}\index{广播机制}:如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失或长度为1的维度上进行,它是深度学习框架中常用的计算方式。来看一个具体的例子,如图\ref{fig:5-28}所示,$\mathbf s $是一个$2\times4$的矩阵而$\mathbf b $是一个长度为4的向量,这两者进行单元加运算时,广播机制会将$\mathbf b $沿第一个维度复制后,再与$\mathbf s $做加法运算。
\parinterval 梯度下降法是一种常用的优化方法,非常适用于目标函数可微分的问题。它基本思想是,给定函数上的第一个点,可以找到使函数值变化最大的方向,然后前进一``步'',这样模型就可以朝着更大(或更小)的函数值以最快的速度移动\footnote{梯度下降的一种实现是{\scriptsize\bfnew{最速下降}}(Steepest Descent)。该方法的每一步移动都选取合适的步长,进而使目标函数能得到最大程度的增长(或下降)。}。具体来说,梯度下降通过迭代更新参数$\mathbf w $,不断沿着梯度的反方向让参数$\mathbf w $朝着损失函数更小的方向移动:如果$ J(\mathbf w)$对$\mathbf w $可微分,则$\frac{\partial J(\mathbf w)}{\partial\mathbf w}$将指向$ J(\mathbf w)$在$\mathbf w $处变化最大的方向,这里将其称之为梯度方向。$\mathbf w $沿着梯度方向更新,新的$\mathbf w $可以使函数更接近极值,其过程如图\ref{fig:5-43}所示。
\parinterval 梯度下降法是一种常用的优化方法,非常适用于目标函数可微分的问题。它的基本思想是:给定函数上的第一个点,找到使函数值变化最大的方向,然后前进一``步'',这样模型就可以朝着更大(或更小)的函数值以最快的速度移动\footnote{梯度下降的一种实现是{\scriptsize\bfnew{最速下降}}(Steepest Descent)。该方法的每一步移动都选取合适的步长,进而使目标函数能得到最大程度的增长(或下降)。}。具体来说,梯度下降通过迭代更新参数$\mathbf w $,不断沿着梯度的反方向让参数$\mathbf w $朝着损失函数更小的方向移动:如果$ J(\mathbf w)$对$\mathbf w $可微分,则$\frac{\partial J(\mathbf w)}{\partial\mathbf w}$将指向$ J(\mathbf w)$在$\mathbf w $处变化最大的方向,这里将其称之为梯度方向。$\mathbf w $沿着梯度方向更新,新的$\mathbf w $可以使函数更接近极值,其过程如图\ref{fig:5-43}所示。
\parinterval 这里新出现了变量$ z $,它保存了以前的所有梯度值的平方和,在更新参数时,通过乘以$\frac{1}{\sqrt{z_t}}$ ,就可以调整学习的尺度。这意味着,变动较大(被大幅更新)的参数的学习率将变小。也就是说,可以按参数的元素进行学习率衰减,使变动大的参数的学习率逐渐减小。
\parinterval 这里新出现了变量$ z $,它保存了以前的所有梯度值的平方和,在更新参数时,通过乘以$\frac{1}{\sqrt{z_t}}$ ,就可以调整学习的尺度。这意味着,变动较大(被大幅度更新)的参数的学习率将变小。也就是说,可以按参数的元素进行学习率衰减,使变动大的参数的学习率逐渐减小。