Normalization(归一化)

写这一篇的原因是以前只知道一个Batch Normalization,自以为懂了。结果最近看文章,又发现一个Layer Normalization,一下就懵逼了。搞不懂这两者的区别。后来是不查不知道,一查吓一跳,Normalization的方法五花八门,Batch Normalization, Layer Normalization, Weight Normalization, Cosine Normalization, Instance Normalization, Group Normlization, Switchable Normlization.... 估计我没看到的还有很多。而且郁闷的是,感觉越看越不懂了...

这里简单记录一下目前的理解与问题。

白化

白化的目的是希望特征符合独立同分布i.i.d条件。包括:

  1. 去除特征之间的相关性 —> 独立;
  2. 使得所有特征具有相同的均值和方差 —> 同分布。

这里我有了第一个问题。什么叫做去除特征之间的相关性?
比如,有两个输入向量,X1=(x11,x12,x13,x14), X2=(x21,x22,x23,x24)
去除特征之间的相关性,只是去除x11,x12,x13,x14之间的相关性,还是去除x11和x21的相关性?

Normalization的好处

  1. 使得数据更加符合独立同分布条件,减少internal corvariate shift导致的偏移
  2. 使数据远离激活函数的饱和区,加快速度。(我理解是只对sigmoid这样的激活函数有效,对relu则没有加速作用了)

Normalization基本公式

\[h=f(g\frac{x-\mu}{\sigma}+b)\]

\(\mu\):均值
\(\sigma\):方差根
\(b\): 再平移参数,新数据以\(b\)为均值
\(g\): 再缩放参数,新数据以\(g^2\)为方差
归一化后的目标就是统一不同\(x\)之间的均值和方差

加入\(g\)和\(b\)的目的是使数据一定程度偏离激活函数的线性区,提高模型表达能力。因为均值是0的话正好落在sigmoid函数的线性部分。

第二个问题,g和b是根据什么确定的,是trainable的吗?

Batch Normalization

Batch Normalization是针对不同batch导致的数据偏移做归一化的方式。比如,一个batch有3个输入,每个输入是一个长度为4的向量。
\(X1=(x11,x12,x13,x14)\)
\(X2=(x21,x22,x23,x24)\)
\(X3=(x31,x32,x33,x34)\)

在上述条件下,归一化时的均值是:
\(\mu=(\frac{x11+x21+x31}{3},\frac{x12+x22+x32}{3},\frac{x13+x23+x33}{3},\frac{x14+x24+x34}{3})\)

这里主要展示一下计算时的方向,即对于每个元素位置,对不同的输入做归一化。方差同理。

第三个问题,很多文章都说batch norm需要在batch size较大,不同batch之间均值方差相差不大的情况下效果好。
即batch的均值方差跟整体的均值方差一致时效果好。
这我就不懂了,无论之前每个batch的分布是怎样的,经过归一化,都已经是相同分布了。为什么一定要原始batch之间分布相似呢?

Batch norm有个缺点,即需要记录每一个batch输入的均值和方差,对于变长的RNN网络来说计算麻烦。

第四个问题:为什么要记录每个batch的均值和方差?对RNN效果不好仅仅因为麻烦吗?
我个人理解BN在RNN上效果不好的原因是,虽然RNN训练时网络深度很深,但实际上只有一个神经元节点,相当于把所有层的神经元的均值和方差设定为相同的值了,导致效果不佳。

如果是图像,则输入是一个四维矩阵,(batch_size, channel_size, weight, height),此时batch norm是针对同一个batch的不同输入中属于同一通道的元素做归一化。如下图,是一个batch_size=2, channel_size=6, weight=5, height=3的例子。一次batch norm是对所有橙色部分元素做归一化。

Layer Normalization

Layer Normalization是针对同一个输入的不同维度特征的归一化方式。还是用上面的例子。
对于\(X1\)来说,layer norm的归一化均值是: \(\mu=\frac{x11+x12+x13+x14}{4}\)

对于图像来说,则是对一个输入的所有元素做归一化。如下图橙色部分:

Instance Norm

对一个输入图像的一个通道中的所有元素做归一化。如下图橙色部分:

Group Norm

对于一个输入图像的多个通道元素做归一化。如下图橙色部分:

Weight Norm

前面的归一化方法都是从不同维度对输入数据做归一化,而weight norm则是对权重做归一化。

Cosine Norm

抛弃了权重和输入点积的计算方式,改用其他函数。

参考文献

  1. https://zhuanlan.zhihu.com/p/33173246
  2. https://blog.csdn.net/liuxiao214/article/details/81037416

