批量归一化处理公式后向传播公式怎么推导的

总结2: Batch Normalization反向传播公式推导及其向量化 - pan5431333的博客 - CSDN博客
总结2: Batch Normalization反向传播公式推导及其向量化
Scala学习者
深度学习学习者
唯品会开发实习生
同济大学硕士在读
1. 背景介绍
上周学习了吴恩达的Deep Learning专项课程的第二门课,其中讲到了Batch Normalization(BN)。但在课程视频中,吴恩达并没有详细地给出Batch Normalization反向传播的公式推导,而是从high level的角度解释了为什么Batch Normalization会work,以及如何在TensorFlow等framework中使用Batch Norm。
我自己首先尝试了一下推导BN反向传播的公式,但是用代码实现后跑的结果都不甚理想,收敛速度比不使用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=ZL-1*mean(ZL)T1*var(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(xp-mean(x))2n
stddev(x)=var(x)??????√
xnorm=??????xnorm1xnorm2...xnormn??????=???????(x1-mean(x))/var(x)??????√(x2-mean(x))/var(x)??????√...(xn-mean(x))/var(x)??????√???????
通过chain rule,我们有:
(αLαxi)1×1=(αLαxnorm)T1×n*(αxnormαxi)n×1
αLαxnorm=??????????αLαxnorm1αLαxnorm2...αLαxnormn??????????n×1
αxnormαxi=??????????αxnorm1αxiαxnorm2αxi...αxnormnαxi??????????n×1
因为xnormj=xj-mean(x)var(x)√,通过分式求导法则有:
αxnormjαxi=(I{j=i}-1n)var(x)??????√-αvar(x)√αxi(xj-mean(x))var(x)
下面求αvar(x)√αxi:
αvar(x)??????√αxi=12var(x)??????√αvar(x)αxi
因为var(x)=∑np=1(xp-mean(x))2n,我们有:
αvar(x)αxi=1n∑p=1n2(xp-mean(x))(I{p=i}-1n)=2n∑p=1nxp(I{p=i}-1n)-2n∑p=1nmean(x)(I{p=i}-1n)=2n(xi-mean(x))-2n(mean(x)-mean(x))=2n(xi-mean(x))
αvar(x)??????√αxi=12var(x)??????√αvar(x)αxi=12var(x)??????√2n(xi-mean(x))=xi-mean(x)nvar(x)??????√
αxnormjαxi=(I{j=i}-1n)var(x)??????√-αvar(x)√αxi(xj-mean(x))var(x)=(I{j=i}-1n)var(x)??????√-(xi-mean(x))nvar(x)√(xj-mean(x))var(x)=I{j=i}-1nvar(x)??????√-(xi-mean(x))(xj-mean(x))nvar(x)3???????√
αxnormαx=??????????αxnorm1αx1αxnorm2αx1...αxnormnαx1αxnorm1αx2αxnorm2αx2...αxnormnαx2............αxnorm1αxnαxnorm2αxn...αxnormnαxn??????????=In×nvar(x)??????√-1*1Tnvar(x)??????√-(x-mean(x))(x-mean(x))Tnvar(x)??????√3
αLαx=(αxnormαx)TαLαxnorm
以下是我用Scala实现的Batch Norm反向传播方法的向量化版本,值得注意的是,由于向量对向量求导的结果是一个矩阵,多个向量对向量求导的结果是一个三维张量,而Scala中的Breeze数值计算库现并不支持张量运算,所以在我用Scala实现的Batch Normalization的反向传播版本中,不可避免地使用的for循环对ZL的每一列循环计算;而如果读者使用的Python,Numpy支持三位数组,故可以把此for循环也替换成张量运算,使得运算速度更快!
private def backWithBatchNorm(dYCurrent: DenseMatrix[Double], yPrevious: DenseMatrix[Double]): (DenseMatrix[Double], DenseMatrix[Double]) = {
val numExamples = dYCurrent.rows
val oneVector = DenseVector.ones[Double](numExamples)
val dZDelta = dYCurrent *:* this.activationFuncEval(zDelta)
val dZNorm = dZDelta *:* (oneVector * beta.t)
val dAlpha = dZDelta.t * oneVector / numExamples.toDouble
val dBeta = (dZDelta *:* zNorm).t * oneVector / numExamples.toDouble
val dZ = DenseMatrix.zeros[Double](z.rows, z.cols)
for (j &- 0 until z.cols) {
val dZNormJ = dZNorm(::, j)
val dZJ = (DenseMatrix.eye[Double](dZNormJ.length) / currentStddevZ(j) - DenseMatrix.ones[Double](dZNormJ.length, dZNormJ.length) / (numExamples.toDouble * currentStddevZ(j)) - (z(::, j) - currentMeanZ(j)) * (z(::, j) - currentMeanZ(j)).t / (numExamples.toDouble * pow(currentStddevZ(j), 3.0))) * dZNormJ
dZ(::, j) := dZJ
val dWCurrent = yPrevious.t * dZ / numExamples.toDouble
val dYPrevious = dZ * w.t
val grads = DenseMatrix.vertcat(dWCurrent, dAlpha.toDenseMatrix, dBeta.toDenseMatrix)
(dYPrevious, grads)
相关文章推荐层次分析法采用特征根的方法计算出特征向量后,经归一化后就是权重向量。什么叫归一化?归一化需要如何处_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
层次分析法采用特征根的方法计算出特征向量后,经归一化后就是权重向量。什么叫归一化?归一化需要如何处
请大虾们帮帮忙~急求
我有更好的答案
9 ; 0,所以要将特征向量分别除以这几个向量之和.4
0,这些数值的和为1,所以叫归一化处理.9 。然后四舍五入.9999,并不是1.9 ; 0归一化比较简单,因为得出的特征向量之和不一定是1:你得到的特征向量为(0.3
0,重新得出的数就是权重向量。比如.0933),所以要对其进行归一化处理。分别用0,最后得出的数为(0.0933 ),它们的和是0
采纳率:57%
为您推荐:
其他类似问题
特征向量的相关知识
换一换
回答问题,赢新手礼包相关文章推荐
Understanding the backward pass through Batch Normalization Layer
Feb 12, 2016
At the moment there ...
1-Motivation
2-Normalization via Mini-Batch Statistics
BN before or after Activation
为什么要batch normalization?
1.batch normalization的原理
在反向传播的过程中,是一个w不断叠乘的结果,因为在传播过程中w时一个不确定范围...
作者给出的批标准化的算法如下:
算法中的ε是一个常量,为了保证数值的稳定性
反向传播求梯度:
本文转载自:http://blog.csdn.net/shuzfan/article/details/
本次所讲的内容为Batch Normalization,简称BN,来源于《...
作者给出的批标准化的算法如下:
算法中的ε是一个常量,为了保证数值的稳定性
反向传播求梯度:
参照http://blog.csdn.net/zxzxy1988/article/details/8587244
double findKth(int a[], int m, int b[], in...
最近在看CS231N的课程,同时也顺带做配套的作业,在Assignment2 中关于Batch Normalization的具体数学过程则困惑了很久,通过参看一些博客自己推导了一遍,供大家参考。Bat...
最近看了一下BP神经网络(Backpropagation Neural Networks),发现很多资料对于BP神经网络的讲解注重原理,而对于反向传播公式的推导介绍的比较简略,故自己根据《PATTER...
最近看了BP神经网络(Back Propagation Neural Networks),对于其中误差反向传播公式的推导比较困惑,在参考周志华老师的《机器学习》和网上一些博客后,做出一个简单的还原。...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Recurrent network 的backpropagation公式 怎么样推导出来_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
Recurrent network 的backpropagation公式 怎么样推导出来
我有更好的答案
表示第层的第个神经元的输出,即:其中表示激活函数。2,此时代价函数表示为;计算输出层产生的错误:公式2(由后往前;表示第层的第个神经元的偏置;表示第层的第个神经元的输入,这是ANN的前向传播过程;(2)由于ANN的输出结果与实际结果有误差:推导过程:(1)将训练集数据输入到ANN的输入层,经过隐藏层,最后达到输出层并输出结果:本文将以一个输入样本为例进行说明. 公式及其推导本节将介绍反向传播算法用到的4个公式,并进行推导。如果不想了解公式推导过程,&nbsp,计算每一层神经网络产生的错误):公式4(计算偏置的梯度);不断迭代上述过程,直至收敛:公式1(计算最后一层神经网络产生的错误)反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法。其主要思想是,直至传播到输入层;(3)在反向传播的过程中,根据误差调整各种参数的值:反向传播错误. 代价函数代价函数被用来计算ANN输出值与实际值之间的误差。常用的代价函数是二次代价函数(Quadratic cost function):其中,表示输入的样本,表示实际的分类,表示预测的输出,表示神经网络的最大层数。3:推导过程。反向传播算法的思想比较容易理解,但具体的公式则要一步步推导,因此本文着重介绍公式的推导过程。变量定义上图是一个三层人工神经网络,layer1至layer3分别是输入层、隐藏层和输出层。如图,先定义一些变量:表示第层的第个神经元连接到第层的第个神经元的权重,并将该误差从输出层向隐藏层反向传播:推导过程,请直接看第4节的算法步骤。首先,将第层第个神经元中产生的错误(即实际值与预测值之间的误差)定义为:前向传播:其中,表示Hadamard乘积,用于矩阵或向量之间点对点的乘法运算。公式1的推导过程如下,即:4. 反向传播算法伪代码输入训练集对于训练集中的每个样本x,设置输入层(Input layer)对应的激活值:,则计算估计值与实际值之间的误差:公式3(计算权重的梯度)
采纳率:97%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包高斯分布的归一化特征推导_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
高斯分布的归一化特征推导
&&高斯分布的归一化特征的推导过程
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 矩阵归一化处理公式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信