Batch Normalization: 原理及细节

觉得有用的话,欢迎一起讨论相互学习~Follow Me

参考文献
吴恩达deeplearningai课程
课程笔记
Udacity课程

为了标准化这些值,我们首先需要计算出批数据中的平均值,如果你仔细看这些代码,你会发现这不是对输入的批数据计算平均值,而是对任意一个特定层的在传入非线性函数之前的输出求平均值。然后将其通过非线性函数后传递给下一层作为输入。

我们将平均值表示为\(\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_原理及细节的更多相关文章

  1. Tensorflow BatchNormalization详解:4_使用tf.nn.batch_normalization函数实现Batch Normalization操作

    使用tf.nn.batch_normalization函数实现Batch Normalization操作 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴恩达deeplearnin ...

  2. Tensorflow BatchNormalization详解:3_使用tf.layers高级函数来构建带有BatchNormalization的神经网络

    Batch Normalization: 使用tf.layers高级函数来构建带有Batch Normalization的神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴 ...

  3. Tensorflow BatchNormalization详解:2_使用tf.layers高级函数来构建神经网络

    Batch Normalization: 使用tf.layers高级函数来构建神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴恩达deeplearningai课程 课程笔 ...

  4. 丰富图文详解B-树原理,从此面试再也不慌

    本文始发于个人公众号:TechFlow,原创不易,求个关注 本篇原计划在上周五发布,由于太过硬核所以才拖到了这周五.我相信大家应该能从标题当中体会到这个硬核. 周五的专题是大数据和分布式,我最初的打算 ...

  5. Git详解之二 Git细节拾遗

    git知识点详解 文件状态 现在我们手上已经有了一个真实项目的 Git 仓库,并从这个仓库中取出了所有文件的工作拷贝.接下来,对这些文件作些修改,在完成了一个阶段的目标之后,提交本次更新到仓库. 请记 ...

  6. 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)

    原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解    By 岩之痕 目录: 一:综述 ...

  7. P2P技术详解(一):NAT详解——详细原理、P2P简介

    1. IPv4协议和NAT的由来 今天,无数快乐的互联网用户在尽情享受Internet带来的乐趣.他们浏览新闻,搜索资料,下载软件,广交新朋,分享信息,甚至于足不出户获取一切日用所需.企业利用互联网发 ...

  8. TensorFlow 安装详解

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! 『不要把手段当成目标 — <一个瑜伽行者的自传>』   本文提纲 1. 机器学习 2 ...

  9. Percona-xtrabackup 使用详解与原理

    现在有个需求需要对使用 innodb 的数据库进行热备.网上查了很多工具皆推荐 Percona-xtrabackup 于是就仔细了解调研一番. 我们可以前往 https://www.percona.c ...

随机推荐

  1. node stream流

    stream 模块可以通过以下方式使用: const stream = require('stream');   Node.js 中有四种基本的流类型: Writable - 可写入数据的流(例如 f ...

  2. loadrunner socket协议问题归纳(0)

    一.概述         Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作.     二.socket概述         soc ...

  3. CSS布局之圣杯布局和双飞翼布局

    其实圣杯布局和双飞翼布局实现的都是三栏布局,两边的盒子宽度固定,中间盒子自适应,也就是我们常说的固比固布局.它们实现的效果都是一样的,差别在于其实现的思想. 一.圣杯布局 html代码中,将重要的内容 ...

  4. Scrum立会报告+燃尽图(十月十日总第一次):选题

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2190 Scrum立会master:付佳 一.小组介绍 组长:付佳 组员: ...

  5. 王者荣耀交流协会--第2次Scrum会议

    Scrum master:袁玥 要求1:工作照片 要求2:时间跨度:2017年10月14号  6:02--6:43  共计41min 要求3:地点:一食堂二楼两张桌子旁(靠近卖方便面那边) 要求4:立 ...

  6. "Hello World"团队召开的第三周第七次会议

    今天是我们团队“Hello World!”团队召开的第三周的第七次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.Todo List 六.会议照片 七.燃尽图 一.会议时 ...

  7. 四则运算(Android)版

    实验题目: 将小学四则运算整合成网页版或者是Android版.实现有无余数,减法有无负数.... 设计思路: 由于学到的基础知识不足,只能设计简单的加减乘除,界面设计简单,代码量少,只是达到了入门级的 ...

  8. 网页调用vlc并播放网络视频

    环境:windows/android/ios windows端保存以下内容为reg文件并运行 Windows Registry Editor Version 5.00 [HKEY_CLASSES_RO ...

  9. 福大软工1816:Alpha事后诸葛

    福大软工·第十一次作业-Alpha事后诸葛亮 组长博客链接 本次作业博客链接 项目Postmortem 模板 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描 ...

  10. Java 线程安全问题

    线程安全问题产生原因: 1.多个线程操作共享的数据: 2.操作共享数据的线程代码有多条.   当一个线程正在执行操作共享数据的多条代码过程中,其它线程也参与了运算, 就会导致线程安全问题的发生. cl ...