神经网络简介-加速学习

在训练神经网络过程中,网络训练速度是比较引人关注的一个问题。我们希望在训练过程中网络代价函数会快速收敛,准确率会快速提升,下面来说说一些常见的方法。

1.代价函数更换
1.1. quadratic-cost function

J(w,b)=12ni=1n(yih(w,b)(xi))2+R(w)

上式中, R(w) 是正则项,对于第一个代价函数,我们由第二节的知识可知,最后一层w更新公式为
w(L)=w(L)αJ(w,b)w(L)=w(L)αδ(L+1)a(L)

其中
δ(L+1)=(ya(L+1))f(z(L))

f(z(L)) 是激活函数的导数,之前的实验中我们选取的激活函数为sigmod函数,其对应的函数曲线为
$f(x)=\frac{1}{1+e^{(-x)}}$
从上图中可以看出,在曲线的两端,sigmod函数导数几乎为0,也就是 δ(L+1) 中的 f(z(L)) 几乎为0,所以导致权重更新得到的值很小,导致网络学习很慢。

1.2. cross-entropy cost function

对于上面提到的问题,如果能让 δ(L+1) 中的 f() 消失,那么 wb 的更新程度将会增大,网络学习速度就会提示。而cross-entropy函数正好可以实现这样的期盼。

J(w,b)=1ni=1n[yiln(h(w,b)(x))+(1yi)ln(1h(w,b)(x))]

此时,对于cross-entropy代价函数,有
Jw(L)=Jhhz(L)z(L)w(L)

其中 Jh=(yh1y1h)=(yhh(1h)) ,我们根据第二接的定义可知,对于最后一层输出 h=a(L+1) ,而 hz(L)=f(z(L)) ,当 f 为sigmod函数时,hz(L)=a(L+1)(1a(L+1)),而 z(L)w(L)=a(L) ,那么
Jw(L)=(ya(L+1))a(L)

可以看到,由于没有了 f() 项, w b的更新将会比之前的quadratic函数快。
然而对于非最后一层的 w b,其残差项
δ(l)=δ(l+1)w(l)f(z(l1))

也会随着bp算法向前传播而迅速趋近于0,导致底层参数更新慢。下图是基于quadratic cost和cross-entropy cost函数在mnist上运行后得到的结果比较。
代价函数变化曲线
这里写图片描述
可以看出,cross-entropy函数收敛速度快于quadratic cost函数。

2.参数初始化

对于初始的 w b,通常都是有标准正态分布随机产生,例如第 l 层网络有n(l)个神经元,那么其对应到第 l+1 层第 k 个神经元,有

z(l+1)k=i=1n(l)w(l+1)k,ia(l+1)i

假设输入 a(l+1)i 都为1,那么由于 n(l) w(l+1)k,i 服从标准正态分布,因此 z(l+1)kN(0,n(l)) 的正态分布,其分布如下:
1000-0正态分布
其中蓝色是标准正态分布,红色是N(0,100)的正态分布,可以看到,当 n(l)=100 时, z(l+1) 有很大概率落到值很大的地方,对于到之前的sigmod函数就可看到落在了梯度很小几乎为0的地方概率很大。而我们常用的网络 n(l) 远远大于100,那么 f(z) 等于0的概率就更大,因此我们要对 w 的初始化做一些限制,使得z服从标准正态分布。我们在产生w b 时使其服从N(0,1n(l))的正态分布,最后 z(l+1)kN(0,1) ,梯度比之前远远要大。
下图是利用随机初始化和服从 N(0,1n(l)) 产生的结果对比
代价函数变化
准确率变化
可以看出,改善权重更新后,网络更新速度得以提升,结果也更好。

3.ReLU激活函数

因为之前的激活函数在函数两端梯度几乎为0,所以如果能换其他函数使得其在输入很大的情况下梯度不会非常小,那么网络收敛速度就不会受太大影响。ReLU激活函数就具备这样的性质,ReLU函数为

z=max(0,z)

下图是三种激活函数的对比
激活函数
可以看出,在横轴大于5时,sigmod和tanh函数梯度几乎为零,但是ReLU函数梯度不变一直为1.

4.Momentum-based gradient descent(动量梯度下降)

该方法出发点为,既然梯度每次都会下降,拿我们对其在其下降方向上对下降程度进行累加,如果每次下降方向相同,那么下降速度会越来越快。有

w=w+v

v=μvαJw

这样,每次下降都会考虑到上次下降的程度(由 μ 控制),这样梯度会沿着下降最快的方向行进。下图是利用动量梯度下降和原始梯度下降的对比效果。
结果比对

Python项目

功能函数
随机初始化函数reset_qinit()
cross-entropy代价函数backppg_cs()
momentum-based gradient decent在调用TrainNet()时添加第二个参数”MO”以及最后一行输入”-p x”设置活跃神经元的比例

参考
[1] Michael Nielsen

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值