首页 > 其他分享 >机器学习——批量规范化

机器学习——批量规范化

时间:2023-11-09 12:25:52浏览次数:48  
标签:机器 批量 nn self var moving 规范化 mean

训练深层神经网络是十分困难的,特别是在较短的时间内使他们收敛更加棘手。 本节将介绍批量规范化(batch normalization) (Ioffe and Szegedy, 2015),这是一种流行且有效的技术,可持续加速深层网络的收敛速度。 再结合在 7.6节中将介绍的残差块,批量规范化使得研究人员能够训练100层以上的网络。

批量规范化计算公式:

 

批量规范化提出的意义:

1. 数据预处理和标准化对结果有很大影响,可以让模型更容易训练。批量规范化在一定程度上也是进行标准化。

2. 中间层的变量分布随着层数和时间都会发生变化,这可能会对训练造成困难。批量规范化可以减小这种变化。 

3. 更深层的网络更容易过拟合,批量规范化作为一种正则化方法可以缓解过拟合。

4. 批量规范化需要一个适当大小的批量,否则无法工作。选择批量大小时需要更加慎重。

5. 批量规范化通过减去均值并除以标准差来规范化,这使用了批量内的统计信息,因此名称中有“批量”。

总结起来,批量规范化通过标准化内部变量的分布来帮助网络训练,使得超参数设置更加容易,并具有正则化的效果。

 

批量规范化层

下面,我们从头开始实现一个具有张量的批量规范化层。

import torch
from torch import nn
from d2l import torch as d2l


def batch_norm(X, gamma, beta, moving_mean, moving_var, eps, momentum):
    # 通过is_grad_enabled来判断当前模式是训练模式还是预测模式
    if not torch.is_grad_enabled():
        # 如果是在预测模式下,直接使用传入的移动平均所得的均值和方差
        X_hat = (X - moving_mean) / torch.sqrt(moving_var + eps)
    else:
        assert len(X.shape) in (2, 4)
        if len(X.shape) == 2:
            # 使用全连接层的情况,计算特征维上的均值和方差
            mean = X.mean(dim=0)
            var = ((X - mean) ** 2).mean(dim=0)
        else:
            # 使用二维卷积层的情况,计算通道维上(axis=1)的均值和方差。
            # 这里我们需要保持X的形状以便后面可以做广播运算
            mean = X.mean(dim=(0, 2, 3), keepdim=True)
            var = ((X - mean) ** 2).mean(dim=(0, 2, 3), keepdim=True)
        # 训练模式下,用当前的均值和方差做标准化
        X_hat = (X - mean) / torch.sqrt(var + eps)
        # 更新移动平均的均值和方差
        moving_mean = momentum * moving_mean + (1.0 - momentum) * mean
        moving_var = momentum * moving_var + (1.0 - momentum) * var
    Y = gamma * X_hat + beta  # 缩放和移位
    return Y, moving_mean.data, moving_var.data

 

 

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

    def forward(self, X):
        # 如果X不在内存上,将moving_mean和moving_var
        # 复制到X所在显存上
        if self.moving_mean.device != X.device:
            self.moving_mean = self.moving_mean.to(X.device)
            self.moving_var = self.moving_var.to(X.device)
        # 保存更新过的moving_mean和moving_var
        Y, self.moving_mean, self.moving_var = batch_norm(
            X, self.gamma, self.beta, self.moving_mean,
            self.moving_var, eps=1e-5, momentum=0.9)
        return Y

 

 

 

使用批量规范化层的 LeNet

net = nn.Sequential(
    nn.Conv2d(1, 6, kernel_size=5), BatchNorm(6, num_dims=4), nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2, stride=2),
    nn.Conv2d(6, 16, kernel_size=5), BatchNorm(16, num_dims=4), nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2, stride=2), nn.Flatten(),
    nn.Linear(16*4*4, 120), BatchNorm(120, num_dims=2), nn.Sigmoid(),
    nn.Linear(120, 84), BatchNorm(84, num_dims=2), nn.Sigmoid(),
    nn.Linear(84, 10))

 

总结

  • 在模型训练过程中,批量规范化利用小批量的均值和标准差,不断调整神经网络的中间输出,使整个神经网络各层的中间输出值更加稳定。

  • 批量规范化在全连接层和卷积层的使用略有不同。

  • 批量规范化层和暂退层一样,在训练模式和预测模式下计算不同。

  • 批量规范化有许多有益的副作用,主要是正则化。另一方面,”减少内部协变量偏移“的原始动机似乎不是一个有效的解释。

 

