前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >最好的batch normalization 讲解

最好的batch normalization 讲解

作者头像
用户1908973
发布2018-07-25 10:13:11
1.2K0
发布2018-07-25 10:13:11
举报
文章被收录于专栏:CreateAMindCreateAMind

batch normalization(Ioffe and Szegedy, 2015) 是优化深度神经网络中最激动人 心的最新创新之一。实际上它并不是一个优化算法,而是一个自适应的重新参数化 的方法,试图解决训练非常深层模型的困难。

非常深层的模型会涉及多个函数或层组合。在其他层不改变的假设下,梯度用于如何更新每一个参数。在实践中,我们同时更新所有层。当我们进行更新时,可能会发生一些意想不到的结果,这是因为许多组合在一起的函数同时改变时,计算更新的假设是其他函数保持不变。举一个简单的例子,假设我们有一个深度神经网络,每一层只有一个单元,并且在每个隐藏层不使用激励函数:

yˆ = xw1w2w3 . . . wl。这里,wi 表示用于层 i 的权重。层 i 的输出是 hi = hi−1wi。输出 yˆ 是输入 x 的线性函数,但是权重 wi 的非线性函数。假设我们的代价函数 yˆ 上的梯度为 1,所以我们希望稍稍降低 yˆ。然后反向传播算法可以计算梯度 g = ∇wyˆ。想想我们在更新w ← w − εg 时会发生什么。近似 yˆ 的一阶泰勒级数会预测 yˆ 的值下降 εg⊤g。如果我们希望 yˆ 下降 0.1,那么梯度中的一阶信息表明我们应设置学习率 ε 为

。然而,实际的更新将包括二阶,三阶,直到 l 阶的影响。yˆ 的更新值为

这个更新中所产生的一个二阶项示例是

很小,那么该项可以忽略不计。而如果层 3 到层 l 的权重都比 1 大时,该项可能会指数级大。这 使得很难选择一个合适的学习速率,因为某一层中参数更新的效果很大程度上取决 于其他所有层。二阶优化算法通过考虑二阶相互影响来解决这个问题,但我们可以 看到,在非常深的网络中,更高阶的相互影响会很显著。即使是二阶优化算法,计算 代价也很高,并且通常需要大量近似,以免真正计算所有的重要二阶相互作用。因此对于 n > 2 的情况建立 n 阶优化算法似乎是无望的。那么我们可以做些什么呢?

batch normalization提出了一种几乎可以重新参数化所有深度网络的优雅方法。 重新参数化显著减少了多层之间协调更新的问题。batch normalization可应用于网络 的任何输入层或隐藏层。设 H 是需要标准化的某层的minibatch激励函数,布置为 设计矩阵,每个样本的激励出现在矩阵的每一行中。标准化 H,我们替代它为

其中 μ 是包含每个单元均值的向量,σ 是包含每个单元标准差的向量。此处的算术 是基于广播向量 μ 和向量 σ 应用于矩阵 H 的每一行。在每一行内,运算是逐元素 的,因此 Hi,j 标准化为减去 μj 再除以 σj。网络的其余部分操作 H′ 的方式和原网 络操作 H 的方式一样。

在训练阶段,

其中 δ 是个很小的正值,比如 10−8,以强制避免遇到

的梯度在 z = 0 处未定义 的问题。至关重要的是,我们反向传播这些操作,计算均值和标准差,并应用它们 于标准化 H。这意味着,梯度不会再简单地增加 hi 的标准差或均值;标准化操作会 除掉这一操作的影响,归零其在梯度中的元素。这是batch normalization方法的一个 重大创新。以前的方法添加代价函数的惩罚,以鼓励单位标准化激励统计量,或是 在每个梯度下降步骤之后重新标准化单位统计量。前者通常会导致不完全的标准化, 而后者通常会显著地消耗时间,因为学习算法会反复改变均值和方差而标准化步骤 会反复抵消这种变化。batch normalization重新参数化模型,以使一些单元总是被定 义标准化,巧妙地回避了这两个问题。

