\item 从几何角度上看,公式中的$\mathbf x\cdot\mathbf w+\mathbf b $将$\mathbf x $右乘$\mathbf w $相当于对$\mathbf x $进行旋转变换,如图\ref{fig:rotation}所示,对三个点$(0,0)$,$(0,1)$,$(1,0)$及其围成的矩形区域右乘如下矩阵:
\parinterval 首先构造一个单层神经网络。如图\ref{fig:code-niutensor-one}所示,简单的定义输入、权重和偏置后,定义激活函数为Sigmoid函数,输入$\mathbf x $经过线性变换和激活函数,得到输出。
\parinterval 下面用几个实例来说明搭建神经网络的过程。注意,搭建神经网络的过程本质上就是定义前向计算的过程。首先构造一个单层神经网络。如图\ref{fig:code-niutensor-one}所示,简单的定义输入、权重和偏置后,定义激活函数为Sigmoid函数,输入$\mathbf x $经过线性变换和激活函数,得到输出$\mathbf y $。
%----------------------------------------------
% 图
\begin{figure}[htp]
\centering
\input{./Chapter5/Figures/fig-code-niutensor-one}
\caption{使用NiuTensor搭建单层神经网络}
\caption{构建单层神经网络的示例}
\label{fig:code-niutensor-one}
\end{figure}
%-------------------------------------------
\parinterval 如图\ref{fig:code-niutensor-three}是使用NiuTensor构造三层神经网络的程序示例,首先定义输入和各层的权重、偏置,随后定义神经网络中各层的实现细节,在第一层中,$\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)$。
\parinterval 如图\ref{fig:code-niutensor-three}是一个构造三层神经网络的程序示例。在第一层中,$\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 参数优化的核心问题是:找到使代价函数$ J(\mathbf w)$达到最小的$\mathbf w $。然而$ J(\mathbf w)$可能会包含大量的参数,比如,基于神经网络的机器翻译模型的参数量可能会超过一亿个。这时不可能用手动方法进行调参。为了实现高效的参数优化,比较常用的手段是使用梯度下降方法(Gradient Descent Method)。
\parinterval 参数优化的核心问题是:找到使代价函数$ J(\mathbf w)$达到最小的$\mathbf w $。然而$ J(\mathbf w)$可能会包含大量的参数,比如,基于神经网络的机器翻译模型的参数量可能会超过一亿个。这时不可能用手动方法进行调参。为了实现高效的参数优化,比较常用的手段是使用{\small\bfnew{梯度下降方法}}(Gradient Descent Method)。
%--5.4.2.1梯度下降---------------------
\subsubsection{(一)梯度下降}\index{Chapter5.4.2.1}
\subsubsection{梯度下降}\index{Chapter5.4.2.1}
\parinterval 梯度下降法是一种常用的优化方法,非常适用于目标函数可微分的问题。它基本思想是,给定函数上的第一个点,可以找到使函数值变化最大的方向,然后前进一``步'',这样模型就可以朝着更大(或更小)的函数值以最快的速度移动\footnote{梯度下降的一种实现是最速下降(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:gradient-descent}所示。
\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:gradient-descent}所示。
@@ -1362,20 +1360,20 @@ J(\mathbf w)&=&\frac{1}{m}\sum_{j=i}^{j+m-1}{L(\mathbf x_i,\mathbf {\widetilde y
\parinterval 数值微分根据导数的原始定义完成,根据公式可知,要得到损失函数在某个参数状态$\mathbf w $下的梯度,可以将$\mathbf w $增大或减小一点($\Delta\mathbf w $),例如,取$\Delta\mathbf w=0.0001$,之后观测损失函数的变化与$\Delta\mathbf w $的比值。$\Delta\mathbf w $的取值越小计算的结果越接近导数的真实值,但是对计算的精度要求越高。