zoukankan      html  css  js  c++  java
  • Batch Normalization 引出的一系列问题

    Batch Normalization,拆开来看,第一个单词意思是批,出现在梯度下降的概念里,第二个单词意思是标准化,出现在数据预处理的概念里。

    我们先来看看这两个概念。

     

    数据预处理

    方法很多,后面我会在其他博客中专门讲,这里简单回忆下

    归一化,x-min/max-min,

    标准化,包括标准差标准化,x-mean/std,极差标准化,x-mean/(max-min),

    中心化,x-mean,

    白化,pac-->归一化

    梯度下降

    梯度下降中 mini batch sgd 是比 sgd 更好的一种方法,因为min batch是平均梯度,使得梯度更平稳,容易收敛,而且batch能够并行计算,减少运算。

    我们知道,在机器学习中,梯度下降是要归一化的,因为如果不归一化,y在各个维度上的量纲不一样,使得y的图形不规则,扁平或者瘦高,这样在求梯度时经常会歪歪曲曲,一般会陷入局部最优。

    图示如下

     神经网络也是用的梯度下降,从这点来看,也是需要数据预处理的。

    独立同分布 IID

    在机器学习中有这个概念,意思是训练数据和测试数据需要服从同样的分布,这样才有意义,很好理解。

    但是在深度学习中,训练和测试都是图片(cnn为例,图片为例),似乎不牵扯IID。

    那这根batch normalization 有什么关系呢?

    因为在神经网络中有层的概念,每一层都有输入,每一层的输入是上一层的输出,而输出是经过非线性函数的,非线性函数的取值都有特定的区间,这就和原始的输入在数据分布上存在很大不同,

    此时需要用一定的方法统一数据分布。

     

    神经网络的训练问题

    神经网络层数越深,越是难以训练,收敛速度越来越慢,为什么呢?下面我以sigmoid函数为例简要说明。(后面我会专门写一篇激活函数的博客,详细阐述)

    在数学建模时一般会要求样本服从正态分布,正态分布标准化后就是标准正态分布。图像如下

     

     可以看到标准正态分布95%的概率落在 [-2, 2] 之间

    sigmoid 函数的特点是在绝大多数x上(除了-2到2的区间)取值要么无限接近于1,要么无限接近于0,而且,这种情况下其梯度无限接近于0,这就是神经网络梯度消息的本质,这也是sigmoid函数很难作为深度神经网络的激活函数的原因。

    而 batch normalization 的作用是把x规范到0附近,此时其梯度很大,收敛很快。

    scale and shift

    batch normalization 虽然增加了梯度,但是同时我们发现,当x在0附近时,其函数非常接近于线性,这大大降低了模型的表达能力。

    为了解决这个问题,作者又提出了 scale and shift,即y=scale*x+shift,这相当于是把数据从0向左或向右平移了一段并拉伸或压缩,使得y处于线性和非线性的交界处,这样既保证了较大的梯度,也保留了模型的非线性表达能力

    scale 和 shift 通过训练学习到

    到这基本就讲完 batch normalization 的原理了,下面看看具体怎么使用。

    使用方法

    之前讲到batch normalization使得神经网络每一层的输入变得规范,也就是说它是把 wx+b 变得规范,即用在线性变换之后,非线性变换之前。如图

    总体计算方法如下

    这里在标准化时分母加了个ε,是防止分母为0。

    总结

    batch normalization的优点

    1. 提高神经网络的训练效率,避免梯度消失

    2. 使得神经网络不依赖于初始值,方便调参

    3. 抑制过拟合,降低dropout的使用,提高泛化能力

    batch normalization的缺点

    1. batch normalization 仍然有很多地方科学理论无法解释

    2. batch大小对其效果影响很大,batch 很小时,其梯度不够稳定,收敛变慢,极端情况就是 sgd

    2020-1-14 更新

    1. 上面的博客中我写到 由于每层网络的输出作为新的输入 与 之前的输入不符合 iid,现在想想感觉不妥,

    我稍微更正下,应该是 同一层网络,每次输入的数据由于经过了调整后的不同参数,很可能不服从 iid,故需要进行 BN

    2. 初始化的参数虽然使得 wx+b 在 0 附近,但是随着参数的调整,很可能不在 0 附近,如果 BN,可以强行拉回 0 附近;

    所以 BN 是为了把 激活函数的 输入 拉回 0 附近,故放在机会函数之前 ,即  wx+b --> BN --> 激活函数

    参考资料:

    https://www.cnblogs.com/guoyaohua/p/8724433.html

    https://www.zhihu.com/question/38102762

    https://blog.csdn.net/whitesilence/article/details/75667002

    https://blog.csdn.net/liangjiubujiu/article/details/80977502

  • 相关阅读:
    GO异常 | runnerw.exe: CreateProcess failed with error 21
    tab切换效果
    第一次码前端页面的经历
    开博第一天
    软件架构参考模板-软件架构设计学习第三天(原创)
    架构设计基础-软件架构设计学习第二天(非原创)
    IT架构师介绍-软件架构设计学习第一天(非原创)
    Android常见面试题学习第二天(原创)
    Android常见面试题学习第一天(原创)
    Netty简单介绍(非原创)
  • 原文地址:https://www.cnblogs.com/yanshw/p/10580393.html
Copyright © 2011-2022 走看看