深度学习:批归一化

批归一化是一种用于神经网络的技术,它通过在每一层内部对输入数据进行归一化,提高了网络对超参数选择的不敏感性,增强了模型的鲁棒性。在训练过程中,批归一化计算每个批次的均值和方差,调整输入到激活函数的值,使其均值为0,方差为1。在前向传播和反向传播中,批归一化涉及到复杂的计算步骤。在测试阶段,使用训练集的统计信息来处理数据。批归一化简化了网络结构,减少了对初始化的依赖,并加速了训练过程。
部署运行你感兴趣的模型镜像

批归一化

通过批归一化,可以让超参数的搜索变得简单一些。在施加了批归一化后,神经网络对于超参数的敏感度会降低,具有更强的鲁棒性。

批归一化将每层传输给激励函数的值都进行归一化,相当于把每层隐藏层都看作单独的神经网络,将输入数据进行归一化,降低了网络之间的耦合。

跟对输入数据的归一化相似,批量归一化做的工作也差不多,不过归一化的对象变成了神经网络中传入激活函数的值z[l](i)z^{[l](i)}z[l](i),简单来说就是我们求出
μ[l]=1m∑i=1mz[l](i)σ2[l]=1m∑i=1m(z[l](i)−μ[l])2 \mu^{[l]}=\frac{1}{m}\sum_{i=1}^mz^{[l](i)}\\ \sigma^{2[l]}=\frac{1}{m}\sum_{i=1}^m(z^{[l](i)}-\mu^{[l]})^2 μ[l]=m1i=1mz[l](i)σ2[l]=m1i=1m(z[l](i)μ[l])2然后把z[l](i)z^{[l](i)}z[l](i)化为均值为0,方差为1的数据:
znorm[l](i)=z[l](i)−μ[l]σ2[l]+ε z^{[l](i)}_\text{norm}=\frac{z^{[l](i)}-\mu^{[l]}}{\sqrt{\sigma^{2[l]}+\varepsilon}} znorm[l](i)=σ2[l]+εz[l](i)μ[l]
不过有些时候,我们希望自己定义z[l](i)z^{[l](i)}z[l](i)的均值与方差,可以通过两个参数γ\gammaγβ\betaβ(又是β\betaβ)来控制,即令
z~[l](i)=γ[l]znorm[l](i)+β[l] \tilde{z}^{[l](i)}=\gamma^{[l]} z^{[l](i)}_\text{norm}+\beta^{[l]} z~[l](i)=γ[l]znorm[l](i)+β[l]来将z[l](i)z^{[l](i)}z[l](i)调整到需要的分布。

其中γ[l]\gamma^{[l]}γ[l]β[l]\beta^{[l]}β[l]不需要手动设置,它们可以作为普通参数在收敛过程中直接学习。同时,因为在归一化的时候,所有z[l](i)z^{[l](i)}z[l](i)的平均值都会被调整为0,所以参数b[l]b^{[l]}b[l]就不需要了,我们只保留W[l],γ[l]W^{[l]},\gamma^{[l]}W[l],γ[l]β[l]\beta^{[l]}β[l]

