总结2: Batch Normalization反向传播公式推导及其向量化

这篇博客详述了作者在理解并推导Batch Normalization(BN)反向传播过程中的经历,包括遇到的问题、解决方法以及最终的向量化实现。作者从吴恩达的课程出发,逐步推导了BN的反向传播公式,并用Scala实现了BN的反向传播,强调了在实现过程中向量化的重要性。
摘要由CSDN通过智能技术生成

1. 背景介绍

上周学习了吴恩达的Deep Learning专项课程的第二门课,其中讲到了Batch Normalization(BN)。但在课程视频中,吴恩达并没有详细地给出Batch Normalization反向传播的公式推导,而是从high level的角度解释了为什么Batch Normalization会work,以及如何在TensorFlow等framework中使用Batch Norm。

我自己首先尝试了一下推导BN反向传播的公式,但是用代码实现后跑的结果都不甚理想,收敛速度比不使用BN还要慢甚至有时候无法收敛,应该是公式推错了。接着我在网上搜索到Google最开始提出BN的论文, 里面给出了反向传播的公式,但是不是以向量化的形式给出的。众所周知,我们实现深度网络应该依赖于向量计算。我看着公式以自己的理解写出了向量的形式,但是实现后结果仍旧不正常。

接着在网上搜索其他人介绍BN的博客文章,绝大多数文章都是前面讲一大堆BN的好处,消除Internal Convariate Shift,加快收敛,减少Dropout的使用,起到部分正则化等等,然后涉及到核心的公式部分时,话锋一转,说BN反向传播部分的推导很简单,就是利用了Chain Rule,接着就给出了与论文中一模一样的公式。看着让人很是头疼。

就这样停滞了大概三四天的时间,但是我实在不甘心仅仅会使用TensorFlow中提供的BN模块,而搞不懂BN的详细推导。终于,我下定决心抽出一整天的时间拿出纸笔一步步的演算,最终心静下来花了大概一个小时算出来,然后代码实现之后跑起来结果就正常了。

2. BN反向传播的详细推导

2.1 单个activation进行batch norm的情况

假设神经网络的第L层是BatchNorm层,其输入数据为 ZL ,其中 ZL 的维度是(n, dL ),n是样本个数, dL 代表第L层神经元的个数。

ZL 进行normalize得到:

Znorm,L=ZL1mean(ZL)T1var(ZL)T

其中, 1 代表元素全为1的列向量,如不特殊说明,其长度为n; 代表矩阵乘法; mean(ZL) 是长度为 dL 的列向量; (var(ZL) 也是长度为 dL 的列向量。

然后对 Znorm,L 加上可被学习的scale参数 γL 和shift参数 βL

YL=Znorm,L×(1γT)+1βT

其中, × 代表矩阵对应元素相乘; γT 代表 γ 的转置。 γ β 都是长度为 dL 的向量。

以上是Batch Norm层正向传播的严谨的公式,很多文章里都习惯于使用具有broadcasting功能的公式,如用一个矩阵减去一个向量等操作,虽然python里的numpy支持这种运算,但是公式如果也用这种方式写则很不严谨,也对我们的求导造成很大的困扰。

接下来是反向传播部分的推导。因为 Znorm,L 是对 ZL 按列normalize得到的,每两列之间是完全独立的,求导的时候也不会互相干扰,所以为了推导的清晰简便起见,我们取 ZL 的第j列进行推导,以下将 ZLj 记为小写的 x

现在我们有如下数据:

x=[x1,x2,...,xn]T

mean(x)=ni=1xin

var(x)=np=1(xpmean(x))2n

stddev(x)=var(x)

xnor
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值