machine-learning-notes
  • 封面
  • 目录
  • 前言
  • 个人前言
  • 机器学习前言
    • 什么是机器学习和模式识别
    • 机器学习的应用
    • 机器学习的流程
    • 不同的机器学习算法对相同数据预测效果不同
    • 快速入门机器学习
    • 机器学习需要参考哪些书
    • 机器学习的学习路径
    • 深度学习的学习路径
    • 互联网机器学习特定岗位所需技能
  • 机器学习面试
  • 数学基础
  • 微积分
    • 泰勒展开
    • e的直观认识
    • 傅里叶变换
    • 希尔伯特空间
  • 线性代数
    • 范数
    • 矩阵求导
    • 特征值
    • 奇异值分解
  • 概率与信息论
    • 综述概率论基本定义
    • 概率论与贝叶斯先验
    • 正态分布
    • 贝叶斯概率
    • 概率符号说明
    • 共轭先验
    • 信息论
  • 数值计算与优化
    • 最小二乘法
    • 等式约束的拉格朗日乘子法
    • 凸优化
      • 凸集和凸函数
      • 凸优化问题
  • 梯度下降算法
    • 随机梯度下降SGD
    • 动量法Momentum
    • 牛顿动量Nesterov
    • AdaGrad
    • RMSprop
    • Adadelta
    • Adam
    • Nadam
    • AMSGrad
    • AdasMax
  • 概率图模型
    • 概率图模型概论
    • 概率图简介
  • 编程基础
  • linux
    • linux常用命令
    • shell
      • 输入输出重定向
  • python
    • python简介
    • python语法
      • 基础语法
      • 数据结构
      • 过程控制
      • 函数
      • 类和对象
      • 文件操作
      • 正则表达式
    • python库
      • numpy
      • pandas
      • scipy
      • matplotlib
      • scikit-learn
    • python应用
      • 排序算法
  • 数据结构与算法
    • 数据结构
    • 算法思想
      • 排序
        • 堆排序
        • 归并排序
        • 快速排序
      • 递归
    • 剑指offer
      • 链表
      • 二叉树
      • 数组
      • 字符串
      • 栈和队列
      • 递归
      • 动态规划
      • 其他
    • leetcode
    • 编程语言
      • c++
  • Hadoop
    • Hadoop简介
    • MapReduce
  • Hive
  • Spark
  • TensorFlow
    • TensorFlow1.0
      • TensorFlow基础
      • TensorFlow基础概念解析
      • TensorFlow机器学习基础
      • Tensorflow分布式架构
    • TensorFlow2.0
  • PyTorch
  • 机器学习
  • 机器学习概论
  • 特征工程
  • 感知机
  • k近邻
  • 朴素贝叶斯
  • 线性模型
    • 最大熵模型
    • 指数族分布与广义线性模型
    • 线性回归
      • Ridge回归(岭回归)
      • Lasso回归
    • Logistic回归-对数几率回归
  • 决策树
  • 支持向量机
    • 线性可分支持向量机与硬间隔最大化
    • 线性支持向量机与软间隔最大化
    • 非线性支持向量机与核函数
    • 序列最小最优化算法SMO
    • SVM总结
  • 集成学习
    • Bagging
      • 随机森林
    • Boosting
      • AdaBoost
      • GradientBoosting
        • GBDT
        • XGBoost
          • XGBoost理论
          • XGBoost实践
    • Stacking
  • 降维
    • PCA主成分分析
    • 流形学习
  • EM算法
  • HMM隐马尔科夫模型
  • CRF条件随机场
  • 聚类
    • k均值聚类
    • 高斯混合模型
  • 主题模型
    • LDA隐狄利克雷分布
  • 知识点
    • 损失函数
    • 负采样
  • 机器学习算法总结
  • 深度学习
  • 深度学习概论
  • ANN人工神经网络
  • 知识点
    • Batch Normalization
  • CNN卷积神经网络
  • 深度学习优化算法
  • RNN循环神经网络
  • LSTM长短期记忆网络
  • GRU门控循环单元
  • GNN图神经网络
    • GNN图神经网络综述
    • GCN图卷积网络
      • GCN图卷积网络初步理解
      • GCN图卷积网络的numpy简单实现
      • GCN图卷积网络本质理解
      • GCN图卷积网络全面理解
      • SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS ICLR2017
  • 神经网络架构搜索
    • Weight-Agnostic-Neural-Networks Google2019
  • 强化学习
  • 强化学习概论
  • 马尔科夫决策过程
  • 动态规划
  • 无模型方法一:蒙特卡洛
  • 无模型方法二:时间差分
  • 无模型方法三:多步自举
  • 函数近似和深度网络
  • 策略梯度算法
  • 深度强化学习
  • 基于模型的强化学习
  • 强化学习前景
  • 自然语言处理
  • 自然语言处理概论
  • 自然语言
  • 语言模型和中文分词
  • word2vec
    • word2vec概述
    • word2vec算法原理
    • word2vec源码分析
    • word2vec实践
  • Seq2Seq模型和Attention机制
  • Self-Attention和Transformer
  • 知识图谱
  • 推荐系统
  • 推荐系统概论
  • 基础知识
  • 进阶知识
    • 机器学习
      • Factorization Machines ICDM2010
    • embedding
      • Network Embedding
        • LINE: Large-scale Information Network Embedding
    • 深度学习
      • DeepFM: A Factorization-Machine based Neural Network for CTR Prediction 2017
      • DSSM: Learning Deep Structured Semantic Models for Web Search using Clickthrough Data CIKM2013
    • 图卷积网络
      • Graph Convolutional Neural Networks for Web-Scale Recommender Systems KDD2018
    • 强化学习
      • DRN基于深度强化学习的新闻推荐模型
  • 业界应用
    • YouTube
      • Deep Neural Networks for YouTube Recommendations RecSys2016
    • Alibaba
      • Learning Tree-based Deep Model for Recommender Systems KDD2018
      • Deep Interest Network for Click-Through Rate Prediction KDD2018
      • DSIN:Deep Session Interest Network for Click-Through Rate Prediction IJCAI2019
