前言:
Batch Norm 是深度学习里面常用的技术之一,主要作用是
把指定维度参数约束到范围内,有效的解决了梯度弥散
现象 ,有助于加速模型的训练速度。
-
问题解释
-
特征缩放 Feature Scaling
-
Batch Normalization
-
Torch API
一 问题解释
如上图,输入范围如下
所以 沿 方向 搜索Loss等高线变化慢,
沿 方向搜索 Loss 等高线变化快
1.1 左图 :
没有做Batch Normalize,进行训练时,如果初始点为A点,搜素比较曲折,收敛的速度很慢
1.2 右图:
做完 Batch Normlize后,
,无论沿着A点或者B点,
收敛速度都很快
二 特征缩放 Feature Scaling
在卷积神经网络常用的方案如下:
2.1 Image Normalization
比如一张图片有R,G,B 三个通道,我们可以通过
normalize = transform .Normalize(mean = [0.485, 0.456, 0.406],
std = [0.229, 0.224, 0.225]),
2.2 Batch Normalization
有四种,主要区别是在不同的维度上对输入进行Normalization
输入 [N,C,W,H] 图片张数,维度, 图片宽,图片高
以输入[6,3,28,28]为例
Batch Norm:
把宽高相乘得到 [6,3,784]
分别对 channel 上的r,g,b通道 6张图片,求均值,方差
然后Normalization ,得到[3]个实例,r,g,b 通道上新的标准化值
Layer Norm:
把宽高相乘得到 [6,3,784]
对6张图片分别求均值,方差,然后Normalization,
得到[6]个实例的标准化值
Instance Norm
对 [6,3] 单独图片,指定的r,g,b维度分别求均值方差,
得到[6,3] 个实例的标准化值
三 Batch Normalization
Batch Normalization(BN) 技术是2015年由Sergey Ioffe 以及 Christian Szegedy 团队提出,通过在每一层神经网络中加入Batch Normalization层,是输入到改成的小批次的数据在训练前进行标准化,作用:
有助于加速模型的训练速度,
降低模型的训练过程收受初始权重影响程度,
模型更稳定,更加有效的收敛,
提高模型的泛化能力
以一个图片数据集为例 [6,3,28,28],在rgb通道上做BN
如上图为对一个mini-batch做BN层处理的流程。一共分为四步:
1. 计算当前mini-batch所有样本的均值;[6,784]
2. 计算当前mini-batch所有样本的方差;[6,784]
3. 对当前mini-batch内每个样本用前面的均值和方差做归一化;
使得r,g,b channel 上的分布服从
4. 对归一化后的样本,乘以一个*缩放*系数,再做一次*平移*;
使得r,g,b channel 上的分布 服从
这两个参数需要通过训练时候学习
前面的三步,都是直接为了稳定x的分布,缓解ICS而做的归一化处理。
参考代码
四 PyTorch API 函数
4.1 nn.BatchNorm1d
N * d --> N * d
BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True,
track_running_stats=True, device=None, dtype=None)
参数
| 含义 |
num_features: | 也就是数据的特征维度 |
eps | 分母上加的一个值,是为了防止分母为0的情况 |
affine | 是仿射变化,将,分别初始化为1和0; |
# -*- coding: utf-8 -*-
"""
Created on Tue May 23 16:10:52 2023
@author: chengxf2
"""
import torch
import torch.nn as nn
def BN():
x = torch.rand(2,3,4)
# num_features=3: 输入维度,也就是数据的特征维度;
layer = nn.BatchNorm1d(3)
out = layer(x)
print("\n batch 均值",layer.running_mean)
print("\n batch 方差",layer.running_var)
print("\n input ",x)
print("\n out",out)
BN()
4.2 BatchNorm2d
BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True,
track_running_stats=True, device=None, dtype=None)
主要作用在特征上,比如输入维度为B*C*H*W, B代表batchsize大小,C代表channel,H代表图片的高度维度,W代表图片的宽度维度;
nn.BatchNorm2d是对channel做归一化处理,也就是对批次内的特征进行归一化;
# -*- coding: utf-8 -*-
"""
Created on Tue May 23 16:10:52 2023
@author: chengxf2
"""
import torch
import torch.nn as nn
def BN():
x = torch.rand(1,16,7,7)
layer = nn.BatchNorm2d(16)
out = layer(x)
print("\n batch 均值",layer.weight)
print("\n batch 方差",layer.bias)
print("\n input ",vars(layer))
BN()
上面的
weight : 对应
bias: 对应
在测试的时候,用的是全局的均值,方差,所以要用到eval( 不启动 Batch Normalization 和 Dropout,并且不会保存中间变量、计算图)
BatchNorm 即批规范化,是为了将每个batch的数据规范化为统一的分布,帮助网络训练, 对输入数据做规范化,称为Covariate shift;
数据经过一层层网络计算后,数据的分布也在发生着变化,因为每一次参数迭代更新后,上一层网络输出数据,经过这一层网络参数的计算,数据的分布会发生变化,这就为下一层网络的学习带来困难 -- 也就是在每一层都进行批规范化(Internal Covariate shift),方便网络训练,因为神经网络本身就是要学习数据的分布;
参考:
高等数学学习笔记——第七十讲——方向导数与梯度_方向导数的几何意义_预见未来to50的博客-CSDN博客
方向导数与梯度_Young__Fan的博客-CSDN博客
Transformer中的归一化(一):什么是归一化&为什么要归一化 - 知乎
Transformer中的归一化(二):机器学习中的特征归一化方法 - 知乎
Transformer中的归一化(三):特征归一化在深度神经网络的作用 - 知乎
Transformer中的归一化(四):BatchNormalization的原理、作用和实现 - 知乎
Batch-Normalization层原理与分析 - 知乎
科学网—Pytorch中nn.Conv1d、Conv2D与BatchNorm1d、BatchNorm2d函数 - 张伟的博文