zoukankan      html  css  js  c++  java
  • 神经网络训练技巧:训练参数初始化、Drop out及Batch Normalization

    参数初始化

    xavier初始化: https://blog.csdn.net/VictoriaW/article/details/73000632

    条件:优秀的初始化应该使得各层的激活值和梯度的方差在传播过程中保持一致

    初始化方法:

    • 假设激活函数关于0对称,且主要针对于全连接神经网络。适用于tanh和softsign

    He初始化https://blog.csdn.net/xxy0118/article/details/84333635

    • 条件:正向传播时,状态值的方差保持不变;反向传播时,关于激活值的梯度的方差保持不变。
    • 适用于ReLU的初始化方法:

    Drop out: https://blog.csdn.net/stdcoutzyx/article/details/49022443

    https://zhuanlan.zhihu.com/p/38200980

    dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃,故而每一个mini-batch都在训练不同的网络。对于一个有N个节点的神经网络,有了dropout后,就可以看做是$2^n$个模型的集合了,但此时要训练的参数数目却是不变的。

    没有dropout的神经网络 :

    有dropout的神经网络:

    上面的Bernoulli函数的作用是以概率系数p随机生成一个取值为0或1的向量,代表每个神经元是否需要被丢弃

    代码层面实现让某个神经元以概率p停止工作,其实就是让它的激活函数值以概率p变为0。比如我们某一层网络神经元的个数为1000个,其激活函数输出值为y1、y2、y3、......、y1000,我们dropout比率选择0.4,那么这一层神经元经过dropout后,1000个神经元中会有大约400个的值被置为0。

    预测的时候,每一个单元的参数要预乘以p:

    Batch Normalization

    随着网络训练的进行,每个隐层的参数变化使得后一层的输入发生变化,从而每一批训练数据的分布也随之改变,致使网络在每次迭代中都需要拟合不同的数据分布,增大训练的复杂度以及过拟合的风险。

    批量归一化方法是针对每一批数据,在网络的每一层输入之前增加归一化处理(均值为0,标准差为1),将所有批数据强制在统一的数据分布下。

    批量归一化降低了模型的拟合能力,归一化之后的输入分布被强制为0均值和1标准差。比如下图,在使用sigmoid激活函数的时候,如果把数据限制到0均值单位方差,那么相当于只使用了激活函数中近似线性的部分,这显然会降低模型表达能力。 

    为此,作者又为BN增加了2个参数,用来保持模型的表达能力。 
    于是最后的输出为: 
    这里写图片描述 其中$r^{(k)}$、$eta^{(k)}$分别为缩放参数和偏移参数。
    上述公式中用到了均值E和方差Var,需要注意的是理想情况下E和Var应该是针对整个数据集的,但显然这是不现实的。因此,作者做了简化,用一个Batch的均值和方差作为对整个数据集均值和方差的估计。 
    整个BN的算法如下: 

    参考:

    https://blog.csdn.net/mzpmzk/article/details/79839047

    http://blog.csdn.net/shuzfan/article/details/50723877

    https://arxiv.org/pdf/1502.03167.pdf

  • 相关阅读:
    Java基础知识:正则表达式
    NodeJs 中 将表单数据转发到后台
    单片机的远程升级
    一些开源协议
    物联网的一些例子
    python一些开源特色库
    qt练习
    网页编程学习笔记
    PCB相关
    工业控制系统
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/7250710.html
Copyright © 2011-2022 走看看