\parinterval 同样,人工神经元是人工神经网络的基本单元。在人们的想象中,人工神经元应该与生物神经元类似。但事实上,二者在形态上是有明显差别的。如图\ref{fig:5-4} 是一个典型的人工神经元,其本质是一个形似$ y=f(\mathbf x\cdot\mathbf w+b)$的函数。显而易见,一个神经元主要由$\mathbf x $,$\mathbf w $,$ b $,$ f $四个部分构成。其中$\mathbf x $是一个形如$(x_0,x_1,\dots,x_n)$ 的实数向量,在一个神经元中担任``输入''的角色。$\mathbf w $是一个权重矩阵,其中的每一个元素都对应着一个输入和一个输出,代表着``某输入对某输出的贡献程度'',通常也被理解为神经元连接的{\small\sffamily\bfseries{权重}}\index{权重}(weight)\index{weight}。$ b $被称作偏置,是一个实数。$ f $被称作激活函数,用于对输入向量各项加权和后进行某种变换。可见,一个人工神经元的功能是将输入向量与权重矩阵右乘(做内积)后,加上偏置量,经过一个激活函数得到一个标量结果。
\parinterval 同样,人工神经元是人工神经网络的基本单元。在人们的想象中,人工神经元应该与生物神经元类似。但事实上,二者在形态上是有明显差别的。如图\ref{fig:9-4} 是一个典型的人工神经元,其本质是一个形似$ y=f(\mathbf x\cdot\mathbf w+b)$的函数。显而易见,一个神经元主要由$\mathbf x $,$\mathbf w $,$ b $,$ f $四个部分构成。其中$\mathbf x $是一个形如$(x_0,x_1,\dots,x_n)$ 的实数向量,在一个神经元中担任``输入''的角色。$\mathbf w $是一个权重矩阵,其中的每一个元素都对应着一个输入和一个输出,代表着``某输入对某输出的贡献程度'',通常也被理解为神经元连接的{\small\sffamily\bfseries{权重}}\index{权重}(weight)\index{weight}。$ b $被称作偏置,是一个实数。$ f $被称作激活函数,用于对输入向量各项加权和后进行某种变换。可见,一个人工神经元的功能是将输入向量与权重矩阵右乘(做内积)后,加上偏置量,经过一个激活函数得到一个标量结果。
这样,矩形区域由第一象限旋转90度到了第四象限,如图\ref{fig:5-13}第一步所示。公式$\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轴向右平移了一段距离。
这样,矩形区域由第一象限旋转90度到了第四象限,如图\ref{fig:9-13}第一步所示。公式$\mathbf x\cdot\mathbf w+\mathbf b $中的公式中的$\mathbf b $相当于对其进行平移变换。其过程如图\ref{fig:9-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}列举了几种激活函数的形式。\\
\parinterval 那激活函数又是什么?神经元在接收到经过线性变换的结果后,通过激活函数的处理,得到最终的输出$\mathbf y $。激活函数的目的是解决实际问题中的非线性变换,线性变换只能拟合直线,而激活函数的加入,使神经网络具有了拟合曲线的能力。 特别是在实际问题中,很多现象都无法用简单的线性关系描述,这时可以使用非线性激活函数来描述更加复杂的问题。常见的非线性函数有Sigmoid、ReLU、Tanh等。如图\ref{fig:9-15}列举了几种激活函数的形式。\\
\noindent 其中,张量$\mathbf x $沿第1阶所在的方向与矩阵$\mathbf w $进行矩阵运算(张量$\mathbf x $第1阶的每个维度都可以看做一个$4\times4$的矩阵)。图\ref{fig:5-27}演示了这个计算过程。张量$\mathbf x $中编号为\ding{172}的子张量(可看作矩阵)与矩阵$\mathbf w $进行矩阵乘法,其结果对应张量$\mathbf s $中编号为\ding{172}的子张量。这个过程会循环四次,因为有四个这样的矩阵(子张量)。最终,图\ref{fig:5-27}给出了结果张量的形式($4\times4\times2$)。
\noindent 其中,张量$\mathbf x $沿第1阶所在的方向与矩阵$\mathbf w $进行矩阵运算(张量$\mathbf x $第1阶的每个维度都可以看做一个$4\times4$的矩阵)。图\ref{fig:9-27}演示了这个计算过程。张量$\mathbf x $中编号为\ding{172}的子张量(可看作矩阵)与矩阵$\mathbf w $进行矩阵乘法,其结果对应张量$\mathbf s $中编号为\ding{172}的子张量。这个过程会循环四次,因为有四个这样的矩阵(子张量)。最终,图\ref{fig:9-27}给出了结果张量的形式($4\times4\times2$)。
\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:9-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:9-43}所示。