CS231n学习笔记-训练神经网络

第七章-训练神经网络

目录

第七章-训练神经网络

大致介绍

Part 1

激活函数

Sigmoid

tanh(x)(双曲正切)

ReLU函数(Rectified Linear Unit)

Leaky ReLU(泄露的ReLU)

ELU(Exponential Linear Units)

Maxout "Neuron"

总结

数据预处理

标准化(standardization/z-score方法)

PCA(主成分分析)

权重初始化

 正态分布初始化权重

“Xavier”初始化    

ReLU初始化

Kaiming/MSRA初始化

*Batch Normalization

Mini-Batch

总结

Part2

Optimization

SGD

SGD+Momentum

Nesterov Momentum

AdaGrad

RMSPorp:“Leaky AdaGrad"

Adam(almost)

Adadelta

学习率

训练过程

Early Stopping:Always do this

Model Ensembles(模型集成)

避免过拟合

为什么要用Dropout?

Dropout总结

数据增强

DropConnect

Fractional Pooling(分数池化)

Stochastic Depth(随机深度)

Cutout

Mixup

Choosing Hyperparameters

Check initial loss(校验初始损失函数)

Overfit a small sample(在小数据集上尝试过拟合)

Find learning_rate that maskes loss go down(找到能尽快使损失函数下降的学习率)

Coarse grid,train for~1-5 epochs

Look at loss curves(关注学习率的变化)

总结

选取参数的规则

总结


大致介绍

训练神经网络的过程大致为下山找最快的路

使用Mini-batch SGD,把数据分批次

放入网络,每次喂入数据会更新一次权重,整个训练过程是”螺旋向上“的,最后会找到最优点,避免了一次喂入的不震荡,也避免了一次喂入一个数据的激烈震荡,保证训练路径在适当震荡范围内

训练网络基础设施

数据、算力、算法、框架

网络配置

        1、不经常变动的配置

        激活函数、权重初始、正则化、梯度校验等

        2、训练过程需要实时更新的配置

        验证集误差、是否过拟合、参数更新、不同优化器

        3、模型评估与集成

        模型效果、测试时间

Part 1

激活函数

函数作用

函数类型

Sigmoid

问题1

饱和性梯度消失

问题二

输出都为正数,不是关于0对称的-->所有函数对权重求偏导同号(同步增大减少)

会出现zig zag path 来回震荡,不能一步到位

问题三

指数运算消耗大量计算资源

tanh(x)(双曲正切)

输出有正有负,关于0对称,避免zig-zag问题

仍然存在梯度消失

ReLU函数(Rectified Linear Unit)

不会饱和,大于零的部分是一个线性函数计算量少,收敛速度是sigmoid的6倍

问题一

输出值不是关于0对称

问题二

x小于0时,梯度为0

原因:

        1、初始化不良

        2、学习率太大

初始化时添加一个偏置项,避免落入dead Relu(权重都为0)

Leaky ReLU(泄露的ReLU)

解决非0对称,线性速度快

ELU(Exponential Linear Units)

近似0对称

Maxout "Neuron"

结合了ReLU和Leaky ReLU,线性函数、不会出现饱和性梯度消失,不会出现多数梯度变0的情况

总结

1、使用ReLU要注意学习率不要选太大

2、尝试使用Leaky ReLU/Maxout/ELU

3、可以尝试使用tanh,但是效果可能不太好

4、不要轻易使用sigmoid

数据预处理

标准化(standardization/z-score方法)

PCA(主成分分析)

白化过程

PCA白化旋转映射回原方向就是ZCA白化

标准化作用

标准化处理之后,损失函数对权重的微小变化不那么敏感,更容易优化

经典网络的数据处理方式

        AlexNet中使用减去“平均图像

        VGGNet使用每个通道分别减去各通道的均值

        ResNetzhong 使用每个通道分别减去各个通道的均值,除以各通道标准差

PCA或者白化在数据处理中并不是很常用

权重初始化

几个问题