在测试阶段,μ 和 σ 可以被替换为训练阶段收集的运行均值。这使得模型可以 对单一样本评估,而无需使用定义于整个minibatch的 μ 和 σ。

回顾例子 yˆ = xw1w2 . . . wl,我们看到,我们可以通过标准化 hl−1 很大程度地 解决学习这个模型的问题。假设 x 采样自一个单位高斯。那么 hl−1 也是来自高斯, 因为从 x 到 hl 的变换是线性的。然而,hl−1 不再有零均值和单位方差。使用batch normalization后,我们得到的归一化 hˆl−1 恢复了零均值和单位方差的特性。对于底层的几乎任意更新而言,hˆl−1 仍然保持着单位高斯。然后输出 yˆ 可以学习为一个简 单的线性函数 yˆ = wlhˆl−1。现在学习这个模型非常简单,因为低层的参数在大多数 情况下没有什么影响;它们的输出总是重新标准化为单位高斯。只在少数个例中,低 层会有影响。改变某个低层权重为 0,可能退化输出;改变低层权重的符号可能反 转 hˆl−1 和 y 之间的关系。这些情况都是非常罕见的。没有标准化,几乎每一个更新 都会对 hl−1 的统计量有着极端的影响。因此,batch normalization显著地使得模型 更易学习。在这个示例中,容易学习的代价是使得底层网络没有用。在我们的线性 示例中,较低层不再有任何有害的影响,但它们也不再有任何有益的影响。这是因 为我们已经标准化了一阶和二阶统计量,这是线性网络可以影响的所有因素。在具 有非线性激励函数的深度神经网络中,较低层可以进行数据的非线性变换,所以它 们仍然是有用的。batch normalization仅标准化每个单元的均值和方差,以稳定化学 习,但允许单元和单个单元的非线性统计量之间的关系发生变化。

由于网络的最后一层能够学习线性变换,实际上我们可能希望移除一层内单 元之间的所有线性关系。事实上,这是Guillaume Desjardins (2015) 中采用的方法, 为batch normalization提供了灵感。令人遗憾的是,消除所有的线性关联比标准化各 个独立单元的均值和标准差代价更高,因此迄今batch normalization仍是最实用的方 法。

标准化一个单元的均值和标准差会降低包含该单元的神经网络的表达能力。为 了保持网络的表现力,通常会取代batch隐藏单元激励 H 为 γH′ + β,而不是简单地 使用标准化的 H′。变量 γ 和 β 是允许新变量有任意均值和标准差的学习参数。乍 一看,这似乎是无用的——为什么我们将均值设为 0,然后又引入参数允许它被重设 为任意值 β?答案是,新的参数可以表示旧参数作为输入的同一族函数,但是新参 数有不同的学习动态。在旧参数中,H 的均值取决于 H 下层中参数的复杂关联。在 新参数中,γH′ + β 的均值仅由 β 确定。新参数很容易通过梯度下降来学习。

大多数神经网络层会采取形式 φ(XW + b),其中 φ 是某个固定的非线性激励函 数,如整流线性变换。自然想到是否我们应该应用batch normalization于输入 X,或 是变换值 XW + b。Ioffe and Szegedy (2015) 推荐后者。更具体地,XW + b 应替换 为 XW 的标准化形式。偏置项应被忽略,因为参数 β 会加入batch normalization重 新参数化,它是冗余的。一层的输入通常是前一层的非线性激励函数,如整流线性函 数,的输出。因此,输入的统计量更符合非高斯,而更不服从线性操作的标准化。

第九章所述的卷积网络,在特征映射中每个空间位置同样地标准化 μ 和 σ 是很 重要的,能使特征映射的统计量不因空间位置而保持相同。

内容摘自:https://github.com/exacity/deeplearningbook-chinese/releases/ 8.7.1

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CreateAMind 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档