神经网络bn公式_BN、LN、IN、GN、SN归一化

2023-11-14

作者:泛音 公众号:知识交点

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

18a093b252f1307ba6b53d27370775f3.png

公众号:知识交点

内容包含: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结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。

133f2853a6d6ae529efe3e43a4aa566f.png

2.详细解说

2.1 Batch Normalization

d5c5393fa0beeee82b3c9a38dadf8d96.png

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

整体公式:

57fd894f4c48b57613b87932bcba97a9.png

向传播CODE:

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-5

x_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_mean
running_var = momentum * running_var + (1 - momentum) * x_var

bn_param['running_mean'] = running_mean
bn_param['running_var'] = running_var

return 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操作。efcc270b-d557-eb11-8da9-e4434bdf6706.svgBN与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-5

x_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 + beta
return 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做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。公式:

9241def3136e126e3588b93203a9ca38.png

前向代码:

def Instancenorm(x, gamma, beta):

# x_shape:[B, C, H, W]
results = 0.
eps = 1e-5

x_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 + beta
return 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-5
x = 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 + beta
return 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使用可微分学习,为一个深度网络中的每一个归一化层确定合适的归一化操作。公式:

9d039b33f933505368299a90ea0491a2.png

前向传播CODE:

def SwitchableNorm(x, gamma, beta, w_mean, w_var):
# x_shape:[B, C, H, W]
results = 0.
eps = 1e-5

mean_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_bn
var = w_var[0] * var_in + w_var[1] * var_ln + w_var[2] * var_bn

x_normalized = (x - mean) / np.sqrt(var + eps)
results = gamma * x_normalized + beta
return results

3 结果比较

12dec8b2cab2653867d24c2480d15391.png

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在法律领域的相关研究工作


60cc7196e038914a8b9d1e409e06e17b.png

好文!好看
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

