您的位置:首页 > 理论基础 > 计算机网络

Deep Learning 学习笔记(三):神经网络反向传播算法推导

2015-02-08 20:04 711 查看

0. 前言

茫然中不知道该做什么,更看不到希望。

偶然看到coursera上有Andrew Ng教授的机器学习课程以及他UFLDL上的深度学习课程,于是静下心来,视频一个个的看,作业一个一个的做,程序一个一个的写。N多数学的不懂、Matlab不熟悉,开始的时候学习进度慢如蜗牛,坚持了几个月,终于也学完了。为了避免遗忘,在这里记下一些内容。由于水平有限,Python也不是太熟悉,英语也不够好,有错误或不当的地方,请不吝赐教。

神经网络有非常丰富的资料,在这里只是记录自己学习的过程、内容和心得。

1. 神经网络的表示

首先用一张图来表示多层神经网络的结构,如图1。



图1 神经网络结构图

1.1 符号说明

输入向量x=[x1,x2,…,xn0]T是一个列向量。

标签(label)y未在图中表示,它和x有相同维度。

nl为第L层的神经节点个数。

W(l)∈Rnl×nl−1为第L层的权重矩阵。截距b(l)∈Rnl×1未在图上表示。

Z(l)表示第L层的活动水平向量,

Z(l+1)i=Σnlj=1(W(l+1)ij×a(l)j+b(l+1)i),a(0)即为输入向量x

Z(l+1)=W(l+1)×a(l)+b(l+1),矢量化表示。

f(∙)为激活函数,可以是sigmoid、tanh等。

a(l)=f(Z(l))为第L层的激活向量,即输出向量。

若l层为输出层,定义假设函数hW,b(x)=a(l)

1.2 反向传播算法

神经网络的反向传播算法是建立在最速梯度下降基础上的,希望误差的能量函数最小。对于输入向量x和标签y,定义平方误差能量函数如下:

J(W,b;x,y)=12∥∥hW,b(x)−y∥∥2=12∑i=1nl(a(l)i−yi)2

我们要找到一个合适的W和b,使J(W,b;x,y)最小,即

minimizeW,bJ(W,b;x,y)(1)

使用梯度下降法:

W=W−α∇W(2)

b=b−α∇b(3)

α为学习率。

下面通过推导求∇W,∇b。

∂J∂W(l)ij=∂J∂Z(l)i∂Z(l)i∂W(l)ij=∂J∂a(l)i∂a(l)i∂Z(l)ia(l−1)j=∂J∂a(l)if′(Z(l)i)a(l−1)j(4)

∂J∂b(l)i=∂J∂Z(l)i∂Z(l)i∂b(l)i=∂J∂a(l)i∂a(l)i∂Z(l)i=∂J∂a(l)if′(Z(l)i)(5)

令误差项(大部分教材中,都把误差项分配到l+1层,但从个人编程的角度理解,把它归入到l层更方便)δ(l)i=∂J∂a(l)if′(Z(l)i)(6),代入(4)(5)式,有:

∂J∂W(l)ij=δ(l)ia(l−1)j(7)

∂J∂b(l)i=δ(l)i(8)

或矢量化形式:

∇W(l)=∂J∂W(l)=δ(l)(a(l−1))T(9)

∇b(l)=∂J∂b(l)=δ(l)(10)

其中:

δ(l)=[δ(l)1,…,δ(l)nl]T,a(l−1)∈Rnl−1×1,∇W(l)∈Rnl×nl−1,∇b(l)∈Rnl×1

若l层为输出层,则:

∂J∂a(l)i=∂(∑nlk=112(a(l)k−yk)2)∂a(l)i=a(l)i−yi(11)

则:δ(l)i=∂J∂a(l)if′(Z(l)i)=(a(l)i−yi)f′(Z(l)i)(12)



δ(l)=(a(l)−y)∙f′(Z(l))(13)

(12)式中的“∙”是向量和矩阵中元素相乘运算符。

若l层是隐藏层,我们还需要对∂J∂a(l)i做进一步的处理。函数J是向量Z(l+1)的函数,而它的每个元素又是a(l)i的函数。根据复合函数求导公式,对J求a(l)i的偏导数有:

∂J∂a(l)i=∑j=1nl+1∂J∂Z(l+1)j∂Z(l+1)j∂a(l)i=∑j=1nl+1∂J∂a(l+1)j∂a(l+1)j∂Z(l+1)j∂Z(l+1)j∂a(l)i=∑j=1nl+1∂J∂a(l+1)jf′(Z(l+1)j)W(l+1)ji=∑jnl+1δ(l+1)jW(l+1)ji=(W(l+1)(,i))Tδ(l+1)(14)

代入(6)式,有δ(l)i=(W(l+1)(,i))Tδ(l+1)f′(Z(l)i)(15)

矢量化后有δ(l)=((W(l+1))Tδ(l+1))∙f′(Z(l))(16)

至此推导完成。

1.3 批量学习的函数形式

在上一节中x是一个向量,如果有m个向量,定义输入矩阵X和标签y:

X=[x(1),…,x(i),…,x(m)],y=[y(1),…,y(i),…,y(m)]T

其中x(i)为具有n个特征的列向量,y(i)为表示类别的标量。

代价函数:

J(W,b)=1m∑i=1mJ(W,b;x(i),y(i))=1m∑i=1m12∥∥hW,b(x(i))−y(i)∥∥2

a(0)=X,Z(l)=W(l)×X,a(l)=f(Z(l)),l=1…nl

对于梯度

∇W(l)=1mδ(l)(a(l−1))T

∇b(l)=1m∑i=1mδ(i)

和误差项δ(l)=(W(l))T×δ(l+1)∙f′(Z(l))

1.4 规范化

为了防止过拟合(overfiting),需要对误差函数和W梯度添加L2范式惩罚项。假定网络有L层,

J(W,b)=1m∑i=1m12∥∥hW,b(x(i))−y(i)∥∥2+λ2∑l=1L∑i=1nl∑j=1nl−1(W(l)ij)2

∇W(l)=1mδ(l)(a(l−1))T+λW(l)

2. 算法描述

重复直到收敛{

- 执行前向传播,得到各层的激活值

- 计算最后一层的δ

- 反向传播计算各层δ

- 计算各层W和b的梯度

- 使用梯度下降更新W和b

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