zoukankan      html  css  js  c++  java
  • 神经网络训练技巧

    参数初始化

    • 是否可以将全部参数初始化为0
      • 同一层的任意神经元都是同构的
      • 它们的输入输出都相同,因此前向反向传播的取值完全相同
      • 训练一直是对称的,同一层参数都是相同的
    • 随机初始化参数
      • 初始化参数为取值范围((-dfrac{1}{sqrt{d}}, dfrac{1}{sqrt{d}}))的均匀分布,或者是高斯分布
      • (d)是一个神经元接受的输入维度
      • 偏置可以设为启发式常数,并不会导致参数对称问题

    Dropout原理与实现

    • 以一定概率随机地“临时丢弃”一部分神经元
    • 相当于每次迭代都在训练不同结构的神经网络,类似于Bagging方法
    • 轻量级的Bagging集成近似,能够实现指数级数量神经网络的训练与评测
    • 具体实现:
      • 包含(N)个神经元的网络,在Dropout作用下可看作为(2^N)个模型的集成
      • 这些模型可看作原网络的子网络,共享部分权值,具有相同网络层数,整体参数数目不变
      • 减弱全体神经元之间的联合适应性,较少过拟合的风险
      • 前向传播:
        • 以概率(p)随机生成取值为0或1的向量,代表每个神经元是否被丢弃

          [r_j^{(l)} sim Bernoulli(p) ]

        • 更新神经元输出

          [ ilde{y}^{(l)}=r^{(l)} * y^{(l)} ]

      • 测试阶段
        • 每个神经元参数乘以概率系数(p)
        • 恢复在训练中该神经元只有(p)的概率被用于整个网络的前向传播计算

    Normalization

    Internal Covariate Shift

    统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,那么就出现了新的机器学习问题,如 transfer learning / domain adaptation 等。而 covariate shift 就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但是其边缘概率不同,即对所有的(x in mathcal{X})

    [P_s(Y|X=x) = P_t(Y|X=x) ]

    但是,

    [P_s(X) eq P_t(X) ]

    简而言之,每个神经元的输入数据不再是“独立同分布”

    • 上层参数需要不断适应新的输入数据分布,降低学习速度
    • 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止
    • 每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎

    通用框架与基本思想

    以一个神经元为例,接收一组输入向量

    [mathbf{x} = (x_1, x_2, cdots, x_d) ]

    通过某种运算后,输出一个标量值:

    [y = f(mathbf{x}) ]

    以BN为代表的方法进行了简化的白化操作,通用框架如下所示:

    [h = f(g cdot frac{mathbf{x} - mu}{delta} + b) ]

    其中,(mu)(delta)是平移参数和缩放参数,(g)(b)是再缩放参数和再平移参数。之所以引入再缩放和再平移,是为了模型的表达能力不会因为规范化下降。这两个参数都是可学习的,保证每个Normalization层学到的是真正有用的分布。

    Batch Normalization:纵向规范化

    结合上述通用公式,BN中均值和方差由以下公式计算

    [mu_i=dfrac{1}{m}sum limits_{i=1}^m x_i ]

    [sigma_i=sqrt{dfrac{1}{m}sum limits_{i=1}^m(x_i-mu_i)^2 + epsilon} ]

    BN独立地规范化每一个输入维度(x_i),但规范化的参数是一个 mini-batch的一阶统计量和二阶统计量。这就要求每一个 mini-batch的统计量是整体统计量的近似估计,或者说每一个 mini-batch彼此之间,以及和整体数据,都应该是近似同分布的。分布差距较小的mini-batch可以看做是为规范化操作和模型训练引入了噪声,可以增加模型的鲁棒性;但如果每个mini-batch的原始分布差别很大,那么不同 mini-batch的数据将会进行不一样的数据变换,这就增加了模型训练的难度。

    训练时,BN层利用隐藏层输出结果的均值与方差来标准化每一层特征的分布,并且维护所有mini-batch数据的均值与方差,最后利用样本的均值与方差的无偏估计量在测试时使用

    Layer Normalization:横向规范化

    与 BN不同,LN是一种横向的规范化,它综合考虑一层所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入:

    [mu = sum_i x_i ]

    [delta = sqrt{sum_i (x_i - mu)^2 + epsilon} ]

    LN针对单个训练样本进行,不依赖于其他数据,因此可以避免BN 中受mini-batch 数据分布影响的问题,可以用于小mini-batch场景、动态网络场景和RNN,特别是自然语言处理领域。此外,LN不需要保存mini-batch 的均值和方差,节省了额外的存储空间

    但是,BN的转换是针对单个神经元可训练的——不同神经元的输入经过再平移和再缩放后分布在不同的区间,而 LN对于一整层的神经元训练得到同一个转换——所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么LN的处理可能会降低模型的表达能力

    Weight Normalization:参数规范化

  • 相关阅读:
    Linux下常用的3种软件安装方式
    解决navicate 连接mysql数据库中文乱码的问题
    Lua 遍历Linux目录下的文件夹
    ubuntu 更改源
    ubuntu 下安装配置LAMP
    简述configure、pkg-config、pkg_config_path三者的关系
    linux 下库的深入调研
    Linux下的库操作工具-nm、ar、ldd、ldconfig和ld.so
    linux命令strings
    c++隐式类型转换和explicit
  • 原文地址:https://www.cnblogs.com/weilonghu/p/11922941.html
Copyright © 2011-2022 走看看