什么是批标准化 (Batch Normalization)

论坛 期权论坛 爱问     
hcj77   2022-5-24 00:27   9724   20
数学是达成目的的工具, 理解才是达成目的桥梁, 所以这篇文章用浅显易懂的动画阐述了复杂的机器学习概念.

强烈推荐通过动画的形式了解.
所以首先放视频链接: Youtube 或者 优酷.
代码实现请来这里看: Python 实现


普通数据标准化



Batch Normalization, 批标准化, 和普通的数据标准化类似, 是将分散的数据统一的一种做法, 也是优化神经网络的一种方法. 在之前 Normalization 的简介视频中我们一提到, 具有统一规格的数据, 能让机器学习更容易学习到数据之中的规律.

每层都做标准化



在神经网络中,数据分布对训练会产生影响. 比如某个神经元 x 的值为1, 某个 Weights 的初始值为 0.1, 这样后一层神经元计算结果就是 Wx = 0.1; 又或者 x = 20,这样  Wx 的结果就为 2.现在还不能看出什么问题, 但是,当我们加上一层激励函数, 激活这个Wx 值的时候,问题就来了. 如果使用像 tanh的激励函数, Wx的激活值就变成了 ~0.1 和 ~1, 接近于 1的部已经处在了 激励函数的饱和阶段,也就是如果 x无论再怎么扩大, tanh激励函数输出值也还是 接近1. 换句话说, 神经网络在初始阶段已经不对那些比较大的 x 特征范围敏感了.这样很糟糕,想象我轻轻拍自己的感觉和重重打自己的感觉居然没什么差别, 这就证明我的感官系统失效了.当然我们是可以用之前提到的对数据做 normalization 预处理,使得输入的 x变化范围不会太大,让输入值经过激励函数的敏感部分. 但刚刚这个不敏感问题不仅仅发生在神经网络的输入层,而且在隐藏层中也经常会发生.


只是时候 x换到了隐藏层当中,我们能不能对隐藏层的输入结果进行像之前那样的normalization 处理呢? 答案是可以的, 因为大牛们发明了一种技术,叫做 batchnormalization,正是处理这种情况.

BN 添加位置

Batch normalization 的 batch 是批数据, 把数据分成小批小批进行 stochastic gradient descent. 而且在每批数据进行前向传递 forward propagation 的时候, 对每一层都进行 normalization 的处理,



BN 效果

Batch normalization 也可以被看做一个层面. 在一层层的添加神经网络的时候,我们先有数据 X, 再添加全连接层,全连接层的计算结果会经过 激励函数 成为下一层的输入, 接着重复之前的操作. Batch Normalization (BN)就被添加在每一个全连接和激励函数之间.


之前说过,计算结果在进入激励函数前的值很重要, 如果我们不单单看一个值,我们可以说,计算结果值的分布对于激励函数很重要. 对于数据值大多分布在这个区间的数据, 才能进行更有效的传递. 对比这两个在激活之前的值的分布.上者没有进行 normalization, 下者进行了 normalization, 这样当然是下者能够更有效地利用 tanh进行非线性化的过程.


没有 normalize的数据 使用 tanh激活以后,激活值大部分都分布到了饱和阶段, 也就是大部分的激活值不是-1,就是1,而 normalize 以后, 大部分的激活值在每个分布区间都还有存在.再将这个激活后的分布传递到下一层神经网络进行后续计算, 每个区间都有分布的这一种对于神经网络就会更加有价值.Batchnormalization 不仅仅 normalize 了一下数据, 他还进行了反 normalize 的手续. 为什么要这样呢?

BN 算法



我们引入一些batchnormalization 的公式. 这三步就是我们在刚刚一直说的 normalization 工序, 但是公式的后面还有一个反向操作,将 normalize 后的数据再扩展和平移. 原来这是为了让神经网络自己去学着使用和修改这个扩展参数 gamma, 和 平移参数 β, 这样神经网络就能自己慢慢琢磨出前面的 normalization 操作到底有没有起到优化的作用,如果没有起到作用,我就使用 gamma和 belt来抵消一些 normalization 的操作.


最后我们来看看一张神经网络训练到最后,代表了每层输出值的结果的分布图. 这样我们就能一眼看出 Batchnormalization 的功效啦. 让每一层的值在有效的范围内传递下去.

如果你对 Batch Normalization 感兴趣, 也想实际动手做做看, 这还有更多使用 python 来编写 Batch Normalization 的教程: 莫烦 Python
分享到 :
0 人收藏

20 个回复