【算法】Normalization的更多相关文章

  1. 【转载】 详解BN(Batch Normalization)算法

    原文地址: http://blog.csdn.net/hjimce/article/details/50866313 作者:hjimce ------------------------------- ...

  2. Batch Normalization原理及其TensorFlow实现——为了减少深度神经网络中的internal covariate shift,论文中提出了Batch Normalization算法,首先是对”每一层“的输入做一个Batch Normalization 变换

    批标准化(Bactch Normalization,BN)是为了克服神经网络加深导致难以训练而诞生的,随着神经网络深度加深,训练起来就会越来越困难,收敛速度回很慢,常常会导致梯度弥散问题(Vanish ...

  3. Batch Normalization的算法本质是在网络每一层的输入前增加一层BN层(也即归一化层),对数据进行归一化处理,然后再进入网络下一层,但是BN并不是简单的对数据进行求归一化,而是引入了两个参数λ和β去进行数据重构

    Batch Normalization Batch Normalization是深度学习领域在2015年非常热门的一个算法,许多网络应用该方法进行训练,并且取得了非常好的效果. 众所周知,深度学习是应 ...

  4. 常见的几种 Normalization 算法

    神经网络中有各种归一化算法:Batch Normalization (BN).Layer Normalization (LN).Instance Normalization (IN).Group No ...

  5. 归一化方法 Normalization Method

    1. 概要 数据预处理在众多深度学习算法中都起着重要作用,实际情况中,将数据做归一化和白化处理后,很多算法能够发挥最佳效果.然而除非对这些算法有丰富的使用经验,否则预处理的精确参数并非显而易见. 2. ...

  6. 从Bayesian角度浅析Batch Normalization

    前置阅读:http://blog.csdn.net/happynear/article/details/44238541——Batch Norm阅读笔记与实现 前置阅读:http://www.zhih ...

  7. 一个关于AdaBoost算法的简单证明

    下载本文PDF格式(Academia.edu) 本文给出了机器学习中AdaBoost算法的一个简单初等证明,需要使用的数学工具为微积分-1. Adaboost is a powerful algori ...

  8. PCA算法

    本文出处:http://blog.csdn.net/xizhibei http://www.cnblogs.com/bourneli/p/3624073.html PrincipalComponent ...

  9. SIFT算法:DoG尺度空间生产

    SIFT算法:DoG尺度空间生产  SIFT算法:KeyPoint找寻.定位与优化 SIFT算法:确定特征点方向  SIFT算法:特征描述子 目录: 1.高斯尺度空间(GSS - Gauss Scal ...

随机推荐

  1. 迁移git

    转自:https://www.darrenfang.com/2016/03/transferring-a-repository/ 因为更换服务器,需要将原来的 git 项目迁移到新的服务器上,需要保留 ...

  2. Django异步任务之Celery

    Celery celery 是一个用于实现异步任务的库, 在很多项目中都使用它, 它和 django 融合使用很完美. 使用 celery 可以在实现 http request请求返回 view 前做 ...

  3. 学习java接口知识

    学习java接口知识 //一个类最多只能有一个直接的父类.但是有多个间接的父类. java是单继承. class ye_01{ String name; } class fu_01 extends y ...

  4. 【BZOJ3997】[TJOI2015]组合数学(动态规划)

    [BZOJ3997][TJOI2015]组合数学(动态规划) 题面 BZOJ 洛谷 题解 相当妙的一道题目.不看题解我只会暴力网络流 先考虑要求的是一个什么东西,我们把每个点按照\(a[i][j]\) ...

  5. 「NOI2013」小 Q 的修炼 解题报告

    「NOI2013」小 Q 的修炼 第一次完整的做出一个提答,花了半个晚上+一个上午+半个下午 总体来说太慢了 对于此题,我认为的难点是观察数据并猜测性质和读入操作 我隔一会就思考这个sb字符串读起来怎 ...

  6. H3C WAP712C 路由器设置

    0.做完任何设置之后都要执行保存操作,否则断电后设置会丢失! 1.默认登录参数:IP:192.168.0.50ID:adminPD:h3capadmin 2.修改默认IP地址:设备 --> 接口 ...

  7. go实现dgraph的各种操作

    go实现dgraph的各种操作 import "github.com/dgraph-io/dgo" import "github.com/dgraph-io/dgo/pr ...

  8. DataReader转Dictionary数据类型之妙用

    datareader转dictionary有很多用处,可以输出表中部分字段转实体字段,以前需要全部字段输出或者再建一个实体模型才行,这样就可以减少数据库的输出量了,特别是某些接口的格式化输出很方便. ...

  9. Cucumber语法格式

    @login Feature: Login @T1 Scenario: Login with correct credentail Given I open login page When I ent ...

  10. Linux安装Oracle JDK替换OpenJDK详解

    转自http://www.lsychina.com/howto_install_oracle-jdk_replace_openjdk_on_linux.html 众所周知,由于Oracle公司的JDK ...