【深度学习技术】Batch Normalization讲解

批量归一化技术
批量归一化(Batch Normalization,BN)是一种用于加速深度学习模型训练的技术。它通过规范化每一层神经网络的输入,确保数据分布在训练过程中保持稳定,从而提高训练速度并简化超参数调整过程。本文介绍了BN的基本概念、工作原理及其在实际应用中的优势。

Batch Normalization

批量归一化技术出现在2015年。
机器学习领域有个很重要的假设,独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型,能够在测试集获得的效果的一个基本保障。而BN就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的

Mini-Batch SGD**优点**:梯度更新方向比较准确,并行计算速度比较快。
Mini-Batch SGD**缺点**:麻烦。超参数调起来很麻烦,比如学习率,参数初始化,Dropout比例等等。BN应用于Mini-Batch SGD之后就可以解决很多SGD的缺点,不用在担心调参的问题。

我们的训练数据是有一定的固定分布,不过深度学习中有很多的隐层,在训练过程中,各层参数会不断变化,很长时间之后才会稳定。BN的基本思想就是让每个隐层节点的激活输入分布股东下来,来提升训练速度。

收BN的起来发源于图像处理的白花操作。所谓白化,就是对输入数据分布变换到均值为0,方差为1的正态分布,那么神经网络较快收敛。

为什么要利用?

这里写图片描述

如果不利用BN,数据就会落在激活函数的饱和区,这样梯度越来越小,甚至出现梯度消失现象。

如何实现BN

这里写图片描述

把输入数据重新拉回到均值为0,方差为1的区域,这样让每层的输入落在(-1,1)区间,这段刚好是激活函数性能最好的区域。

落在0附近的线性区域也不好,进行下面的操作y= scale*x+shift。每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是scale和shift把这个值重标准正态分布左移和右移一点并且长胖或变瘦一点。使得整个分布从中心周围的线性区往非线性区移动了一些。核心思想就是找到一个合适的位置,既能享有非线性的表达能力,又避免太靠近非线性去的两头使得网络收敛速度太慢。

这里写图片描述

对比了利用BN和不利用BN的结果,可以发现利用BN的结果性能更好。

网络中实现

这里写图片描述

对于一个m个样本的输入,对于每一层的输入进行归一化操作

这里写图片描述

这里写图片描述

其中X(k)=W*U+b
E[X(k)]代表m个样本在某个神经元之前x(k)的均值。
分母代表m个样本的x(k)的标准差。

算法原理如下所示:

这里写图片描述

测试阶段的均值和方差

测试阶段的均值和方差要用整体的均值和方差,这要求在计算每个mini-batch的时候要记录每个mini-batch的均值和方差
这里写图片描述

参考链接:http://blog.youkuaiyun.com/elaine_bao/article/details/50890491

Batch Normalization(简称BN)是一种在深度学习中广泛应用的技术,用于加速神经网络的训练过程并提高模型的稳定性。其核心思想是通过对每一层的输入进行标准化处理,使得网络各层的输入分布更加稳定,从而缓解梯度消失和梯度爆炸的问题。 ### 原理概述 Batch Normalization 的核心思想是在每个 mini-batch 上对输入数据进行标准化处理,即减去该 batch 的均值并除以其标准差。这样做的目的是为了让每一层的输入分布接近标准正态分布,从而减少内部协变量偏移(Internal Covariate Shift)[^2]。 具体来说,对于一个给定的 mini-batch 数据 $ x $,Batch Normalization 的计算过程如下: 1. **计算均值**:$$ \mu_B = \frac{1}{m} \sum_{i=1}^{m} x_i $$ 2. **计算方差**:$$ \sigma_B^2 = \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu_B)^2 $$ 3. **标准化**:$$ \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} $$ 4. **缩放和平移**:$$ y_i = \gamma \hat{x}_i + \beta $$ 其中,$ m $ 是 mini-batch 的大小,$ \epsilon $ 是一个小的常数,用于防止除以零的情况,$ \gamma $ 和 $ \beta $ 是可学习的参数,用于恢复数据的表达能力。 ### 实现方法 在 TensorFlow 中,Batch Normalization 可以通过以下几种方式实现: - **tf.nn.batch_normalization**:这是一个低级的操作函数,调用者需要自己处理张量的平均值和方差。 - **tf.layers.batch_normalization**:这是对先前操作的高级包装。最大的不同在于它负责创建和管理运行张量的均值和方差,并尽可能地调用快速融合运算。通常,这个函数应该是默认选择。 - **tf.contrib.layers.batch_norm**:这是 batch norm 的早期实现,其升级的核心 API 版本为 `tf.layers.batch_normalization`。不推荐使用它,因为它可能会在未来的版本中丢失[^3]。 ### 示例代码 以下是一个使用 TensorFlow 的 `tf.layers.batch_normalization` 实现 Batch Normalization 的简单示例: ```python import tensorflow as tf # 定义输入占位符 inputs = tf.placeholder(tf.float32, shape=[None, 128]) # 添加 Batch Normalization 层 bn_layer = tf.layers.batch_normalization(inputs, training=True) # 定义其他层 dense_layer = tf.layers.dense(bn_layer, units=64, activation=tf.nn.relu) # 初始化变量 init_op = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init_op) # 假设我们有一些输入数据 input_data = ... # 运行模型 output = sess.run(dense_layer, feed_dict={inputs: input_data}) ``` 在这个示例中,`tf.layers.batch_normalization` 被用来对输入数据进行标准化处理。`training=True` 参数表示在训练阶段使用 Batch Normalization,而在推理阶段应设置为 `training=False`。 ### 总结 Batch Normalization 通过标准化每一层的输入,有效地减少了内部协变量偏移,加快了训练速度,并提高了模型的泛化能力。在实际应用中,可以通过 TensorFlow 提供的不同函数来实现 Batch Normalization,其中 `tf.layers.batch_normalization` 是推荐使用的高级接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值