深度学习之基础篇(三)

1、神经网络中损失函数和优化函数的作用

训练出一个网络模型之后如何对模型进行评估?往往是衡量预测值与真实值之间的差异程度,这就是通过损失函数来完成的。另外损失函数也是神经网络中优化的目标函数,神经网络训练或者优化的过程就是最小化损失函数的过程,损失函数越小,说明模型的预测值就越接近真实值,模型的准确性也就越好。那么为了最小化损失函数则需要对网络模型的参数进行更新,确定如何更新参数这时则需要选择合适的优化函数(用以确定对网络模型参数进行更新的方法,步长和方向的确定)。我们都知道,神经网络模型训练得以实现是经过前向传播计算LOSS,根据LOSS的值进行反向推到,进行相关参数的调整。这个过程需要在loss值的指导下进行,因此在优化时需要传入loss值。

2、神经网络中的收敛

一般我们可以设置一个迭代次数阈值,当损失loss的变化小于一个很小的值,或者迭代次数达到阈值上限,那么我们一般就认为模型已经收敛了。
在实际应用中,如果你用的是TensorFlow之类的工具,可以在Tensorboard上看loss的变化情况,如果曲线趋于平的,那么基本就可以认为是收敛了。
另外收敛只看训练集的损失值,与测试集无关。

3、train loss与val loss结果分析

train loss 不断下降,val loss不断下降,说明网络仍在学习; 
train loss 不断下降,val loss趋于不变,说明网络过拟合; 
train loss 趋于不变,val loss不断下降,说明数据集可能有问题; 
train loss 趋于不变,val loss趋于不变,说明学习可能已经收敛; 
train loss 不断上升,val loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。

4、影响神经网络收敛速度的不同因素

1)对于收敛路径而言,梯度的方向和步长的大小显然是对收敛速度两个最直接的因素。对于网络优化问题来说也是两个角度,一个是学习率衰减,决定了梯度下降的步长,包括AdaGrad、RMSprop、AdaDelta;另一个就是梯度方向,避免陷入局部最优,包括动量法、Nesterov加速梯度、梯度截断等;还包括mini batch方法,引入随机噪声又能平滑梯度,相交于一次性全局梯度和单个样本随机梯度。

2)参数的初始化也很重要,既要避免参数全部一致导致学习特征单一,又要避免激活函数(sigmoid)的净输入陷入饱和区导致梯度为0无法学习。随机初始化包括高斯分布以及Xavier[‘ze?v?r]。

3)数据预处理就是归一化。简单地讲,由于特征量度不同,导致Loss的等高线成为不均匀的椭圆状,在像最优点下降过程中,梯度方向难免出现震荡,使得收敛速度变缓。引入归一化后,使得Loss等高线变为更均匀的圆形,约束梯度下降的方向指向正中圆心最优点,得到最优的收敛路径。归一化方法包括缩放归一化和标准分布归一化。

4)训练过程中,层与层之间输入输出需要保持分布一致性,否则会出现内部协变量偏移,越深的层次,现象越明显。深度神经网络中,误差通过梯度反向传播,分布不一致会导致参数更新不是最优的方向,阻碍了收敛最优点。解决方案是引入输入输出规范化,包括批规范化BN和层规范化LN。

5)残差网络ResNet,ResNet是针对CNN训练中层次过深导致退化问题。简单来说,卷积用来提取目标特征,而越深的卷积层使得提取的特征更加抽象,从而在测试集上得到更好的准确率。同时,层次过深又阻碍了误差反向传播,比如梯度爆炸和梯度弥散,使得参数得不到最优的更新,在训练集合上收敛不到最优。对此引入残差网络,将输入作为旁路恒等映射到输出端,这个映射使得误差反向传播时,保证梯度的稳定。在保持深层次的基础上,使得各层的参数得到很好的更新,有利于模型的收敛。

5、梯度爆炸和梯度消失

写的很好的参照:

https://blog.csdn.net/qq_25737169/article/details/78847691

简单理解,就是在反向传播的算法过程中,由于我们使用了是矩阵求导的链式法则,有一大串连乘,如果连乘的数字在每层都是小于1的,则梯度越往前乘越小,导致梯度消失,而如果连乘的数字在每层都是大于1的,则梯度越往前乘越大,导致梯度爆炸。

比如我们在前一篇反向传播算法里面讲到了δ的计算,可以表示为:

如果不巧我们的样本导致每一层的∂zl+1/∂zl都小于1,则随着反向传播算法的进行,我们的δl会随着层数越来越小,甚至接近越0,导致梯度几乎消失,进而导致前面的隐藏层的W,b参数随着迭代的进行,几乎没有大的改变,更谈不上收敛了。这个问题目前没有完美的解决办法。

导致梯度消失和梯度爆炸的原因:

两种情况下梯度消失经常出现,一是在深层网络中,二是采用了不合适的损失函数,比如sigmoid。梯度爆炸一般出现在深层网络和权值初始化值太大的情况下。梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。

从深层网络角度来讲,不同层学习速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。

解决梯度消失和梯度爆炸的方法:

由于导致这两种现象产生的根本原始是反向传播训练法则,所以可以从对w的控制以及激活函数着手。

