作者:泛音

公众号:知识交点

该小伙子文章写得不错,感兴趣的大家可以关注下:

公众号:知识交点

内容包含:BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm

1.简述

1.1 论文链接

(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.2 整体介绍

归一化层,目前主要有这几个方法,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.详细解说

2.1 Batch Normalization

算法过程:
(1)、沿着通道计算每个batch的均值u
(2)、沿着通道计算每个batch的方差σ^2
(3)、对x做归一化,x’=(x-u)/开根号(σ^2+ε)
(4)、加入缩放和平移变量γ和β ,归一化后的值,y=γx’+β
加入缩放平移变量的原因是: 不一定每次都是标准正态分布,也许需要偏移或者拉伸。保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加速训练。这两个参数是用来学习的参数。

整体公式:

向传播CODE:

import numpy as npdef 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

pytorch中的API:

torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
torch.nn.BatchNorm3d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)# num_features:来自期望输入的特征数,该期望输入的大小为’batch_size x num_features [x width]’
# eps:为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
# momentum:动态均值和动态方差所使用的动量。默认为0.1。
# affine:布尔值,当设为true,给该层添加可学习的仿射变换参数。
# track_running_stats:布尔值,当设为true,记录训练过程中的均值和方差

2.2 Layer Normalizaiton

batch normalization存在以下缺点:

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

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

BN与LN的区别在于:

(1)、LN中同层神经元输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差;
(2)、BN中则针对不同神经元输入计算均值和方差,同一个batch中的输入拥有相同的均值和方差。
(3)、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

Pytorch API:

torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True)
# normalized_shape:输入尺寸[∗×normalized_shape[0]×normalized_shape[1]×…×normalized_shape[−1]]
# eps:为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
# elementwise_affine:布尔值,当设为true,给该层添加可学习的仿射变换参数。

2.3 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

Pytorch API:

torch.nn.InstanceNorm1d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
torch.nn.InstanceNorm2d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
torch.nn.InstanceNorm3d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)# num_features:来自期望输入的特征数,该期望输入的大小为’batch_size x num_features [x width]’
# eps:为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
# momentum:动态均值和动态方差所使用的动量。默认为0.1。
# affine:布尔值,当设为true,给该层添加可学习的仿射变换参数。
# track_running_stats:布尔值,当设为true,记录训练过程中的均值和方差;

2.4 Group Normalization

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

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

Pytorch API:

torch.nn.GroupNorm(num_groups, num_channels, eps=1e-05, affine=True)
# num_groups:需要划分为的groups
# num_features:来自期望输入的特征数,该期望输入的大小为’batch_size x num_features [x width]’
# eps:为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
# momentum:动态均值和动态方差所使用的动量。默认为0.1。
# affine:布尔值,当设为true,给该层添加可学习的仿射变换参数。

2.5 Switchable Normalization

本篇论文作者认为:

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

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

前向传播CODE:

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

3 结果比较

4 参考链接:

本篇大部分内容摘抄自https://blog.csdn.net/liuxiao214/article/details/81037416

推荐阅读:

【一分钟论文】IJCAI2019 | Self-attentive Biaffine Dependency Parsing

【一分钟论文】 NAACL2019-使用感知句法词表示的句法增强神经机器翻译

【一分钟论文】Semi-supervised Sequence Learning半监督序列学习

【一分钟论文】Deep Biaffine Attention for Neural Dependency Parsing

详解Transition-based Dependency parser基于转移的依存句法解析器

经验 | 初入NLP领域的一些小建议

学术 | 如何写一篇合格的NLP论文

干货 | 那些高产的学者都是怎样工作的?

一个简单有效的联合模型

近年来NLP在法律领域的相关研究工作


好文!好看

