个人总结

  • 1. 概述
  • 2. Batch Normalization
  • 3.Layer Normalizaiton
  • 4. Instance Normalization
  • 5. Group Normalization
  • 6. Switchable Normalization
  • 7. 相关论文连接

1. 概述

归一化层,目前主要有这几个方法,Batch Normalization(2015年)、Layer Normalization(2016年)、Instance Normalization(2017年)、Group Normalization(2018年)、Switchable Normalization(2018年);

将输入的图像shape记为[N, C, H, W],这几个方法主要的区别就是在,

  • batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好;
  • layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显;
  • instanceNorm在图像像素上,对HW做归一化,用在风格化迁移;
  • GroupNorm将channel分组,然后再做归一化;
  • SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。

2. Batch Normalization

首先,在进行训练之前,一般要对数据做归一化,使其分布一致,但是在深度神经网络训练过程中,通常以送入网络的每一个batch训练,这样每个batch具有不同的分布;此外,为了解决internal covarivate shift问题,这个问题定义是随着batch normalizaiton这篇论文提出的,在训练过程中,数据分布会发生变化,对下一层网络的学习带来困难。

以batch normalization就是强行将数据拉回到均值为0,方差为1的正太分布上,这样不仅数据分布一致,而且避免发生梯度消失。

此外,internal corvariate shift和covariate shift是两回事,前者是网络内部,后者是针对输入数据,比如我们在训练数据前做归一化等预处理操作。

算法过程:

  • 沿着通道计算每个batch的均值u
  • 沿着通道计算每个batch的方差σ^2
  • 对x做归一化,x’=(x-u)/开根号(σ^2+ε)
  • 加入缩放和平移变量γ和β ,归一化后的值,y=γx’+β

加入缩放平移变量的原因是:保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加速训练。 这两个参数是用来学习的参数。

import numpy as np
def Batchnorm(x, gamma, beta, bn_param):# x_shape:[B, C, H, W]running_mean = bn_param['running_mean']running_var = bn_param['running_var']results = 0.eps = 1e-5x_mean = np.mean(x, axis=(0, 2, 3), keepdims=True)x_var = np.var(x, axis=(0, 2, 3), keepdims=True0)x_normalized = (x - x_mean) / np.sqrt(x_var + eps)results = gamma * x_normalized + beta# 因为在测试时是单个图片测试,这里保留训练时的均值和方差,用在后面测试时用running_mean = momentum * running_mean + (1 - momentum) * x_meanrunning_var = momentum * running_var + (1 - momentum) * x_varbn_param['running_mean'] = running_meanbn_param['running_var'] = running_varreturn results, bn_param

3.Layer Normalizaiton