Powered by GitBook
On this page
  • Batch Normalization
  • BN用在哪里
  • BN怎么操作
  • 深入理解BN
  • 总结
  • 参考资料

Was this helpful?

  1. 知识点

Batch Normalization

Previous知识点NextCNN卷积神经网络

Last updated 5 years ago

Was this helpful?

Batch Normalization

  • 返回顶层目录

  • 返回上层目录

  • BN用在哪里

  • BN怎么操作

  • 深入理解BN

  • 总结

信号处理的解释:relu 是二极管, bn 就是电容器过滤掉直流成份,并控制增益不要超载,多么简单的道理。

pdf: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

BN目前已经成为了调参师面试必问题之一了。同时,BN层也慢慢变成了神经网络不可分割的一部分了,相比其他优化操作比如dropout, l1, l2, momentum,影子变量等等,BN是最无可替代的。

这篇博文想以最通俗的方法解释BN,避免大量术语以及杂七杂八的公式。

BN用在哪里

BN往往用在卷积层之后,激活函数之前(比如对于darknet-53来说,conv+BN+relu成为一个标配,构成最小组件)。当然,BN不一定用在conv之后,但用在激活函数之前是几乎必须的(这样才能发挥它的作用)。

我们把神经网络各层之间的传递称为特征图(feature map),特征图在传递的过程中,就需要用BN进行调整。为什么要调整呢?

我们在训练的时候,都是输入一批一批的训练数据(mini-batch),比如batch size=32,那一次输入32个数据。这一数据可能满足一个分布A,如果A分布比较任性,那分布A在通过激活函数(非线性层)时,修剪率会很高或者很低。(修剪率是我自己定义的一个说法,神经网络就是通过特征提取层(如conv)提取特征再通过激活函数修剪从而实现神经网络的函数表达力)

多说不如一张图:

上图展示了3种分布情况,当batch特征图分布比较任性(batch比较小的时候,很容易出现任性的情况,如上图前两种情况)。上述用的激活函数是relu,在输入大于0时保持不变,小于0时变为0。对于一二两种情况,要么修剪得过少,等于没用激活函数;要么修剪得过多,一大批0传到后面。当然,在不断训练的过程中,情况一二都会慢慢减少,因为特征提取层越来越牛x。但这需要用更多训练时间去填补,而且最终的性能不会很好,虽然是batch训练,但它的视野没到batch分布那个层面。视野太窄,也更容易过拟合。如果用其他激活函数比如sigmoid/tanh等,还有梯度加速弥散的问题存在。(自己可以画图看看,两端抑制)

OK,我们想要的是上图表示的第三种情况,激活函数的修剪率适中。这就需要用到BN操作了。

BN怎么操作

先看论文里的截图:

第一步,我们获得了一个mini-batch的输入B=x1,...,xm\mathcal{B} = {x_1,..., x_m}B=x1​,...,xm​,可以看出batch size就是mmm。

第二步,求这个batch的均值μ\muμ和方差σ\sigmaσ

第三步,对所有xi∈Bx_i\in \mathcal{B}xi​∈B,进行一个标准化,得到x^i\hat{x}_ix^i​。

第四步,对x^i\hat{x}_ix^i​做一个线性变换,得到输出yiy_iyi​。

现在对上述四个步骤做一个全面分析:

我们获取一个任意分布,对这个分布包含的数据做一个标准化。这个操作是否十分熟悉呢?我们回到高中的正态分布:

f(x)=12πσexp(−(x−μ)22σ2)f(x)=\frac{1}{\sqrt{2\pi}\sigma}\text{exp}\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)f(x)=2π​σ1​exp(−2σ2(x−μ)2​)

标准化一个高斯分布是怎么做的呢?对于x∼N(μ, σ2)x\sim N(\mu,\ \sigma^2)x∼N(μ, σ2)而言,如果x^=(x−μ)/σ\hat{x} = (x- \mu)/\sigmax^=(x−μ)/σ,则x^∼N(0,1)\hat{x}\sim N(0, 1)x^∼N(0,1)。这个标准化公式(即x^=(x−μ)/σ\hat{x} = (x- \mu)/\sigmax^=(x−μ)/σ),可以通过正态分布的概率密度公式推出来,在这里就不做详解了。

