机器学习(四)——神经网络反向传播细节
上一篇讲了个神经网络结构,它具体怎么用,怎么算就算这一篇。
神经网络的用法就算下面这几步:
1、正向传播,计算h(X),就是根据随机给的权重计算出一个结果;
2、反向传播,修正权重,也就是θ矩阵,使得代价函数最小;
3、预测数据,前面两步都是训练,这一步就是使用训练好的网络进行结果的预测。
首先,需要铺垫一些东西。
1、神经网络隐藏层的每一个节点可以看做前后两个部分:前面一个部分根据输入和权重得到一个结果,称作z;后面一个部分将得到z带入sigmod函数[(参考Logistic Regression) ]
2、求偏导里面的链式法则:
3、规定
δlj=∂J∂Z(l)j
δ
j
l
=
∂
J
∂
Z
j
(
l
)
表示第
l
l
层第j个节点的误差。(在这儿也不有点懵,看完后面的例子就get了应该)
一、正向传播
正向传播其实上一篇就说过了,按照上面那张神经网络的图,假设是一个多分类问题,输出是一个向量,输入含有两个特征。
1、首先把训练数据X输入,随机生成权重W矩阵。
2、计算隐藏层的输出,先根据权重得到z,简单书写就是Z(2)=W(1)X,然后使用sigmod函数,得到隐藏层第二层的输出,a=g(z(2))。
3、计算输出层的输出,在输出层,计算过程和隐藏层类似,首先是Z(3)=W(2)a(2),然后得到最终输出,h(X)=g(Z(3))。
到这里,正向传播的过程就结束了,得到了想要的东西,就是根据权重和输入算到的h(X)。
二、反向传播
这一步的目的是根据得到的h(X)和训练集里的y比较,修正权重矩阵,根据前面几篇的想法,就是得到代价函数,然后求出代价函数相对于每一个权重的偏导,设置一个步长,疯狂迭代就行了。
所以问题就集中在怎么求偏导。
1、先考虑怎么求总代价吧。
就是逻辑回归里面那个式子。
所以在这个例子里,可以看出来总代价J就是下面这样:
2、隐藏层—>输出层 权值更新
其实就是求J对W3的偏导,根据链式法则就可以转化为这样:
由于输出有两个,所以稍微复杂了一点点,不过也差不多。
接下来就是挨个求偏导就好了。
可以看到其实a(3)就是h(X),所以J对a(3)的偏导可以看做是
接下来就是a(3)1对z(3)1的偏导了,就是sigmod函数的导数嘛,下面给出的是sigmod函数的求导。
J和a(3)之间第二个单元的求偏导和第一个单元类似,就不说了,剩下最后一个就是z(3)1对W3求偏导,这个是最简单的,直接就可以得到
所以结合起来,就可以得到下面这个结果:
最后再回头看一下最开始链式展开的时候,也可以写成这样,
由于规定了 δlj=∂J∂Z(l)j δ j l = ∂ J ∂ Z j ( l ) 表示第l层第j个节点的误差,所以 ∂J∂W3 ∂ J ∂ W 3 也可以表示成 (δ(3)1+δ(3)2)∗a(2)1 ( δ 1 ( 3 ) + δ 2 ( 3 ) ) ∗ a 1 ( 2 ) 。
好了,总结一下这一小节,从隐藏层到输出层的权值更新中,偏导数有两种表示方式:
∂J∂W3=∑i=12(a(3)i(1−y)+(1−a(3)i)∗y)∗a(2)1 ∂ J ∂ W 3 = ∑ i = 1 2 ( a i ( 3 ) ( 1 − y ) + ( 1 − a i ( 3 ) ) ∗ y ) ∗ a 1 ( 2 )
∂J∂W3=(δ(3)1+δ(3)2)∗a(2)1 ∂ J ∂ W 3 = ( δ 1 ( 3 ) + δ 2 ( 3 ) ) ∗ a 1 ( 2 )
3、输入层—>隐藏层 权值更新
这一部分就针对
w1
w
1
举例就好了。
其实根据刚才的经验,很快就可以写出其中一种表示方法:
另一种表示方法其实也就是把 δz(2)1 δ z 1 ( 2 ) 求出来而已。
下面来求就行了。
从这里已经看出了一些猫腻,那就是前面层数的
δ
δ
可以由后面层数的
δ
δ
得到,转换成矩阵形式就可以得到这个结论:前面层数的节点误差等于后一层的节点误差经过权重后乘以g前导
δ(l)=(θ(l))Tδ(l+1).∗g′(z(l)) δ ( l ) = ( θ ( l ) ) T δ ( l + 1 ) . ∗ g ′ ( z ( l ) )
最后这个矩阵形式看着不爽的话,就对照上面一排的
δ
δ
转换结果多瞧瞧,还是有一丢丢感觉的。
目前为止,
δ
δ
知道了,偏导就更简单了,另一个结论就是:
代价函数对每个权重的偏导数等于上一层的输出乘以下一层的误差。
∂J∂θ(l)ij=a(l)iδ(l+1)j ∂ J ∂ θ i j ( l ) = a i ( l ) δ j ( l + 1 )
三、数据预测
到了这里就没啥好说的了,用梯度下降算法或者什么厉害的算法更正好权重矩阵后,把要预测的x放进去,得到y就行了。
好了,大功告成,其实无非就是链式法则的运用而已。