Batch normalization:accelerating deep network training by reducing internal covariate shift的笔记
说实话,这篇paper看了很久,,到现在对里面的一些东西还不是很好的理解。
下面是我的理解,当同行看到的话,留言交流交流啊!!!!!
这篇文章的中心点:围绕着如何降低 internal covariate shift 进行的, 它的方法就是进行batch normalization。
internal covariate shift 和 batch normalization
1. 什么是 internal covariate shift呢?
简单地理解为一个网络或system的输入的dirstribution不断地发生变化,导致网络的训练很难。
2. 文中的 batch normalization 怎么回事呢?
1)文中对输入data的每一维的基于batch 块的size 个数据 进行 normalization。 用公式表示:
, 这个其实就是 z-score。
2)为了不改变网络的 representation(进行normalizaiton, 肯定改变了输入的 scale了吧), 对normalization 之后的值进行scale 与 shift: (我感觉这个很重要的,真的)
分析:
首先:对于如何尽可能地使每一层的 inputs 的 distribution 不发生变化这一件事情上,文章的做法就是:对输入进行 normalizaiton, 结果呢, 每一维上的数据的分布有了相同的 均值 0 与 方差(variance). 也仅仅只能在这两点上进行对网络的输入的分布进行控制, 来达到减少 internal covariate shift的目的;
第二点:这个网络的输入是指的:上一层的输入 X 加权 W 以后的值,即 WX(也可以加上偏置,不过应该省略掉,加了也没有屁用,经过 normalization就没有作用了,另个后面对它进行调整的beta值可以代替它的使用了)。 如果想对网络的输出即 X 进行 batch normalizaiton 也是可以的,不过呢,由于呢,X 需要进行加权 W,所以呢,仅仅通过 mean 与 variance (即一阶矩与二阶矩)并不能很好地控制 输入的 distribution. 文章3.2 section的原话为: We could have also normalized the layer inputs u, but since u is likely the output of another nonlinearity, the shape of its distribution is likely t o change during training, and constraining its first and second moments would not eliminate the covariate shift。
第三点:为什么是在输入的每一维进行 normalizaiton,而不是对于输入的维度之间即每一层N个激活函数的输入之间进行呢? (在有些的神经网络中,有时最开始的输入进行标准化)
后来思考了一个这个问题: 认为就是应该在基于 batch的每一维度之间进行 normalizaiton. 在训练过程中,对于不同的 examples, 就应该让输入的每一个维度的分布尽可能一样,别瞎变来变去的。 而输入的各个维度之间的分布尽可能地不同,只能这样才可以更好地进行分类啊。 你想想,把很多类别集中在一个小的区域好呢,还是分散更好呢? 或者这么理解是对的吧。。。
文章 section 2 的理解:
问题1: 这是想了好久呢,感觉问题在于:
这个公式,它们不相等啊。。。。 E(delta)b 不等于 (delta)b 的啊。
问题2:另外,如果考虑 EX 对 B 的影响,会发现 delta b 为0 啊。。,所以,因为经过normalization, 这个偏置对网络的输入没有什么影响啊,直接约没有了;
问题3:对于文中解释的,为什么会出现文中的那个情况,我真的没有看明白啊。。我感觉文中意思是应该把Ex中的相关参数考虑进去。 但是考虑进去的话,就出现问题2 的情况了,这个 b 直接不用更新了,反正它对输入也没有影响了。另外通过 beta 参数就可以代替偏置b 的作用了;
batch normalizaiton 的步骤与梯度公式:
在网络进行正向传导时, batch normalization的步骤为如下图,即文中的 algorithm 1:
这个不难,一看就明白;
下图为梯度更新公式:
对于上面的公式:主要明白第二个与第三个公式中的为什么要求 m 的加和:在基于mini-batch 的反向传播算法中, W 与 b 的更新都是要进行加和处理的,对吧,没有问题。而
与W 和 b 是类似的,在 batch中的examples 之间是共用的,所以呢,需要加和。 到最后更新使用的时候,要不要除以 m, 这个需要看 loss函数是怎么定义的了;
链式法则时:永远记住谁是谁的变量,就不会出错了。例如:上面公式中为什么要求对
的梯度呢,就是因为 xi 影响了
,在求对 xi 的梯度时,需要计算在包含在
中的那一部分;
对于测试过程:
需要思考:训练的时候,normalizaiton的参数由batch 的example决定,而测试时,这个参数怎么办???
这个参数只能中训练样本决定(千万别想着由测试样本决定,怎么可能), 文章中采用无偏估计,理论为中全部的样本的均值与方差,但是计算公式如下:
公式表示把每一个batch的参数再求无偏估计的期望值, 而不是重新把样本全部相加计算;因为, batch 参数在训练过程的已经求出了啊,避免再次计算了,并且用无偏估计可以更好的估计出用全部样本计算出来的方差与均值;
再想一个问题:
很多时候,我们基于样本集1 训练出来的网络模型,可以通过 tuning,应用到 样本集中。 而采用 batch normalizaiton 的方法训练得到的网络模型,很大程度上应该受到了这样的限制。 因为参数中的均值与方差很依赖训练样本的;
训练与测试的总过程:
对于卷积的情况:
在全连接层的网络中的每一个神经元相当于卷积层的中每一个 feature map. 在同一个feature map中的神经元之间共享权值与偏置。对于卷积神经网络的 bath normalization, 这里的batch 指的是同一个 feature map 以及 batch 上的二者 联合起来的 batch . 例如: batch 大小为32, feature map 为 5*5 ,则应该在 32* 5*5 个输入之间求均值与方差;
bath normalization 是怎么enable higher learning rate的:
文章的解释为:当大的 lr时, 会使权值变大,而权值变大不会影响 layer jacobian(它决定了反向传播过程中的梯度在网络中的传播), 并且使 对权值的更新的梯度变小; 公式如下:
这个公式简单证明一下:
对于其它:
文章其它就是说了实验部分了,以及对 batch normalization 的其它一些功能的推测;
在实验部分最让我吃惊的地方就是: 使用batch normalization以后,学习速度明显加快了很多,这一点很重要啊;我感觉特厉害;
另外,文章有很多用于协方差矩阵、奇异值等的地方,这个需要加强演习;
论文引用:
Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015.
Batch normalization:accelerating deep network training by reducing internal covariate shift的笔记的更多相关文章
- Deep Learning 27:Batch normalization理解——读论文“Batch normalization: Accelerating deep network training by reducing internal covariate shift ”——ICML 2015
这篇经典论文,甚至可以说是2015年最牛的一篇论文,早就有很多人解读,不需要自己着摸,但是看了论文原文Batch normalization: Accelerating deep network tr ...
- 图像分类(二)GoogLenet Inception_v2:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
Inception V2网络中的代表是加入了BN(Batch Normalization)层,并且使用 2个 3*3卷积替代 1个5*5卷积的改进版,如下图所示: 其特点如下: 学习VGG用2个 3* ...
- 论文笔记:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
ICML, 2015 S. Ioffe and C. Szegedy 解决什么问题(What) 分布不一致导致训练慢:每一层的分布会受到前层的影响,当前层分布发生变化时,后层网络需要去适应这个分布,训 ...
- Batch Normalization:Accelerating Deep Network Training by Reducing Internal Covariate Shift(BN)
internal covariate shift(ics):训练深度神经网络是复杂的,因为在训练过程中,每层的输入分布会随着之前层的参数变化而发生变化.所以训练需要更小的学习速度和careful参数初 ...
- Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
1. 摘要 训练深层的神经网络非常困难,因为在训练的过程中,随着前面层数参数的改变,每层输入的分布也会随之改变.这需要我们设置较小的学习率并且谨慎地对参数进行初始化,因此训练过程比较缓慢. 作者将这种 ...
- Batch Normalization原理及其TensorFlow实现——为了减少深度神经网络中的internal covariate shift,论文中提出了Batch Normalization算法,首先是对”每一层“的输入做一个Batch Normalization 变换
批标准化(Bactch Normalization,BN)是为了克服神经网络加深导致难以训练而诞生的,随着神经网络深度加深,训练起来就会越来越困难,收敛速度回很慢,常常会导致梯度弥散问题(Vanish ...
- 深度学习网络层之 Batch Normalization
Batch Normalization Ioffe 和 Szegedy 在2015年<Batch Normalization: Accelerating Deep Network Trainin ...
- 【深度学习】深入理解Batch Normalization批标准化
这几天面试经常被问到BN层的原理,虽然回答上来了,但还是感觉答得不是很好,今天仔细研究了一下Batch Normalization的原理,以下为参考网上几篇文章总结得出. Batch Normaliz ...
- 解读Batch Normalization
原文转自:http://blog.csdn.net/shuzfan/article/details/50723877 本次所讲的内容为Batch Normalization,简称BN,来源于<B ...
随机推荐
- Why-are-GPUs-well-suited-to-deep-learning
https://www.quora.com/Why-are-GPUs-well-suited-to-deep-learning http://timdettmers.com/2015/03/09/de ...
- Linux 守护进程
1.什么是守护进程 守护进程daemon指的是在后台运行的进程 2.前台任务和后台任务 前台任务:独占命令行窗口,运行完毕或手动终止,才能执行其他命令 以redis服务为例 redis-server ...
- libevent源码分析:event_add、event_del
event_add.event_del两个函数分别是使event生效和失效的,下面就来看一下两个函数的实现. event_add int event_add(struct event *ev, con ...
- Leetcode:Scramble String 解题报告
Scramble String Given a string s1, we may represent it as a binary tree by partitioning it to two no ...
- java多线程16:join()的使用
讲解join()方法之前请确保对于即wait()/notify()/notifyAll()机制已熟练掌握.可以参考前面的笔记 join()方法的作用是等待线程销毁.join()方法反应的是一个很现实的 ...
- decode和encode
作者:于洋链接:https://www.zhihu.com/question/23374078/answer/69732605来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- IntelliJ IDEA maven库下载依赖包速度慢的问题
Reference: https://blog.csdn.net/qq1501340219/article/details/54638158 在pom.xml中添加maven 依赖包时,我就发现不管是 ...
- Ubuntu常用安装源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak #备份 sudo vim /etc/apt/sources.list #修改 sudo ...
- 七牛文件上传-python
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import os from sevencow import CowException ...
- 基于jQuery左侧大图右侧小图切换代码
基于jQuery左侧大图右侧小图切换代码是一款带右侧缩略图选项卡的jQuery图片切换特效.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class=" ...