47、正则化(批量归一化(BN))

『AI先锋杯·14天征文挑战第9期』 10w+人浏览 67人参与

正则化(批量归一化(BN))

  • 就是先进行标准化,丢失一些信息,(例如这个给数据3,标准化后为0.2,这样就小了哦,就是丢失了一些信息)
  • 然后再进行数据重构,wx+b这种进行找补一些信息回来(例如再给上面的0.2,进行 r*0.2 +β 这种就右放大了,也就找了一些信息回来)
  • BN的本质确实是标准化,而不是我们通常说的Min-Max归一化,对于Batch Normalization:确实是标准化 + 可学习重构。只是历史命名的问题:论文作者(Ioffe & Szegedy, 2015)可能为了强调“将数据归一到稳定分布”的目的,深度学习社区早期术语使用比较随意

测试代码

  • 任何数据(一维或二维)都可以直接BN
  • 但直接BN效果有限,因为没有特征学习
  • 特征提取层(Linear/Conv) + BN 才是标准组合
import torch
import torch.nn as nn

# 处理二维数据,直接处理就行
def dm01():
    # 一个两通道(就是两个)的 3 * 4 的矩阵
    input_2d = torch.randn(1,2,3,4)
    print(f'input_2d:{input_2d}')

    # 参1 就是几通道,这里就设置多少
    # 参2: 噪声值
    # 参3: 就是β,动量值
    # 参4: 对标准化后的进行缩放和平移
    bn2d = nn.BatchNorm2d(2, eps=1e-05, momentum=0.1, affine=True)

    output_2d = bn2d(input_2d)
    print(f'output_2d:{output_2d}')

    pass

# 处理一维数据,需要先进行网络隐藏层的线性处理
def dm02():
    # 就是2 *2 的矩阵,处理的就是一行的一维数据
    input_1d = torch.randn(2,2)

    # 只要输入2就行了,和input_1d的列 2 匹配就行,输出无所谓
    linear1 = nn.Linear(2,4)

    # 隐藏层线性处理
    l1 = linear1(input_1d)
    print(f'l1:{l1}')

    # 创建Bn层(批量归一化层)
    bn1d =nn.BatchNorm1d(num_features=4)
    output_1d = bn1d(l1)
    print(f'output_1d:{output_1d}')
    pass


if __name__ == '__main__':
    dm01()
    dm02()

测试结果

D:\software\python.exe -X pycache_prefix=C:\Users\HONOR\AppData\Local\JetBrains\PyCharm2025.2\cpython-cache "D:/software/PyCharm 2025.2.4/plugins/python-ce/helpers/pydev/pydevd.py" --multiprocess --qt-support=auto --client 127.0.0.1 --port 54557 --file C:\Users\HONOR\Desktop\python\test26_bn.py 
Connected to: <socket.socket fd=1000, family=2, type=1, proto=0, laddr=('127.0.0.1', 54571), raddr=('127.0.0.1', 54557)>.
Connected to pydev debugger (build 252.27397.106)
input_2d:tensor([[[[ 0.7882,  0.6323, -0.1769, -0.5410],
          [-0.9137,  1.8242, -0.7872, -1.0762],
          [-1.0629, -0.7037, -0.5402, -0.0247]],

         [[-0.6074,  1.0865,  1.4428,  0.0430],
          [ 0.8085, -1.8110, -0.4287, -1.1544],
          [-1.4426, -1.9275,  1.1019, -0.3645]]]])
output_2d:tensor([[[[ 1.1819,  0.9983,  0.0450, -0.3839],
          [-0.8228,  2.4024, -0.6739, -1.0143],
          [-0.9987, -0.5755, -0.3829,  0.2244]],

         [[-0.2974,  1.2006,  1.5157,  0.2778],
          [ 0.9547, -1.3618, -0.1394, -0.7811],
          [-1.0360, -1.4648,  1.2142, -0.0826]]]],
       grad_fn=<NativeBatchNormBackward0>)
l1:tensor([[-0.9470,  0.6517,  0.1117,  0.3206],
        [-1.2776,  0.7866,  0.5050,  0.1676]], grad_fn=<AddmmBackward0>)
output_1d:tensor([[ 0.9998, -0.9989, -0.9999,  0.9991],
        [-0.9998,  0.9989,  0.9999, -0.9991]],
       grad_fn=<NativeBatchNormBackward0>)

Process finished with exit code 0

总结

批量归一化(Batch Normalization)是一种在深度学习中广泛使用的技巧,旨在加速神经网络的训练过程并提高模型的稳定性。其基本原理是通过对每层的输入进行标准化处理,使得网络中间层的激活值保持在一个较小的范围内,从而有助于加速模型的收敛[^2]。 具体来说,批量归一化对同一通道、不同样本之间的数据进行归一化处理。这意味着对于每个小批量(mini-batch)中的数据,都会计算该批次的均值和方差,然后利用这些统计量来标准化该层的输入。这种做法不仅能够减少梯度消失和爆炸的问题,还能允许使用更大的学习率,进一步加快训练速度[^1]。 在实现上,以PyTorch框架为例,可以通过调用`nn.BatchNorm1d`、`nn.BatchNorm2d`或`nn.BatchNorm3d`等函数来添加批量归一化层到神经网络中,具体取决于输入数据的维度。例如,在一个简单的全连接网络中,可以这样实现: ```python import torch.nn as nn net = nn.Sequential( nn.Linear(input_dim, hidden_dim), nn.BatchNorm1d(hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, output_dim) ) ``` 在这个例子中,`input_dim`、`hidden_dim`和`output_dim`分别代表输入层、隐藏层和输出层的维度大小。通过这种方式,可以在每个批次的数据上执行标准化操作,进而提升模型性能[^3]。 此外,值得注意的是,批量归一化层还包含两个可学习参数——缩放因子(gamma)和偏移因子(beta),它们用于调整归一化后的输出,增加模型的灵活性。这两个参数通常在模型训练过程中自动更新[^3]。 ### 实现细节 - **初始化**:在定义批量归一化层时,需要指定特征的数量,即有多少个特征需要被归一化。 - **前向传播**:在前向传播过程中,批量归一化层会计算当前批次数据的均值和方差,并据此对数据进行标准化。之后,利用学习到的gamma和beta参数对标准化后的数据进行线性变换。 - **训练与评估模式**:当模型处于训练模式时,批量归一化层会使用当前批次的数据来估计均值和方差;而在评估模式下,则会使用整个训练集上的移动平均来代替,确保推理阶段的一致性和准确性。 综上所述,批量归一化不仅有助于解决内部协变量偏移问题,而且还能作为正则化手段之一,帮助防止过拟合,尤其是在深层网络中效果显著[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值