umich cv-5-1 神经网络训练1
这节课中介绍了训练神经网络的第一部分,包括激活函数的选择,权重初始化,数据预处理以及正则化方法
激活函数
这部分主要讨论我们之前提到的几种激活函数的利弊:

首先我们看sigmoid函数,这种激活函数有着激活函数中常见的优点与缺点:

优点方面,它可以使数据分布在0-1之间,可以很好地表示神经元的饱和放电现象
缺点方面
我们考虑使用这个激活函数进行梯度的反向传播:

我们可以看到在x = 10或者x = -10时,传播的梯度都会接近于0,导致后面的所有梯度均变为0,这就会导致梯度消失,我们的神经网络无法学习
同时,sigmoid激活函数的输出并不是以0为中心:

我们知道w梯度的反向传播的值于x相关,所以当x一直为正时,w梯度将取决于w的正负,所以梯度很可能会在正负之间横跳,这样也不利于神经网络的学习,但是在小数据集上还是可以使用,并且小哥指出这一点其实不是特别关键
最后,就是exp()这种非线性操作从底层来说很花费时间(相对于线性操作来说)
之后我们再来看看其它激活函数:
tanh它的优缺点与sigmoid函数大致相同:

然后是最常用的relu激活函数:

relu函数有很多优异的性质,比如不会导致饱和杀死梯度,计算开销低速度快,神经网络收敛的也快
但是还有一个人们一直担心的问题就是:

小于0的数据永远不会被激活无法学习
因此人们又想出来了很多relu的变体:
leaky relu在小于0的区域加入一个线性函数,更进一步地,可以把小于0区域函数的系数作为一个可学习的参数加入神经网络,通过反向传播来更新优化

elu 相对于leaky relu添加了鲁棒性,但是计算开销增大

selu 对深度神经网络的效果很好 甚至可以不用batch normalization就可以训练深层神经网络 而其中的参数是固定的,是通过91页的数学推导得出的结果(震惊小哥一万年)

最后再放上不同激活函数数据的统计以及小哥的建议:


数据预处理
数据的预处理最常见的就是从均值与标准差入手:

当然也有少数使用PCA降维与数据白化:

它们的基本思想都是减少模型的敏感性,使其更容易优化收敛:

举个例子,Alexnet VGG ResNet都采用了不同的数据预处理方法,Alexnet减去整个图像的均值,VGG减去每个通道的均值,而Resnet减去每个通道的均值再除以每个通道的标准差

权重初始化
在训练神经网络时,我们面临的问题就是如何进行权重矩阵的初始化
首先一个基础的想法就是都初始化为0矩阵,但是这样会导致所有的输出都是0,梯度都一样,无法学习
其次我们会想全0不行,那随机生成一些随机数应该可以了吧,我们可以使用python中randn函数,利用高斯分布生成随机数,但是这样的方法只使用于小的神经网络,不适用于更深的神经网络,为什么呢?

我们把在不同层的数据分布图画出来,可以看到:


std系数小的时候,数据在深层会集中在0,std大的时候就会出现之前的过饱和现象,杀死梯度,这两种情况都会导致神经网络无法学习
针对上述问题,人们想出来了Xavier initialization,把之前的std改为除以输入维度开根号,这是针对全连接层,卷积层是卷积核的平方乘以输入维度再开根号,我们可以看到效果很好,基本维持住了数据的形状

这里的原理主要就是我们想要使输入方差等于输出方差,这一点可以利用基本的概率论知识进行推导,建立在相互独立以及均值为0的假设上:

但是上述神经网络中我们采用的是tanh激活函数,假如我们使用relu激活函数,那么均值为0的假设就不成立,这时候人们推导出针对relu的Kaiming initialization:

上面提到了全连接层还有卷积层,还没有提到残差网络,针对残差网络比较特殊,如果我们使用上述初始化,使得输入与输出的方差相等的话,由于残差块还要加上一个x,所以方差是一定会增大的,这里我们可以把第一个卷积层采用kaiming initialization初始化,第二个卷积层直接初始化为0,这样我们残差块的输入与输出的方差就相等了:

正则化
正则化方法最常用的就是我们直接衡量矩阵的L2distance等等:

也有我们之前提到的dropout方法:

这里的思想是神经网络中可能有冗余的特征,通过dropout我们可以放弃这些冗余的特征,降低特征与特征之间的关联,这样有利于我们提取到更重要更有效的特征:

这里引入正则化的一般模式,思想是在训练的时候我们加入随机性,在测试的时候我们平均这种随机性防止混乱:

dropout的实现也是如此:

注意dropout只使用于全连接层,对于放弃了全连接层的网络一般使用batch normalization:

既然提到了正则化的思想是增加随机性,我们可以在输入数据上做更多的处理,采用不同的数据增强方法:
我们可以旋转我们的图像:

将图像划分为不同的区域:

甚至改变颜色:

总之我们可以做任何疯狂的事情来帮助我们的神经网络学习不同复杂的情况:

除了数据增加,我们还有dropconnect,随机放弃神经元之间的连接:

选择随机的池化区域:

随机跳过一些残差块:

随机将图像的一部分像素设为0(cutout):

将不同的图像混合训练:

最后是小哥的建议!