BN、LN、IN、GN、SN归一化相关推荐

  1. 深度学习归一化算法详解(BN,LN,IN,GN)

    目录 一.Batch Normalization(BN) 1.1为什么提出BN? 1.2BN的基本原理和公式 1.3BN在神经网络中的实现 1.4BN的优点和缺点 二.LN,IN,GN的原理和适用范围 ...

  2. 深度学习中的归一化方法BN,LN,IN,GN

    文章目录 前言 一.BN 二.LN 三.IN 四.GN 前言 归一化层,目前主要有这几个方法, 1.Batch Normalization(2015) 2.Layer Normalization(20 ...

  3. Normalization 归一化方法 BN LN IN GN

    1.分类 BN是在batch上,对N.H.W做归一化,而保留通道 C 的维度.BN对较小的batch size效果不好.BN适用于固定深度的前向神经网络,如CNN,不适用于RNN: LN在通道方向上, ...

  4. BN,LN,IN,GN的理解和用法

    绿色区域表示将该区域作用域(四种方法都贯穿了w,h维度),即将该区域数值进行归一化,变为均值为0,标准差为1.BN的作用区域时N,W,H,表示一个batch数据的每一个通道均值为0,标准差为1:LN则 ...

  5. 【深度学习】深度学习的归一化方法的演变(局部响应LRN,BN,LN, IN, GN, FRN, WN, BRN, CBN, CmBN)

    [深度学习]深度学习的归一化方法的演变(局部响应LRN,BN,LN, IN, GN, FRN, WN, BRN, CBN, CmBN) 文章目录 [深度学习]深度学习的归一化方法的演变(局部响应LRN ...

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

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

  7. 手推BN、IN、LN、GN

    手推BN.IN.LN.GN 本文主旨 简要介绍 BN IN LN GN 手推BN.IN.LN.GN 本文主旨 y = x − E [ x ] V a r [ x ] + ϵ ∗ γ + β y = \ ...

  8. BN、SyncBN、IN、LN、GN学习记录

    1 BatchNorm BN的原理 BN是计算机视觉最常用的标准化方法,它沿着N.H.W维度对输入特征图求均值和方差,随后再利用均值和方差来归一化特征图.计算过程如下图所示,1)沿着通道维度计算其他维 ...

  9. pytorch实现BN、LN、GN

    BN实现 # coding=utf8 import torch from torch import nn# track_running_stats=False,求当前 batch 真实平均值和标准差, ...

  10. 卷积在计算机中实现+pool作用+数据预处理目的+特征归一化+理解BN+感受野理解与计算+梯度回传+NMS/soft NMS

    一.卷积在计算机中实现 1.卷积 将其存入内存当中再操作(按照"行先序"): 这样就造成混乱. 故需要im2col操作,将特征图转换成庞大的矩阵来进行卷积计算,利用矩阵加速来实现, ...

最新文章

  1. python学习 01 变量
  2. Swift学习------常量与变量
  3. Kubernetes安全之认证
  4. 时频分析:短时傅立叶变换实现(5)
  5. 递归-递归的特点及基本代码演练
  6. Python+Opencv实现自动化阅卷
  7. Servlet生命周期中的service方法分析
  8. java怎么计算等式_谁能解释计算这个等式的步骤? Java的
  9. java 基础知识2
  10. idea 搭建flutter 安卓开发环境(因为有idea就不需安装Android Studio)
  11. 引入tinymce-vue后调试器报错 Refused to apply styl
  12. “ 作业帮 “ (Servlet)
  13. 计算机设备选型的基本原则,设备选型的概念和选型依据
  14. Unity画面像素化shader
  15. 工业物联网平台的效益有哪些
  16. 数组队列存储结构的简单实现例子
  17. cesium-加载geoserver发布的tms服务
  18. c++/c中的预编译,文件包含伪指令,#include,包含哨卫,头文件保护
  19. 查看php的错误日志文件,php查看错误日志
  20. AJAX---发送POST请求、Get请求、请求四步、解决低版本的缓存问题

热门文章

  1. Ubuntu中启用关闭Network-manager网络设置问题! 【Server版本】
  2. java day44【JQuery 基础:概念,快速入门,JQuery对象和JS对象区别与转换,选择器,DOM操作,案例】...
  3. 网页设计之字体和 CSS 调整
  4. (转)JVM中的OopMap(zz)
  5. Linux上层应用--Shell scripts基础规范
  6. Linux进程状态(ps stat)之R、S、D、T、Z、X 转:http://blog.csdn.net/huzia/article/details/18946491...
  7. shift and算法
  8. 【LeetCode】347-前K个高频元素
  9. 蓝桥杯 字母组串(递归)
  10. HNOI2015 接水果