继续是机器学习课程的笔记,这节课会继续介绍神经网络的内容,上一节主要是基本的介绍,以及模型表示,而本节会介绍代价函数,反向传播算法等。

神经网络代价函数

 首先是有如下一个神经网络,这里将首先介绍一些标记符号的意思。
  • L 代表一个神经网络中的层数
  • SlS_l 代表第ll层的处理单元(包括偏置单元)的个数
  • SLS_L 代表最后一层中处理单元的个数
  • K 代表我们希望分类的类的个数,与SLS_L相等

    所以上图显示的神经网络是一个4层,输出结果也是4个结果,也就是K=4,SL=S4S_L=S_4。

    在逻辑回归归一化中,我们的代价函数如下所示:

    J(θ)=−1m[∑i=1my(i)loghθ(x(i))+(1−y(i)log(1−hθ(x(i)))]+λ2m∑j=1nθ2j

    J(\theta) = -\frac{1}{m} [\sum_{i=1}^my^{(i)}logh_\theta(x^{(i)})+(1-y^{(i)}log(1-h_\theta(x^{(i)}))] + \frac{\lambda}{2m} \sum_{j=1}^n \theta_j^2

这里我们只有一个输出变量,也称为标量(scalar),也就是一个因变量yy.

但是在神经网络中,可以有很多输出变量,这里的hθ(x)h_\theta(x)是一个维度为K的向量,并且训练集中的因变量也是同样维度的一个向量,因此,得到的代价函数会比逻辑回归更加复杂一些,如下所示:

J(θ)=−1m[∑i=1m∑k=1Ky(i)klog(hθ(x(i)))k+(1−y(i)klog(1−(hθ(x(i)))k)]+λ2m∑l=1L−1∑i=1sl∑j=1sl+1(θ(l)ji)2

J(\theta) = -\frac{1}{m} [\sum_{i=1}^m \sum_{k=1}^K y_k^{(i)}log(h_\theta(x^{(i)}))_k+(1-y_k^{(i)}log(1-(h_\theta(x^{(i)}))_k)] + \frac{\lambda}{2m} \sum_{l=1}^{L-1} \sum_{i=1}^{s_l} \sum_{j=1}^{s_l+1} (\theta_{ji}^{(l)})^2
上述式子归一化那项中排除了每一层的 θ0\theta_0,同时最里层的循环j循环所有的行(由 sl+1s_l+1层的激活单元数决定),循环i则循环所有的列,由该层( sls_l层)的激活单元数所决定。

反向传播算法

在上一节中介绍了正向传播方法来计算神经网络的输出结果,现在需要计算代价函数的偏导数∂∂θ(l)ijJ(θ)\frac{\partial}{\partial \theta_{ij}^{(l)}}J(\theta),需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层层反向求出各层的误差,直到倒数第二层。

下面以一个开头给出的4层神经网络来说明反向传播算法。
假设训练集只有一个实例(x(1),y(1))(x^{(1)},y^{(1)}),使用一个四层的神经网络,其中,K=4,SL=4S_L=4,L=4。

从最后一层的误差开始计算,误差δ\delta是激活单元的预测a(4)ka_k^{(4)}与实际值yky_k之间的误差,即δ(4)=a(4)−y\delta^{(4)}=a^{(4)}-y,这里是使用向量化表示,所以不需要使用下标k。

接着利用这个误差值计算前一层,也就是第三层的误差:

δ(3)=(θ(3))Tδ(4).∗g′(z(3))

\delta^{(3)} =(\theta^{(3)})^T\delta^{(4)}.*g^{\prime}(z^{(3)})
其中 g′(z(3))g^{\prime}(z^{(3)})是S形函数的导数, g′(z(3))=a(3).∗(1−a(3))g^{\prime}(z^{(3)})=a^{(3)}.*(1-a^{(3)}),而 (θ(3))Tδ(4)(\theta^{(3)})^T\delta^{(4)}是权重导致的误差的和。

下一步就是继续计算第二层的误差:

δ(2)=(θ(2))Tδ(3).∗g′(z(2))

\delta^{(2)} =(\theta^{(2)})^T\delta^{(3)}.*g^{\prime}(z^{(2)})
由于第一层是输入变量,不存在误差,我们有了所有的误差的表达式后,便可以计算代价函数的偏函数了,假设 λ=0\lambda=0,即不做任何归一化处理时,有:

∂∂θ(l)ijJ(θ)=a(l)jδ(l+1)i

\frac{\partial}{\partial \theta_{ij}^{(l)}}J(\theta)=a_j^{(l)}\delta_i^{(l+1)}

如果考虑归一化处理,并且训练集是一个特征矩阵而非向量。在上述的特殊情况中,是需要计算每一层的误差单元来计算代价函数的偏导数。而在更为一般的情况中,同样需要计算每一层的误差单元,但是更需要为整个训练集计算误差单元,此时的误差单元就是一个矩阵。使用△(l)ij\triangle_{ij}^{(l)}来表示这个误差矩阵,第ll层的第ii个激活单元受到第jj个参数影响而导致的误差。

算法如下所示:

即首先是用整向传播算法计算出每一层的激活单元,利用训练集的结果和神经网络预测的结果求出最后一层的误差,再利用该误差使用反向传播算法计算出直至第二层的所有误差。

求出了△(l)ij\triangle_{ij}^{(l)}之后,我们便可以计算代价函数的偏导数了,计算方法如下:

D(l)ij=1m△(l)ij+λθ(l)ijif j≠0D(l)ij=1m△(l)ijif j=0

D_{ij}^{(l)}=\frac{1}{m}\triangle_{ij}^{(l)}+\lambda \theta_{ij}^{(l)} \quad if\ j \neq 0 \\ D_{ij}^{(l)}=\frac{1}{m}\triangle_{ij}^{(l)} \qquad \qquad if\ j = 0

梯度检验

当对一个比较复杂的模型,如神经网络,使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在减小,但最终的结果可能并不是最优解。

为了避免这样的问题,我们将采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。

对梯度估计采用的方法是在代价函数上沿着切线的方向选择两个非常近的点然后计算两个点的平均值用以估算梯度。也就是对于某个特定的θ\theta,我们计算出在θ−ϵ\theta-\epsilon处和θ+ϵ\theta+\epsilon的代价值(ϵ\epsilon是一个非常小的值,通常选取0.001),然后求两个代价的平均,用以估算在θ\theta处的值,如下图所示:

当θ\theta是一个向量时,我们则需要对偏导数进行检验,因为代价函数的偏导数检验只针对一个参数的改变进行检验,即如下所示,下面是一个只针对θ1\theta_1进行检验的示例:

∂∂θ1=J(θ1+ϵ,θ2,θ3,…,θn)−J(θ1−ϵ,θ2,θ3,…,θn)2ϵ

\frac{\partial}{\partial \theta_1}=\frac{J(\theta_1+\epsilon,\theta_2,\theta_3,\ldots,\theta_n)-J(\theta_1-\epsilon,\theta_2,\theta_3,\ldots,\theta_n)}{2\epsilon}

然后需要通过反向传播算法计算出的偏导数进行检验,当两者比较接近就说明运行正确。

这里有几点需要注意的:

  • 在反向传播中计算出J(θ)J(\theta)对θ\theta的导数D,并组成向量
  • 用梯度检验法计算大概的梯度gradApprox=J(θ+ϵ)−J(θ−ϵ)2ϵgradApprox=\frac{J(\theta+\epsilon)-J(\theta-\epsilon)}{2\epsilon}
  • 判断上述两者是否相同或者接近
  • 最重要的一点是,当需要使用神经网络学习的时候,必须停止使用梯度检验,否则会使得学习速度非常慢

随机初始化

对于梯度下降算法和其他优化算法都是需要初始的参数。在之前逻辑回归中,对于θ\theta是初始化为0,这样做是对逻辑回归是可行的。但是对于神经网络却是不可行的,如果我们令所有的初始参数都为0,这意味着第二层的所有激活单元都会有相同的值。同理,如果将所有参数初始化为同一个非0的参数,结果也是一样的。

因此,我们通常初始参数为[−ϵ,ϵ][-\epsilon,\epsilon]的随机值。

小结

这里小结下使用神经网络时的步骤:

网络结构:

第一件事要做的是选择网络结构,即选择多少层以及决定每层分别有多少个单元。

  • 第一次的激活单元数就是训练集的特征数量
  • 最后一层的激活单元数是训练集的结果的类的数量
  • 如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好

所以我们真正要决定的是隐藏层的层数以及其单元数。

训练神经网络

  • 权重随机初始化
  • 使用正向传播方法计算所有的hθ(x)h_\theta(x)
  • 编写计算代价函数J(θ)J(\theta)的代码
  • 使用反向传播算法计算所有的偏导数
  • 使用梯度数值检验方法检验这些偏导数
  • 使用梯度下降算法或其他优化算法来最小化代价函数

[机器学习笔记]Note7--神经网络:学习相关推荐

  1. 吴恩达机器学习笔记 —— 9 神经网络学习

    http://www.cnblogs.com/xing901022/p/9344621.html 本章讲述了神经网络的起源与神经元模型,并且描述了前馈型神经网络的构造. 更多内容参考 机器学习& ...

  2. 吴恩达机器学习笔记week8——神经网络 Neutral network

    吴恩达机器学习笔记week8--神经网络 Neutral network 8-1.非线性假设 Non-linear hypotheses 8-2.神经元与大脑 Neurons and the brai ...

  3. 机器学习笔记之集成学习(四)Gradient Boosting

    机器学习笔记之集成学习--Gradient Boosting 引言 回顾: Boosting \text{Boosting} Boosting算法思想与 AdaBoost \text{AdaBoost ...

  4. 机器学习笔记-人工神经网络(artificial neural networks)

    目录 人工神经网络(ANN) 引言 感知器 什么是感知器? 感知器的例子 权重和阈值 多层前馈神经网络 网络结构 正向传播 反向传播(Error Back Propagation,BP算法) ​ 后话 ...

  5. 机器学习笔记(五)神经网络

    5.神经网络 5.1神经元模型 神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应.对这句话的理解,简单提要下,主角是简单单元(输入单 ...

  6. [机器学习笔记] Note1--机器学习简介

    阅读本文大约需要 2 分钟 本文结构: 什么是机器学习 监督学习(Supervised Learning) 非监督学习(Unsupervised Learning) 课程小结 这是学习 Andrew ...

  7. 机器学习笔记-多分类学习,类别不平衡,决策树

    读书笔记 多分类学习 基本思想:拆解法:将多分类任务拆解为若干个二分类任务求解,先对这些问题经拆分,为拆分出的每个二分类任务训练一个分类器,测试时,对这些分类器的预测结果进行集成以获得最终的多分类结果 ...

  8. [机器学习笔记]Note9--机器学习系统设计

    继续是机器学习课程的笔记,本节课的内容主要是介绍如何设计一个机器学习系统. 首先要做什么 这节课将介绍如何设计一个机器学习系统,首先是以设计一个垃圾邮件分类器算法作为例子. 为了解决这个问题,首先要决 ...

  9. [机器学习笔记]Note8--机器学习应用建议

    继续是机器学习课程的笔记,本节课的内容主要是一些机器学习应用的建议,包括对假设的评估,如何处理过拟合和欠拟合等. 觉得下一步做什么 到目前为止,我们已经学习了线性回归,逻辑回归以及神经网络,梯度下降等 ...

  10. 吴恩达机器学习笔记 —— 10 神经网络参数的反向传播算法

    http://www.cnblogs.com/xing901022/p/9350271.html 本篇讲述了神经网络的误差反向传播以及训练一个神经网络模型的流程 更多内容参考 机器学习&深度学 ...

最新文章

  1. makefile .phony targets
  2. java虚拟机内存监控_java虚拟机内存监控工具
  3. VTK:PolyData 的轮廓用法实战
  4. 计算机队列概念,2020计算机专业考研数据结构知识点:栈、队列和数组
  5. 深度学习——02、深度学习入门 1-7
  6. leetcode 1721. Swapping Nodes in a Linked List | 1721. 交换链表中的节点(Java)
  7. 原型模式 java 深浅_JAVA设计模式---原型模式--浅客隆和深克隆
  8. 发纸牌c语言指针,算了算学了有一个月c语言了,写了个扑克牌程序
  9. vue绑定自定义属性(属性值:false),DOM不显示问题
  10. transformer:self-attention 自注意力机制详解
  11. 初级Java代码——自制坦克大战游戏
  12. scratch作品导出html5,抓取scratch源码,使用二进制方式保存。
  13. 内存映射文件mmap
  14. Android应用开发性能优化的知识点
  15. 短视频行业深度(一)快手科技:私域筑垒,公域进军.PDF
  16. Java ArrayList集合案例(上课笔记)
  17. Go Context 原理详解
  18. Python 基于积分原理计算定积分并可视化数值积分计算的动画过程
  19. 自动跟随小车c语言,智能小车跟随系统的设计与制作.doc
  20. ExtJs自学教程(2):从DOM看EXTJS

热门文章

  1. Java项目问题_Java项目出现的问题01----学习
  2. mysql延时优化教程_Mysql优化之延迟索引和分页优化_MySQL
  3. visio对象放入word显示不全_办公人士必学visio技能 手把手教你使用visio绘制项目全景图!...
  4. mysql数据库语法_MySQL数据库语法(一)
  5. vue 转为静态html,Vue CLI 3使用:HTML和静态资源(五)
  6. Linux 系统应用编程——网络编程(TCP 协议三次握手过程)
  7. Linux 系统应用编程——进程基础
  8. python,时间加减,时间计算,时间格式化,时间提取汇总
  9. “Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported“解决方法
  10. [react] React怎样跳过重新渲染?