目录
观看官方双语关于深度学习之神经网络的三个部分的视频,
以数字图像处理为例,浅述工作过程:
一:神经网络的基本工作过程简述
1,人脑处理图像
大脑是如何识别包含0到9在内的像素点图像?即便这些数字的像素点不尽相同?
大脑在识别由像素点组成的数字时,会将数字拆分成各组成部分,比如:
看到一个9,大脑会将这个9拆分成一个圈和一竖 ;
看到8会将其拆分成由上下两个圆圈的组合;
看到4会将其拆分成两竖一横。
也就是说人脑在识别数字的时候会会通过识别数字的特征组合,以激活(使兴奋)对应的神经元,并通过联系不同强相关神经元,进而来判别数字。
2,神经网络的构建
神经网络的工作原理正是仿照人脑来进行的。
我们将神经元用一个个的圈表示出来,并像像素点那样,用0表示白色,用1表示黑色(假使图像是黑白双色的,并且图像部分——在这里是0到9——是黑色的),就好像大脑的神经元那样,我们人为的让该神经元被激活表示1,为激活表示0.
灰度值:但实际上并不是只有激活与为激活状态,或者说这中间是连续的,所以实际上每个神经元的取值范围应为0~1之间,越接近1,图像越黑,神经元激活程度越高。
我们将所有的像素点转化为一个个的神经元,构成神经网络的第一层,我叫它输入层;
并将0~9用10个神经元表示,构成神经网络的最后一层,我叫它输出层。
我们现在就是要通过网络使得由输入层得到输出层的结果,也就说0~9的某个值(当然,由于灰度值,实际上0~9的所表示的值都在0~1之间,只是看谁更接近1罢了),
而输入层和输出层的中间我们可以构建2层隐含层,这就构成了典型的4层神经网络用来识别0~9.
我们让这里的第二层处理少数几个像素点的组成,让第三层处理数字的组成(也就是上面提到的数字包含的圈圈或竖横线),
上一层的激活值决定下一层的激活值 ,通过层层激活最终得到结果。
第二层处理诸如圈圈或竖线的部分组成——
3,权重
第二层需要给第一层的所有神经元之间都连上一条接线,并且都附上一个权重。
而第二层的每一个神经元激活值的计算正是第一层所有神经元加权求和的结果。
如果我们用绿色表示正权重,红色表示负权重,颜色越亮表示权重越大,那么将其反映到图像中,比如如下的一横(假使反映在网络第二层),理想情况是这一横对应的网络第一层的那些神经元给到第二层的偏重为正且极大,而横线的周围的偏重甚至是负的(凸显边框),其余地方权重赋为0:
值得注意的一点是,权重求和的结果可以超出0~1范围,所以需要在求和结果前在乘上一个系数Sigmoid:
如下是一种可能的Signmoid函数:
4,偏置
5,数据处理
而其他层也是如此,需要设置权重和偏置。
于是对于一个784像素点的图像,整个网络一共会用到进13000个权重加偏置。
为了处理数据,使用矩阵进行运算,如下:
而这整个表达式可以简化成:
二:神经网络如何学习
——即神经网络如何通过数据获取合适的权重和偏置
1,代价函数
(1)Cost
一开始,完全随机初始化每个神经元的权重和偏置,所以最开始网络的输出结果将会特别糟糕。
那个这个时候就要对这个初始的输出结果进行调整:
将0~9每个激活值(随机)与正确结果(只有其中一个激活值为1,其余为0)做差再平方,
并将9个平方项求和,得到一个值——我们称之为代价。
初始时由于权重和偏置的随机设置,”代价“会很大,之后将逐渐趋于0.
所以”代价“就是用于衡量权重和偏置设置的好坏程度。
(2)Cost Funtion
通过代价函数对权重和偏置进行调整:
刚才说了,”代价“越小,就意味着权重和偏置设置的越好,那么输出结果就应该越准确。
所以如果能使“代价”最小,或者说,找到”代价“的最小值,就认为找到了最好的权重和偏置设置。
现在以如下的一元函数为例,其中x轴表示网络里的唯一权重,y轴表示代价值:
而找代价的最小值即是找整个代价函数的最小值。
这个时候就会想到让代价函数的一阶导=0,从而求得最小代价值。
但事实是,可能会出现多个局部最小值,所以更明确的做法是,随机选择很多函数值,计算它们的斜率,然后根据斜率正负判断可能的局部最小值方向,再根据斜率绝对值大小确定每一步调整的大小——就像是往下图的的这个一元函数(当作山)上放很多小球,小球会先快后满的滚向局部最小值。
上升到更加复杂的二元函数中(x,y对应权重,z对应代价值),如下,也是想要求“山脚”:
当我们想要知道在一个3维空间中快速找到每个位置的“下山捷径”,自然就会用梯度去计算。
2,梯度下降
函数的梯度会指出函数增长(梯度正方向)和下降(梯度负方向)最快的方向。
所以我们可以将上面构建的经典网络中的13000个权重偏置(13000元函数!)都放在一个列向量里,那么代价函数的负梯度也就成了一个向量,如下:
此时代价的列向量表示的是这个13000元函数中的某一点位置!对应整个网络的一种权重,偏置设置,此时负梯度的列向量整体反映的是我们应该向哪个方向进行调整(”下山“),负梯度的列向量里的每个元素都对应着其中一个自变量的值!
观察代价向量及其梯度,你会发现,调整其中的某些值会对结果影响更大。
对于代价向量,其中数值越大的元素意味着该权重对应神经元对结果的影响比其他的大。所以找到并改动这些神经元的激活值会更加有效的改变输出结果(改动程度更大);
而对于梯度向量,其上的每个元素的大小指明各个权重偏置对于某个结果在的相对重要度。直观来讲,如果图像数字是3,输出结果中3的激活值为0.1,9的激活值为0.9,8的激活值为0.1,那么显然,调整决定3和9激活值的那些权重和偏置就会比调整8的性价比要高的多——
数学表达上就是:输出的每个可能结果对应的激活值的大小与现在值和目标值的差异成正比。
值得注意的是,这里的代价函数取了整个训练集(这里的训练集针对同一个数字,比如10000张数字2的图片)的平均值,所以最小化”代价“会使样本的总体结果变好而不是针对某个特定图片。
那么怎么一步步的计算每一次的梯度,又应该如何一步步去调整整个网络的权重和偏置呢?
——我们使用反向传播算法。
3,反向传播
(1)计算梯度
我们知道梯度定义和算子如下:
在这里,f 就是代价函数的值,而 i ,j ...等对应的就是x,y...轴等不同方向,也就是对应不同的
偏置或权重(自变量),所以按公式求偏导再带入对应“点坐标”(即对应的权重和偏置的值)即可知道该“点”的梯度值了。
那这里如何求偏导呢?
如下是代价关于其中一个权重的偏导:
用链式法则将上面红圈的这个比值展开得到下面黄色框框里的公式:
而右式的每一项即是分别对图右上的式子进行求导得到,如下:
上述计算过程实际上就已经运用了反向传播。
(2) 更新权重和偏置
对于权重w: w = w - η * ∇w
对于偏置b: b = b - η * ∇b
其中的 η ,是人为设定的一个值,会直接影响到学习效率。学习率设置的越大,权重和偏置改变的每次改变的量也就越大,亦即改变的越快。
(3)更新了权重和偏置以后,就重新正向计算,得到新的输出结果,然后反复。