batch normlization随记

个人笔记:为什么用BN层。1,它一定程度上抑制了梯度“不活跃”区间,因为神经网络内部发生了协方差偏移。2,防止过拟合,《一个样本只与minibatch中其他样本有相互关系;对于同一个训练样本,网络的输出会发生变化。这些效果有助于提升网络泛化能力,像dropout一样防止网络过拟合,同时BN的使用,可以减少或者去掉dropout类似的策略。》其他博主写的,能理解一点。

计算步骤:例如一个batch样本,在RGB通道channal上进行减均值出方差,批归一化后数据呈现高斯分布,然后再进行×γ+β的操作,γ和β是梯度求导更新出来的,当然第一次是赋值的(0,1,并没改变),之后的:γ新 = γ旧+γ梯度,这样即保持反向更新梯度的敏感区间,有保持了非线性映射能力(毕竟均值为0,方差为1处于线性区间)。测试阶段,不是利用自己样本的均值和方差,毕竟一个样本谈不上,利用的是训练阶段***累计***求的均值和方差,说白了,利用训练数据构成的张量空间,怎么你能不用其均值和方差呢。我觉得就算测试数据是一个batch,也应该用训练数据构成的张量空间,但是测试数据这个batch比训练数据都庞大,这。。。。。。。谁知道呢

### 批归一化概述 批归一化是一种用于神经网络层之间的标准化技术[^1]。不同于传统的数据预处理方法,该技术应用于每一批次的小批量样本而非整个数据集上。 #### 主要作用 通过引入批归一化操作可以加速模型训练过程并允许使用更大的学习率来简化优化流程。这有助于缓解内部协变量偏移问题——即由于参数更新而导致各层输入分布发生变化的现象。 #### 实现方式 为了更好地理解如何实现批归一化的前向传播算法,在每一层计算过程中会先求得当前mini-batch内所有激活值均值μ_B以及方差σ²_B: \[ \mu_{B}=\frac{1}{m}\sum _{{i=1}}^{m}x_{{(i)}}\] \[ {\sigma _{B}}^{2}={\frac {1}{m}}\sum _{{i=1}}^{m}(x_{{(i)}}-\mu _{B})^{2}\] 其中\( m \)表示单个批次中的样例数量;接着利用这两个统计量对原始特征进行线性变换得到规范化后的输出y: \[ y=(x-\mu )/{(\sqrt {{\sigma ^{2}}+\epsilon })}\cdot \gamma +\beta \] 这里加入了极小常数项ε防止除零错误发生; γ 和 β 是可学习参数用来恢复被破坏掉的信息. 对于反向传播部分,则需应用链式法则沿着计算图传递梯度信息以便调整权重矩阵W和偏差b的同时也更新γ与β这些新增加出来的超参[^3]. ```python import torch.nn as nn class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3) self.bn1 = nn.BatchNorm2d(num_features=64) def forward(self, x): conv_out = self.conv1(x) bn_out = self.bn1(conv_out) return bn_out ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CV_er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值