目录
接上篇笔记,我继续学习有关神经网络的知识。
4.反向传播(梯度下降)
先介绍一下梯度下降法:
用一句话解释就是快速找到最低点的一个方法。
比如下图中沿着箭头所示走就能到红旗处(最低点)。
要实现这个过程中有三个问题 1.方向 -▽f 2.距离 η 3.终止条件 ||▽f||
(1)方向问题
这是个一元函数,自变量只有两个方向,一个朝左,一个朝右。
朝右边运动,越走越高,函数值增加,这个方向称为梯度方向。朝左边运动,越走越低,函数值在减小,这个方向称为梯度的反方向。
显然,要走到最低点,我们要选择梯度的反方向,重复之前的逻辑,不断朝梯度的反方向运动。“运气好“”的话,我们可以到达最低点。
这里的“运气好”是指走的距离合适。距离不合适有可能会越走越远,永远到不了谷底。
(2)距离问题
要完成梯度下降,需要选择合适的学习率。学习率是0.2时,迭代10次基本就能降到谷底。
学习率过大或者过小,有可能会反复横跳或者迭代很多次也到达不了最低点,浪费计算量。
(3)终止条件
η为0.2时,每次迭代后,梯度值在不断下降,第十次为0.12来到谷底附近,梯度为0时是最低点位置。只要学习率选择的合适,梯度就可以下降到任意小。
正式介绍反向传播
举个简单栗子:f(x,y,z)=(x+y)z 假设x=-2,y=5,z=-4,现在想让函数值变小,那就变小x、y、z的值。
令q=x+y ,q对x求偏导=1,q对y求偏导=1
f=qz, f对q求偏导得z,f对z求偏导得q
我们想得到,由链式求导法则可知:f对x求偏导=f对q求偏导*q对x求偏导,f对y求偏导同上。
注意:反向传播是从后往前逐层计算。(链式法则)
复杂的栗子:逐层求解:
1/x求偏导得-(1/x^2),所以-(1/1.37^2)=-0.53,所以1/x这层梯度是-0.53,向前传递,+1表示x+1,x+1求偏导是1,计算这层的梯度为-0.53*1=-0.53,一直逐层向前求。在这里我们只需理解它,实际应用中不会让你去算,直接调包使用就行。
也可以直接一块一块的计算:
5.整体架构
层次结构:一层一层对数据进行变换。
神经元:数据的量或者说是矩阵的一个大小。
全连接:
非线性:加在了每一步矩阵计算之后,进行一个非线性变换。
神经网络的一个强大之处在于用更多的参数来拟合复杂的数据!
6.正则化与激活函数
(1)正则化的作用
参数对结果的影响:参数个数比如64 128 256 512等
(2) 激活函数:
常见的激活函数:Sigmoid,Relu,Tanh函数等
激活函数对比
Sigmoid函数可能会发生梯度消失的情况(一般不用),现在一般都用Relu函数(不会出现梯度消失现象),或者它的变体。
6.参数初始化(非常重要)
通常我们都使用随机策略来进行参数初始化
W = 0.01*np.random.randn(D,H)
7.DROP-OUT
过拟合是神经网络中很头疼的一个问题(那我们就不要让这个网络太强)
即舍弃其中一部分来增强抗拒拟合的能力。
上面左图是完整的神经网络,每一个神经元相互连接。
上面右图即使用了drop-out,在训练的过程中在每一层随机的选择固定比例的神经元杀死,其中圆中带×的就是这次没选择,但不是指一直不选择它,有可能下次就会选中,是随机的。drop-out可以说是一个比例,比如在训练过程中每次有50%的神经元不参与这次的训练。
梳理整体(总结)
说白了,就是找合适的权重参数(即一系列W) ,解决过拟合的方法有正则化或者加drop-out等方法。