自由Man

深度学习网络搭建与训练技巧

搭建技巧

  • 使用 ADAM 优化器

  • ReLU 是最好的非线性(激活函数)

  • 请在每一个层添加一个偏差

  • 使用方差缩放(variance-scaled)初始化 / 对每层的输入进行BN操作

  • 归一化输入数据

  • 一般不用学习率衰减(学习率衰减在 SGD 中更为常见)

  • 池化用于平移不变性

预处理技巧

  • 数据预处理

    1)zero-center ,这个挺常用的.
              X -= np.mean(X, axis = 0) # zero-center
              X /= np.std(X, axis = 0) # normalize

    2)PCA whitening,这个用的比较少.

  • 参数初始化

          n_in为网络的输入大小,n_out为网络的输出大小,n为n_in或(n_in+n_out)*0.5
          Xavier初始法论文:
          He初始化论文:

          1)uniform均匀分布初始化:
          w = np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])

    • Xavier初始法,适用于普通激活函数(tanh,sigmoid):scale = np.sqrt(3/n)

    • He初始化,适用于ReLU:scale = np.sqrt(6/n)

      2)normal高斯分布初始化:
      w = np.random.randn(n_in,n_out) * stdev # stdev为高斯分布的标准差,均值设为0

    • Xavier初始法,适用于普通激活函数 (tanh,sigmoid):stdev = np.sqrt(n)

    • He初始化,适用于ReLU:stdev = np.sqrt(2/n)

      3)svd初始化:对RNN有比较好的效果。参考论文:


调试技巧

  • 过拟合

    如果你的网络没有学习,那么首先要做的第一件事就是对训练点进行过拟合。准确率基本上应为 100% 或 99.99%,或误差接近 0。如果你的神经网络不能对单个数据点进行过拟合,那么体系架构就可能有严重的问题,但这可能是微妙的。如果你可以对一个数据点进行过拟合,但是对较大的集合进行训练仍然无法收敛,请尝试以下建议.

  • 降低学习率

    你的网络学习就会变得更慢一些,但是它可能会找到以前无法进入的最小化的方式,因为它的步长太大了。

  • 提高学习率

    这样做将会加快训练,有助于收紧反馈,这意味着无论你的网络是否正常工作,你都会很快地知道你的网络是否有效。虽然网络应该更快地收敛,但其结果可能不会很好,而且“收敛”实际上可能会跳来跳去。(对于 ADAM 优化器,我们发现在很多经历中,学习率大约为 0.001 时,表现很不错。)

  • 减少批量处理规模

    将批处理大小减小到 1,可以为你提供与权重更新相关的更细粒度的反馈,你应该使用TensorBoard(或其他一些调试/可视化工具)展示出来。

  • 删除批归一化层

    随着批处理大小减少到 1,这样做会暴露出梯度消失或梯度爆炸的问题。我们曾有过一个网络,在好几周都没有收敛,当我们删除了批归一化层之后,我们才意识到第二次迭代时输出都是 NaN。就像是创可贴上的吸水垫,它也有它可以发挥效果的地方,但前提是你知道网络没有 Bug。

  • 增加批量处理的规模

    一个更大的批处理规模,如果可以的话,整个训练集减少梯度更新中的方差,使每个迭代更准确。换句话说,权重更新将朝着正确的方向发展。但是!它的可用性和物理内存限制都有一个有效的上限。通常,我们发现这个建议不如前面两个建议有用,可以将批处理规模减少到1并删除批归一化层。

  • 检查你的重构

    大幅度的矩阵重构(如改变图像的X、Y 维度)会破坏空间局部性,使网络更难学习,因为它也必须学会重塑。(自然特征变得支离破碎。事实上,自然特征在空间上呈局部性,也是为什么卷积神经网络能如此有效的原因!)如果使用多个图像/通道进行重塑,请特别小心;使用 numpi.stack()进行适当的对齐操作。

  • 仔细检查你的损失函数

    如果使用一个复杂的函数,请尝试将其简化为 L1 或 L2。我们发现L1对异常值不那么敏感,在发出噪声的批或训练点时,不会做出太大的调整。

  • 梯度归一化,即算出来的梯度除以minibatch size

    如果loss已经取过平均,就不需要再除以batch_size

  • dropout

    dropout对小数据防止过拟合有很好的效果,值一般设为0.5,小数据上dropout+sgd在我的大部分实验中,效果提升都非常明显.因此可能的话,建议一定要尝试一下。 dropout的位置比较有讲究, 对于RNN,建议放到输入->RNN与RNN->输出的位置.关于RNN如何用dropout,可以参考这篇论文:

  • optimizer

  • 尽量不要用sigmoid

    除了gate之类的地方,需要把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类的激活函数.1. sigmoid函数在-4到4的区间里,才有较大的梯度。之外的区间,梯度接近0,很容易造成梯度消失问题。2. 输入0均值,sigmoid函数的输出不是0均值的。

  • LSTM

    LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的结果,来自这篇论文:, 我这里实验设成1.0,可以提高收敛速度.实际使用中,不同的任务,可能需要尝试不同的值.


参考:

【1】https://www.cnblogs.com/DicksonJYL/p/9660811.html

【2】https://www.cnblogs.com/DjangoBlog/p/7281511.html

【3】https://www.jianshu.com/p/0b116c43eb16

【4】https://www.jianshu.com/p/b71d303f7796

【5】https://blog.51cto.com/14444086/2421035

【6】https://www.cnblogs.com/eilearn/p/9044543.html

【7】https://www.cnblogs.com/andre-ma/p/8676186.html

【8】https://mp.weixin.qq.com/s?__biz=MzU2OTA0NzE2NA==&mid=2247488661&idx=1&sn=1add84d01117238bc23e9189b022b788&chksm=fc85f586cbf27c906ef49df57537075ba9059257be26c8e68e03afe89d2b3a45b4723769d35b&scene=38##

【9】https://blog.csdn.net/shankezh/article/details/88025669

【10】https://blog.csdn.net/xinyuski/article/details/84400527

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.5.2 Zero Theme By 爱墙纸

Copyright ZiYouMan.cn. All Rights Reserved. 蜀ICP备15004526号