文章目录

  • 前言
  • Batch Normalization
    • 前向传播
    • 后向传播
    • 推理阶段
  • Dropout
    • 前向传播
    • 后向传播
    • 推理阶段
  • 扩展
    • Batch Renormalization
    • Cross-Iteration Batch Normalization

前言

在机器学习以及深度学习中,Normalization解决的是Internal Covariate Shift,解决梯度弥散的问题,提高训练速度。
另一方面,在机器学习模型中,如果模型参数太多了,而训练样本又太少了,训练出来的模型容易过拟合。为了避免这种情况的发生,使用Dropout可以有效地缓解过拟合的发生,在一定程度上达到正则化的效果。Dropout可以作为训练神经网络的一种Trick选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器(隐层节点)间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。

现在我们一起来讨论下训练阶段的前向传播和后向传播以及推理阶段的Normalization和Dropout是如何计算的。

Batch Normalization

Normalization可以参考之前写的一篇文章:深度学习 Normalization。

前向传播

BatchNormalization前向传播比较简单,首先求得mini-batch的均值和方法,然后对xxx进行归一化,最后做尺度转换和变换。整个计算过程如下图所示:

后向传播

BN后向传播的计算可以参考这篇文章:Understanding the backward pass through Batch Normalization Layer和笔记:Batch Normalization及其反向传播。BN的后向传播可以通过以下这张图理解:

从左向右是前向传播的过程,输入是矩阵XXX、γ\gammaγ以及β\betaβ。反过来从右向左就是它的反向传播过程,沿着红色的箭头进行链式求导。在反向求导的过程中,有一点需要了解的是链式求导,链式求导大致过程如下图所示:

接下来我们一步步看反向传播的过程。
第一步:

这一步主要对加法进行求导,类似f=x+yf=x+yf=x+y分别对xxx和yyy进行求导,得到的值为1。接着对所有输出进行求和之后即可得到参数β\betaβ的值。

第二步:

这一步主要类似f=x×yf=x\times yf=x×y分别对xxx和yyy进行求导,得到的结果是对其中一个输入的导数是另一个输入变量。 对于γ\gammaγ参数,此时类似β\betaβ操作,只需要把梯度求和即可得出。现在求得γ\gammaγ参数后,剩下只需要对输入xxx的参数进行调整即可。

第三步:

第四步:

第五步:

第六步:

The calculation of the derivative of this steps local gradient might look unclear at the very first glance. But it’s not that hard at the end. Let’s recall that a normal summation gate (see step 9) during the backward pass only transfers the gradient unchanged and evenly to the inputs. With that in mind, it should not be that hard to conclude, that a column-wise summation during the forward pass, during the backward pass means that we evenly distribute the gradient over all rows for each column. And not much more is done here. We create a matrix of ones with the same shape as the input sq of the forward pass, divide it element-wise by the number of rows (thats the local gradient) and multiply it by the gradient from above.

第七步:

第八步:

第九步:

第十步:

import numpy as npdef batchnorm_forward(x, gamma, beta, bn_param):# read some useful parameterN, D = x.shapeeps = bn_param.get('eps', 1e-5)momentum = bn_param.get('momentum', 0.9)running_mean = bn_param.get('running_mean', np.zeros(D, dtype=x.dtype))running_var = bn_param.get('running_var', np.zeros(D, dtype=x.dtype))# BN forward passsample_mean = x.mean(axis=0)sample_var = x.var(axis=0)x_ = (x - sample_mean) / np.sqrt(sample_var + eps)out = gamma * x_ + beta# update moving averagerunning_mean = momentum * running_mean + (1-momentum) * sample_meanrunning_var = momentum * running_var + (1-momentum) * sample_varbn_param['running_mean'] = running_meanbn_param['running_var'] = running_var# storage variables for backward passcache = (x_, gamma, x - sample_mean, sample_var + eps)return out, cachedef batchnorm_backward(dout, cache):# extract variablesN, D = dout.shapex_, gamma, x_minus_mean, var_plus_eps = cache# calculate gradientsdgamma = np.sum(x_ * dout, axis=0)dbeta = np.sum(dout, axis=0)dx_ = np.matmul(np.ones((N,1)), gamma.reshape((1, -1))) * doutdx = N * dx_ - np.sum(dx_, axis=0) - x_ * np.sum(dx_ * x_, axis=0)dx *= (1.0/N) / np.sqrt(var_plus_eps)return dx, dgamma, dbeta