标签:机器,批量,nn,self,var,moving,规范化,mean
From: https://www.cnblogs.com/yccy/p/17819429.html

相关文章

  • 不再填鸭,AI机器人小奥!
    在这个充满科技魅力的时代,一款专为孩子学习量身打造的AI机器人“小奥”正式与大家见面!它是一款集全球领先的人工智能、语音识别、语义理解、情感陪伴为一体的高科技教育产品,旨在帮助孩子提高学习兴趣、拓宽知识面,以科技创新助力学习成绩提高。特色亮点高度智能:拥有强大的自然语言处......
  • NLP机器翻译全景:从基本原理到技术实战全解析
    机器翻译是使计算机能够将一种语言转化为另一种语言的技术领域。本文从简介、基于规则、统计和神经网络的方法入手,深入解析了各种机器翻译策略。同时,详细探讨了评估机器翻译性能的多种标准和工具,包括BLEU、METEOR等,以确保翻译的准确性和质量。关注TechLead,分享AI全维度知识。......
  • NLP机器翻译全景:从基本原理到技术实战全解析
    机器翻译是使计算机能够将一种语言转化为另一种语言的技术领域。本文从简介、基于规则、统计和神经网络的方法入手,深入解析了各种机器翻译策略。同时,详细探讨了评估机器翻译性能的多种标准和工具,包括BLEU、METEOR等,以确保翻译的准确性和质量。关注TechLead,分享AI全维度知识。作......
  • PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SV
    全文下载链接:http://tecdat.cn/?p=26219最近我们被客户要求撰写关于银行机器学习的研究报告,包括一些图形和统计输出。该数据与银行机构的直接营销活动相关,营销活动基于电话。通常,需要与同一客户的多个联系人联系,以便访问产品(银行定期存款)是否会(“是”)或不会(“否”)订阅银行数据......
  • [机器学习复习笔记] BGD, SGD, MBGD
    BGD,SGD,MBGD1.BGD批量梯度下降法(BatchGradientDescent)1.1批量梯度下降法介绍在梯度下降法每次迭代中,将所有样本用来进行参数\(\theta\)(梯度)的更新,这其实就是批量梯度下降法。批量梯度下降法的损失函数表达式:\[E=\frac{1}{2n}\sum_{i=1}^{n}(y^{(i)}-f......
  • postgresql批量修改表的owner
    postgresql批量修改表的ownerpostgresql中,对表的权限控制比较严格,很多事情只有owner才有权限去做。所以我们尽量用onwer账户去操作。但是有的时候我们需求去批量修改owner,比如导入的表结构。但是官方并没有提供比较好的命令。我们可以用拼接sql的方式去完成这个命令。1.查看有......
  • 机器学习——网络中的网络NiN
    NiN块回想一下,卷积层的输入和输出由四维张量组成,张量的每个轴分别对应样本、通道、高度和宽度。另外,全连接层的输入和输出通常是分别对应于样本和特征的二维张量。NiN的想法是在每个像素位置(针对每个高度和宽度)应用一个全连接层。如果我们将权重连接到每个空间位置,我们可以将......
  • 机器学习——使用块的网络VGG
    VGG块虽然AlexNet证明深层神经网络卓有成效,但它没有提供一个通用的模板(例如VGG块)来指导后续的研究人员设计新的网络。在下面的几个章节中,我们将介绍一些常用于设计深层神经网络的启发式概念。经典卷积神经网络的基本组成部分是下面的这个序列:带填充以保持分辨率的卷积层;......
  • 机器学习——深度卷积神经网络AlexNet
    AlexNet相对于LeNet的主要优势包括:1.更深的网络结构AlexNet有8层结构,而LeNet只有5层。网络更加深入有利于学习更抽象的高级特征。2.使用ReLU激活函数AlexNet使用ReLU激活函数,避免梯度消失问题,使得深层网络的训练更加容易。3.引入Dropout操作AlexNet在全连接层使用Dro......
  • 扫地机器人如何实现缺水检测-管道光电液位传感器
    扫地机器人是一种智能家居清洁设备,它可以通过自动巡航和清扫地面来减轻人们的家务负担。扫地机器人在工作时,需要确保水箱中有足够的清水进行清扫。当水箱缺水时,扫地机器人需要停止工作并发出缺水提示,以便及时为水箱加水。扫地机器人实现缺水检测的方法之一是使用管道光电液位传感器......