umich cv-5-1 神经网络训练1的更多相关文章
- 深度学习与CV教程(6) | 神经网络训练技巧 (上)
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- 深度学习与CV教程(4) | 神经网络与反向传播
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- 神经网络训练中的Tricks之高效BP(反向传播算法)
神经网络训练中的Tricks之高效BP(反向传播算法) 神经网络训练中的Tricks之高效BP(反向传播算法) zouxy09@qq.com http://blog.csdn.net/zouxy09 ...
- tesorflow - create neural network+结果可视化+加速神经网络训练+Optimizer+TensorFlow
以下仅为了自己方便查看,绝大部分参考来源:莫烦Python,建议去看原博客 一.添加层 def add_layer() 定义 add_layer()函数 在 Tensorflow 里定义一个添加层的函 ...
- 模式识别之ocr项目---(模板匹配&BP神经网络训练)
摘 要 在MATLAB环境下利用USB摄像头采集字符图像,读取一帧保存为图像,然后对读取保存的字符图像,灰度化,二值化,在此基础上做倾斜矫正,对矫正的图像进行滤波平滑处理,然后对字符区域进行提取分割出 ...
- 字符识别OCR研究一(模板匹配&BP神经网络训练)
摘 要 在MATLAB环境下利用USB摄像头採集字符图像.读取一帧保存为图像.然后对读取保存的字符图像,灰度化.二值化,在此基础上做倾斜矫正.对矫正的图像进行滤波平滑处理,然后对字符区域进行提取切割出 ...
- 从有约束条件下的凸优化角度思考神经网络训练过程中的L2正则化
从有约束条件下的凸优化角度思考神经网络训练过程中的L2正则化 神经网络在训练过程中,为应对过拟合问题,可以采用正则化方法(regularization),一种常用的正则化方法是L2正则化. 神经网络中 ...
- TensorFlow+实战Google深度学习框架学习笔记(5)----神经网络训练步骤
一.TensorFlow实战Google深度学习框架学习 1.步骤: 1.定义神经网络的结构和前向传播的输出结果. 2.定义损失函数以及选择反向传播优化的算法. 3.生成会话(session)并且在训 ...
- TensorFlow实战第三课(可视化、加速神经网络训练)
matplotlib可视化 构件图形 用散点图描述真实数据之间的关系(plt.ion()用于连续显示) # plot the real data fig = plt.figure() ax = fig ...
- 从MAP角度理解神经网络训练过程中的正则化
在前面的文章中,已经介绍了从有约束条件下的凸优化角度思考神经网络训练过程中的L2正则化,本次我们从最大后验概率点估计(MAP,maximum a posteriori point estimate)的 ...
随机推荐
- vue3中父组件与组件之间参数传递,使用(defineProps/defineEmits),涉及属性传递,对象传递,数组传递,以及事件传递
Vue3 中子父组件之间的通信 一.父组件传递参数到子组件 采用defineProps 传递属性 父组件: <template> <div> <h1>这是父组件&l ...
- 深入JS——理解闭包可以看作是某种意义上的重生
JS中有一个非常重要但又难以完全掌握的概念,那就是闭包.很多JS程序员自以为已经掌握了闭包,但实质上是一知半解,就像"JS中万物皆为对象"这个常见的错误说法一样,很多前端开发者到现 ...
- IIS部署的应用无法自动注册到Nacos
问题描述: 自己开发的某系统后台API接入nacos,在IIS上部署无法自动注册到nacos服务列表中.其根本原因是网站处于休眠状态,当某请求访问该网站时,网站被激活,nacos注册成功. 但这块有个 ...
- keycloak~AbstractJsonUserAttributeMapper的作用
AbstractJsonUserAttributeMapper 它是一个抽象类,用来更新条件更新用户属性(user_attribute)的信息,我们在实现自己的mapper时,需要关注3个方法,下面分 ...
- Java并发工具CountDownLatch的使用和原理
1.等待多线程完成的 CountDownLatch CountDownLatch 允许一个或多个线程等待其他线程完成操作. 假如有这样一个需求:我们需要解析一个 Excel 里多个 sheet 的数据 ...
- jquery解决跨域问题
在Ajax请求的url不是本地或者同一个服务器下面的URI,最后虽然请求显示为200,但是不会返回任何数据,事实上简单来说请求同一个域名下的url或者说用不带http的绝对路径和相对路径请求是没有任何 ...
- 蜂鸟E203 仿真之路
本文记录自己在学习蜂鸟E203的过程.下面简单介绍一下仿真之路所遇到的困难和走过的坑. 1.环境开发 :一般选择ubuntu 18.04 这个版本,安装这个教程很多,可以自行学习. 2.在Linux中 ...
- React报错:Module not found: Error: Can't resolve 'react-router-dom'
解决方案 npm install -S react-router-dom@5 参考链接 https://stackoverflow.com/questions/53914013/failed-to-c ...
- python教程 入门学习笔记 第1天 初识python python语言环境安装 python编写器
初识python 一.python语言简介: 1.起源:1989年由荷兰的前谷歌程序员吉多.范罗苏姆(龟叔)创造,python的命名来源于英国电视喜剧Monty Python's Flying Cir ...
- AcWing 4797. 移动棋子题解
算出数值为 \(1\) 的点离 \((3, 3)\) 的距离即可. #include <iostream> #include <cstring> #include <al ...