对于自然界很多分布,都可以用(类)高斯分布来建模。同样,可以用这个公式x^=(x−μ)/σ\hat{x} = (x- \mu)/\sigmax^=(x−μ)/σ来进行标准化(这个标准化公式不仅适用高斯分布),标准化之后的分布满足期望为0,方差为1。比较一下标准化公式和第三步的公式:

x^i←xi−μBσB2+ϵ\hat{x}_i\leftarrow \frac{x_i-\mu_{\mathcal{B}}}{\sqrt{\sigma^2_{\mathcal{B}}+\epsilon}}x^i​←σB2​+ϵ​xi​−μB​​

多了一个ϵ\epsilonϵ,这里的ϵ\epsilonϵ是一个很小的数,避免由分母等于0带来的系统错误,所以其实两个公式是等价的。

对于标准正态分布而言,刚好满足我在上图中描述的第三种情况。钟形曲线刚好关于y轴对称。

想必会有人认为,按理说BN操作到这里就结束了,为什么还会有第四步呢?

第4步恰好是BN的精髓之处:γ\gammaγ和β\betaβ是可学习的。我们获得一个关于y轴对称的分布真的是最符合神经网络训练的吗?没有任何理由能证明这点。事实上,γ\gammaγ和β\betaβ为输出的线性调整参数,可以让分布曲线压缩或延长一点,左移或右移一点。由于γ\gammaγ和β\betaβ是可训练的,那么意味着神经网络会随着训练过程自己挑选一个最适合的分布。如果我们固执地不用γ\gammaγ和β\betaβ会怎么样呢?那势必会把压力转移到特征提取层,虽然最后结果依然可观,但训练压力会很大。你想想,一边只需要训练两个数,另一边需要训练特征提取层来符合最优分布就是关于y轴的对称曲线。前者自然训练成本更低。

深入理解BN

个人认为三点,深度学习那本书已经讲的比较清楚了

  1. BN的启发来自于对数据做preprocess,比如一般的中心化和标准化,白化等方法。这个方法引入到每一个隐藏层去,就是一般的normalize方案

  2. 但一般的normalize,会影响BP。因为normalize的参数其实是当前weight的函数,如果忽略这一点,来做BP,计算出来的gradient 是不正确的,体现出来的就是在下一次forward计算中,Normalize会影响gradient update的效果,并不是最优的梯度方向。所以在paper中需要计算对于mu和sigma的导数,加入到BP中去,才能得到正确的gradient

  3. 引入γ\gammaγ和β\betaβ。normalize的过程其实损失了表达能力,原来的参数集是(w, b),经过normalize之后,b被中心化了,而w必须隐式的满足归一化条件,从而自由度降低了一维。为了得到同样的自由参数数目,引入γ\gammaγ和β\betaβ可以解决这个问题。

    最初看到gamma和beta的时候,会有些疑惑,为什么这个技巧会有用。Goodfellow那本书的argument比较合理,gamma和beta代表的其实是input分布的var和bias,对于一般的网络,不做BN的话,这两个维度是高度依赖前面网络的weight,会出现复杂的非线性。但提取出来之后,这里的gamma和beta跟前面的weight就无关了,而变成了这一层的学习参数,更加有利于优化的过程。

  4. 如同paper中讨论的,BN本身还有正则化的效果。正则化的效果在于初始分界面在数据中间的概率提高了很多倍,降低了迭代过程中分界面掉到数据外围局部最优的可能性。

总结

BN就是调整每层网络输出数据的分布,使其进入激活函数的作用区。激活函数的作用区就是指原点附近的区域,梯度弥散率低,区分率高。同时,BN会在训练过程中,自己调节数据分布,使其“更合理”地进入激活函数。

所以,BN有以下特点:

  1. 加速收敛。减少epoch轮数,因为不必训练神经网络去适应数据的分布。同时,完美地使用了激活函数对数据的“修剪”,减少梯度弥散。同时,学习率也可以大一点。

  2. 准确率更高。这也是得亏于对激活函数的完美使用,切得更准,垂直度更高。比如,yolo v2加入BN后,mAP提高了2%。

这以上两个特点,具有普世性价值,这也是BN势不可挡的原因。

  1. 对初始化的值不敏感,因为假设初始化值增加了一倍,但是均值和方差也都增加了一倍,所以相当于没增加。

参考资料

  • 【AI数学】Batch-Normalization详细解析

由于该文章简单易懂,本文主要参考此文章。

  • 李宏毅深度学习(2017)

  • Batch Normalization 详解 李宏毅

李宏毅讲的

  • 深度学习中 Batch Normalization为什么效果好?

“深入理解BN”参考了此回答。

  • 《Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》阅读笔记与实现

“深入理解BN”第四点参考此博客。

===

  • Batch Normalization导读

这是张俊林写的,需要好好读一下。

paper
activation
batch-normalizing-transform