为了避免梯度爆炸可以通过梯度剪切(这样处理其实并不粗糙,有些论文中也是这样处理的)和正则化的手段,从激活函数的选取方面选用relu激活函数。

通过合理的初始化权重能够减小梯度消失和梯度爆炸的情况,引入batch_norm也能一定程度减小梯度消失和梯度爆炸的情况。

原文地址:https://www.cnblogs.com/dyl222/p/10982500.html

时间: 2024-08-30 09:32:57

深度学习之基础篇(三)的相关文章

python 学习之 基础篇三 流程控制

前言: 一. python中有严格的格式缩进,因为其在语法中摒弃了“{}”来包含代码块,使用严格的缩进来体现代码层次所以在编写代码的时候项目组要严格的统一器缩进语法,一个tab按键设置为四个空格来缩进,防止缩进不规范导致的启动失败. 二.在python中变量(标识符)命名和一般的高级语言没有什么不同都推荐使用,字母.下划线.数字命名,其中数字不能作为标识符的开头,python中变量名是区分大小写的(所以可以使用驼峰命名法去命名,也就是英文单词的字母首字母大写其余的小写).以下划线开头的标识符是有

从冷战到深度学习:一篇图文并茂的机器翻译史

从冷战到深度学习:一篇图文并茂的机器翻译史 选自Vas3k.com 作者:Ilya Pestov 英语版译者:Vasily Zubarev 中文版译者:Panda 实现高质量机器翻译的梦想已经存在了很多年,很多科学家都为这一梦想贡献了自己的时间和心力.从早期的基于规则的机器翻译到如今广泛应用的神经机器翻译,机器翻译的水平不断提升,已经能满足很多场景的基本应用需求了.近日,Ilya Pestov 用俄语写的机器翻译介绍文章经 Vasily Zubarev 翻译后发表到了 Vas3k.com 上.机

一步步学习javascript基础篇(3):Object、Function等引用类型

我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂数据类型(即引用数据类型) Object类型 我们用的最多的引用类型就属object类型了,一般用来存储和传输数据是再好不过的.然,它的两种创建方式我们是否了解呢? 1.通过构造函数来创建 如: var obj = new Object(); 在js中的引用类型有个非常灵活的用法,可以动态的附加属性和赋值.

渗透学习笔记--基础篇--sql注入(字符型)

环境:dvwa1.7数据库:mysql前置知识:sql语句(Click me)      在进行sql注入前,我们先熟悉熟悉select语句.一.打开我们的sql终端 二.进入之后可以看到有mysql>我们输入sql语句,即可返回我们想要的结果,注意分号哟!我们使用的dvwa,在我们前几章设置的时候,会在数据库中生成一个dvwa的database:这里我们使用它来进行我们的select 语句:(1)使用dvwa数据库use dvwa;(2)在users表里查询用户名为'admin'的所有信息se

Python学习笔记基础篇——总览

Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列表.字典.主文件判断.对象 Python学习笔记——基础篇1[第三周]——set集合 Python学习笔记——基础篇2[第三周]——计数器.有序字典.元组.单(双)向队列.深浅拷贝.函数.装饰器 Python学习笔记——基础篇[第四周]——迭代器&生成器.装饰器.递归.算法.正则表达式 Python

iOS开发学习笔记:基础篇

iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境),Xcode是一个集成开发环境,包括了编辑器.调试.模拟器等等一系列方便开发和部署的工具,iOS SDK则是开发应用所必需,不同的SDK分别对应不同的iOS版本或设备,通常我们需要下载多个iOS SDK以确保我们开发的程序能够在不同版本的iOS上正常运行. 创建新工程 Xcode提供了很多种工程模

Python基础篇(三)

元组是序列的一种,与列表的区别是,元组是不能修改的. 元组一般是用圆括号括起来进行定义,如下: >>> (1,2,3)[1:2]     (2,) 如果元组中只有一个元素,元组的表示有些奇怪,末尾需要加上一个逗号: >>> (1,2,3)[1:2]     (2,) >>> 3*(3)      9      >>> 3*(3,)      (3, 3, 3) tuple函数 tuple函数用于将任意类型的序列转换为元组: >&

Deep Learning(深度学习)之(三)Deep Learning的常用模型或者方法

九.Deep Learning的常用模型或者方法 9.1.AutoEncoder自动编码器 Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有层次结构的系统,如果给定一个神经网络,我们假设其输出与输入是相同的,然后训练调整其参数,得到每一层中的权重.自然地,我们就得到了输入I的几种不同表示(每一层代表一种表示),这些表示就是特征.自动编码器就是一种尽可能复现输入信号的神经网络.为了实现这种复现,自动编码器就必须捕捉可以代表输入数据的最重要的因素

《神经网络和深度学习》系列文章三:sigmoid神经元

出处: Michael Nielsen的<Neural Network and Deep Leraning>,点击末尾“阅读原文”即可查看英文原文. 本节译者:哈工大SCIR硕士生 徐伟 (https://github.com/memeda) 声明:我们将在每周一,周四,周日定期连载该书的中文翻译,如需转载请联系[email protected],未经授权不得转载. “本文转载自[哈工大SCIR]微信公众号,转载已征得同意.” 使用神经网络识别手写数字 感知机 sigmoid神经元 神经网络的