吴恩达机器学习 7.神经网络参数的反向传播算法
1.神经网络算法的代价函数
标记方法
神经网络的训练样本有m个
每个包含一组输入x和一组输出信号y
L表示神经网络层数
SIS_ISI表示每层的神经元个数
SlS_lSl表示输出层的神经元个数
SLS_LSL表示最后一层中处理单元的个数
神经网络的分类定义为两种情况:二类分类和多类分类
代价函数
对比逻辑回归问题中的代价函数和神经网络中代价函数
1.在逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量y
2.在神经网络中,我们可以有很多输出变量,我们的hθ(x)h_\theta(x)hθ(x)是一个维度为K的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些
但是二者代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出K个预测,基本上我们可以利用循环,对每一行特征都预测K个不同结果,然后在利用循环在K个预测中选择可能性最高的一个,将其与y中的实际数据进行比较。
正则化的那一项只是排除了每一层θ0\theta_0θ0后,每一层的θ\thetaθ矩阵的和。最里层的循环j循环所有的行(由 sls_lsl+1 层的激活单元数决定),循环i则循环所有的列,由该层(sls_lsl层)的激活单元数所决定。即:hθ(x)h_\theta(x)hθ(x)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行regularization的bias项处理所有参数的平方和。
2.反向传播算法
1.正向传播方法:计算神经网络预测结果时用到,我们从第一层开始正向一层一层进行计算,直到最后一层hθ(x)h_\theta(x)hθ(x)
2.反向传播算法:为了计算代价函数的偏导数
首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层
举例:
假设训练集只有一个样本(x(1),y(1))(x^{(1)},y^{(1)})(x(1),y(1)),我们的神经网络是一个四层的神经网络,其中K=4,SL=4,L=4S_L=4,L=4SL=4,L=4:
从最后一层的误差开始计算,误差是激活单元的预测(a(4))(a^{(4)})(a(4))与实际值(y(k))(y^{(k)})(y(k))之间的误差,(k=1:k)我们用δ\deltaδ来表示误差,
则:δ(4)=a(4)−y\delta^{(4)}=a^{(4)}-yδ(4)=a(4)−y
随后我们用这个误差值来计算前一层的误差:
δ(3)=(Θ(3))Tδ(4)∗g′(z(3))\delta^{(3)}=(\Theta^{(3)})^T\delta^{(4)}*g'(z^{(3)})δ(3)=(Θ(3))Tδ(4)∗g′(z(3))其中g′(z(3)g'(z^{(3)}g′(z(3)是S形函数的导数,g′(z(3)=a(3)∗(1−a(3))g'(z^{(3)}=a{(3)}*(1-a^{(3)})g′(z(3)=a(3)∗(1−a(3)),而(Θ(3))Tδ(4)(\Theta^{(3)})^T\delta^{(4)}(Θ(3))Tδ(4)则是权重导致的误差和
随后继续计算第二层的误差:δ(2)=(Θ(2))Tδ(3)∗g′(z(2))\delta^{(2)}=(\Theta^{(2)})^T\delta^{(3)}*g'(z^{(2)})δ(2)=(Θ(2))Tδ(3)∗g′(z(2))
第一层是输入变量,不存在误差
有了所有误差的误差的表达式后,便可以计算代价函数的偏导数了,假设λ=0\lambda=0λ=0即即我们不做任何正则化处理时有:
明确式子的上下标含义:
lll代表目前所计算的是第几层
jjj代表目前计算层中的激活单元的下标,也将是下一层的第jjj个输入变量的下标。
iii代表下一层中误差单元的下标,是受到权重矩阵中第iii行影响的下一层中的误差单元的下标。
如果我们考虑正则化处理,并且我们的训练集是一个特征矩阵而非向量。在上面的特殊情况中,我们需要计算每一层的误差单元来计算代价函数的偏导数。在更为一般的情况中,我们同样需要计算每一层的误差单元,但是我们需要为整个训练集计算误差单元,此时的误差单元也是一个矩阵,我们用Δij(l)\Delta^{(l)}_{ij}Δij(l)来表示这个误差矩阵。第 lll层的第iii个激活单元受到第jjj个参数影响而导致的误差。
我们的算法表示为
即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。
在求出了Δij(l)\Delta^{(l)}_{ij}Δij(l)之后,我们便可以计算代价函数的偏导数了,计算方法如下:
Dij(l):=1mΔij(l)+λΘij(l)ifj≠0D^{(l)}_{ij}:=\frac{1}{m}\Delta^{(l)}_{ij}+\lambda\Theta^{(l)}_{ij} if j\not=0Dij(l):=m1Δij(l)+λΘij(l)ifj=0
Dij(l):=1mΔij(l)ifj=0D^{(l)}_{ij}:=\frac{1}{m}\Delta^{(l)}_{ij} if j=0Dij(l):=m1Δij(l)ifj=0
在Octave 中,如果我们要使用 fminuc这样的优化算法来求解求出权重矩阵,我们需要将矩阵首先展开成为向量,在利用算法求出最优解后再重新转换回矩阵。
假设我们有三个权重矩阵,Θ1\Theta1Θ1,Θ2\Theta2Θ2 和
Θ3\Theta3Θ3,尺寸分别为 1011,1011 和1*11
thetaVec = [Theta1(:) ; Theta2(:) ; Theta3(:)]...optimization using functions like fminuc...
Theta1 = reshape(thetaVec(1:110, 10, 11);
Theta2 = reshape(thetaVec(111:220, 10, 11);
Theta1 = reshape(thetaVec(221:231, 1, 11);
3.反向传播算法的直观理解
为了更好地理解反向传播算法,我们先来仔细研究一下前向传播的原理:
前向传播算法:
反向传播算法:
4.实现:展开参数
这里将详细介绍使用反向传播算法计算代价函数的导数的一个细节的实现过程:怎样把你的参数从矩阵展开成向量,以便我们在高级最优化步骤中的使用需要
5.梯度检验
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价函数值看上去在不断减小,但最终的结果可能并不是最优解。
为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法(双侧差分法)的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的θ\thetaθ ,我们计算出在θ−ϵ\theta -\epsilonθ−ϵ 处和 θ+ϵ\theta +\epsilonθ+ϵ 的代价值(ϵ\epsilonϵ是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在θ\thetaθ处的代价值。
Octave 中代码如下:
gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps)
当θ\thetaθ是一个向量时,我们则需要对偏导数进行检验。因为代价函数的偏导数检验只针对一个参数的改变进行检验,下面是一个只针对θ1\theta_1θ1进行检验的示例
最后我们还需要对通过反向传播方法计算出的偏导数进行检验
根据上面的算法,计算出的偏导数存储在矩阵Dij(l)D^{(l)}_{ij}Dij(l) 中。检验时,我们要将该矩阵展开成为向量,同时我们也将 θ\thetaθ矩阵展开为向量,我们针对每一个θ\thetaθ 都计算一个近似的梯度值,将这些值存储于一个近似梯度矩阵中,最终将得出的这个矩阵同Dij(l)D^{(l)}_{ij}Dij(l)进行比较。
6.随机初始化
优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非0的数,结果也是一样的。
我们通常初始参数为正负ε之间的随机值,假设我们要随机初始一个尺寸为10×11的参数矩阵,参数为正负ε之间的随机值,代码如下:
Theta1 = rand(10, 11) * (2*eps) – eps
7.组合
小结一下使用神经网络时的步骤:
1.网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。
注意:
第一层的单元数即我们训练集的特征数量。
最后一层的单元数是我们训练集的结果的类的数量
如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。我们真正要决定的是隐藏层的层数和每个中间层的单元数。
2.训练神经网络
参数的随机初始化
利用正向传播方法计算所有的hθ(x)h_\theta(x)hθ(x)
编写计算代价函数 J的代码
利用反向传播方法计算所有偏导数
利用数值检验方法检验这些偏导数
使用优化算法来最小化代价函数
吴恩达机器学习 7.神经网络参数的反向传播算法相关推荐
- 花书+吴恩达深度学习(三)反向传播算法 Back Propagation
目录 0. 前言 1. 从 Logistic Regression 中理解反向传播 2. 两层神经网络中单个样本的反向传播 3. 两层神经网络中多个样本的反向传播 如果这篇文章对你有一点小小的帮助,请 ...
- 入门机器学习(八)--神经网络参数的反向传播算法
1. 代价函数(Cost Function) 假设我们拥有一个如下图所示的神经网络,一共有四层,分别是一层输入层,两层隐藏层,一层输出层.下面定义几个变量的意义: m:训练样本的个数,共有m个样本 L ...
- 吴恩达机器学习4——神经网络
吴恩达机器学习4--神经网络 1. 非线性假设 2. 神经网络算法 2.1 神经元 2.2 神经网络 3. 神经网络算法实例 3.1 例子1:单层神经网络表示逻辑运算 3.2 例子2 4. 多分类 1 ...
- 吴恩达机器学习[9]-神经网络学习
神经网络学习 Neural Network 非线性假设 Non-linear hypotheses 神经元与大脑 Neurons and the brain 模型展示1 Model represent ...
- 吴恩达机器学习笔记 —— 10 神经网络参数的反向传播算法
http://www.cnblogs.com/xing901022/p/9350271.html 本篇讲述了神经网络的误差反向传播以及训练一个神经网络模型的流程 更多内容参考 机器学习&深度学 ...
- 吴恩达《机器学习》课程总结(8)_神经网络参数的反向传播算法
Q1代价函数 (1)假设神经网络的训练样本有m个,每一个包含一组输入x和一组输出信号y,L表示神经网络的层数,Sl表示每一层的神经元个数,SL代表最后一层中处理单元的个数. 则代价函数为(同样不对θ0 ...
- 吴恩达机器学习:神经网络 | 反向传播算法
上一周我们学习了 神经网络 | 多分类问题.我们分别使用 逻辑回归 和 神经网络 来解决多分类问题,并了解到在特征数非常多的情况下,神经网络是更为有效的方法.这周的课程会给出训练 神经网络 所使用的 ...
- 吴恩达机器学习5——神经网络的学习
神经网络的学习 1. 代价函数和反向传播 1.1 代价函数 1.2 反向传播算法 1.3 反向传播算法的直观理解 2. 神经网络算法技巧 2.1 参数展开技巧 2.2 梯度检验 2.3 随机初始化参数 ...
- 吴恩达机器学习 6.神经网络学习
一.非线性假设 学习了线性回归和逻辑回归,二者都有的缺点有:当特征太多时,计算的负荷会非常大. 假如: 当使用x1,x2x_1,x_2x1,x2的多项式进行预测时,我们可以应用的很好. 之前有了解 ...
最新文章
- 深入浅出解释FFT(六)——深入理解fft变换
- XCTF-Reverse:re1
- 蓝桥练习-算法训练 P0505
- linux lvm 简介之二 扩充空间
- 利用Certbot工具快速给网站部署Let's Encrypt免费SSL证书
- System.Configuration命名空间下的关键类
- ROS安装过程和配置过程(可能出现的问题及解决方法)
- 判断一颗树是否为完全二叉树
- 微信扫一扫直接打开手机外部浏览器
- c语言文件操作——复制文件
- OpenCV 图像编解码操作【imencode/imdecode】使用
- 利用ArcGIS Python批量拼接遥感影像(arcpy batch processing)
- 前端基础——html5新增标签
- 基于Matlab使用开普勒运动模型跟踪空间碎片(附源码)
- supercharge快充_IQOO、小米快充技术对比,27W快充和44W快充,到底哪家强
- 使用SYUGI快速创建类似于Office XP/2003 界面风格的应用程序
- 昨晚 win7 盗版 黑屏了
- 百度统计之百度代码引用
- Destroying assets is not permitted to avoid data loss.解决思路
- 从零开始创建自己的区块链应用(JAVA版)
热门文章
- 软工小学期实践PART ONE
- Codeforces Gym 100338H High Speed Trains 组合数学+dp+高精度
- codevs 1191 树轴染色 线段树区间定值,求和
- 基于Microsoft Translator API的vim翻译插件
- AutoIT: 开发界面结合GUI automation和Watir Automation
- 跟我学spring3 电子书下载(完)
- 解决行内块元素(inline-block)之间的空格或空白问题
- Oracle无法使用EM解决方案
- 禁止chrome浏览器自动填充表单的解决方案
- vue搭建cli脚手架环境(出现问题及解决,主要是node版本低)