推理阶段

在训练阶段,BN层的μ\muμ和σ2\sigma^2σ2都是基于当前batch的训练数据,然而在预测阶段,可能只需要预测一个样本或者很少的样本,此时μ\muμ和σ2\sigma^2σ2的计算有一定的偏估计,这时候利用BN训练好模型后,保留了mini-batch训练数据在网络中每一层的μbatch\mu_{batch}μbatch​与σbatch2\sigma^2_{batch}σbatch2​。此时使用整个样本的统计量来对预测数据进行归一化。除了这种方法,还可以对可以对train阶段每个batch计算的mean/variance采用指数加权平均来得到test阶段mean/variance的估计。

Dropout

Dropout的工作原理是在前向传播的过程中,让某个神经元的激活值以一定的概率ppp停止工作,可以使模型泛化性能更强。

前向传播

  1. 首先随机(临时)删除网络中一半的隐藏神经元,输入输出神经元保持不变。
  2. 输入xxx通过修改后的网络前向传播,然后将损失结果反向传播,更新未被删除神经元的参数。
  3. 恢复被删除的神经元,重复1、2步。

后向传播

后向传播在前向传播的时候已经阐明了。

推理阶段

推理过程则无需考虑,恢复完整的网络结构即可。

扩展

Batch Renormalization

参考论文:Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models

这篇论文主要阐述了Batch Normalization的几个问题:

  • 对于mini-batch,batch normalization的效果可能不是特别好
  • 推理阶段的均值和方差采用训练阶段每个batch均值和方差的平均值,假设每个batch都不是同分布,这点会产生误差。

而这篇论文为了保证训练阶段与推理阶段的BN的等效性,解决minibatch的问题,提出Batch Renormalization,具体算法如下:


后向传播:

效果:

相关代码实现可以参考:https://github.com/titu1994/BatchRenormalization

Cross-Iteration Batch Normalization

论文:CBN:Cross-Iteration Batch Normalization。 代码地址:https://github.com/Howal/Cross-iterationBatchNorm。该论文分析了各种Normalization的优缺点,有Batch Normalization,Group Normalization,Instance Normalization的不足,提出了一种Normalization:CrossIteration Batch Normalization (CBN)

文章也提到上面的Batch Renormalization(BRN)

CBN方法与BN比较如下:

