Batch Normlization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》论文详细解读

简介: Batch Normlization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》论文详细解读

《Batch Normlization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》论文详细解读

_
💡目录

基础知识

一文读懂PCA

面临的挑战

Internal covariate shift (内部协变量偏移)

在这里插入图片描述

作者把在训练期间参数的改变而导致网络激活分布的改变叫做内部协变量偏移,对此我们有两个版本版本的解释:

  1. 如上图所示,前向计算从数据侧到损失侧,反向传播与其相反,函数更新从上到下,随着网络深度的加深,越往下梯度就越小,在学习率固定的情况下,参数更新幅度也就越来越小。靠近损失侧的神经元提取的大多是高层语义信息,这些神经元的权重往往很容易拟合,而靠近数据侧的神经元提取的是底层的纹理、线条等信息,这部分数据权重拟合较慢,因为更新参数会导致分布改变,顶部会不断的去适应底部的分布,这就会导致训练速度很慢。
  2. 如下图所示,数据x根据参数A输出a(根据链式法则,a也等于函数对B的偏导数),a通过参数B输出b,数据x从左到右前向转播计算损失,之后从后往前计算梯度,我们发现当参数A到A'的时候,参数B也更新到了B',但是B'的梯度计算是以a为基础的,而此刻a已经变成了a',也就是说B‘在这个模型中就不是最合适的了,BN的核心思想就是尽量的让a与a’的分布相近,这样可以缓解上面问题所带差距。

在这里插入图片描述

解决方案

whiten(白化)

PCA白化

PCA是在对观测数据进行基变换,新的坐标系使各数据维度线性无关,坐标系的重要程度从大到小衰减。

求解过程:

  1. 数据标准化(以远点为坐标原点)
  2. 求协方差矩阵
  3. 对协方差矩阵特征值分解找到最大方差的方向
  4. 对数据基变换

其中特征向量,就是最大方差方向,每个特征向量对应的特征值就是这个数据维度的方差。

PCA白化实际上就是在数据通过PCA进行基变换后再把数据进行标准化,让数据每个维度的方差全部为1。
公式推导如下:

符号定义:X:原始数据矩阵 M:原始数据协方差矩阵 设$S^{1/2}$为白化矩阵

在这里插入图片描述

对M特征值分解:
在这里插入图片描述
U就是我们要找的变换矩阵,转换数据基坐标:
$$X_{PCA}=UX$$

然后进行白化操作:
lambda为特征值
在这里插入图片描述

其中有的特征值很小,会造成数值溢出,就给它加上了1个常数项,于是把白化矩阵改为:

在这里插入图片描述

我们发现,白化操作可以让观测数据的方差与均值固定,去除每个维度的相关性。这样确实可以加快模型的收敛,但是也面临着一个问题:
如果忽略了E[x]对b的依赖(也就是反向传播计算梯度的时候考虑均值的影响)
在这里插入图片描述
从上面案例中我们发现,更新偏置b前后函数的输出没有改变,也就是损失没有改变,反而b不断增加,这会使模型变得更糟。

我们把归一化操作定义为Norm,如果反向传播不考虑Norm,那么更新的梯度就会与Norm抵消,如果考虑,就会增加很大的计算量。

Batch Normalization

Training

由于白化的计算代价很大,作者提出了简化的版本,从对整个数据集进行归一化改成对每一个Batch的每一层神经元的output归一化来确保均值与方差固定。
在这里插入图片描述
如果把每层的输出固定下来,可能会对网络产生负面的影响,所以我们加入两个可学习的参数:贝塔与伽马使均值与方差变得可以调节。
其中伽马初始化为这一batch对应层输出的方差,贝塔初始化为其均值,从而保证整个network的capacity。(有关capacity的解释:实际上BN可以看作是在原模型上加入的“新操作”,这个新操作很大可能会改变某层原来的输入。当然也可能不改变,不改变的时候就是“还原原来输入”。如此一来,既可以改变同时也可以保持原输入,那么模型的容纳能力(capacity)就提升了。)

在这里插入图片描述

总体流程如下:
在这里插入图片描述
反向传播梯度计算公式如下:
在这里插入图片描述

Testing

  1. 在训练阶段,我们通过每个batch的数据来计算均值与方差,当在测试阶段,由于一些环境条件的限制,batch一般为1,就不能计算均值与方差了,所以在训练阶段采用指数加权平均的方式来计算所有batch的均值与方差的平均值。
  2. 为了使计算更加准确,采用无偏估计。
    在这里插入图片描述

在CNN中的运用

当BN操作应用在卷积层后,作者找到了一个符合卷积神经网络特性的方法,归一化作用在了通道维度上。
我们用代码输出结果展示一下:
用pytorch生成 Batch=2 channel = 3 hw 2 * 2 的特征图:

    ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/77be7a041a974c989131a636952dc096.png)

