铺垫了几节课,终于讲到了反向传播。因为笔者已经在刷CS231n的时候学习过BP算法,想要直接查看BP相关知识点的可以看之前的博客:CS231n课程笔记4.1:反向传播BP、 CS231n作业笔记1.3:SVM的误差函数以及反向传播(非向量及向量算法)、 CS231n作业笔记1.6:神经网络的误差与梯度计算。(笔者的经验是看教程总有些想当然的地方,写几次作业就可以深入理解了)
这里只是记录一些CS231n中未提及的一些相关知识点。
1. 为什么要加入隐层节点
前几节已经展示了学习单层神经元是多么的简单容易,而且还用不上BP算法。这里Hinton再次陈述了学习多层神经网络的意义:1. 单层网络能力有限 2. 手动设计特征繁琐复杂要求高 3. 多层神经网络期待通过数据自动学习出有效的特征。
2. 其他的学习算法
2.1. 扰乱权重法
(进化理论方向):随机扰乱(幅值应该很小)某一权重,然后判断其是否会提升效果,如果可以则保留扰动。这个方法有些像强化学习,不知道怎么办,先试一下,如果好就留下。但是非常低效,因为对于任意权重的扰动,评价其是否会带来效果提升,都需要在一个足够有代表性(抽样均匀、数据量大之类的)的训练集上测试。(多少个权重就测试多少次,而BP只需要对所有权重一起进行测试)从训练难度上来说,在训练接近结束的时候,同样需要调节扰动大小,从而保证收敛到足够好的权重值。
2.2. 扰乱权重法的小改进(并不有效)
不扰动一个权重了,同时扰动多个权重。看似可以多个权重并行,但为了获取到某一个权重应该改动的方向,需要多次扰动才可。
2.3. 扰动神经元法(扰乱权重法的改进)
注意到只需要知道神经元输出的改变趋势,就可以计算出权重的改变趋势。而神经元的数目是要远小于权重数目的(权重数目大致是神经元数目的平方)。这样扰动神经元输出,从而判断神经元输出的改变趋势,进而判断权重的改变趋势。虽然要比扰乱权重法有效,但仍然是BP的<神经元个数>倍。
2.4. 梯度估计法
这个方法已经和BP很像了,也没有出现在slide里面,而是作为课间小测的形式出现。
操作为:对于某一权重,先使其增加某个小值(
ϵ
),得到一个误差
E1
;然后再减少小值(
ϵ
),得到一个误差
E2
;最后使得权重变化
ηE1−E22ϵ
。
很容易看出,这就是通过最原始的方法估计
∂E∂w
,然后应用了一步Steepest descent step。可以说是原始BP了。
3. 反向传播算法(Back Propagation)
所有的努力都是为了得到
∂E∂w
。输出层的梯度获取方法在线性神经元和逻辑斯蒂神经元两节里面已经解释清楚了,这里主要讨论隐层神经元输入权重梯度的获取。(具体做法请参看CS231n课程笔记4.1:反向传播BP,基本就是把梯度值流回去。)
假设神经网络为二层神经网络,每层神经元都使用sigmoid激活函数,如下图所示:
想要求取的梯度为
∂E∂w
。首先可以拆分出
∂E∂w=∂E∂yi∂yi∂w
,其中
∂yi∂w
的部分和逻辑斯蒂神经元同理。然后拆分
∂E∂yi=∑j∂E∂yj∂yj∂yi
(因为
E=f(yj0,yj1,⋯,yjnj)=E=f(gj0(yi),gj1(yi),⋯,gjnj(yi))
)。而
∂yj∂yi=∂yj∂zj∂zj∂yi
。从而有: