【学习笔记3】Neural Network --BP方法

来源:互联网 发布:ubuntu 中科大源 编辑:程序博客网 时间:2024/05/19 04:02

机器学习算法可以看做是对于Logistic Regression的一种升级版,其主要的思想是构建分层的神经网络结构,层与层之间以非线性映射的方法进行连接,通过这种多层的非线性关系来拟合复杂的Decision Boundary。
一个神经网络至少包含输入层和输出层,可以有一个或多个隐藏层。隐藏层就是处于输入层和输出层之间、对外不可见的层。一般来讲,隐藏层越多,学习的效果越好,但是相应的学习计算代价就越大。
对于一个神经网络,其学习参数的个数是由层数和每层中节点个数决定的。每相邻两层有一个参数矩阵Θ,若前一层有节点m个(不包含bias节点),当前层由节点n个(也不含bias节点),那么Θ就是一个n×(m+1)的矩阵。一个有L层的神经网络需要学习L1个参数矩阵。在这个课程里吴老师主要介绍了如何使用Backpropagation方法来进行学习。
首先给出模型,输入为一个m×k 的矩阵X,代表有m 个样本,k 个特征维度。取其中一个行向量(一个样本)xi ,在开头添加一个元素1,并转为列向量,记为a1 。那么根据a1 计算得到的第二层的值a2 可以表示为

a2=hΘ(a1)=g(Θa1)
其中a2 并不包含bias分量,在计算下一层值时需要额外添加;而g(z) 表示一个非线性函数,本课程中采用的是sigmoid函数
g(z)=11+ez

Cost Function的定义与Logistic Regression相似,不过需要对k 个输出同时求和:
J(Θ)=1mi=1mj=1k(yi,jlog(hΘ(xi))(1yi,j)log(1hΘ(xI)))

根据之前的经验,有了Cost Function,只要再分别计算出它关于每个参数θ 的偏导数就可以使用Gradient Decent或类似的优化方法来进行学习了。这里计算偏导数使用的是Backpropagation算法。
算法的思想是,如果对于每一个参数直接求导则运算量太大,希望通过递推的方式来求得所有的偏导数。通过分析可以发现,hΘ(x)=hΘ(x)(1hΘ(x))x ,带入J(Θ) 可以得到对输出层对应的参数矩阵Θ
J(Θ)=1mi=1mj=1k(hΘ(xi)yi,j)xi
其中最后一个xi 是由于对最后一个矩阵中元素求导得到的,也就是最后一个隐藏层节点的值。若是要对最后一个隐藏层中元素求导,则最后一项应变为对Θxixi 求导,因此应得到xi(1xi)Θai,这里ai 是倒数第二个隐藏层节点的值。
由此,对倒数第二个参数矩阵求导的结果应为:
J(Θ)=1mi=1mj=1k(hΘ(xi)yi,j)xi(1xi)Θai
若要继续对之前的Θ 求导,那么可以根据这个思路继续对ai 求导即可。总结规律可以发现,如果我们记
J(Θi)=1mi=1mj=1kδi,jxi
,那么就有
δi1,sl=δi,jxi(1xi)Θi
根据这个就可以用递推的方式得到所有的J(Θ)
这就是Backpropagation的主要思想。除此之外,还可以使用数值方法计算每一个J(Θ) ,即
J(θ)=J(θ+ϵ)J(θϵ)2ϵ
这里取ϵ 足够小(如104),对于第一遍使用BP方法得到的J(Θ) 进行验证,可以保证运算的正确性。这就是Gradient Checking,但是当确定正确之后应当将其关闭,因为数值方法运算非常非常慢。
还有一个需要注意的问题就是在选择初始化Θ 的时候,不能使用全部相同的值,否则会导致神经网络节点之间没有差异性,从而学习失败。一般使用随机矩阵的方法来生成,如init_theta = 2*epsilon*rand(m,n) - epsilon。还有就是做Regularization的时候λ 的取值有一个经验公式,即6nm+1
使用了Octave中的fmincg方法进行学习,得到了不错的效果。
有机会要研究一下神经网络背后的原理。

0 0
原创粉丝点击