超萌新级的学习心得——神经网络

神经网络的出现是为了解决一系列问题的,这个问题的来源用最简单的说法描述就是“找规律问题”。

首先,思考一下,人类可以比对一堆事物的基本特征来找到规律,然后写出一个代表规律的表达式来进行预测,例如:2,4,6,8,10;这个数列的规律人类的做法就是目测一下,感觉这些是偶数(2n),然后猜下一个是12。但是计算机是不会这样操作的,计算机必须通过一个算法来找到合适的情况。

直观一点:

 

 

 

人类视角就是直接顺着一个一个的点绘制过去,然后直接目测的得出曲线为,然后预测下一个为12。

 

 

 

但是计算机视角是一堆散点,不知道规律,只能先随便画一条线计算一下样本点和直线上的点的距离,看看误差大不大。发现有误差就一点一点的旋转及平移,直到误差为0或者低于一个很小的数时,计算机就认为“找到规律”了,便写出表达式并预测下一个数。

这个问题实质是回归问题,计算机在做的就是曲线拟合,即用一根曲线描述这些点的分布。而这种平移旋转的方法为著名的梯度下降法,特点是在缓慢旋转的过程中,当误差越来越小时,旋转或移动的量也跟着逐渐变小,当误差小于某个很小的数就收敛。具体为在直线拟合中,计算机首先创建直线:,然后不断修改的值,直到误差小于某个很小的数。

一般想到的可能用 (表示样本点,表示直线点)来计算误差,但是实际效果更好的是最小二乘法,即使用计算。

 

在仔细想想,这个工作的原理能不能再深挖一下?

我们将拟合的直线的斜率作为自变量,将拟合的误差作为因变量画一下曲线,不难得到,这是个类似于二次曲线的图像,而且当这个曲线的斜率为0时,因变量即误差应该有最小值。

 

 

 

这时,可以很直观的感受到,梯度下降即是在图像上缓缓取切线的过程。

切线缓缓改变的幅度叫做学习率,加大学习率是会加快拟合速度的(会更快到达斜率为0的点),但是太大就会导致错过而无法收敛。

但是,在任何实际操作中,使用直线来拟合是十分差的(上述情况除外),曲线(特指不是直线的那种,不是代数中的意思)会更加好。

好像扯了一点点数学……

 

但是这个和神经网络什么关系呢?

之前提到,神经网络是为了解决所谓的“找规律”问题,但是这些简单的曲线拟合只要纸和笔就好了,感觉用不上什么神经网络,或者说用“高端”的神经网络可能就没有什么意义。但是,实际上的参数是不可能只有两个的,就是哪怕把方程改为即三个参数时,方程也是千变万化,至少纸笔就有一定的难度了。

前面讲的是一串数字的规律,但生活中的往往是由很多变量组成的。这些变量可以说是叫“特征”,像之前的曲线方程的多个变量也可以叫特征值。每一个原始特征叫做维度,例如之前的每一个变量都是维度。

在多维拟合的场景下,使用二次曲线进行拟合,特征量会爆炸式增加。例如,一个50维的数据,使用二次曲线拟合,特征值会加到:个。以目前计算机的算力,处理这个数据还是难度不大,但是实际上需要计算机处理时,一张50 X 50像素大小的照片大约可以达到个特征……

那50 X 50像素有多大?3.5 X 3.5厘米,大概是大拇指指甲大小……仔细想想,一张这么点大的图就是这么多特征,那人物像,一般的街景什么的,肯定不止这么多,而我们要做的是从大量像这样的数据中找出一个规律(拟合);例如fer2013数据集中有35887个数据,我们要从中找到规律从而分析一张新的表情是什么意义,显然之前的算法是极度不符合要求的。

而神经网络就很好的解决了问题。

