深度学习笔记(12) Batch归一化网络
1. Batch归一化
Batch归一化,由Sergey loffe和Christian Szegedy两位研究者创造
会使参数搜索问题变得很容易,使神经网络对超参数的选择更加稳定
超参数的范围会更加庞大,工作效果也很好,训练也更加容易,甚至是深层网络
当训练一个模型,比如logistic回归时,归一化输入特征可以加快学习过程
计算了平均值
从训练集中减去平均值
计算了方差
除以标准差(根号方差)
根据方差归一化数据集,数据集变成更圆,易于算法优化
所以,对logistic回归和神经网络的归一化输入特征值是有效的
2. 激活值归一化
在更深的模型,不仅输入了特征值x,而且这层有激活值a[1]
如果想训练这些参数,比如w[3],b[3]
更好的是归一化a[2] 的平均值和方差,以便使w[3],b[3]的训练更有效率
严格来说,真正归一化的不是a[2] ,而是z[2]
实践中,经常做的是归一化 z[2]
在神经网络中,已知一些中间值,假设隐藏单元值从z(1) 到z(m)
来源于隐藏层,即 z[l](i) 为隐藏层,i从1到m
所以已知这些值,要计算平均值:
方差:
注意所有这些都是针对l层,但省略 [
l
l
l]
通常将ε作为分母,以防σ=0的情况
取每个z(i)值,使其规范化
现在已把这些z值标准化,化为含平均值0和标准单位方差
所以z的每一个分量都含有平均值0和方差1
3. 特殊情况不归一化
也许隐藏单元有了不同的分布会有意义
不想让隐藏单元总是含有平均值0和方差1
计算
这里γ和β是模型的学习参数
所以使用梯度下降或一些其它类似梯度下降的算法
比如Momentum或者Nesterov,Adam,会更新γ和β
正如更新神经网络的权重一样
γ和β的作用是,可以随意设置
z
~
\widetilde{z}
z
(i) 的平均值
事实上,如果 γ =
(
σ
2
+
ε
)
\sqrt{(σ^2+ε)}
(σ2+ε),β = μ
那么
z
~
\widetilde{z}
z
(i) = γznorm(i)+β,
那
z
~
\widetilde{z}
z
(i)=z(i)
4. mini-batch上的Batch归一化
需要强调的是Batch归一化是发生在计算z和a之间的
常和训练集的mini-batch一起使用
用反向prop计算
d
d
dw[l] 和
d
d
db[l] ,及所有l层所有的参数,
d
d
dβ[l] 和
d
d
dγ[l]
更新这些参数:
在TensorFlow框架中
可以用这个函数 tf.nn.batch_normalization 来实现Batch归一化
在mini-batch上计算中,Batch归一化有轻微的正则化效果
因为部分数据集由均值和方差缩放给隐藏单元添加了噪音
这迫使后部单元不过分依赖任何一个隐藏单元
类似于dropout,它给隐藏层增加了噪音
因此有轻微的正则化效果
选择l层,假设有mini-batch,X[1],X[2],X[3]……以及对应的y值等等
那么在为
l
l
l层训练X{1}) 时,得到了第一个mini-batch和这一层的 μ( μ[l] → μ{1}[l] )
当训练第二个mini-batch,就会得到第二个μ(μ{2}[l])
之前用的指数加权平均来计算θ1,θ2,θ3的均值
当时是试着计算当前气温的指数加权平均
这样来追踪均值向量的最新平均值
于是这个指数加权平均就成了对这一隐藏层的z均值的估值
同样的,可以用指数加权平均来追踪在这一层的第一个mini-batch中所见的 σ2 的值
以及第二个mini-batch中所见的 σ2 的值等等
因此在用不同的mini-batch训练神经网络的同时
能够得到每一层的μ和σ2的平均数的实时数值
最后在测试时,对应这个等式:
只需要用z值来计算 znorm(i) ,用 μ 和σ2的指数加权平均
用最新数值来做调整
然后用刚算出来的znorm和在神经网络训练过程中得到的 β 和 γ 参数来计算测试样本
z
~
\widetilde{z}
z
(i) 值
参考:
相关推荐:
深度学习笔记(11)超参数调试
深度学习笔记(10)优化算法(二)
深度学习笔记(9) 优化算法(一)
深度学习笔记(8) 实践层面(三)
深度学习笔记(7) 实践层面(二)
谢谢!