神经网络bn公式_BN、LN、IN、GN、SN归一化 的相关文章

  • 【cocos2d-x 2】关于CocosStudio编辑出的csb的简单使用

    说明 cocos2d x版本为 3 4 cocosStudio版本为2 1 5 cocosStudio 我个人目前的认识 以为就是一个界面编辑器 界面通过美工可以排布好 然后把发布的csb和png资源文件 提供给程序员使用 1 关于 coc
  • 大语言模型之八-提示工程(Prompt engineer)

    大语言模型的效果好 很大程度上归功于算力和数据集 算力使得模型可以足够大 大到模型的理解 记忆 推理和生成以及泛化能力可以同时兼备 而数据集则是模型学习的来源 LLM中的prompt方法主要用于fine tune阶段 即在预训练的基础上 针
  • Pyramid Scene Parsing Network

    Pyramid Scene Parsing Network Keras实现代码链接 https github com BBuf Keras Semantic Segmentation Contribution 提出了金字塔场景解析网络 以将
  • poj 2155 Matrix

    Problem poj org problem id 2155 vjudge net contest 146952 problem A Referencd www cnblogs com gj Acit p 3258880 html Mea
  • mysql Heartbeat主主同步方案

    Heartbeat高可用Mysql主主同步方案 1 1 方案简介 本方案使用heartbeat mysql主主同步来实现mysql数据库的高可用 当服务器或者master的heartbeat宕掉以后会自动切换到backup上 服务器或者ma
  • 使用MATLAB进行多元线性回归预测

    在回归分析中 如果有两个或两个以上的自变量 就称为多元回归 事实上 一种现象常常是与多个因素相联系的 由多个自变量的最优组合共同来预测或估计因变量 比只用一个自变量进行预测或估计更有效 更符合实际 因此多元线性回归比一元线性回归的实用意义更
  • B站马士兵python入门基础版详细笔记(7)

    B站马士兵python入门基础版详细笔记 7 接着这个博客写的笔记 他写的还是很详细的 但是只写到了第六章 python基础知识 记录在B站视频看到的python的基础知识 我的笔记就有点偷懒了 很多没有敲代码 直接截的图 一 字典 列表
  • 【半监督学习】2、Soft Teacher

    文章目录 一 背景 二 方法 2 1 End to End Pseudo Labeling Framework 2 2 Soft teacher 2 3 Box Jittering 三 实验 论文 End to End Semi Super
  • C++ void** 类型

    在C 中 0 或者字面值 nullptr 能转换成任意指针类型 指向任意非常量的指针能转换成 void 指向任意常量对象的指针能转换成 const void 参考 C 类型转换 所以 void 类型可以用以下方式理解 void ppDefi
  • 在docusaurus中使用Vue组件⚡

    docusaurus 类似于Vuepress 是一个静态站点生成工具 但不同的是 使用docusaurus可以在文档中轻易混入React组件 很适合写React相关组件的文档 而Vuepress则是适合混入Vue组件 这就让我比较困惑 如果
  • error: #35: #error directive: "... 解决方法

    出现 USER stm32f10x h 96 error 35 error directive Please select first the target STM32F10x device used in your application
  • shell大小中括号作用

    http taotaocoder blog 163 com blog static 200228274201110306203483 Shell的强大是毋庸置疑的 方便了我们也迷惑了我们 比如这些杂七杂八的括号 一向自认聪明的我也傻傻分不清
  • 动态鼠标指针_推荐8款电脑鼠标指针,让你电脑不再千篇一律

    今天应该朋友给我留言说想要一款电脑指针 我就去搜罗了八款电脑指针 这些电脑指针有优美的 有酷炫的 有简洁的 可盐可甜 01 Breeze Cursors样式 002 a element 样式3D动态旋转鼠标指针 003 bibata cur
  • Self-study Python Fish-C Note-2 P9-P14

    先存一个网址非常详细的介绍python的数据类型 https www runoob com python3 python3 data type html A 数字 Numbers 1 整数 integers python 的整数长度是不受限
  • 类中的成员

    类中的成员 字段 方法 属性 1 字段 字段 普通字段 静态字段 1 class Mycalss 2 str 这是静态字段 3 def init self str1 4 self str1 str1 普通字段 5 实例化对象 6 a Myc
  • php提交表单显示错误,php – 在提交注册表单时使用jQuery显示错误

    你需要修好几件事情 gt 首先 处理注册过程的文件不应该是与表单相同的文件 gt 它纯粹用于处理数据 因此不能使用头 Location login php 直接重定向浏览器 这部分应该由你的JavaScript代码来处理 gt 您还需要告诉
  • 笔记--java sort() 方法排序

    背景 最近在刷一道算法题 字符串重新排序 时 发现自己有思路但是写代码的时候就无从下手了 而且看了答案之后还没看懂 关键就是基础不好 对于排序没有理解 虽然我学过常用的排序算法 但是都是理念 实践少 目的 从实践和原理出发 重点是从实践出发
  • 基于博弈搜索算法的智能五子棋设计

    基于博弈搜索算法的智能五子棋设计 0 引言 在智能过程中 搜索是必不可少的 是人工智能中的一个基本问题 这是因为人工智能研究的主要是那些没有成熟方法可依的问题领域 需要一步一步搜索求解 游戏中如何找到对自己有利的局面就属于这类问题 在游戏
  • SQL注入式攻击

    一 SQL注入式攻击 1 所谓SQL注入式攻击 就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串 欺骗服务器执行恶意的SQL命令 2 在某些表单中 用户输入的内容直接用来构造 或者影响 动态SQL命令 或作为存储过程的输

