Tensorflow BatchNormalization详解:1_原理及细节
Batch Normalization: 原理及细节
觉得有用的话,欢迎一起讨论相互学习~Follow Me
为了标准化这些值,我们首先需要计算出批数据中的平均值,如果你仔细看这些代码,你会发现这不是对输入的批数据计算平均值,而是对任意一个特定层的在传入非线性函数之前的输出求平均值。然后将其通过非线性函数后传递给下一层作为输入。
我们将平均值表示为\(\mu_B\),是所有\(x_i\) 值得和然后除以\(x_i\) 的个数\(m\)。
\[
\mu_B \leftarrow \frac{1}{m}\sum_{i=1}^m x_i
\]
然后我们需要计算方差或者均方差,用\(\sigma_{B}^{2}\)表示。如果你不熟悉数理统计,简单来说就是将每个\(x_i\)的值将其减去这个批次的平均值(先前我们计算过这个值并且用\(\mu_B\)表示)。这就是我们所说的对该值的偏差。我们将结果平方以得到平方偏差。将批次中所有数据的平方偏差求和再除以数值的个数即\(m\),所得的这个平均值叫做平方偏差。
\[
\sigma_{B}^{2} \leftarrow \frac{1}{m}\sum_{i=1}^m (x_i - \mu_B)^2
\]
一旦我们有了均值和方差,我们就可以用下面的方程对数据进行归一化。对于每个值,我们将其减去平均值并处以标准差(几乎是)。(你可能多次听说过标准偏差,但如果你没有研究统计数据,你可能不知道标准偏差实际上是均方差的平方根.)
\[
\hat{x_i} \leftarrow \frac{x_i - \mu_B}{\sqrt{\sigma_{B}^{2} + \epsilon}}
\]
上面我们说的是几乎是标准偏差,这是因为该批次的实际标准偏差是\(\sqrt{\sigma_{B}^{2}}\),但是在我们的方程式中我们在分母的位置的平方根号中加入了一个很小的数\(\epsilon\)。这个\(\epsilon\)可以是任意一个很小的正数,在我们的代码中,我们使用值0.001.这个操作是为了确保我们不会试图使用0作为除数,但实际上他也的确为每个批次稍微增加了一点方差。
为什么增加方差?根据统计学上说法,这是有道理的,因为即使我们一次对一个批次进行标准化,我们也正在尝试估计总体训练集合上的分布,而总体方差高于从该总体中抽取的任何样本的方差,因此每批增加差异有助于将其考虑在内。
此时,我们已经得到了一个归一化的值,即 \(\hat{x_i}\) 。但我们不是直接使用它,而是将它乘以一个伽玛值 \(\gamma\),然后添加一个\(\beta\)。 \(\gamma\) 和 \(\beta\) 都是网络的可学习参数,分别用于缩放和移位归一化值。因为它们就像权重一样可以学习,所以它们可以在训练过程中为网络提供一些额外的旋钮,以帮助网络更好的学习。
\[
y_i \leftarrow \gamma \hat{x_i} + \beta
\]
我们现在有了神经层批量标准化后最终的输出,我们可以将其传递给非线性激活函数例如:sigmoid, tanh, ReLU, Leaky ReLU等等。在原始批量标准化论文中Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. 他们提到可能会出现希望在非线性之后而不是之前执行批量标准化,但实际上实践中很难找到像这样的用途。
Tensorflow BatchNormalization详解:1_原理及细节的更多相关文章
- Tensorflow BatchNormalization详解:4_使用tf.nn.batch_normalization函数实现Batch Normalization操作
使用tf.nn.batch_normalization函数实现Batch Normalization操作 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴恩达deeplearnin ...
- Tensorflow BatchNormalization详解:3_使用tf.layers高级函数来构建带有BatchNormalization的神经网络
Batch Normalization: 使用tf.layers高级函数来构建带有Batch Normalization的神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴 ...
- Tensorflow BatchNormalization详解:2_使用tf.layers高级函数来构建神经网络
Batch Normalization: 使用tf.layers高级函数来构建神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴恩达deeplearningai课程 课程笔 ...
- 丰富图文详解B-树原理,从此面试再也不慌
本文始发于个人公众号:TechFlow,原创不易,求个关注 本篇原计划在上周五发布,由于太过硬核所以才拖到了这周五.我相信大家应该能从标题当中体会到这个硬核. 周五的专题是大数据和分布式,我最初的打算 ...
- Git详解之二 Git细节拾遗
git知识点详解 文件状态 现在我们手上已经有了一个真实项目的 Git 仓库,并从这个仓库中取出了所有文件的工作拷贝.接下来,对这些文件作些修改,在完成了一个阶段的目标之后,提交本次更新到仓库. 请记 ...
- 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)
原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解 By 岩之痕 目录: 一:综述 ...
- P2P技术详解(一):NAT详解——详细原理、P2P简介
1. IPv4协议和NAT的由来 今天,无数快乐的互联网用户在尽情享受Internet带来的乐趣.他们浏览新闻,搜索资料,下载软件,广交新朋,分享信息,甚至于足不出户获取一切日用所需.企业利用互联网发 ...
- TensorFlow 安装详解
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! 『不要把手段当成目标 — <一个瑜伽行者的自传>』 本文提纲 1. 机器学习 2 ...
- Percona-xtrabackup 使用详解与原理
现在有个需求需要对使用 innodb 的数据库进行热备.网上查了很多工具皆推荐 Percona-xtrabackup 于是就仔细了解调研一番. 我们可以前往 https://www.percona.c ...
随机推荐
- [redis] linux下哨兵篇(3)
一.前言1.为何部署sentinel哨兵前文redis主从架构中,当主服务故障时,需要手动将从服务切换为主服务,sentinel服务就是将这个过程自动化.主要功能有:1)不时监控主从服务正常运行2)可 ...
- DB2 9.5 数据库分区管理及应用实践
DB2 数据库分区是 DB2 企业版 DPF(Data Partitioning Feature)选件提供的,它主要用来为大规模数据处理.高并发数据访问提供支持.DB2 数据库分区采用 Share-n ...
- 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局
继承是C++作为OOD程序设计语言的三大特征(封装,继承,多态)之一,单一非多态继承是比较好理解的,本文主要讲解GCC环境下的多重继承和虚拟继承的对象内存布局. 一.多重继承 先看几个类的定义: 01 ...
- eclipse取消validation验证
点击按钮如下:window-Preferences-Validation.如图. 然后把build里面的都取消.即可.
- request内置对象在JSP
- 软工网络15团队作业4——Alpha阶段敏捷冲刺-5
一.当天站立式会议照片: 二.项目进展 昨天已完成的工作: 日期等细致信息的处理,对添加账单日期化. 明天计划完成的工作: 完成对账单的编辑,删除等操作,以及开始服务器的编写工作 工作中遇到的困难: ...
- HashMap的扩容机制以及默认大小为何是2次幂
HashMap的Put方法 回顾HashMap的put(Key k, Value v)过程: (1)对 Key求Hash值,对n-1取模计算出Hash表数组下标 (2)如果没有碰撞,直接放入桶中,即H ...
- 【C++】C++ static关键字详解
static的作用 1.隐藏 当我们编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,其他的源文件也能访问.如,我们有源文件source1.cpp定义了一个全局变量i和函数Fu ...
- jquery弹出层开源框架layer
高度自适应参考:layer.open如何让高度自适应? 高度自适应修改layer.js代码如下: r.iframeAuto = function(e) { if (e) { var t = r.get ...
- EM算法【转】
混合高斯模型和EM算法 这篇讨论使用期望最大化算法(Expectation-Maximization)来进行密度估计(density estimation). 与K-means一样,给定的训练样本是, ...