Batch Normalization究竟学到了数据的什么信息?
原文链接:
Batch Normalization究竟学到了数据的什么信息?
大家好,我是泰哥。上节为大家介绍了数据归一化的发展历程,本节就讲讲Batch Normalization的计算思路,看看它究竟强在哪里?为什么它可以使模型梯度保持平稳。
1 归一化不会改变数据分布
任何归一化的本质都是对数据进行平移和放缩。
- 平移:数据集每一列数据统一加上或减去某一个数
- 缩放:数据集每一列数据统一除以或乘以某一个数
import torch
import matplotlib.pyplot as plt# 生成200个黄色数据集,标签为1
yellow = torch.normal(mean = 2, std = 2, size=(200, 2))
yellow_label = torch.ones(size = (yellow.shape[0], 1))# 生成200个紫色数据集,标签为0
purple = torch.normal(mean = 8, std = 2, size=(200, 2))
purple_label = torch.zeros(size = (purple.shape[0], 1))# 合并数据集
data = torch.cat((yellow, purple), dim = 0)
label = torch.cat((yellow_label, purple_label), dim = 0)# 查看其分布
plt.scatter(data[:, 0], data[:, 1], c = label)
而数据的平移和放缩,不会影响数据特征的分布情况。
接下来,我们使用Z-score对其进行归一化操作,然后对比查看归一化前后数据集分布:
def z_score(t):std = t.std(0)mean = t.mean(0)ans = (t - mean) / stdreturn ans zs_data = z_score(data)# 然后对比查看归一化前后数据集分布
plt.figure(figsize=(12, 6))
plt.subplot(121)
plt.scatter(data[:, 0], data[:, 1], c = label)
plt.title('data distribution')
plt.subplot(122)
plt.scatter(zs_data[:, 0], zs_data[:, 1], c = label)
plt.title('zs_data distribution')
可以发现,数据在坐标中的绝对值会发生变化,但是归一化前后数据分布不变。
2 归一化其实是仿射变化
数据的仿射变换用矩阵形式来进行表示就是: x ^ = x ∗ w + b \hat x = x * w + b x^=x∗w+b其中x是原数据,w是参数矩阵,b是截距, x ^ \hat x x^是经过变换之后的数据。此处以Z-Score为例,探讨归一化操作转化为仿射变换的方法。
在归一化运算时,我们进行了如下操作:
x − m e a n ( x ) s t d ( x ) \frac{x-mean(x)}{std(x)} std(x)x−mean(x)
稍作变换,就可以写成如下表达式:
x s t d ( x ) − m e a n ( x ) s t d ( x ) = x ⋅ 1 s t d ( x ) − m e a n ( x ) s t d ( x ) \begin{aligned} \frac{x}{std(x)} - \frac{mean(x)}{std(x)} \\ = x \cdot\frac{1}{std(x)}- \frac{mean(x)}{std(x)} \\ \end{aligned} std(x)x−std(x)mean(x)=x⋅std(x)1−std(x)mean(x)
与 x ^ = x ∗ w + b \hat x = x * w + b x^=x∗w+b形式相同了,但在BN中会写作 x ⊗ γ + β x \otimes \gamma + \beta x⊗γ+β,其中 ⊗ \otimes ⊗表示逐个元素相乘, γ 和 β \gamma 和\beta γ和β为指代参数。
3 将平移与缩放设为参数
那么在归一化的过程中,放缩的部分可以通过矩阵乘法来完成,而平移部分则更加简单,让数据集加上由每一列平移幅度所构成的向量即可完成。
在实际操作中,我们将归一化操作看成一个特殊的线性层,也将极大拓展归一化操作可以出现的位置。在经典机器学习领域,对数据的归一化只停留在输入数据时对数据进行统一处理,那么在迭代过程中,数据会逐渐失去初始化之后所带来的良好特性,此时如果我们可以像添加线性层一样,在任意隐藏层前后添加归一化层进行处理,就能避免迭代过程中数据逐渐偏移所导致的梯度不平稳问题。
g r a d 3 = ∂ l o s s ∂ y ^ ⋅ F ( F ( X ∗ w 1 ) ∗ w 2 ) grad_3 = \frac{\partial loss}{\partial \hat y} \cdot F(F(X * w_1) * w_2) grad3=∂y^∂loss⋅F(F(X∗w1)∗w2)
实际上均值为0、方差为1的归一化不一定是最优选择,根据各层梯度计算公式不难看出,最佳的数据归一化方法并不是绝对的0均值1方差,而是能够使得最终各变量(输入、参数、激活函数)相乘之后梯度保持均衡。
4 BN实际流程
BN的平移和放缩分为两个阶段:
- 第一个阶段是先将数据进行Z-Score处理
- 第二阶段则是在此基础上在对数据的均值进行参数平移,并对其方差进行参数放缩
其实两个阶段做的是一件事,就是对参数进行平移和缩放。我们可以将第一阶段理解为将数据本身的均值与方差设为了初始值,第二阶段则是根据反向传播来不断的更新参数。
最终训练结束,数据将朝向方差为 γ \gamma γ、均值为 β \beta β的分布方向靠拢。
5 BN的衍生
在BN诞生之后,根据不同的业务场景,又衍生出了原理相同的一些方法,比如Layer Normalization
、instance normalization
、Group Nomalization
。
它们只是选择了数据的不同维度进行了缩放与平移,但是与BN的原理一致。
原文链接:
Batch Normalization究竟学到了数据的什么信息?
Batch Normalization究竟学到了数据的什么信息?相关推荐
- 什么是批标准化 (Batch Normalization)
为什么要数据标准化 (1)具有统一规格的数据, 能让机器学习更容易学习到数据之中的规律. (2)也是优化神经网络的一种方法 什么是批标准化 (Batch Normalization) Batch No ...
- Batch Normalization解析
Batch Normalization Batch Normalization, 批标准化, 和普通的数据标准化类似, 是将分散的数据统一的一种做法, 也是优化神经网络的一种方法 发现问题 如上图所示 ...
- Normalization 批标准化(batch normalization)理解
数学是达成目的的工具, 理解才是达成目的桥梁, 所以这篇文章用浅显易懂的动画阐述了复杂的机器学习概念. 强烈推荐通过动画的形式了解. 所以首先放视频链接: Youtube 或者 优酷. 代码实现请来这 ...
- 【学习笔记】Pytorch深度学习—Batch Normalization
[学习笔记]Pytorch深度学习-Batch Normalization Batch Normalization概念 `Batch Normalization ` `Batch Normalizat ...
- BN(Batch Normalization):批量归一化
现在的神经网络通常都特别深,在输出层像输入层传播导数的过程中,梯度很容易被激活函数或是权重以指数级的规模缩小或放大,从而产生"梯度消失"或"梯度爆炸"的现象,造 ...
- 偏差与方差、L1正则化、L2正则化、dropout正则化、神经网络调优、批标准化Batch Normalization(BN层)、Early Stopping、数据增强
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 3.2 深度学习正则化 3.2.1 偏差与方差 3.2.1.1 ...
- Lesson 14.1 数据归一化与Batch Normalization理论基础
Lesson 14.1 数据归一化与Batch Normalization理论基础 数据归一化是机器学习领域的一种对数据处理的常规方式.在传统机器学习领域,由于各特征的量纲不一致,可能出现建模过程 ...
- Batch Normalization标准化(精)==>一方面可以简化计算过程,一方面经过规范化处理后让数据尽可能保留原始表达能力
Layer normalization Normalization 有很多种,但是它们都有一个共同的目的,那就是把输入转化成均值为 0 方差为 1 的数据.我们在把数据送入激活函数之前进行 Norma ...
- 深度学习之优化详解:batch normalization
摘要: 一项优化神经网络的技术,点进来了解一下? 认识上图这些人吗?这些人把自己叫做"The Myth Busters",为什么?在他们的启发下,我们才会在Paperspace做类 ...
最新文章
- keil添加hal库_使用Keil uVision5创建stm32 hal库项目过程
- 源代码管理的新15条建议
- 关于js复制文本信息(按钮级别)
- 安卓学习-WebView
- 谈谈nodejs爬虫程序利器——cheerio模块
- nodejs因buildpack指定不当部署到CloudFoundry后出的一个错误
- storm apache java_Apache Ignite与Apache Storm(深入)
- 51单片机按键控制数码管0~9_51单片机外部中断
- 父组件传递值给子组件(一)
- 最便宜的865旗舰来了!全球首款5G游戏手机发布
- 非常全面的讲解SpringCloud中Zuul网关原理及其配置,看它就够了!
- 启动Virtual User Generator提示ArgumentNullException:值不能为null
- 最新恶意复制型病毒及代码分析
- cocos2d-x学习记录3——CCTouch触摸响应
- 常用电子面单接口API demo下载
- 课后作业3:软件分析与用户体验分析
- 为何国内“程序员”是秃头代名词?来看看国外程序员的一天
- Android简单计算器实现
- 考研线性代数手写笔记1 行列式
- 进程文件: dllhost 或者 dllhost.exe