我眼中的神经网络

警告:本文为小白入门学习笔记


前面学习了线性回归和logistics回归算法,的确可以解决一些问题,但是如果在特征值增多时,就会变得困难

例如,当处理非线性问题是,图片识别,语音识别等。一张图片可以由很多像素点组成,如果每个像素点是一个特征值的话,那么将会产生很多特征值,所以就有了神经网络。

神经网络算法的产生是开始模拟人的大脑,对于神经网络的原理有很多人做了总结,我对它的理解是这样的。

神经网络可以由很多层,第一层为输入层,最后一层为输出层,中间的都是隐藏层

(1)前向传播(Forward propagation)

    这个过程很有意思,就像我们的神经反射一样,假如你的手受到刺激,经过一系列的神经传递到达大脑,大脑再做出反应,这个过程就是一个个神经元完成的,而对于一个复杂的神经网络模型,也是由一个个简单的神经元组成,就像这样。

                                                                       

这里我不列令人头晕的数学表达式,只是简文字描述。

计算过程是:一开始输入值和权重计算获得激活函数,激活函数成为下一个输入值再和下一层上的权重计算获取下一层的激活函数,就这样不断向前传递直到最后获得一个结果。

举个例子: 下图是一个三层网络,(图有点丑,但人不丑)注意每一条线上的权重并不一样(是已知数),并且每一层的激活函数a也不一样,输入输出值对应下图表格,可以看出一开始由输入值获得a1,a2,。a1,a2再计算获取h,计算表达式是起到或门的作用,可以根据需求来制定自己的函数来实现不同的功能,是不是明白了很多。

                       

(2)反向传播(back propagation)

  在学习线性回归和logistics回归时,都会有一个损失函数,通过损失函数可以计算出权重值,还有打印出损失函数变化可以用来判断是否正常工作。同理神经网络也要计算损失函数,求偏导等一系列复杂计算,而它也有一个有意思的过程,同前向传播十分相像,只是传递的方向不同,它的计算过程是用前向传播最后计算出的值(每一层都要一个值)同真实值做方差,求偏导,更新权重(梯度下降算法),这个过程我认为就是一个学习过程,通过和真实值比较,算法能够自动去更新权重,从而提高准确率,经过很多次的迭代后,最后会与真实结果越来越靠近,从而获取一组权重值。并不是说这一组权值值就是最好的,它可能对于训练集数据拟合的非常好,但是对于新数据就不行,所以这里还要考虑过拟合,欠拟合等一些列的评估方法。

(3)梯度检测(Numerical estimate of gradient)

  整个神经网路运行的过程中我们无法得知内部的运行情况,有的时候中间会有各种bug,但是仍然会有结果产生,并且有的时候损失函数依然呈现下降的趋势,如何检测这个过程是否正确呢?梯度检测是一个好的方案。学过微积分的同学可能还记得导数定义:

也就是说当ε无限接近零的时候,导数可以写成右边的样子,于是检测的原理就是如此,用有右边的式子(ε一般选10-4左右)去和计算出的偏导数比较,如果比较结果很接近的话,说明反向传播计算正确,可以排除这方面的问题。

注意:检测完毕时一定要注释掉梯度检测代码,因为这个过程十分耗时。

(3)随机初始化(Random initialization)

  对于权重的选择使用随机初始化方案,之前学习的算法权重的初始值都是0,对于神经网络不行,因为这会使得计算结果无变化,从而起不到任何作用。

总结神经网络实现过程如下:

1 随机初始化权重

2 使用前向传播对于输入值获取假设函数值

3 计算损失函数

4 使用反向传播去计算损失函数的偏导数

5 使用梯度检测去检测偏导数是否正确,然后注释梯度检测代码

6 使用梯度下降或者其他高级优化算法在反向传播的过程中是损失函数最小化,更新权重。

其实不难发现,对于简单到只有一个神经元的神经网络模型

它的实现过程就和线性回归一样了,当激活函数a是sigma函数时它就实现了logistics回归的功能,神经网络求偏导,运用高级优化算法提高准确性,是反向传播过程实现的,这种方法在层数增多的时候会速度很快。

有一个更好的试验可以帮助更好的理解神经网络:http://www.tensorfly.cn/tfdoc/tutorials/mnist_pros.html

 

原文地址:https://www.cnblogs.com/zhxuxu/p/9534239.html