神经网络的历史麻烦自行百度百科,这里就不说了。简单点说,我们认为可能可以找到一个解决这类拟合问题的算法,即不需要对不同的拟合问题采用不同的算法,只需要一种就可以了。而这个假说被各种各样的事实证明了,而神经网络就是这个算法。

神经网络的模型和人体的神经网络是比较类似的。单个神经元如图所示:

 

 

 

说明:1表示的是偏移值(类似于曲线中的常数);X1,X2表示的是初始特征值,简单点说就是输入的变量值;W1,W2,W3表示权重,就是变量的参数;特征值会首先会加权求和然后通过激活函数再最终输出。

比方说激活函数是:,X1,X2分别为5,4,W1,W2,W3分别为0.5,0.6,0.7;输出值就是:

当然,激活函数是不会用这么简单的函数的,一般用的是Sigmoid,也称逻辑曲线,如下:

这一种是比较常见的。

另一种是双曲正切函数,这里就不多讲了。

 

目前为止,神经网络就差一个最关键的部分——网络结构。

首先说明一下,网络结构是非常多的,如图:

 

 

本萌新是不可能全部讲的(未来可能会),但目前是不会的。

这里我们手动弄一个简单的讲一下原理。如图:

 

 

这是一个大佬绘制的神经网络结构,有点像第一张图的“FF”。简要说明:每一个圏就是一个神经元,或者说节点。隐藏层就是介于输入层和输出层用来处理数据的层。


感谢贴吧大佬@利_刃,原帖:http://tieba.baidu.com/p/3013551686?pid=49703036815&see_lz=1#


计算方法如下:

 

这个和之前的神经元的计算方式是非常相似的,同时要注意一下:

  • 这个图中的有向线段是没有标上权值的,实际操作上是有权值的。
  • 一般隐藏层与输出层是使用不同的函数,比如使用Sigmoid作为激活函数,输出层使用的是。

但是这个方法和之前的方法是没有任何区别的,自然需要改进或使用新的算法BP算法:

 

BP算法由信号的正向传播和误差的反向传播两个过程组成。

正向传播时,输入样本从输入层进入网络,经隐层逐层传递至输出层,如果输出层的实际输出与期望输出(导师信号)不同,则转至误差反向传播;如果输出层的实际输出与期望输出(导师信号)相同,结束学习算法。

反向传播时,将输出误差(期望输出与实际输出之差)按原通路反传计算,通过隐层反向,直至输入层,在反传过程中将误差分摊给各层的各个单元,获得各层各单元的误差信号,并将其作为修正各单元权值的根据。这一计算过程使用梯度下降法完成,在不停地调整各层神经元的权值和阈值后,使误差信号减小到最低限度。

 

意思是说,我们依然需要将数值一步一步传递到输出层,同时,输出层还会反过来传递到输入层,在这个过程中不断调整权值。

 

这时,方法就改为了:

 

 

传递到输出层的具体的过程就是比较简单的权值求和。但是比较复杂的是反向传播。反向传播过程是利用误差来修改权值来达到拟合的效果,具体的计算方法根据不同的网络可能不一样,这里就不再做过多的阐述。

最后,利用更改后的权值继续计算并更新权值直到收敛,这就完成了。但是这个方法在计算上是比较麻烦的,于是也出现了批量梯度下降,即在不更新权重的情况下,把记录集的每条记录都算过一遍,把要更新的增值全部累加起来求平均值,然后利用这个平均值来更新一次权重,然后利用更新后的权重进行下一轮的计算。


 

到此,神经网络告一段落,但是仔细看这篇文章还是有一种讲了一堆但是又什么都没讲的感觉,这就是理论的学习上的一个特点:讲完可能不知道应用。可能不像之前的编程语言一样学了立马可以写一个简单程序,这个只是使我们加深了对某一个概念的理解,让我们知道是什么,以及怎么做,但是这些看了是不一定可以保证可以直接上手的,还要有各种知识储备作为基础,因此还是要不断学习其他的相关知识才能保证良好地运用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值