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

机器学习算法可以看做是对于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 是由于对最后一个矩阵中元素求导得到的,也就是最后一个隐藏层节点的值。若是要对最后一个隐藏层中元素求导,则最后一项应变为对 Θxi xi 求导,因此应得到 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值