Neural Networks: Learning 内容较多,故分成上下两篇文章。
Backpropagation in Practice
Application of Neural Networks
首先定义一下后面会提到的变量
L: 神经网络总层数 Sl:l层单元个数(不包括bias unit) k:输出层个数
回顾正则化逻辑回归中的损失函数:
J(θ)=−1m∑i=1m[y(i) log(hθ(x(i)))+(1−y(i)) log(1−hθ(x(i)))]+λ2m∑j=1nθ2j
在神经网络中损失函数略微复杂了些,但是也比较好理解,就是把所有层都算进去了。
J(Θ)=−1m∑i=1m∑k=1K[y(i)klog((hΘ(x(i)))k)+(1−y(i)k)log(1−(hΘ(x(i)))k)]+λ2m∑l=1L−1∑i=1sl∑j=1sl+1(Θ(l)j,i)2更详细的公式推导可以参考http://ufldl.stanford.edu–反向传导算法
下面给出我自己对BP算法的理解以及ufldl上的推导:
假设神经网络结构如下
首先需要知道的是BP算法是干嘛的?它是用来让神经网络自动更新权重 W 的。 这里权重W与之前线性回归权值更新形式上是一样:
那现在要做的工作就是求出后面的偏导,在求之前进一步变形:
注意 J(W,b;x(i),y(i)) 表示的是单个样例的代价函数,而 J(W,b) 表示的是整体的代价函数。
所以接下来的工作就是求出 ∂J(W,b;x,y)∂Wij(l) ,求解这个需要用到微积分中的链式法则,即
∂J(W,b;x,y)∂Wij(l)=∂J(W,b;x,y)∂ai(l)∂ai(l)∂zi(l)∂zi(l)∂wij(l)=a(l)jδ(l+1)i (上面公式可以参考下面的计算过程进行理解,跳过也不影响阅读)
具体推导过程可以参考[一文弄懂神经网络中的反向传播法——BackPropagation],这篇文章详细的介绍了BP算法的每一步骤。
上面的公式中出现了 δ (误差error),所以后续的目的就是求出每层每个node的δ,具体过程如下:
计算δ对于第 nl 层(输出层)的每个输出单元 i ,我们根据以下公式计算残差:
对 l=nl−1,nl−2,……,3,2的各个层,第 l 层的第 i 个节点的残差计算方法如下:
将上面的结果带入权值更新的表达式中便可顺利的执行BackPropagation啦~~~
但是!!!需要注意的是上面式子中反复出现的 f′(z(l)i) ,表示激活函数的导数。这个在刚开始的确困惑到我了,因为视频里老师在演示计算 δ 的时候根本就乘以这一项,难道老师错了?其实不是的,解释如下: 常用的激活函数有好几种,但使用是分情况的:
在线性情况下:f(z) = z 在非线性情况下:(只举一些我知道的例子) sigmoid tanh relu所以这就是为什么老师在视频中没有乘以 f′(z(l)i) 的原因了,就是因为是线性的,求导后为1,直接省略了。
另外sigmoid函数表达式为 f(z)=11+e−z ,很容易知道 f′(z)=−e−z(1+e−z)2=f(z)⋅(1−f(z)) 这也就解释了Coursera网站上讲义的公式是这样的了:
所以现在总结一下BP算法步骤:
进行前馈传导计算,利用前向传导公式,得到 L2,L3,… 直到输出层 Lnl 的激活值。对输出层(第 nl 层),计算: δ(nl)=−(y−a(nl))∙f′(z(nl)) 对于 l=nl−1,nl−2,nl−3,…,2 的各层,计算: δ(l)=((W(l))Tδ(l+1))∙f′(z(l)) 计算最终需要的偏导数值: ∇W(l)J(W,b;x,y)=δ(l+1)(a(l))T,∇b(l)J(W,b;x,y)=δ(l+1)使用批量梯度下降一次迭代过程:
对于所有 l ,令 ΔW(l):=0,Δb(l):=0 (设置为全零矩阵或全零向量)对于 i=1 到 m , 使用反向传播算法计算 ∇W(l)J(W,b;x,y) 和 ∇b(l)J(W,b;x,y) 。 计算 ΔW(l):=ΔW(l)+∇W(l)J(W,b;x,y) 。 计算 Δb(l):=Δb(l)+∇b(l)J(W,b;x,y) 。更新权重参数: W(l)=W(l)−α[(1mΔW(l))+λW(l)]b(l)=b(l)−α[1mΔb(l)]本小节演示了具体如何操作BP,不再赘述。
具体可参考Coursera讲义。