神经网络模型

作者:一个独行的程序员

神经网络中决定一个模型好坏的因素就是参数W,b,而后向传播过程就是通过计算Loss相对w或b的偏导数来不断更新参数的过程。本文简要介绍神经网络模型,详细的解释了后向传播原理

神经网络模型

在机器学习和认知科学领域,人工神经网络(artificial neural network,缩写ANN),简称神经网络(neural network,缩写NN)是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。神经网络由大量的人工神经元联结进行计算。现代神经网络是一种非线性统计性数据建模工具。

典型的神经网络具有以下两个部分:

网络结构:指定了网络中的变量和它们的拓扑关系。

激活函数:大部分神经网络模型具有一个短时间尺度的动力学规则,来定义神经元如何根据其他神经元的活动来改变自己的激励值。一般激励函数依赖于网络中的权重(即该网络的参数)。

和其他机器学习方法一样,神经网络已经被用于解决各种各样的问题,例如机器视觉和语音识别。这些问题都是很难被传统基于规则的编程所解决的。

神经元

神经元
  • a1~an为各神经元的输出
  • w1~wn为神经元各个突触的权值
  • b为偏置
  • f为激活函数,通常为非线性函数。一般有sigmoid, tanh, Relu
  • t为神经元输出

向量表示:

  • $t=f(WA^T+b)$
  • $W$为权重向量
  • $A$为输入向量,$A^T$为输入向量的转置
  • $b$为偏置
  • $f$为激活函数

可见,一个神经元的功能是求得输入向量与权向量的内积后,经一个非线性传递函数得到一个标量结果。

单个神经元的作用:把一个n维向量空间用一个超平面分割成两部分(称之为判断边界),给定一个输入向量,神经元可以判断出这个向量位于超平面的哪一边。

神经网络模型

神经网络就是多层神经元的连接,上一层的神经元输出,作为下一层神经元的输入,下图是一个3层的神经网络,1个输入层,1个隐层和1个输出层:

3层神经网络

符号定义:

  • $a^{(l)}_{i}$为第$l$层的第$i$个神经元的输出
  • $w^{(l)}_{ij}$为第$l$层第$j$个神经元到第$l+1$层第$i$个神经元的权重
  • $b^{(l)}_i$为第$l$层第$i$个神经元的偏置
  • 向量$(\vec{W},\vec{B})=(w^{(l)}, b^{(l)}),\ l=1,…,L,\ L为网络层数,w和b为模型参数$

前向传播

这个概念比较简单,就是在给定模型参数$W和B$的情况下,通过输入数据$X$,得到输出值$H$的一个过程。一般我们通过前向传播的输出$H$与真实值$Y$之间的差来后向传播训练参数。在参数确定后,便可以使用前向传播来进行预测了

当$l=1时,令a^{(1)}_{i}=x_i$,下面以3层网络为例解释前向传播的计算过程:

$$
a_{1}^{(2)} = f(w_{11}^{(1)}x_1 + w_{12}^{(1)}x_2 + w_{13}^{(1)}x_3 + b_{1}^{(1)})
$$

$$
a^{(2)}_2 = f(w^{(1)}_{21}x_1+w^{(1)}_{22}x_2+w^{(1)}_{23}x_3 + b^{(1)}_{2})
$$

$$
a^{(2)}_3 = f(w^{(1)}_{31}x_1+w^{(1)}_{32}x_2+w^{(1)}_{33}x_3 + b^{(1)}_{3})
$$

$$
h_{w,b}(x) = a^{(3)}_3 = f(w^{(2)}_{11}a^{(2)}_1+w^{(2)}_{12}a^{(2)}_2+w^{(2)}_{13}a^{(2)}_3 + b^{(2)}_{1})
$$

这样的形式看起来未免太过繁复,所以我们可以使用向量的形式来描述这个计算过程,令$z^{(l)}_i$表示第$l$层第$i$个节点的输入加权和,则有:

$$
z^{(l)}_i=\sum_{j=1}^n{w^{(l-1)}a^{(l-1)}+b^{(l-1)}}
$$

$$
a_i^{(l)}=f(z_i^{(l)}),\quad i=1,…,n
$$

于是,3层网络的输出表达式为