计算均值
在这里插入图片描述
计算举例:
(0+1+2+3+12+13+14+15)/8 = 7.5

总结

  1. BN使得每层网络输出分布相对稳定,可以使用更大的学习率加速模型。
  2. BN使得模型对网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定。
  3. BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题。
  4. BN具有一定的正则化效果。

代码实现

class BatchNorm(nn.Block):
    # num_features:完全连接层的输出数量或卷积层的输出通道数。
    # num_dims:2表示完全连接层,4表示卷积层
    def __init__(self, num_features, num_dims, **kwargs):
        super().__init__(**kwargs)
        if num_dims == 2:
            shape = (1, num_features)
        else:
            shape = (1, num_features, 1, 1)
        # 参与求梯度和迭代的拉伸和偏移参数,分别初始化成1和0
        self.gamma = self.params.get('gamma', shape=shape, init=init.One())
        self.beta = self.params.get('beta', shape=shape, init=init.Zero())
        # 非模型参数的变量初始化为0和1
        self.moving_mean = np.zeros(shape)
        self.moving_var = np.ones(shape)

    def forward(self, X):
        # 如果X不在内存上,将moving_mean和moving_var
        # 复制到X所在显存上
        if self.moving_mean.ctx != X.ctx:
            self.moving_mean = self.moving_mean.copyto(X.ctx)
            self.moving_var = self.moving_var.copyto(X.ctx)
        # 保存更新过的moving_mean和moving_var
        Y, self.moving_mean, self.moving_var = batch_norm(
            X, self.gamma.data(), self.beta.data(), self.moving_mean,
            self.moving_var, eps=1e-12, momentum=0.9)
        return Y
目录
相关文章
|
10月前
|
存储 负载均衡 云计算
抖音服务器是什么样的
抖音服务器采用分布式云计算架构,遍布全国多个数据中心,如北上广、四川和贵州等地,利用高带宽、云集群并发及OSS、CDN、SLB等技术,确保大量用户同时流畅观看视频。这不仅需要强大的服务器群支持,还需精准的负载均衡与内容分发网络,保障用户体验。
409 1
|
Linux
centos7 升级qemu-kvm版本
centos7 手动升级qemu-kvm版本
2656 0
|
JSON 网络协议 开发工具
对已有的docker容器添加新的目录映射, 端口映射,环境变量,dns等
docker容器已经建立并运行, 需要在已有容器上添加新的目录映射,端口映射,环境变量等
3053 0
|
9月前
|
运维 Kubernetes Serverless
阿里云Argo X K8s玩转工作流引擎,实现大规模并行计算
本文基于2024云栖大会田双坤的演讲,介绍了Kubernetes作为云原生操作系统的角色及其在各类任务中的应用,重点探讨了Argo Workflows在Kubernetes上编排并行任务的能力。面对自建Argo Workflows的挑战,如稳定性、成本和安全性等问题,阿里巴巴云推出了全托管的Serverless Argo工作流,提供全托管、免运维、可观测和易集成的特点,显著提升了任务编排的效率和稳定性。适用于数据处理、科学计算、自动驾驶仿真等多个领域。
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
596 19
|
机器学习/深度学习 供应链 监控
ERP系统中的供应链风险识别与应对策略解析
【7月更文挑战第25天】 ERP系统中的供应链风险识别与应对策略解析
893 1
|
关系型数据库 MySQL 数据库
mysql下的max_allowed_packet参数设置
mysql下的max_allowed_packet参数设置
1499 0
|
Linux
Linux mkdir命令:创建目录(文件夹)
mkdir 命令,是 make directories 的缩写,用于创建新目录,此命令所有用户都可以使用。mkdir 命令的基本格式为: [root@localhost ~]# mkdir [-mp] 目录名 -m 选项用于手动配置所创建目录的权限,而不再使用默认权限。 -p 选项递归创建所有目录,以创建 /home/test/demo 为例,在默认情况下,你需要一层一层的创建各个目录,而使用 -p 选项,则系统会自动帮你创建 /home、/home/test 以及 /home/test/demo。 【例 1】建立目录。 [root@localhost ~]#mkdir cangls
866 0
|
测试技术 数据库 数据安全/隐私保护
Jmeter系列(47)- 针对需要登录的接口如何做性能测试?
Jmeter系列(47)- 针对需要登录的接口如何做性能测试?
567 0
Jmeter系列(47)- 针对需要登录的接口如何做性能测试?
|
人工智能 JSON 自然语言处理
大语言模型做数据助手,浙大Data-Copilot高效调用、处理、可视化数据
大语言模型做数据助手,浙大Data-Copilot高效调用、处理、可视化数据
1069 1