batch normalization存在以下缺点:

  • 对batchsize的大小比较敏感,由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布;
  • BN实际使用时需要计算并且保存某一层神经网络batch的均值和方差等统计信息,对于对一个固定深度的前向神经网络(DNN,CNN)使用BN,很方便;但对于RNN来说,sequence的长度是不一致的,换句话说RNN的深度不是固定的,不同的time-step需要保存不同的statics特征,可能存在一个特殊sequence比其他sequence长很多,这样training时,计算很麻烦。(参考于https://blog.csdn.net/lqfarmer/article/details/71439314)

与BN不同,LN是针对深度网络的某一层的所有神经元的输入按以下公式进行normalize操作


BN与LN的区别在于:

  • LN中同层神经元输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差;
    BN中则针对不同神经元输入计算均值和方差,同一个batch中的输入拥有相同的均值和方差。
  • 所以,LN不依赖于batch的大小和输入sequence的深度,因此可以用于batchsize为1和RNN中对边长的输入sequence的normalize操作。

LN用于RNN效果比较明显,但是在CNN上,不如BN。

def Layernorm(x, gamma, beta):# x_shape:[B, C, H, W]results = 0.eps = 1e-5x_mean = np.mean(x, axis=(1, 2, 3), keepdims=True)x_var = np.var(x, axis=(1, 2, 3), keepdims=True0)x_normalized = (x - x_mean) / np.sqrt(x_var + eps)results = gamma * x_normalized + betareturn results

4. Instance Normalization

BN注重对每个batch进行归一化,保证数据分布一致,因为判别模型中结果取决于数据整体分布。

但是图像风格化中,生成结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,因而对HW做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。

公式:

def Instancenorm(x, gamma, beta):# x_shape:[B, C, H, W]results = 0.eps = 1e-5x_mean = np.mean(x, axis=(2, 3), keepdims=True)x_var = np.var(x, axis=(2, 3), keepdims=True0)x_normalized = (x - x_mean) / np.sqrt(x_var + eps)results = gamma * x_normalized + betareturn results

5. Group Normalization

主要是针对Batch Normalization对小batchsize效果差,GN将channel方向分group,然后每个group内做归一化,算(C//G)HW的均值,这样与batchsize无关,不受其约束。

公式:

伪代码:

def GroupNorm(x, gamma, beta, G=16):# x_shape:[B, C, H, W]results = 0.eps = 1e-5x = np.reshape(x, (x.shape[0], G, x.shape[1]/16, x.shape[2], x.shape[3]))x_mean = np.mean(x, axis=(2, 3, 4), keepdims=True)x_var = np.var(x, axis=(2, 3, 4), keepdims=True0)x_normalized = (x - x_mean) / np.sqrt(x_var + eps)results = gamma * x_normalized + betareturn results

6. Switchable Normalization

本篇论文作者认为,

  • 第一,归一化虽然提高模型泛化能力,然而归一化层的操作是人工设计的。在实际应用中,解决不同的问题原则上需要设计不同的归一化操作,并没有一个通用的归一化方法能够解决所有应用问题;
  • 第二,一个深度神经网络往往包含几十个归一化层,通常这些归一化层都使用同样的归一化操作,因为手工为每一个归一化层设计操作需要进行大量的实验。

因此作者提出自适配归一化方法——Switchable Normalization(SN)来解决上述问题。与强化学习不同,SN使用可微分学习,为一个深度网络中的每一个归一化层确定合适的归一化操作



def SwitchableNorm(x, gamma, beta, w_mean, w_var):# x_shape:[B, C, H, W]results = 0.eps = 1e-5mean_in = np.mean(x, axis=(2, 3), keepdims=True)var_in = np.var(x, axis=(2, 3), keepdims=True)mean_ln = np.mean(x, axis=(1, 2, 3), keepdims=True)var_ln = np.var(x, axis=(1, 2, 3), keepdims=True)mean_bn = np.mean(x, axis=(0, 2, 3), keepdims=True)var_bn = np.var(x, axis=(0, 2, 3), keepdims=True)mean = w_mean[0] * mean_in + w_mean[1] * mean_ln + w_mean[2] * mean_bnvar = w_var[0] * var_in + w_var[1] * var_ln + w_var[2] * var_bnx_normalized = (x - mean) / np.sqrt(var + eps)results = gamma * x_normalized + betareturn results

结果比较:


7. 相关论文连接

1、Batch Normalization

https://arxiv.org/pdf/1502.03167.pdf

2、Layer Normalizaiton

https://arxiv.org/pdf/1607.06450v1.pdf

3、Instance Normalization

https://arxiv.org/pdf/1607.08022.pdf

https://github.com/DmitryUlyanov/texture_nets

4、Group Normalization

https://arxiv.org/pdf/1803.08494.pdf

5、Switchable Normalization

https://arxiv.org/pdf/1806.10779.pdf

https://github.com/switchablenorms/Switchable-Normalization

参考资料
[1] https://blog.csdn.net/liuxiao214/article/details/81037416
[2] https://mlexplained.com/2018/11/30/an-overview-of-normalization-methods-in-deep-learning/

[深度学习]BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm个人总结相关推荐

  1. 深度学习-各种归一化(Batch Norm、Layer Norm、Group Norm、InstanceNorm、Spatially-Adaptive Norm)

    深度学习之归一化:BN.LN.GN.IN.SPADE 0.总述 0.1.为什么要归一化处理 0.2.大体上看BN.LN.IN.GN 1.批量归一化(Batch Normalization,BN) 1. ...

  2. 深度学习模型压缩(量化、剪枝、轻量化结构、batch-normalization融合)

    "目前在深度学习领域分类两个派别,一派为学院派,研究强大.复杂的模型网络和实验方法,为了追求更高的性能:另一派为工程派,旨在将算法更稳定.高效的落地在硬件平台上,效率是其追求的目标.复杂的模 ...

  3. 深度学习中的Normalization总结(BN/LN/WN/IN/GN)

    文章目录 简介 独立同分布(i.i.d) Internal Covariate Shift Normalization的通用公式 Batch-Normalization -- 纵向规范化 为什么用BN ...

  4. 深度学习中的Normalization模型(附实例公式)

    来源:运筹OR帷幄 本文约14000字,建议阅读20分钟. 本文以非常宏大和透彻的视角分析了深度学习中的多种Normalization模型,从一个新的数学视角分析了BN算法为什么有效. [ 导读 ]不 ...

  5. 【深度学习】重新思考BatchNorm中的 “Batch”

    这篇很有趣且很有用,激动的赶紧把文章看了一遍,不愧是FAIR,实验看的太爽了. 之前对于Norm的研究主要在于改变Norm的维度,然后衍生出了BatchNorm.GroupNorm.InstanceN ...

  6. [深度学习] Normalization 模型

    目录 一  Batch Normalization "Internal Covariate Shift"问题 训练阶段如何做BatchNorm BatchNorm的好处 二 Lay ...

  7. [深度学习] 自然语言处理---Transformer实现(二)

    目录 Encoder-Decoder框架 一 整体架构 动态流程图 二 Encoder 2.1 Encoder Layer和残差网络 Residual Connection 2.2 Attention ...

  8. 深度学习——从网络威胁情报中收集TTPs

    从网络威胁情报中收集TTPs 摘要 为啥要用网络威胁情报 被动防御 & 主动防御 网络威胁情报的概念 何为情报(Intelligence)? 何为网络威胁(Cyber Threat)? 何为网 ...

  9. 深度学习中的归一化方法总结(BN、LN、IN、GN、SN、PN、BGN、CBN、FRN、SaBN)

    目录 概要 Batch Normalization(BN) (1)提出BN的原因 (2)BN的原理 (3)BN优点 (4)BN缺点 Instance Normalization(IN) (1)提出IN ...

最新文章

  1. java8中的default关键字
  2. 王京春|大学生智能汽车竞赛感想
  3. [python,2018-06-29] 37%法则及其拓展解决恋爱问题
  4. nginx 配置静态文件目录_nginx配置静态资源服务器
  5. 名词用作动词举例_日语动词修饰名词的形式
  6. 手机操作系统如何实现跨平台开发和使用
  7. 赛尔号什么时候支持html5,赛尔号三全能时代即将来临 你准备好了吗
  8. 第五——十三章的作业
  9. 微型计算机中存储器分成哪几个等级?它们各有什么特点?用途如何?,《微机原理》复习思考题第十二章存储器.DOC...
  10. WAS集群系列(5):集群搭建:步骤3:安装IHS软件
  11. 【第九届蓝桥杯大赛决赛真题】JAVA大学C组题解
  12. python比较运算符用于两个数_比较运算符用于比较两个数,其返回的结果只能是True或False(1.0分)_学小易找答案...
  13. 编译原理实验之词法分析
  14. 手把手教你用ArcGIS做张降雨量分布专题图
  15. 混沌加密的理解及应用,附代码
  16. 全国12315平台网上投诉与举报提示“含有不规范用语”的应对方法
  17. python制作查询网页_Python制作简单的网页爬虫
  18. Simulink仿真示波器波形出现小圆圈
  19. 学习笔记 02:关于在某宝上面购买的stm32f103c8t6最小系统开发板如何使用USBtoTTL模块烧录程序的记录
  20. mongodb 字符串查找匹配中$regex的用法

热门文章

  1. 使用duilib开发半透明异形窗体程序(附源码和demo)
  2. 《PHP对象、模式与实践》之对象
  3. Windows下架设Apache并支持ASP-Win+Apache+ASP
  4. 利用Crontab为Linux定时备份Mysql数据库
  5. 吊炸天!一行命令快速部署大规模K8S集群!!!
  6. Nginx 附录A 编码风格 和 附录B 常用API
  7. 《Spring源码深度解析》 PDF
  8. mysql左右连接举例_MYSQL 连接举例
  9. 典型电商网站的站点导航的布局结构实现,及运用三种方式实现下拉效果
  10. 【C语言】构建一个校园交通查询系统程序。能够规划出任意出发地和目的地之间的最短路径。...