训练和推理阶段的BN和Dropout相关推荐

  1. 深度学习推理时融合BN,轻松获得约5%的提速

    批归一化(Batch Normalization)因其可以加速神经网络训练.使网络训练更稳定,而且还有一定的正则化效果,所以得到了非常广泛的应用.但是,在推理阶段,BN层一般是可以完全融合到前面的卷积 ...

  2. BN和Dropout在训练和测试时有哪些差别?

    作者丨海晨威@知乎 来源丨https://zhuanlan.zhihu.com/p/61725100 编辑丨极市平台 Batch Normalization BN,Batch Normalizatio ...

  3. BN和Dropout在训练和测试时的差别

    Batch Normalization BN,Batch Normalization,就是在深度神经网络训练过程中使得每一层神经网络的输入保持相近的分布. BN训练和测试时的参数是一样的嘛? 对于BN ...

  4. 独家|深度学习训练和推理之间有什么差异?

    作者:Michael Copeland 翻译:杨光 校对:丁楠雅 本文约2200字,建议阅读5分钟.资深科技编辑Michael copeland解释了深度学习的基本原理. 就像在学校上课一样,神经网络 ...

  5. float32精度_混合精度对模型训练和推理的影响

    单精度/双精度/半精度/混合精度 计算机使用0/1来标识信息,每个0或每个1代表一个bit.信息一般会以下面的三种形式表示: 1 字符串 字符串的最小单元是char,每个char占8个bit,也就是1 ...

  6. NLP 训练及推理一体化工具(TurboNLPExp)

    作者:TurboNLP,腾讯 TEG 后台工程师 导语 NLP 任务(序列标注.分类.句子关系判断.生成式)训练时,通常使用机器学习框架 Pytorch 或 Tensorflow,在其之上定义模型以及 ...

  7. 深度估计自监督模型monodepth2在自己数据集的实战——单卡/多卡训练、推理、Onnx转换和量化指标评估

    本文详细介绍monodepth2模型在自己数据集的实战方法,包括单卡/多卡训练.推理.Onnx转换和量化评估等,关于理论部分请参见另一篇博客:深度估计自监督模型monodepth2论文总结和源码分析 ...

  8. 详谈大模型训练和推理优化技术

    详谈大模型训练和推理优化技术 作者:王嘉宁,转载请注明出处:https://wjn1996.blog.csdn.net/article/details/130764843 ChatGPT于2022年1 ...

  9. CV之CNN:基于tensorflow框架采用CNN(改进的AlexNet,训练/评估/推理)卷积神经网络算法实现猫狗图像分类识别

    CV之CNN:基于tensorflow框架采用CNN(改进的AlexNet,训练/评估/推理)卷积神经网络算法实现猫狗图像分类识别 目录 基于tensorflow框架采用CNN(改进的AlexNet, ...

最新文章

  1. 这就是芬兰:先让全国1%的人学起AI!
  2. 搭建python selenium 自动化测试框架_Python3+Selenium2完整的自动化测试框架实现(二):IE和Chrome浏览器驱动配置...
  3. [OpenGL]未来视觉1-Android摄像头采集基础
  4. Python里的dict和set的背后小秘密
  5. JAVA链表返回子表_基于java的链表反转
  6. 软件工程知识——软件配置管理
  7. python pickle模块详解
  8. 学习plc编程经验分享
  9. matlab代码 无标度网络 生成图,标准无标度网络matlab
  10. Windows 之 IP地址
  11. 教师招聘面试视频 计算机,怎么准备教师招聘面试试讲?(附视频)
  12. Python学习——三分钟分析目前最火的电视剧
  13. canvas画布调节字符间距
  14. 微信定位精灵服务器或网络异常,微信定位精灵系统界面无法更新怎么办
  15. 2022年外贸公司邮箱签名怎么设置?
  16. filer.js: 一个 Unix 命令风格的 HTML 5 FileSystem API 封装 - V2EX
  17. 【上海交大oj】畅畅的牙签袋(改)(枚举+模拟)
  18. 使用蓝桥杯单片机做一个智能密码锁可以修改密码
  19. python之网页自动打卡
  20. 一个骨灰级玩家的游戏加速器使用心得分享

热门文章

  1. 奔驰c260语言设置方法图解,奔驰C260L灯光使用方法 C260L灯光开关图解说明
  2. MobileNetV2: Inverted Residuals and Linear Bottlenecks--M Sandler
  3. HDR显示器在 windows/PC 下正确的使用方式
  4. React学习笔记003-内外联样式
  5. C/C++ fabs 函数 - C语言零基础入门教程
  6. 解决react native打包apk文件安装好之后进入应用闪退的问题
  7. CRC32、murmur32、SDBM32碰撞实验数据对比
  8. 【云原生之kubernetes实战】在k8s环境下部署BookBrowser电子书浏览器
  9. C#中的转义字符和Verbatim字符串
  10. 天池大赛 xgboost/lightgbm + python36 + win10_64 环境配置