[转]DeepLearning(基于caffe)优化策略--Normalization:BN、WN、LN
来源:互联网 发布:ubuntu 查看cpu核数 编辑:程序博客网 时间:2024/05/21 10:49
转自:龙王Black的博客http://blog.csdn.net/sihailongwang/article/details/72818603,
Yelena_11的博客:http://blog.csdn.net/yelena_11/article/details/53924225
非常感谢!
另外还有一部分资料内容:
知乎:请问batch_normalization做了normalization后为什么要变回来?:
https://www.zhihu.com/question/55917730/answer/154269264
[深度学习] Batch Normalization算法介绍 :http://blog.csdn.net/lhanchao/article/details/70308092
BN的好处:更高的学习率,更快的训练过程,防止过拟合,移除或使用较小的dropout,取消局部响应归一化层。
第一部分
一、简介
如果将googlenet称之为google家的inception v1的话,其Batch Normalization(http://arxiv.org/pdf/1502.03167v3.pdf)文章讲的就是BN-inception v1。
它不是网络本身本质上的内容修改,而是为了将conv层的输出做normalization以使得下一层的更新能够更快,更准确。
二、网络分析
caffe官方将BN层拆成两个层来实验,一个是https://github.com/BVLC/caffe/blob/master/include/caffe/layers/batch_norm_layer.hpp,
另外一个是https://github.com/BVLC/caffe/blob/master/include/caffe/layers/scale_layer.hpp。
其具体使用方法可以参考:https://github.com/KaimingHe/deep-residual-networks/blob/master/prototxt/ResNet-50-deploy.prototxt
中的BatchNorm与Scale。
BN-inceptionv1训练速度较原googlenet快了14倍,在imagenet分类问题的top5上达到4.8%,超过了人类标注top5准确率
补充说明:
在Caffe中使用Batch Normalization需要注意以下两点,
要配合Scale层一起使用,具体参见http://blog.csdn.net/sunbaigui/article/details/50807398以及Residual Network
训练的时候,将BN层的use_global_stats设置为false,然后测试的时候将use_global_stats设置为true,不然训练的时候会报“NAN”或者模型不收敛 —— 这个其实挺难注意到的
另附caffe框架学习的源码链接:
https://github.com/BVLC/caffe
http://caffe.berkeleyvision.org/
第二部分
我们知道,深度学习是一种高性能的解决模式识别问题的模型算法,尤其是在计算机视觉方面,但随之而来的,对深度学习进行优化也成为了一个大家讨论的话题。这次总结的是三种深度学习的Normalization。
一、Batch Normalization
什么是Batch Normalization?
即批标准化,和普通的标准化类似,是将数据进行归一化的操作,在网络(Network)中也属于一层操作。
为什么需要Batch Normalization?
众所周知,深度学习中的学习率(Learning Rate)是我们需要调整的参数之一,学习率太高,会导致Loss值“爆炸”(所谓爆炸,就是loss值过于大,失去了其的意义);学习率太小,Loss值一直处于平缓的状态,寻找一个合适的Rate,与你初始的学习率是有关的,如果初始的太大,会导致需要太多的时间,如果初始的太小,有可能错失了“最优参数”,于是BN算法就此诞生。
Batch Normalization的优点
1.因为BN可以使得训练的速度飙升,所以就可以选择较大的初始学习率,它能够使得衰减的速度变快,从而得到“最优学习率”,再也不用慢慢的调整学习率了
2.采用BN之后,你就可以移除dropout、L2正则项参数了,因为BN可以提高网络泛化的能力(有待以后去体会)
3.不用再使用局部相应归一化层了,因为BN本身就是归一化操作
怎么使用Batch Normalization?
具体操作如下:
我们需要输入的是待归一化的Xi,最后我们得到的是BN之后的Xi
特此说明:提出BN的大佬为了保持模型的表达能力,又增加了两个变量参数
Batch Normalization用在何处?
一般情况下,用在非线性激活函数之前,或者非线性激活函数之后
如何在caffe中进行应用呢?
在caffe中,BN被拆成两个文件(scale_layer.cpp和batch_normalization_layer.cpp)
训练时,在deploy.prototxt中写如下代码:
- layer{
- bottom: “conv1”
- top: “conv1”
- name: “bn_conv1”
- type: “BatchNorm”
- batch_norm_param {
- use_global_stats: false
- }
- }
- layer{
- bottom: “conv1”
- top: “conv1”
- name: “scale_conv1”
- type: “Scale”
- scale_param {
- bias_term: false
- }
- }
layer{
bottom: “conv1”
top: “conv1”
name: “bn_conv1”
type: “BatchNorm”
batch_norm_param {
use_global_stats: false
}
}
layer{
bottom: “conv1”
top: “conv1”
name: “scale_conv1”
type: “Scale”
scale_param {
bias_term: false
}
}
测试时,在deploy.prototxt中写如下代码:
- layer{
- bottom: “conv1”
- top: “conv1”
- name: “bn_conv1”
- type: “BatchNorm”
- batch_norm_param {
- use_global_stats: true
- }
- }
- layer{
- bottom: “conv1”
- top: “conv1”
- name: “scale_conv1”
- type: “Scale”
- scale_param {
- bias_term: false
- }
- }
layer{
bottom: “conv1”
top: “conv1”
name: “bn_conv1”
type: “BatchNorm”
batch_norm_param {
use_global_stats: true
}
}
layer{
bottom: “conv1”
top: “conv1”
name: “scale_conv1”
type: “Scale”
scale_param {
bias_term: false
}
}
二、Layer Normalization
什么是Layer Normalization?
即层标准化,和普通的标准化类似,是将网络中的层进行归一化的操作。
为什么需要Layer Normalization?
对于RNN模型来说,归一化的时候Batch Normalization不再适合,在RNN模型里,sequence的长度是不一致的,正是由于这种不一致的问题,导致BN使用起来效果不佳,借用网上的一句话,RNN的深度不是固定的,不同的time-step需要保存不同的statics特征,可能存在一个特殊的sequence比其sequence长,所以对sequence进行Batch Normalization计算起来比较麻烦。于是乎,Layer Normalization登场了。
Layer Normalization的优点
跟BN类似,也具有Normalization的优点,更适用于RNN模型
怎么使用Layer Normalization?
我们需要明确的是LN是对层进行归一化的,但是也是对某一层所有的dataset进行归一化的。
具体操作如下:
一般的通式:
针对RNN的公式:
由此可见,LN中同层输入拥有相同的均值和方差,不同输入拥有不同的均值和方差;而BN是同一个minibatch中的输入拥有相同的均值和方差,而不同minibatch的输入拥有不同的均值和方差。
三、Weight Normalization
什么是Weight Normalization?
即权重归一化,也就是对权重值进行归一化。
Weight Normalization的优点
1.WN是通过重写深度网络的权重来进行加速的,没有引入对minibatch的依赖,更适合于RNN网络
2.引入更少的噪声
3.不需要额外的空间进行存储minibatch的均值和方差,对时间的开销也小,所以速度会更快
- [转]DeepLearning(基于caffe)优化策略--Normalization:BN、WN、LN
- DeepLearning(基于caffe)优化策略(1)--Normalization篇:BN、WN、LN
- DeepLearning(基于caffe)优化策略(3)--调参篇
- <深度学习优化策略-1>Batch Normalization(BN)
- DeepLearning(基于caffe)优化策略(2)--防拟合篇:Dropout
- BN层 LN层 WN层作用介绍
- Batch Normalization(BN)
- <优化策略-2>深度学习加速器Layer Normalization-LN
- BN(batch Normalization)笔记
- BN(Batch Normalization)要点
- BN and Caffe BN
- DeepLearning(基于caffe)实战项目(2)--mnist(image转lmdb)
- DeepLearning(基于caffe)实战项目(7)--从caffe结构里函数总结一览caffe
- [caffe]深度学习之图像分类模型Batch Normalization[BN-inception]解读
- DeepLearning(基于caffe)实战项目(3)--我们关心的caffe输出
- DeepLearning(基于caffe)实战项目(5)--Matlab画学习(Loss)曲线
- DeepLearning(基于caffe)实战项目(1)--mnist_convert函数分析
- DeepLearning(基于caffe)实战项目(4)--Matlab测试训练好的model
- 剑指offer题解C++【19】顺时针打印矩阵
- mysql基本语句操作(一)--一对一的实现
- JQuery 即 点 即 改
- 0728AM jQuery.ajax实现文件上传存在的问题
- Vue 2.0 的变化(一)之基本 API 变化
- [转]DeepLearning(基于caffe)优化策略--Normalization:BN、WN、LN
- Pots
- Xamarin Android读写Contacts联系人
- Qt之信号槽机制
- build.gradle文件详解
- windows pip install MySQL-python
- ie hack
- Mybatis传多个参数(三种解决方案)
- 硬件仿真注意事项