吴恩达机器学习笔记—神经网络学习(2)

上一篇博文,已经直观地了解了神经网络结构及计算假设函数过程。我们这节课主要学习,给定训练集,如何拟合神经网络的参数。

1、代价函数

以神经网络在分类中的应用为例,二元分类只有一个输出单元,k元分类对应有k个输出单元(k>2),这与我们之前在学习逻辑回归的时候,讲到的多对多分类时,每一类别需要一个分类器,这是一个输出单元看作一个分类器,K类需要K个分类器,即K个输出单元。神经网络输出的是一个K维的实数向量,当神经网络为二分类时输出的是一个实数。

984a1d3992d6452b086833f5c7301392f08.jpg

刚刚学习了,神经网格的每个输出单元看似逻辑回归的一个分类器,如下图我们回顾一下逻辑回归的代数函数,J由蓝色线标注的拟合项和“+”后面的正则化项组成

4a36af7c73985357ad3154410f62954ecc4.jpg

而神经网络可能由不止一个逻辑回归输出单元组成,它的代数函数改如何表示呢?这时神经网络输出的是一个K维的实数向量,i表示输出单元的下标,它的拟合目标项和正则化增加K维,具体如下

0d64f9f7586d6ac0532d22b0e56a812b395.jpg

2、反向传播算法

1)梯度下降求解最小化J,我们需要计算J和偏导项fb646b7118a61e8d03eb78bb12d05274649.jpg,主要是偏导项的计算。

a1f187c70950c208c6d21d59f67fe31d2d9.jpg

2)我们先来回顾一下什么是“前向传播”,如下图,有个单训练样本,从输入单元开始往下计算,求出每个神经元的激活值,直到计算出h(x),这样称为“前向传播”。前向传播可以计算出神经网络中每个神经元的激活值。

5691618aa7b57828b942d19b97e5a6e2402.jpg

为了计算偏导数项,采用了一种叫做反向传播(Backpropagation)的算法。我们知道了每个神经元的激活值,可用真实值和激活值求得误差项3873314e301e57ce2aa2afcef69d99ac6b0.jpg。如下图,求得第四层的某个节点神经元的误差项为1da50945df79fe5e05b2919c93085771e7f.jpg,如果把一个层当成向量的话,误差层也可以视为一个k向量587af92dbafe8e99abaf467d11a22c42a37.jpg(k等于输出层的神经单元数)。由e35a4f9be45e633a77ed65b4a8a849f565f.jpg可以反向求出6297eeab8990a8eccf1221558a533c41fb8.jpg,依次类推求出ab3878e5291d7a3aecb340c222fa3d13b49.jpg等等(我们不对输入层考虑误差项)。这里不做详细推导

f67b7e3715791e7243fa3dadd08e890ca79.jpg

3)当我们大量的训练样本时,是这样做的:3728765558e493309c65d7a9b78aa18c5f9.jpg为大写的be27dce958090d56f4bcc37afb076c8712e.jpg,将每个误差项等于0去计算偏导项,这些误差b0b1dc2dcf6664df1fcde63a5b3cbeb731d.jpg作为累加项,用来计算偏导数,计算过程如下图:最后得到4e663ffba30fe62044342f95522c836698a.jpg,这样就可以用反向传播(Backpropagation)的算法算出代价函数对于每个参数的偏导项了。因为这推导过程比较复杂而且里面有很多细节的东西,这里只要知道这么一个计算过程就好了,不建议去推导。

9cd9221d06db40522beb7b1ced7d13095e7.jpg

3、理解反向传播

eff16c05d28ad83a0299dd12b5851af938f.jpg

某一节点神经元的造成误差,实际为该节点的cost函数在对激活值a的误差,也是cost函数对特征值z的偏导数。由1da50945df79fe5e05b2919c93085771e7f.jpg,可以得到第l层的误差项。跟像“前向传播”一样,第l-1层项的激活值向第l层传播时,有一参数41abbd61ab92ff0aba11688f378bfe36ff4.jpg,所以有87fbc37bff21aa59b1edce25cd69340ee7d.jpg,同理可以往前递推,求得各神经元的误差项。

50e31a78d80badf2b3706cc53ae72898f3a.jpg

使用注意:展开参数,把矩阵转换成向量,以便我们在高级最优步骤中使用。

4、梯度检测

反向传播算法含有很多细节,实现比较困难,并且会存在缺点:会出现一些微妙的BUG,当它和梯度下降或者其它算法一起工作时,代价函数J一直在下降看起来运行正常,但是你最后得到的神经网络其误差将会比无BUG情况下,高出一个量级。并且你很难会察觉这个BUG的存在。梯度检测就是一种用于解决反向传播算法用于梯度下降等方法时,出现这样的BUG的算法。能完全保证你的前向传播和反向传播的正确性。

1)数值导数估计

当参数为实数时,某点代价函数对参数的导数为2691070572292d6f598f846dd0918193caf.jpg

8da35d2cf052a5f46fa678a411a8f904258.jpg

当参数组为向量时,我们可以用同样的方法来估计任意点代价函数对参数偏导的估计:

5c8afd64e4834359fb7b3cda54dc02315e4.jpg

2)梯度检验的思想

梯度检验主要是根据反向传播计算出来的偏导项跟我们用数值导数估计计算出来的偏导项进行比较,保证它们的值非常相近,说明反向传播算法正确。但是由于数值导数估计的计算量巨大,我们验证完算法正确性之后,记得关闭梯度验证的代码,不然运算速度回非常慢。

67c870ffe1e519e3235013fe8634b68b4cc.jpg

5、随机初始化

我们在求解最优参数时,我们得先初始化,即给定参数组一个初始值。很多时候我们都是设为零,但是在神经网络中,初始化参数组都设为0的话,都在计算相同的特征,最后神经网络输出同一个特征,阻止了神经网络去学习有趣的东西,会产生高度冗余现象。所以引入了随机初始化的思想,用随机函数生成参数组。

49e0d6ff71cb326bbb41b3cf024311a5b0c.jpg

6、整合过程

1)选择模型架构:模型架构包括三层(输入层、隐藏层和输出层)

我们选择的时候需要注意的是:输入层的神经元由特征数量决定,输出层的神经元数由类别数量决定。隐藏层的数量是架构选择的主要变动选择,一般来说隐藏层越多模型效果越好,但计算量越大。可以根据每个人的习惯很侧重点来选择隐藏层的数量。

115430d7e742a1a23c8d64202d7252a78aa.jpg

2)训练模型

①随机选择初始参数,初始参数为很小接近于0的值

②执行前向传播,计算该神经网络模型任意特征x下得到的y(即a3550aa7ec6f79fd229aefb8f280e8dc73f.jpg)

③计算代价函数8852ce2aa48e3be3a3e34ce4e7221465c30.jpg

④反向传播算法计算偏导项fcbda723271e44284c3bbd07f3e96f5b98c.jpg

⑤梯度检验(验证反向传播算法的正确性)

⑥将反向传播算法和梯度下降或高级优化算法结合

 

转载于:https://my.oschina.net/u/3767735/blog/1842953

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值