神经网络

在机器学习和认知科学领域,人工神经网络(英文:artificial neural network,缩写ANN),简称神经网络(英文:neural network,缩写NN)或类神经网络,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具。

Neural Networks and Deep Learning

前向算法的作用是计算输入层结点对隐藏层结点的影响,也就是说,把网络正向的走一遍:输入层—->隐藏层—->输出层,计算每个结点对其下一层结点的影响。

例如,我们要算结点h1的值,那么就是:

\[net_{h_{1}}=i_{1}\times w_{1}+i_{2}\times w_{2}+b_{1} \times 1\]

是一个简单的加权求和。这里稍微说一下,偏置项和权重项的作用是类似的,不同之处在于权重项一般以乘法的形式体现,而偏置项以加法的形式体现。

而在计算结点\(o_1\)时,结点\(h_1\)的输出不能简单的使用\(net_{h1}\)的结果,必须要计算激活函数,激活函数,不是说要去激活什么,而是要指“激活的神经元的特征”通过函数保留并映射出来。以sigmoid函数为例,\(h_1\)的输出:

\[out_{h_{1}}=\frac{1}{1+e^{-net_{h_{1}}}}\]

\[net_{o_{1}}=out_{h_{1}}\times w_{5}+out_{h_{2}}\times w_{6}+b_{2}\times 1\]

\[out_{o_{1}}=\frac{1}{1+e^{-net_{o_{1}}}}\]

按照上面的步骤计算出\(out_{o_{2}}\),则\([out_{o_{1}},out_{o_{2}}]\)就是整个网络第一次前向运算之后得到的结果。

在实际情况中,因为是随机给定的权值,很大的可能(几乎是100%)得到的输出与实际结果之间的偏差非常的大,这个时候我们就需要比较我们的输出和实际结果之间的差异,将这个残差返回给整个网络,调整网络中的权重关系。这也是为什么我们在神经网络中需要后向传播的原因。其主要计算步骤如下:

  1. 计算总误差 \[E_{total}=\sum \frac{1}{2}(target-output)^{2}\]
  2. 隐藏层的权值更新
  3. 在要更新每个边的权重之前,必须要知道这条边对最后输出结果的影响,可以用整体误差对\(w_{5}\)求偏导求出\(\frac{\partial E_{total}}{\partial_{w_{5}}}\)。具体计算的时候,可以采用链式法则展开,在计算的时候一定要注意每个式子里面哪些自变量是什么,求导千万不要求错了。需要讲出来的一个地方是,在计算\(w_{1}\)的权重时,\(E_{total}\)中的两部分都需要对它进行求导,因为这条边在前向传播中对两个残差都有影响。 \[\frac{\partial E_{total}}{\partial out_{o_{1}}} \times \frac{\partial out_{o_{1}}}{\partial net_{o_{1}}} \times \frac{\partial net_{o_{1}}}{\partial w_{5}}\]
  4. 更新权重 这一步里面就没什么东西了,直接根据学习率来更新权重: \[w_5^+=w_5-\eta \times \frac{\partial E_{total}}{\partial_{w_{5}}}\]
  5. 至此,一次正向+反向传播过程就到此为止,接下来只需要进行迭代,不断调整边的权重,修正网络的输出和实际结果之间的偏差(也就是training整个网络)。   

I. 归一化

为什么要归一化?不同的算法,在归一化中得到的好处各不相同。不过目前大部算法,都比较需要归一化,特别是常用的梯度下降法(或梯度下降的衍生方法)。

  • 使网络快速的收敛,更方便的求解。
  • 无容置疑,归一化的确可以避免一些不必要的数值问题。
  • 避免神经元饱和:与权值阈值相乘后,才是sigmoid的输入值,初始化得好的话,并不会饱和输出。若果使用“把权值和阈值随机初始化为[-1,1]之间的值”这种初始化方法,那不归一化就会引起神经元输出饱和现象。
  • 大数吞小数:若果我们找到适合的权值,是不会吞掉的。

关于使用matlab工具箱:

  1. Matlab2012b已经会自动将输入数据归一化,所以不必再自己去做数据的预处理,直接用原始数据建立网络就可以。
  2. 使用matlab神经网络工具箱,而又要用梯度下降法的话,输出一定要做归一化。因为工具箱计算误差的时候,使用的是原始数据的误差,因此误差数量级可能很大,这样一来梯度就很大了,在学习率还没来得及自适应减小的时候,梯度就一下子把原来初始化好的权重给吞掉了,使网络的权重掉到一个离最优解非常远的地方。
  3. 使用matlab2012b(或以上)工具箱得到的网络权值,是面向作了归一化后的数据的。所以使用时,需要先对数据进行归一化,再将归一化后的输入数据放到网络中计算网络输出,再将输出反归一化,才是真正的预测结果。由于归一化和反归一化都是线性运算,而权值阈值与输入输出也是线性运算,能否将它们合并成一个线性运算?答案当然是可以的!

II. 梯度消失

神经网络梯度与归一化问题总结