倒序浏览
2#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-5-24 00:27:49 发帖IP地址来自 北京
有两个问题:
1. 你提到,BN的作用是避开tanh激励函数的饱和区,但如果用的是ReLU激励函数,那BN的作用又是什么呢?
2. 如果不做标准化而直接学习scale和shift参数,是否也能得到类似效果?
3#
rh04jp  1级新秀 | 2022-5-24 00:28:11 发帖IP地址来自 福建
1, https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-13-BN/#compare 我这里有个用tensorflow做的BN教程,里面有对比tanh和relu在使用BN前后的动图效果,有图有真相。
2, scale 和 shift在视频中提到了,都是为了反标准化,而不是为了标准化,直接scale shift应该效果不好
4#
xaqu  1级新秀 | 2022-5-24 00:28:37 发帖IP地址来自 广东
好的,谢谢。
5#
dfbjt  1级新秀 | 2022-5-24 00:28:55 发帖IP地址来自 北京
这个赞,原以为relu会好点,没想到更糟。就是不知道elu效果怎么样
6#
13774550002  1级新秀 | 2022-5-24 00:29:23 发帖IP地址来自 北京邮电大学
elu 会好点.
7#
fsqoz  1级新秀 | 2022-5-24 00:30:14 发帖IP地址来自 北京
oh man...我当初装tensorflow时似乎就看的你的视频...
8#
xa33  1级新秀 | 2022-5-24 00:30:28 发帖IP地址来自 广东广州
有BN的网络,该怎么处理测试样本?训练时候有minibatch,测试时候也分minibatch吗?
9#
nv7  1级新秀 | 2022-5-24 00:30:43 发帖IP地址来自 北京邮电大学
bn可能部分做了relu的工作,如果没有relu是不是也能训练出来,猜测
10#
l2r_m  1级新秀 | 2022-5-24 00:31:38 发帖IP地址来自 中国
多谢,看的最明白的一个教程了
11#
9h6e6  1级新秀 | 2022-5-24 00:32:13 发帖IP地址来自 北京
请问这个数值分布,是指在一个batch内,不同样本在某层某个神经元上数值的分布吧?还是指一个样本内某层所有神经元的数值分布?
12#
v4bbd  1级新秀 | 2022-5-24 00:32:43 发帖IP地址来自 广东佛山
同样迷惑,求明白者解答下:目前自我感觉偏向前者(根据bn论文中的伪代码公式)
13#
pkx3q  1级新秀 | 2022-5-24 00:33:15 发帖IP地址来自 中国
想问下为什么ELU会好一点饱和区不是都在负半轴嘛
14#
hzv  1级新秀 | 2022-5-24 00:34:14 发帖IP地址来自 中国
Why does batch normalization work?
(1) We know that normalizing input features can speed up learning, one intuition is that doing same thing for hidden layers should also work.
(2)solve the problem of covariance shift
Suppose you have trained your cat-recognizing network use black cat, but evaluate on colored cats, you will see data distribution changing(called covariance shift). Even there exist a true boundary separate cat and non-cat, you can't expect learn that boundary only with black cat. So you may need to retrain the network.
For a neural network, suppose input distribution is constant, so output distribution of a certain hidden layer should have been constant. But as the weights of that layer and previous layers changing in the training phase, the output distribution will change, this cause covariance shift from the perspective of layer after it. Just like cat-recognizing network, the following need to re-train. To recover this problem, we use batch normal to force a zero-mean and one-variance distribution. It allow layer after it to learn independently from previous layers, and more concentrate on its own task, and so as to speed up the training process.
(3)Batch normal as regularization(slightly)
In batch normal, mean and variance is computed on mini-batch, which consist not too much samples. So the mean and variance contains noise. Just like dropout, it adds some noise to hidden layer's activation(dropout randomly multiply activation by 0 or 1).
This is an extra and slight effect, don't rely on it as a regularizer.
15#
rb7v5  1级新秀 | 2022-5-24 00:34:48 发帖IP地址来自 湖北
哥们能问一下你这个note哪来的么?
16#
gj_ic  1级新秀 | 2022-5-24 00:35:27 发帖IP地址来自 北京
求分享,谢谢!
17#
drufr  1级新秀 | 2022-5-24 00:36:17 发帖IP地址来自 黑龙江大庆
我认为是第一个
18#
phlo5d  1级新秀 | 2022-5-24 00:36:22 发帖IP地址来自 中国
从吴恩达的视频里面总结的哈
19#
dlq3378  2级吧友 | 2022-5-24 00:36:48 发帖IP地址来自 中国
我知道这是那课里的,但是我没找到那个课的note。。。
20#
hwp  1级新秀 | 2022-5-24 00:37:42 发帖IP地址来自 中国
自己整理咯,如果你有onenote,可以把我的分享给你
21#
_rhfj  1级新秀 | 2022-5-24 00:38:11 发帖IP地址来自 中国
多谢!私信你了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP