深度学习——Batch Normalization

前言

通过前面的实验,可以看到不同的激活函数通过设置不同的权重初始值,学习的效果不一样,好的学习效果的标准是各层的激活值的分布有适当的广度。
如果“强制性”的调整激活参数的分布(在选择了合适的权重参数初始值情况下),进而使得各层有适当的广度。于是乎就引出了接下来的内容——Batch Normalization算法

Batch Normalization 的算法

优点:
①增加学习率
②对不同的激活函数不再过度依赖权重的初始值
③减轻过拟合
————————————————————————————————
算法的思路:
要向神经网络中插入对数据分布进行正规化的层,即Batch Normalization层。
在这里插入图片描述
数学式表示如下:
在这里插入图片描述
ε是一个微小值(比如,10e-7)
通过(6.7)式,会得到一组 均值为0、方差为1的数据x1,x2…Xm。在激活函数前后执行此操作,可以减小数据分布的偏向。

接下来对正规化后的数据进行缩放和平移变换。
γ和β是参数。一开始γ = 1,β = 0,然后再通过学习调整到合适的值。
在这里插入图片描述
Batch Norm算法在神经网络上的计算图如下;
在这里插入图片描述

对Batch Normalization 效率的评估

使用Batch Norm层和不使用 Batch Norm层的学习过程变化,实验代码如下。

import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.multi_layer_net_extend import MultiLayerNetExtend
from common.optimizer import SGD, Adam

(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True)

#减少学习数据
x_train = x_train[:1000]
t_train = t_train[:1000]

max_epochs = 20
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.01

def __train(weight_init_std):
    bn_network = MultiLayerNetExtend(input_size=784, hidden_size_list=[100, 100, 100, 100, 100], output_size=10, 
                                    weight_init_std=weight_init_std, use_batchnorm=True)
    network = MultiLayerNetExtend(input_size=784, hidden_size_list=[100, 100, 100, 100, 100], output_size=10,
                                weight_init_std=weight_init_std)
    optimizer = SGD(lr=learning_rate)
    
    train_acc_list = []
    bn_train_acc_list = []
    
    iter_per_epoch = max(train_size / batch_size, 1)
    epoch_cnt = 0
    
    for i in range(1000000000):
        batch_mask = np.random.choice(train_size, batch_size)
        x_batch = x_train[batch_mask]
        t_batch = t_train[batch_mask]
    
        for _network in (bn_network, network):
            grads = _network.gradient(x_batch, t_batch)
            optimizer.update(_network.params, grads)
    
        if i % iter_per_epoch == 0:
            train_acc = network.accuracy(x_train, t_train)
            bn_train_acc = bn_network.accuracy(x_train, t_train)
            train_acc_list.append(train_acc)
            bn_train_acc_list.append(bn_train_acc)
    
            print("epoch:" + str(epoch_cnt) + " | " + str(train_acc) + " - " + str(bn_train_acc))
    
            epoch_cnt += 1
            if epoch_cnt >= max_epochs:
                break
                
    return train_acc_list, bn_train_acc_list

#3.绘制图形==========
weight_scale_list = np.logspace(0, -4, num=16)
x = np.arange(max_epochs)

for i, w in enumerate(weight_scale_list):
    print( "============== " + str(i+1) + "/16" + " ==============")
    train_acc_list, bn_train_acc_list = __train(w)
    
    plt.subplot(4,4,i+1)
    plt.title("W:" + str(w))
    if i == 15:
        plt.plot(x, bn_train_acc_list, label='Batch Normalization', markevery=2)
        plt.plot(x, train_acc_list, linestyle = "--", label='Normal(without BatchNorm)', markevery=2)
    else:
        plt.plot(x, bn_train_acc_list, markevery=2)
        plt.plot(x, train_acc_list, linestyle="--", markevery=2)

    plt.ylim(0, 1.0)
    if i % 4:
        plt.yticks([])
    else:
        plt.ylabel("accuracy")
    if i < 12:
        plt.xticks([])
    else:
        plt.xlabel("epochs")
    plt.legend(loc='lower right')
    
plt.show()

在这里插入图片描述

参考

《深度学习入门:基于Python的理论与实现》斋藤康毅

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Batch Normalization是一种用于加速神经网络训练的技术。在神经网络中,输入的数据分布可能会随着层数的增加而发生变化,这被称为“内部协变量偏移”问题。Batch Normalization通过对每一层的输入数据进行归一化处理,使其均值接近于0,标准差接近于1,从而解决了内部协变量偏移问题。 具体地,对于一个Mini-Batch中的一组输入数据,Batch Normalization将这组数据进行标准化处理,使得其均值为0,标准差为1。这样做的好处是,可以使得每一层的输入数据分布更加稳定,从而加速神经网络的训练过程。此外,Batch Normalization还具有一定的正则化效果,可以减少过拟合问题的发生。 Batch Normalization被广泛应用于深度学习中的各种网络结构中,例如卷积神经网络(CNN)和循环神经网络(RNN)。它是深度学习中一种非常重要的技术,可以提高网络的训练速度和准确度。 ### 回答2: Batch Normalization(批归一化)是一种用于训练深度神经网络的技术。深度神经网络的层数较多,容易出现梯度消失或梯度爆炸的问题,导致训练困难。Batch Normalization通过在神经网络中的每个层对输入进行归一化处理,从而缓解了这个问题。 具体而言,Batch Normalization将每个输入特征进行标准化,使其均值为0,方差为1,然后再通过缩放和平移操作进行线性变换,将归一化后的特征重新映射回原来的数据范围。这个归一化操作是在每个batch的样本上进行的,因此称为批归一化。 批归一化有以下几个优点。首先,它使得模型更加稳定,通过减少不同层之间的协变量偏移(covariate shift),加速了网络的收敛速度。其次,批归一化减少了对初始参数选择的敏感性,使得网络参数更易于初始化。再次,批归一化还可以起到正则化的作用,减少模型的过拟合。 批归一化可以应用于深度神经网络中各个层的输入。在训练时,对每个batch的输入进行归一化处理,并记录归一化所使用的均值和方差。在预测时,使用训练过程中得到的均值和方差对输入进行归一化处理,以保持模型的稳定性。 综上所述,Batch Normalization是一种用于处理深度神经网络输入的技术,可以加速网络的训练收敛速度,增强模型的稳定性,并提供正则化的效果。它在深度学习领域中得到了广泛的应用。 ### 回答3: Batch Normalization是一种常用的深度学习中的技术,用于加速神经网络的训练和提高模型的稳定性。深度神经网络中,每层的输入数据分布会随着训练过程中参数的更新而发生变化,这使得网络学习变得困难,难以收敛。Batch Normalization通过在每个训练小批量中对数据进行标准化处理,使得各层的输入数据分布基本稳定,有利于网络训练。 具体来说,Batch Normalization的过程分为两步。首先,对于每个小批量的数据,计算其均值和方差,然后对数据进行标准化处理,使得数据的均值接近0,方差接近1。该过程可以通过调整两个可学习参数——缩放因子(scale factor)和位移因子(shift factor)来实现,从而保留数据的表达能力。其次,将标准化后的数据通过一个仿射变换,恢复为网络中层的输出。 Batch Normalization的优点包括:首先,可以加速模型的训练,因为对数据的标准化可以减少数据间的相关性,使得优化过程更快收敛;其次,可以增强模型的泛化能力,减少过拟合的风险;还可以对网络的激活函数的输出进行归一化,从而避免了梯度爆炸或消失的问题,提高了网络的稳定性和学习效率。 总之,Batch Normalization是一种通过对每个小批量的数据进行标准化处理的技术,旨在加速神经网络的训练和提高模型的稳定性,被广泛应用于深度学习中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值