简单来说就是经过 Batch Normalization(批量归一化)处理的数据(处理的这个批次总体)服从均值为0,方差为1。
作用:
-
加速训练:由于减少了梯度消失或爆炸的问题,Batch Normalization可以加速深度网络的训练过程。
-
减少对初始化的敏感性:Batch Normalization降低了对网络权重初始化的依赖,使得即使使用随机初始化,网络也能较好地工作。
-
轻微的正则化效果:由于Batch Normalization在训练和推理时使用不同的统计量(训练时使用小批量统计量,推理时使用全局统计量),它引入了轻微的正则化效果,有助于减少过拟合。在某些情况下可以替代dropout
-
允许更高的学习率:归一化的效果使得网络对于学习率的微小变化更加鲁棒,因此可以使用更高的学习率,进一步加速训练过程。
注意点:
-
依赖于批次大小:Batch Normalization的效果依赖于批次的大小,太小的批次可能导致统计估计不准确。
-
计算开销:Batch Normalization会增加一些计算开销,因为它需要计算和存储每个小批量的均值和方差,以及更新全局均值和方差。
-
可能需要调整网络结构:在某些情况下,使用Batch Normalization可能需要对网络结构进行微调,比如调整激活函数或网络层的深度。
另外:
引入可学习参数:Batch Normalization层引入了额外的可学习参数(γ和β),这为模型提供了更多的灵活性,但也增加了模型的参数数量。
计算公式:
γ(scale)参数:这个参数用于控制BN层输出的方差。它是一个可学习的参数,通常初始化为1,意味着在开始时不对数据的方差进行缩放
β(shift)参数:这个参数用于控制BN层输出的均值。它也是一个可学习的参数,通常初始化为0,意味着在开始时不对数据的均值进行平移
pytorch中,可以通过affine
参数来决定是否需要学习γ和β。如果affine=True
(默认值),则γ和β会被初始化并学习;如果affine=False
,则γ会被设置为1,β会被设置为0,且它们不会在训练过程中更新。
实例:
import torch
import torch.nn as nn
from scrapy.core.downloader.handlers.http11 import tunnel_request_data
from sympy import false
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
self.fc1 = nn.Linear(3, 2) # 一个简单的全连接层
self.bn1 = nn.BatchNorm1d(2,affine=True) # 对应的Batch Normalization层
def forward(self, x):
x = self.bn1(self.fc1(x)) # 先全连接,然后Batch Normalization
return x
net = SimpleNet()
input_data = torch.randn(5, 3) # 例如,这里批次大小为5
print(input_data)
output = net(input_data)
print(output)
输出:
#输入
tensor([[-0.6967, -1.5696, 0.7364],
[ 2.5387, 1.4016, -0.5481],
[-0.4291, 0.6605, 0.0703],
[ 0.4796, 1.0505, 0.3659],
[-0.2556, -1.0072, -1.2100]])#输出:简单理解就是每一列服从均值为0,方差为1,注意批次小效果差
tensor([[ 0.0987, -1.7580],
[ 1.5916, 1.3214],
[-0.7358, 0.1952],
[ 0.3771, 0.3398],
[-1.3316, -0.0983]], grad_fn=<NativeBatchNormBackward0>)
详解:Batch Normalization详解以及pytorch实验_pytorch batch normalization-优快云博客