所以,在向前传播时,我们的计算过程为
Z[l]=W[l]A[l−1]μ[l]=1mnp.sum(Z[l],axis=1,keepdims=True)σ2=1mnp.sum((Z[l]−μ[l])2,axis=1,keepdims=True)Znorm[l]=Z[l]−μ[l]σ2[l]+εZ~[l]=γ[l]∗Znorm[l]+β[l]A[l]=g[l](Z~[l]) \begin{aligned} &Z^{[l]}=W^{[l]}A^{[l-1]}\\ &\mu^{[l]}=\frac{1}{m}np.sum(Z^{[l]},axis=1,keepdims=True)\\ &\sigma^2=\frac{1}{m}np.sum((Z^{[l]}-\mu^{[l]})^2,axis=1,keepdims=True)\\ &Z^{[l]}_\text{norm}=\frac{Z^{[l]}-\mu^{[l]}}{\sqrt{\sigma^{2[l]}+\varepsilon}}\\ &\tilde{Z}^{[l]}=\gamma^{[l]}*Z^{[l]}_\text{norm}+\beta^{[l]}\\ &A^{[l]}=g^{[l]}(\tilde{Z}^{[l]}) \end{aligned} Z[l]=W[l]A[l1]μ[l]=m1np.sum(Z[l],axis=1,keepdims=True)σ2=m1np.sum((Z[l]μ[l])2,axis=1,keepdims=True)Znorm[l]=σ2[l]+εZ[l]μ[l]Z~[l]=γ[l]Znorm[l]+β[l]A[l]=g[l](Z~[l])
向后传播计算过程为
dZ~[l]=dA[l]∗g[l]′(Z~[l])dZnorm[l]=dZ~[l]∗γ[l]dβ[l]=1mnp.sum(dZ~[l],axis=1,keepdims=True)dγ[l]=1mnp.sum(dZ~[l]∗Znorm[l],axis=1,keepdims=True)dσ2[l]=1mnp.sum(dZnorm[l]∗(Z[l]−μ[l])(−(σ2[l]+ε)−322),axis=1,keepdims=True)dμ[l]=1mnp.sum(dZnorm[l]∗−1σ2[l]+ε,axis=1,keepdims=True)+dσ2[l]1mnp.sum(−2(Z[l]−μ[l]),axis=1,keepdims=True)dZ[l]=1σ2[l]+ε∗dZnorm[l]+2(Z[l]−μ[l])m∗dσ2[l]+1mdμ[l]dW[l]=1mdZ[l]A[l−1]T \begin{aligned} &d\tilde{Z}^{[l]}=dA^{[l]}*g^{[l]'}(\tilde{Z}^{[l]})\\ &dZ^{[l]}_\text{norm}=d\tilde{Z}^{[l]}*\gamma^{[l]} \\ &d\beta^{[l]}=\frac{1}{m}np.sum(d\tilde{Z}^{[l]},axis=1,keepdims=True)\\ &d\gamma^{[l]}=\frac{1}{m}np.sum(d\tilde{Z}^{[l]}*Z^{[l]}_\text{norm},axis=1,keepdims=True)\\ &d\sigma^{2[l]}=\frac{1}{m}np.sum(dZ^{[l]}_\text{norm}*(Z^{[l]}-\mu^{[l]})(\frac{-(\sigma^{2[l]}+\varepsilon)^{-\frac{3}{2}}}{2}),axis=1,keepdims=True) \\ &d\mu^{[l]}=\frac{1}{m}np.sum(dZ^{[l]}_\text{norm}*\frac{-1}{\sqrt{\sigma^{2[l]}+\varepsilon}},axis=1,keepdims=True)+d\sigma^{2[l]}\frac{1}{m}np.sum(-2(Z^{[l]}-\mu^{[l]}),axis=1,keepdims=True) \\ &dZ^{[l]}=\frac{1}{\sqrt{\sigma^{2[l]}+\varepsilon}}*dZ^{[l]}_\text{norm}+\frac{2(Z^{[l]}-\mu^{[l]})}{m}*d\sigma^{2[l]}+\frac{1}{m}d\mu^{[l]} \\ &dW^{[l]}=\frac{1}{m}dZ^{[l]}A^{[l-1]T}\\ \end{aligned} dZ~[l]=dA[l]g[l](Z~[l])dZnorm[l]=dZ~[l]γ[l]dβ[l]=m1np.sum(dZ~[l],axis=1,keepdims=True)dγ[l]=m1np.sum(dZ~[l]Znorm[l],axis=1,keepdims=True)dσ2[l]=m1np.sum(dZnorm[l](Z[l]μ[l])(2(σ2[l]+ε)23),axis=1,keepdims=True)dμ[l]=m1np.sum(dZnorm[l]σ2[l]+ε1,axis=1,keepdims=True)+dσ2[l]m1np.sum(2(Z[l]μ[l]),axis=1,keepdims=True)dZ[l]=σ2[l]+ε1dZnorm[l]+m2(Z[l]μ[l])dσ2[l]+m1dμ[l]dW[l]=m1dZ[l]A[l1]T

测试时,因为可能只有单组数据,我们无法直接求出μ\muμσ2\sigma^2σ2。因此在测试集中使用BN算法时,我们会利用训练集里的μ\muμσ2\sigma^2σ2的指数加权平均来作为估计值对测试数据进行批归一化。一般使用的深度学习框架还会提供类似的工具来估算均值和方差,事实上只要是合理的估算,BN算法在测试集上的鲁棒性是很强的。

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值