热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BatchNormalization:AcceleratingDeepNetworkTrainingbyReducingInternalCovariateShift论文学习

BatchNormalization:AcceleratingDeepNetworkTrainingbyReducingInternalCovariateShift文章试图解决的
Batch Normalization: Accelerating Deep Network Training byReducing Internal Covariate Shift

文章试图解决的问题


  • 内部协变量转移(internal covariate shift):在训练进行时,网络中的参数不断改变,导致每一层的输入分配会进行变化,这个现象被称作内部协变量转移
  • 由于分布变化,所以需要更小的学习率,小心的初始化。但导致训练速度降低,本文就是要解决这个问题
  • 内部协变量转移不符合IID(独立同分布)的假设

常见的优化


  • 我们都知道,对初始数据减均值或者白化可以加快学习速度

这里写图片描述
    • 减均值:如上b,紫色的先是拟合线,但是训练一开始生成的线是在原点的附近,所以要变成紫色的先要花费较多的时间,所以我们可以让点都集中在原点的附近—减均值
    • 白化:白化有很多种方式:如PCA白化:
      PCA完后再进行方差归一化—>这样的数据基本满足 0均值,单位方差和弱相关性。
      • 作者首先考虑对每一层进行PCA白化:但是这样是不可取的,因为计算量很大,而且在求逆的过程中或许不可导
      • 如果只进行简单的对每一层数据归一化,会降低层的表达能力,以及梯度的作用。因为在计算梯度的时候没有把归一化的梯度考虑进去。
  • 作者想通过Batch Normalization的方式:尝试减少内部协变量转移,通过修复层输入的均值和方差来实现。


优点


  • 协变量转移减少,学习速度更快

  • 通过减小了网络对梯度的依赖,使得可以用更大学习率而不存在发散的风险

  • 减少了对dropout的需要


内容


  • 我们知道对每一层进行白化的不可行,所以我们考虑做两个必要的简化。

    • 1、我们考虑单独normalize每一个特征,使其均值为0,方差为1;而不是在输入输出上共同normalize

    • 对一个d维的input x=(x(1),...x(d))x=(x^{(1)},...x^{(d)})x=(x(1),...x(d)),我们normalize每一维

    x^(k)=x(k)−E[x(k)]Var[x(k)]\hat x^{(k)}=\frac{x^{(k)-E[x^{(k)}]}}{\sqrt{Var[x^{(k)}]}} x^(k)=Var[x(k)]

    x(k)E[x(k)]

    • 期望和方差在总体的数据集上计算
    • 仅仅是这一个简化,就能加速收敛
    • 这个简化导致数据分布是零均值的,毕竟各层的分布都差不多了
  • 我们知道如果只这样干不行,会降低网络的表达能力,如在sigmoid之前这样干会把sigmoid非线性极值变成线性这里写图片描述

    • 所以我们对每一个激活值x^(k)\hat x^{(k)}x^(k)引进两个参数
      y(k)=γ(k)x^(k)+β(k)y^{(k)}=\gamma^{(k)}\hat x^{(k)}+\beta^{(k)} y(k)=γ(k)x^(k)+β(k)
  • 这些参数和原始网络一起学习,并恢复网络的表达能力

  • 事实上,通过设定γ(k)=Var[x(k)],β(k)=E[x(k)\gamma^{(k)}=\sqrt{Var[x^{(k)}]},\beta^{(k)}=E[x^{(k)}γ(k)=Var[x(k)]

    ,β(k)=E[x(k)是最理想的方法

    • 2、我们这样设置的训练步骤是基于整个网络的,,但是我们在进行SGD的时候是不行的。所以我们有了第二个简化:我们每次用一个Batch(小批量)的均值和方差来作为对整个数据集的估计

然后我们在测试和训练的时候是不一样的,因为训练的时候可以用mini_batch,而测试的时候我们用的是一张张的图片,所以此时直接用所有的均值和方差来做无偏估计,然后训练的网络要用net.eval()来使得参数不变

  • eval会把网络的参数固定住,比如dropout和BN的参数,不会取平均

推荐阅读
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • [论文笔记] Crowdsourcing Translation: Professional Quality from Non-Professionals (ACL, 2011)
    Time:4hoursTimespan:Apr15–May3,2012OmarZaidan,ChrisCallison-Burch:CrowdsourcingTra ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
author-avatar
buddha覀mito_438
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有