BP+SGD+激活函数+代价函数+基本问题处理思路
今天读到这篇文章,对之前发的几篇博客来说是非常好的总结,所以转载 过来学习啦!
0. 学习模型评价标准
1. 反向传播算法计算全过程
2. 随机梯度下降法计算全过程
3. 激活函数
3.1 为什么需要激活函数?
3.2 常见激活函数汇总
3.3 Sigmoid激活函数
3.3.1 Sigmoid激活函数
1)优点:
- 它可把输入的连续实值压缩到[0,1]之间
- 可解释为神经元饱和的“firing rate”
2)缺点:
- 饱和的神经元导致梯度消失
输入非常大或非常小时,其梯度接近于0
- 指数运算计算量大
- Sigmoid的输出不是以0为均值
产生的一个结果就是:如果数据进入神经元的时候是正的(e.g. x>0 elementwise in f=wTx+b),那么 w 计算出的梯度也会始终都是正的。 当然了,如果你是按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的 kill gradients 问题相比还是要好很多的。
3.3.2 Sigmoid函数图形
3.3.3 Sigmoid函数导数图形
3.4 Softmax激活函数
3.5 tanh激活函数
1)优点:
- 与Sigmoid相比,tanh是0均值的。
- 理论和实验证据表明tanh有时比Sigmoid性能更好。
- tanh(-z)=-tanh(z)
2)缺点:
- 饱和的神经元导致梯度消失
输入非常大或非常小时,其梯度接近于0
3.6 校正线性单元(Rectified Linear Unit:ReLU)
f(x) = max(0, wx+b)
1)优点:
相比于 sigmoid/tanh,有如下优点:
- 计算高效:采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计 算量相对大,而采用ReLU激活函数,整个过程的计算量节省很多。
- 没有饱和及梯度消失问题:对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失,从而无法完成深层网络的训练。
- ReLU会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
- 收敛速度比sigmoid/tanh快6倍
2)缺点:
- 当然 ReLU 也有缺点,就是训练的时候很”脆弱”,很容易就”die”了. 什么意思呢?
举个例子:一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。如果这个情况发生了,那么这个神经元的梯度就永远都会是0.实际操作中,如果你的Learning Rate 很大,那么很有可能你网络中的40%的神经元都”dead”了。
当然,如果你设置了一个合适的较小的Learning Rate,这个问题发生的情况其实也不会太频繁。
- 当z<0时,梯度也消失了
- 非零居中输出
3.7 Leaky-ReLU、P-ReLU、R-ReLU
1)Leaky ReLU:
就是用来解决“Die ReLU”的,其定义如下:
α 是一个很小的常数(如0.01)。这样,即修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。关于Leaky ReLU 的效果,众说纷纭,没有清晰的定论。有些人做了实验发现 Leaky ReLU 表现的很好;有些实验则证明并不是这样。
优点:
- 不会饱和
- 计算高效
- 收敛速度快
- 不会死
2)Parametric ReLU:
对于 Leaky ReLU 中的α,通常都是通过先验知识人工赋值的。 而P-ReLU中,α 是一个变量,需要被学习。
然而可以观察到,损失函数对α的导数我们是可以求得的,可不可以将它作为一个参数进行训练呢?
Kaiming He的论文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不仅可以训练,而且效果更好。
公式非常简单,反向传播至未激活前的神经元的公式就不写了,很容易就能得到。对α的导数如下:
原文说使用了Parametric ReLU后,最终效果比不用提高了1.03%.
3)Randomized ReLU:
Randomized Leaky ReLU 是 leaky ReLU 的random 版本 (α 是random的).
它首次试在 kaggle 的NDSB 比赛中被提出的。 核心思想就是,在训练过程中,α 是从一个高斯分布
U(l,u) 中 随机出来的,然后再测试过程中进行修正(有点像dropout的用法)。
数学表示如下:
在测试阶段,把训练过程中所有的 αij 取个平均值。NDSB 冠军的 α 是从 U(3,8) 中随机出来的。那么,在测试阶段,激活函数就是就是:
4) Exponential Linear Units (ELU)
1)优点:
- 所有ReLU的优点
- 不会死
- 输出接近0均值
2)缺点:
- 计算量大,需要指数运算
3.8 Maxout
Maxout定义如下:
Maxout其实是改变了神经元的形式,它将每个神经元由原来一次训练一组参数扩展为同时训练多组参数,然后选择激活值最大的作为下一层的激活值,比如同时训练3组参数:
可以看出ReLu为Maxout同时训练两组参数且w2,b2取0时的情形,因此maxout拥有ReLu的所有优点同时避免了神经元“死亡”的现象;但是,由于需要多训练了几组参数,网络的效率也大大降低了。
Maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。最直观的解释就是任意的凸函数都可以由分段线性函数以任意精度拟合,而Maxout又是取k个“隐隐含层”节点的最大值,这些”隐隐含层"节点也是线性的,所以在不同的取值范围下,最大值也可以看做是分段线性的(分段的个数与k值有关)。论文中的图1如下(它表达的意思就是可以拟合任意凸函数,当然也包括了ReLU了):
3.9 激活函数表
3.10 Conv&Maxout&NIN
NIN: Network in Network
Maxout和NIN都是对传统conv+relu的改进;Maxout想表明它能够拟合任何凸函数,也就能够拟合任何的激活函数(默认了激活函数都是凸的);NIN想表明它不仅能够拟合任何凸函数,而且能够拟合任何函数,因为它本质上可以说是一个小型的全连接神经网络。
3.10.1 工作流程
1)常规卷积层:conv→relu
- conv: conv_out=∑(x·w)
- ReLU: y=max(0, conv_out)
2)Maxout:several conv(full)→max
- several conv (full): conv_out1 = x·w_1, conv_out2 = x·w_2, …
- max: y = max(conv_out1, conv_out2, …)
3)NIN: conv→relu→conv(1x1)→relu
- several conv (full): conv_out1 = x·w_1, conv_out2 = x·w_2, …
- relu: relu_out1 = max(0, conv_out1), relu_out2 = max(0, conv_out2), …
- conv(1x1): conv_1x1_out = [relu_out1, relu_out2, …]·w_1x1
- relu: y = max(0, conv_1x1_out)
3.10.2 实例说明
1)常规卷积层:直接x和w求卷积,然后relu一下就好了。
3)NIN:有k个3x3的w(这里的k也是自由设定的),分别卷积得到k个1x1的输出,然后对它们都进行ReLU,然后再次对它们进行卷积,结果再ReLU。(这个过程,等效于一个小型的全连接网络)
3.11 如何选择激活函数
1)不要使用sigmoid;
2)可以考虑使用tanh,但期望不要太高;
3)使用ReLU激活函数的话,注意不要把学习率设得太高,避免产生结点”死亡”现象;
4)最好使用Maxout / Leaky ReLU / ELU, 他们的效果比tanh好。
4. 代价函数
4.1 交叉熵代价函数
如果激活函数为sigmoid函数,则有:
4.2 二次代价函数
如果激活函数为sigmoid函数,则有:
4.3 对数似然代价函数
从以上梯度公式中可知,对于解决学习速度慢的问题:【Softmax输出层+对数似然成本函数】与【Sigmoid输出层+交叉熵成本函数】效果相当。
5. 基本问题处理思路
5.1 减少参数数量
1)主要是减少权重参数数量,如CNN与全连接神经网络相比,通过共享权重和偏差,大大减少了权重参数的数量;从而使学习变得更加容易。
5.2 减少过拟合
5.2.1 使用强有力的规范化技术
- L1规范化
- L2规范化(或权重衰减:weight decay)
获取小的权重,且使代价函数的值最小。
- dropout(弃权)
dropout不修改代价函数,而是修改网络本身。基本思路是:保持输入和输出神经元不变,对于一个mini-batch训练样本,随机删除一半的隐层神经元,然后根据BP+SGD更新权重和偏差;然后基于另一个mini-batch做同样的操作;一直重复下去。
可以理解为训练多个神经网络,然后多个神经网络再对结果进行投票,从而排除overfitting。其目标是:在丢失部分证据的条件下,此方法同样健壮。
Dropout用于训练大的深度网络很有用,因为在此类网络中,overfitting问题非常严重。
- 卷积层
共享权重:意味着卷积滤波器被强制从整个图像中学习,于是对过拟合就有了很强的抵抗性。
- 人工扩展训练数据
5.2.2 增加训练数据的数量
5.3 加速训练
1)使用ReLU而不是Sigmoid,可以加速训练。
5.4 训练时间长
1)可通过GPU来进行长期训练。
5.5 学习速度下降
1)使用正确的代价函数(如交叉熵代价函数):避免梯度消失或爆炸,即梯度不稳定问题。
2)使用好的权重初始化:避免神经元饱和。
参考:http://www.cnblogs.com/tornadomeet/tag/Deep%20Learning/
BP+SGD+激活函数+代价函数+基本问题处理思路相关推荐
- 【13】 数学建模 | 预测模型 | 灰色预测、BP神经网络预测 | 预测题型的思路 | 内附代码(清风课程,有版权问题,私聊删除)
一.灰色预测使用的场景 数据是以年份度量的非负数据(如果是月份或者季度数据一定要用我们上一讲学过的时间序列模型): 数据能经过准指数规律的检验(除了前两期外,后面至少90%的期数的光滑比要低于0.5) ...
- BP神经网络对鸢尾花进行分类
题目:BP神经网络分类器 一.实验项目: BP神经网络对鸢尾花进行分类 二.实验目的: 掌握BP神经网络学习算法,利用BP神经网络进行数据分类 三.实验内容: 1.编程实现BP神经网络算法 2.建立三 ...
- 交叉熵代价函数cross-entropy
交叉熵代价函数(Cross-entropy cost function)是用来衡量人工神经网络(ANN)的预测值与实际值的一种方式.与二次代价函数相比,它能更有效地促进ANN的训练.在介绍交叉熵代价函 ...
- 【通俗讲解】BP神经网络
参考文章:http://www.jianshu.com/p/3d96dbf3f764 David Rumelhart 和 J.McClelland 于1985年提出了BP网络的误差反向后传BP(Bac ...
- 交叉熵代价函数(作用及公式推导
交叉熵代价函数(Cross-entropy cost function)是用来衡量人工神经网络(ANN)的预测值与实际值的一种方式.与二次代价函数相比,它能更有效地促进ANN的训练.在介绍交叉熵代价函 ...
- 激活函数选取不当为什会造成梯度消失
下图为四层神经网络,它包括输入层,输出层,两个隐层 假设输入层到第一个隐层的权值为,偏置值为.两个隐层之间的权值为,偏置值为.第二个隐层到输出层的权值为,偏置值为.现在假设输入的值为,输出为,标签值为 ...
- 基于遗传算法改进的BP神经网络电网负荷预测,GA-BP神经网络电网负荷预测,1000案例之14
摘要 节能减排,降低谈排放,降低电网传输的损耗 电力负荷预测是以电力负荷为对象进行的一系列预测工作.从预测对象来看,电力负荷预测包括对未来电力需求量(功率)的预测和对未来用电量(能量)的预测以及对负荷 ...
- 基于MATLAB编程的萤火虫FA优化BP神经网络的回归分析
目录 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络激活函数及公式 SVM应用实例,基于fa-svm分类预测 代码 结果分析 展望 BP神经网络的原 ...
- Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现
Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 zouxy09@qq.com http://blog.csdn.net/zouxy09 自己平时看了一些论文, ...
最新文章
- nordic 51822 sdk. timer 的使用
- snapchat_机器中的幽灵:Snapchat不是移动优先的-完全是另一回事
- mysql查询表中名字包含某个字符_查询当前数据库中所有用户表中哪些字段包含某个字符串...
- wxpython菜单的位置_wxpython教程:[5]次级菜单
- 混淆矩阵简介与Python实现
- 安卓rom制作教程_MIUI官方ROM(卡刷包、线刷包)合集
- 移远EC20模组网口SGMII通讯调试以及FC20wifi通讯调试
- Android源码下载编译(TI)
- Typora如何自动生成标题序号
- java valuewidget_Flutter开发之常用Widget
- 安装监控的地方没有WiFi,没有无线网络,如何实现远程监控?
- 读书笔记(九)--三分做事,七分做人
- 在投射和录制时显示敏感信息时,免root授权确认框
- C++ boost库中的sp_counted_base实现解析
- MySQL(17) 通过Docker搭建主从同步
- 微信小程序获取手机号,含java后台接口实现
- about unit test in android ppt,选修5 unit4Learning about language.ppt
- win10设置pg/pc接口_pg/pc设置里没有添加删除接口选项
- Rera1N环境Linux,iPhone降级不是梦!ReRa1n降级工具推出,支持任意降级
- SVNH数据(.mat格式)转为图像(.png)matlab代码
热门文章
- 【已解决】“The import java.sql.Connection conflicts with a type defined in the same file“
- 9行代码AC——L1-022 奇偶分家(10 分)(~解题报告~)
- NoClassDefFoundError和ClassNotFoundException
- InnoDB 的索引模型
- python asyncio回调函数_python回调函数用法实例分析
- 第一个linux桌面,Ubuntu 4.10 “Warty Warthog”:回顾第一个Ubuntu Linux桌面
- 自己做网站翻译服务器 - 添加网站,猎场seo视频教程:站群之间应该如何进行链接-专业...
- python数据可视化的特点_Python数据可视化 pyecharts实现各种统计图表过程详解
- c++ 0x8000ffff灾难性故障_《可靠性设计》——故障模式影响分析
- intitle:客服机器人代码_游戏客服能影响企业发展?千万别大意