$$
h_{w,b}(x)=a^{(3)}=f(z^{(3)})
$$

后向传播

后向传播是利用$h与y$的差,反过来调整网络模型中的隐层参数$w和b$。本文以sigmoid函数作为激励函数,进行反向传播原理说明。

符号定义:

  • $\sigma(x)=\frac{1}{1+e^{-x}},\ sigmoid函数$
  • $ \sigma^{‘}(x)=\sigma(x)(1-\sigma(x)),\ 易证$

权重调整

假设输出层的节点数为K,一共$L$层网络,则有以下定义:

损失函数
$$
E = \frac{1}{2}\sum_{k\in{K}}(h_k-Y_k)^2
$$
这里需要注意的是,原理上我们应该用整个训练集的所有数据来计算E。但是实际操作时,由于计算量太大,我们往往就只用1个数据点来进行参数调整(梯度更新),这也就是所谓的SGD(Stochastic Gradient Descent),关于这部分内容,参考这篇文章

训练的目标:最小化误差,即求损失函数对参数的偏导数。

不失一般性,不妨考虑最后一隐层第$j$个神经元到输出层第$k$个神经元的参数$w^{(L-1)}_{kj}$,则有:

$$
\frac{\partial{E}}{\partial{w^{(L-1)}_{kj}}}=\frac{\partial}{\partial{w^{(L-1)}_{kj}}}\frac{1}{2}\sum_{k\in{K}}(h_k-Y_k)^2
$$

由于参数$w^{(L-1)}_{kj}$只影响第k个输出,所以输出层的其它偏导数为0,且$Y$与参数并不相关,即:

$$
\frac{\partial}{\partial {w_{kj}^{(L-1)}} } \frac{1}{2} \sum_{k\in{K}} (h_k-Y_k)^2 = \frac{\partial}{\partial{w_{kj}^{(L)}}} \frac{1}{2} (h_k-Y_k)^2 \ =\ (h_k-Y_k) \frac{\partial}{\partial{w_k^{(L)}}} h_k
$$

根据上文定义有:

$$
h_k=a_k^{(L)}=\sigma{(z_k^{(L)})}
$$

代入上式得:
$$
\frac{\partial{E}}{\partial{w^{(L-1)}_{kj}}}=(h_k-Y_k) \sigma{(z_k^{(L)})} (1-\sigma{(z_k^{(L)})}) \frac{\partial{(z_k^{(L)})}}{\partial{w_{kj}^{(L-1)}}}
$$
同理,由于求$w^{(L-1)}_{kj}$的偏导数,所以只与第$j$个输入有关,其他的参数偏导数为0。

即:
$$
\frac{\partial{(z_k^{(L)})}}{\partial{w_{kj}^{(L-1)}}} = \sum_{j\in n} \frac {\partial{ ({w_{kj}^{(L-1)} a_j^{(L-1)} + b^{(L-1)}} )} } {\partial{w^{(L-1)}_{kj}}} = \frac{\partial{(w_{kj}^{(L-1)} a_j^{(L-1)})}}{\partial{w_{kj}^{(L-1)}}}
$$

由于$w_{kj}^{(L-1)}和a_j^{(L-1)}$并不相关,所以互为常数,求偏导就变得很简单了。
即:

$$
\frac{\partial{(w_{kj}^{(L-1)} a_j^{(L-1)})}}{\partial{w_{kj}^{(L-1)}}} = a_j^{(L-1)}
$$

综上各式:

$$
\frac {\partial{E}} {\partial{ w_{kj}^{(L-1)} }} = (h_k-Y_k) \sigma{(z_k^{(L)})} (1-\sigma{(z_k^{(L)})}) a_j^{(L-1)} = (h_k-Y_k) a_k^{(L)} (1-a_k^{(L)}) a_j^{(L-1)}
$$

为了形式更简洁,我们定义:

$$
\delta_k^{(L)}=(h_k-Y_k) a_k^{(L)} (1-a_k^{(L)})
$$
则有:

$$
\frac {\partial{E}} {\partial{ w_{kj}^{(L-1)} }} = \delta_k^{(L)} a_j^{(L-1)}
$$
至此,已经理清了从输出层到最后一层隐层间的参数更新过程!往更前层隐层的更新与这个过程类似,就不再赘述。