博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
吴恩达机器学习笔记-反向传播算法练习
阅读量:6172 次
发布时间:2019-06-21

本文共 1920 字,大约阅读时间需要 6 分钟。

直观感受反向传播的概念

上篇文章讲述了神经网络的反向传播算法的基本概念,现在来详细的对此算法进行一些讲解。

回忆一下神经网络的代价函数:

如果我们只考虑一个简单的只有一个输出单元的情况,即k=1,那么代价函数则变成:

直观的说,$\delta_j^(l)$项表示在第l层中第j个单元的误差。更正式的说,$\delta$的值实际上是代价函数的导数。

$$ \delta_j^(l) = \frac{\partial}{\partial z_j^(l)}cost(t) $$

由于函数的导数即是其切线的斜率,因此其切线越陡则说明计算的误差越大。每一个神经元的误差都与后面连接的神经元有关,如下图计算:

其中:

$$ \delta_2^(2) = \Theta_{12}^(2)\delta_1^(3) + \Theta_{12}^(2)\delta_1^(3) $$

$$ \delta_2^(3) = \Theta_{12}^(3)\delta_1^(4) $$

参数展开

使用神经网络时,我们处理的一组矩阵:$\Theta^(1)$,$\Theta^(2)$,$\Theta^(3)$...,为了使用最优化函数比如"fminuc()",我们需要将所有的元素展开将其放入一个长向量中:

$$ thetaVector = [Theta1(:);Theta2(:),Theta(3);] $$

比如说如果Theta1的维度是1011,Theta2是1011,Theta3是1*11,那我们通过展开后的向量来得到原始的矩阵的话,需要如下的方法:

$$ Theta1 = reshape(thetaVector(1:110),10*11) \\ Theta2 = reshape(thetaVector(111:220),10*11) \\ Theta3 = reshape(thetaVector(221:231),1*11) \\ $$

总结的话就直接看吴恩达老师的笔记:

梯度校验

梯度校验是用来确保我们做的反向传播算法是否正确,这里假设代价函数的导数为:

$$ \frac{\partial}{\partial \Theta}J(\Theta) \approx \frac{J(\Theta+\epsilon) - J(\Theta - \epsilon)}{2\epsilon} $$

那么在多个$\theta$的矩阵,则可以得到下面近似于关于$\Theta$的导数:

$$ \frac{\partial}{\partial \Theta}J(\Theta) \approx \frac{J(\Theta_1,... \Theta_j+\epsilon,...,\Theta_n) - J(\Theta_1...,\Theta_j - \epsilon,... \Theta_n)}{2\epsilon} $$

一般取$\epsilon = 10^{-4}$比较合适,太小了会导致一些计算问题。因此我们只是在$\Theta$矩阵中加上或减去$\epsilon$,在octave中代码如下所示:

我们已经计算过deltaVector,因此计算出gradApprox后就可以判断是否gradApprox ≈ deltaVector。一旦计算出反向传播算法是准确的,就不需要再继续计算gradApprox了,因为计算gradApprox的过程是很缓慢的。

随机初始化参数

将所有的权重初始化为0不适用于神经网络,那样反向传播时,所有节点将重复更新为相同的值。因此,我们可以使用以下方法随机初始化我们的Θ矩阵的权重:

因此,这里初始化每个$\Theta_{ij}^(l)$为$[-\epsilon,\epsilon]$之间的随机值,使用上述公式保证我们得到所需的界限,相同的程序使用于所有的$\Theta$。以下代码可以用来进行实验:(Theta1,Theta2,Theta3的维度同上面一样,这里的epsilon和上面梯度校验的无关):

Theta1 = rand(10,11) * (2*INIT_EPSILON) - INIT_EPSILON;Theta2 = rand(10,11) * (2*INIT_EPSILON) - INIT_EPSILON;Theta3 = rand(1,11) * (2*INIT_EPSILON) - INIT_EPSILON;

总结

这里就直接使用原课程的笔记,懒得写了,写了也只是把这个翻译一遍不如直接看原版笔记。这一周的内容的确有点难度了,需要一定时间消化。

以上,为吴恩达机器学习第五周后半部分内容。

转载地址:http://yhtba.baihongyu.com/

你可能感兴趣的文章
Linux光纖卡配置,磁盤掛載,多路徑設置
查看>>
ROS探索总结(四)——简单的机器人仿真
查看>>
datatable 添加同一类型的datatable,字典添加数据
查看>>
(转)libvirt 部分API 介绍
查看>>
在WIN10下搭建Robot Framework环境
查看>>
船舶行业钢板堆垛管理特色和创新管理思路
查看>>
C++版 - Leetcode 69. Sqrt(x) 解题报告【C库函数sqrt(x)模拟-求平方根】
查看>>
《当程序员的那些狗日日子》(四十一)卑微的角色
查看>>
SQL Server 查看identity值的几种方法。
查看>>
auto uninstaller (autodesk 修复大师) 简体中文版 更新下载地址
查看>>
MySQL 先按某字段分组,再取每组中前N条记录
查看>>
Windows 2008 r2 AD域自定义属性
查看>>
Eclipse - 循环cin的输出怎样终止
查看>>
shell文本过滤编程(十一):paste命令
查看>>
关于spring项目报错:找不到元素 'beans' 的声明的解决办法
查看>>
genymotion device manager列表没有
查看>>
echarts渐变效果
查看>>
superF12
查看>>
matlab练习程序(力场变换)
查看>>
tomcat启动时 myeclipse控制台中文乱码
查看>>