随机推荐

  • CS-Stdio Display Builder

    Display Builder 1 操作界面编辑器和Runtime 2 在EPICS edd dm medm edm 想法上构建 3 与CS Studio BOY 兼容性非常好 4 大约2015年在CS Stdio Eclipse中开始 现
  • 【高阶】linux内核环形缓冲区ring buffer实现原理分析

    1 前言 最近项目中用到一个环形缓冲区 ring buffer 代码是由linux内核的kfifo改过来的 缓冲区在文件系统中经常用到 通过缓冲区缓解cpu读写内存和读写磁盘的速度 例如一个进程A产生数据发给另外一个进程B 进程B需要对进程
  • 非root用户安装expect

    非root用户安装expect 文章目录 非root用户安装expect 准备 tcl安装 expect安装 怎么卸载 看了很多教程 踩了很多坑 分享给需要的人 准备 参考资料 ubuntu安装expect 其实不用root权限的原理很简单
  • 设置VS 2013代码折叠

    设置VS 2013代码折叠 版本 VS2013 中文版 步骤 工具 T gt 选项 O gt 文本编辑器 gt C C gt 查看 gt 大纲语句块 设置为 True
  • JavaScript基础

  • matlab低通滤波器

    clc 清除命令窗口 clear 清除所有变量 close all 关闭所有的图形窗口 N 2 10 定义一个变量N 值为2的10次方 n 0 N 1 生成一个从0到N 1的序列 Fs 2000 采样频率 tn n 1 Fs 时间序列 Fn
  • 为什么需要单元测试?

    为什么需要单元测试 从产品角度而言 常规的功能测试 系统测试都是站在产品局部或全局功能进行测试 能够很好地与用户的需要相结合 但是缺乏了对产品研发细节 特别是代码细节的理解 从测试人员角度而言 功能测试和系统测试以及其他性能测试等等对测试人
  • Windows下忘记MySQL root密码解决方法

    Windows下忘记MySQL密码的解决办法网上好多好多 可是 我发现 如果采用Windows服务启动的时候 安装网上通过命令行修改root密码的方法行不通 经过实验 发现 Windows的服务运行的配置并不是在命令行下的配置 查看Wind
  • anaconda怎么运行python脚本_Anaconda运行python脚本 Anaconda方法教程

    你是否想了解Anaconda运行python脚本的操作 下面就是笔者带来的Anaconda运行python脚本的操作步骤 赶紧来看一下吧 相信对大家一定会有所帮助哦 Anaconda是使用 虚拟 环境里边运行Python 这样便于版本 包管
  • 面向对象的设计思想

    面向对象的设计思想 OO思想 Object Oriented 1 看到一个需求的时候不应该直接写代码 应该先考虑有哪些类 2 考虑类的时候 类一定是一类事务的描述 不能太局限 3 考虑类的时候需要考虑主要的类 也就是需要和业务 动作 事件紧
  • 声明指向unsigned int类型的对象的指针vptr_一步步分析:C语言如何面向对象编程...

    一 前言 在嵌入式开发中 C C 语言是使用最普及的 在C 11版本之前 它们的语法是比较相似的 只不过C 提供了面向对象的编程方式 虽然C 语言是从C语言发展而来的 但是今天的C 已经不是当年的C语言的扩展了 从2011版本开始 更像是一
  • c语言string函数的用法_C语言奇淫技巧,字符串的三种表示方法,不会用不是合格的程序员...

    1 在C语言中 是将字符串作为字符数组来处理的 字符串是逐个存放到数组元素中的 例如用一个一维的字符数组存放字符串 I am a boy 如下代码 char c 12 I a m a b o y 这个字符串的实际长度是11 数组长度是12
  • 【红队技术】第二节:信息收集

    https note youdao com s M5U3LWvw
  • 如何高效率提出问题?

    前言 我们总是对自己 不太熟悉 的东西 但是又迫切想知道其答案 所以总是 匆匆 的像他人提出问题 然而 我们发现一个现象 为什么大多数时候 我的问题总是很少引起别人的兴趣 言外之意是 我总是不能在 短时间 的得到一个 正确的答案 本篇根据笔
  • Oracle检查点队列–实例崩溃恢复原理剖析

    检查点队列 实例崩溃恢复原理剖析 什么叫检查点队列 检查点队列是将脏块连接起来 按照第一次脏的数据块依次往后串联起来 形成一个队列 检查点的作用是什么 检查点只是一个数据库事件 它存在的根本意义在于减少崩溃恢复时间 Oracle8i以前是没
  • PHPStorm.WebStrom等系列官方开发工具配置本地项目与运程服务器同步

    PHPStorm WebStrom配置本地项目与运程服务器同步 说明 PHPStorm WebStrom等官方的系统开发工具配置本地项目与运程服务器同步的方法都基本一致没有 几乎没有什么不同之处 我们拿WebStorm为例说一下具体的配置过
  • 背光补偿

    背光补偿能提供在非常强的背景光线前面目标的理想的曝光 无论主要的目标移到中间 上下左右或者荧幕的任一位置 背光补偿也称作逆光补偿或逆光补正 它可以有效补偿摄像机在逆光环境下拍摄时画面主体黑暗的缺陷 当摄像机处于逆光环境中拍摄时 画面会出现黑
  • windows,IDEA各种常用快捷键积累

    windows IDEA各种常用快捷键积累 windows快捷键 1 win shfit s 拖动截屏 2 ctrl alt s 系统录屏 IDEA 1 快速形成main方法 psvm 回车 2 快速形成输出语句 sout 回车 3 内容提
  • [转载]推荐:互联网思维必读十本书

    原文地址 推荐 互联网思维必读十本书 作者 梧桐雨 推荐 互联网思维必读十本书 最近在商界最流行的词汇 莫过于 互联网思维 了 互联网思维 就像一部让人垂涎的武林秘籍 得之可化腐朽为神奇 无论是小米 阿芙精油 或是卖煎饼的黄太吉 都宣称自己
  • 神经网络bn公式_BN、LN、IN、GN、SN归一化

    作者 泛音 公众号 知识交点 该小伙子文章写得不错 感兴趣的大家可以关注下 公众号 知识交点 内容包含 BatchNormalization LayerNormalization InstanceNorm GroupNorm Switcha