1、所有权重全部初始化为用一个常数,会有什么问题?(不能同时是一个常数

同一层的所有神经元前向推断和反向传播完全相同,相当于每一个隐藏层都只有一个神经元起作用

2、逻辑回归(LR)中可以将全总初始化为同一个常数的,因为逻辑回归没有隐含层,可以直接接受不同的x,打破对称性

多层神经网络不能将全总初始化为同一个数,否则无法打破“对称性”(symmetry)

 正态分布初始化权重

效果

幅值为0.01,越往后的隐藏层,标准差就越接近0,输出越接近1

问题:

        对图中式子求偏导,xi是上次的激活值,从图中可以看到,后面层的激活值接近于0,这样就会导致求得梯度为0,出现梯度消失

幅值为使用0.05,并使用正态分布,效果与之前0.01相反,0.05的输出全部集中在饱和区

这样的结果会导致图中式子的函数求导趋近于0(图像中的导数或者斜率趋近0),激活值变成了1或-1

综上可知,幅值太大或太小都不行,因此就有了“Xavier”初始化

“Xavier”初始化    

根据输入维度进行设置幅值,将输入维度的平方根放在分母上做乘法,输入维度很大,分母很大,相对幅值就会变小,反之,同上。实现自适应调整

输入维度变大就是数据变得更复杂,每次探索就需要走更小的步幅

证明为什么这样有用?

图中可以看到,方差是1/输入维度,所以标准差就需要开平方根,

前提是x,w均值为0,且独立同分布。

式子的改写

ReLU初始化

可以看到也是会出现梯度消失黑洞

Kaiming/MSRA初始化

用在ResNet上,并对权重进行分类处理,当权重w服从正态分布和服从均匀分布两种,相当“Xavier”初始化的改进版

图像分布可以看到,数值不止分布在一个地方,0~1都有分布

*Batch Normalization

强行将输出变为标准正态分布,减均值除方差

Mini-Batch

全部变成正态分布

有时强行转换成正态分布并不好,因此引入另外两个参数γ和β

测试阶段

使用训练时的总均值和总方差作为mini-batch均值和方差进行测试

卷积神经网络中Batch-Normalization

BN层一般放在非线性层之前

作用

加快收敛、改进梯度(原理饱和区)、大学习率、对初始化不敏感、正则化作用

注:训练和测试的BN层不一样

Others Normalization

*几种Normalization的不同之处

总结

Part2

大致内容

Optimization

各种优化器效果对比

案例1

案例2

案例3

SGD

缺点

问题一

优化方向振幅太大做无用功

可以使用减小学习率解决震荡,但是也会导致正确的优化方向优化速度变慢。不能单纯通过减小学习率解决

问题二

容易陷入局部最优点、鞍点,尤其是在高维空间

高维空间中会很多局部最优点,SGD不能有效的避免局部最优化

SGD对应函数

相当于走一步看一步

SGD+Momentum

相当于下山过程中会有另外的一个动量决定优化方向,下图中rho是动量大小,0.9或0.99可以理解为摩擦力,

相当于考虑之前也考虑当下,起到平均、平滑的作用

Nesterov Momentum

动量优化

向前多考虑一步,尽可能早的感知到坡度

考虑了前一步、当前和后面一步,类似于前面的动量,再次基础上优化,更快的下降到最优点或者说更快的离开局部最优点

对比三种优化器,NAG的速度是最快的

公式

代码

AdaGrad

图中标识项,将所有的dx取平方再相加,最后的式子里对前面的梯度进行惩罚(开方),

坡度陡的地方被惩罚,坡度缓的地方被加速优化

问题一

逐点相乘,会导致数值很大

问题二

随着训练次数的增大,最后式子的分母项会变得很大,导致权重(x)趋近于0

RMSPorp:“Leaky AdaGrad"

类似于AdaGrad,对AdaGrad的梯度累加项进行衰减

二者对比可以参考上面的三个案例动图,其中可以看大AdaGrad训练到后面会变慢,RMSProp相对效果更好

Adam(almost)

融合了动量和AdaGrad

将RMSPorp中学习率的系数变为第一动量,第二动量和RMSPorp的动量求解相同

初始化两种动量为0,需要等到两个动量自己更新到合适的值,整个式子才会发挥作用,相对较慢

采用另一种方式初始化两种动量,这样一开始便可以让两种动量有较高的初始值,更快的进行合适的运算

其中beta1初始化设为0.9,beta2初始化设为0.999,learning_rate设为10的-3次方或5*10的-4次方

Adadelta

学习率

优化器中有学习率需要进行调整,学习率决定着优化器的效果,好的学习率,既要更快收敛到最优,又可以让损失韩式达到比较的结果

训练时一般需要采用的策略为:开始使用较大学习率,更快的收敛,后面使用较小的学习率,更准确的查找最优点(自适应学习率)

几种常用

固定训练次数降低学习率

余弦形式降低学习率

线性形式降低学习率

幂函数的形式降低学习率

目前的优化方式

一阶优化

二阶优化

典型的牛顿法,通过曲率求结果,需要用到二阶导,可以明显加快查找的速度

二阶导中多元函数和一阶函数的对比

深度学习中不会使用二阶优化方法,因为海森矩阵求逆矩阵需要巨大算力,因此有人提出一些新型方法简化海森矩阵

训练过程

下图就是出现过拟合现象

Early Stopping:Always do this

训练准确率上升,验证准确率下降了,这种情况就要提前停止训练,保持最好模型效果

Model Ensembles(模型集成)

集合多个好而不同的模型,这些模型是从不同角度对数据进行训练得到的结果,从中选出比较好的模型

还可以使用不同时刻的模型集成,不同周期性的周期点进行集成

避免过拟合

正则化

Dropout

掐死部分神经元

为什么要用Dropout?

作用一

打破了神经元之间的联合适应性

因为不加dropout之前单个神经元会根据其他神经元提供的信息确定自己的功能,也可以说彼此神经元之间的依赖性强,因此在添加了dropout之后打破神经元之间的联合适应性,让每个神经元在不依赖其他神经元或者仅依赖少数神经元的情况下确立自己的功能,每个神经元都能独当一面,同样也减少了特征之间的干扰

注:如上图所示,每个神经元可能表示一种特征,打破特征之间的联合适应性,也是打破了每种特征之间的联系,让每种提取的特征都可以更好地作为分类依据。

作用二

起到了模型集成的效果

假设每一层有n个神经元,使用p=0.5(随机删除50%的神经元),这样就是2^n个模型的集成,因为每个神经元都是两种可能(留下或去掉),一共有2^n中可能。全连接层中一般是4096个神经元,那么使用dropout就相当于集成2^4096个模型,很庞大的一个数字,因此对模型效果提升有很大帮助

注:之所以是0.5,是因为在0.5的情况下,每个神经元删除或者保留的可能性是一直的,保证每个神经元“雨露均沾”

测试阶段不使用dropout

根据数学期望,在训练使用过dropout后,数学期望值就变成了之前的1/2,在测试阶段需要不成回来

补偿方法1

在测试阶段乘以P,P和训练阶段用的P相同

补偿方法2

测试的时候不考虑dropout,不做任何处理,称为Inverted Dropout

Dropout总结

具体可以看dropout的论文,

Dropout: A Simple Way to Prevent Neural Networks from Overfitting

数据增强

通过不同方式对图片进行操作,可以得到不止一张的图像作为数据集,可以扩充数据集,防止过拟合

水平翻转

水平翻转加颜色便偏移

随机裁剪

还可以进行其他方式

- translation(颜色变换)
- routation(旋转)
- stretching(伸展)
- shearing(剪切变形)
- lens distortions(透镜扭曲)等

DropConnect

随机掐死输入值

Fractional Pooling(分数池化)

池化窗口不一定是正方形,前向传播时随机生成

Stochastic Depth(随机深度)

随机掐死某些层,让每一层都独当一面,独立决策,而不是依赖其它层,可以使网络更深,达到1000多层。

Cutout

将图像中某些区域抹去

Mixup

将两类图像按不同比例融合

Choosing Hyperparameters

Check initial loss(校验初始损失函数)

保证神经网络没有什么额外错误

Overfit a small sample(在小数据集上尝试过拟合)

如果在小数据集上可以过拟合,那么说明在大的数据集上也可以进行更好的优化

Find learning_rate that maskes loss go down(找到能尽快使损失函数下降的学习率)

尝试下面四个常用学习率

Coarse grid,train for~1-5 epochs

刚开始使用比较大的学习率,快速下降,后面使用比较小的学习率

Look at loss curves(关注学习率的变化)

初始化不好

总结

选取参数的规则

参数值随机选取或者规则选取

关注权重的更新量

权重更新的值比上权重本身

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值