神经网络参数优化

参数优化:

  1. 卷积核的大小及个数的选择:        

        在达到相同感受野的情况下,卷积核越小,所需要的参数和计算量越小。

        具体来说。卷积核大小必须大于1才有提升感受野的作用,1排除了。而大小为偶数的卷积核即使对称地加padding也不能保证输入feature map尺寸和输出feature map尺寸不变(画个图算一下就可以发现),2排除了。所以一般都用3作为卷积核大小。

        现在鼓励使用小filter, 3x3大小, 多加层次(这样, 非线性更好点).  当然如果你使用大的filter, 一般5x5往上, 也会取得不错的结果。

  1. 卷积核一般都把size设为奇数,主要有两个原因:
  • 保证 锚点 刚好在中间,方便以 central pixel 为标准进行滑动卷积,避免了位置信息发生偏移 。
  • 保证填充(Padding),在图像之间添加额外的零层,图像的两边相 对称,以使输出图像的大小与输入相同。
  1. padding方式“SAME”和“VALID

     “VALID”:只会丢掉最右边的列(或最底部的行)
     “SAME”:尝试向左或右均匀填充,但如果添加的列数是奇数,它将向右添加偶数,向左侧添加奇数个列(向下添加偶数个列,向上添加奇数个列)为了不影响原来的图像像素信息,一般以0来填充。这就不难理解不同的padding方式输出的形状会有所不同了。

      在CNN用处理文本时,一般卷积层设置卷积核的大小为n×k,其中k为输入向量的维度(即[n,k,input_channel_num,output_channel_num]),这时候我们就需要选择“VALID”填充方式,这时候窗口仅仅是沿着一个维度扫描而不是两个维度,可以理解为统计语言模型当中的N-gram。

对于调参我自己的经验, 有下面这些:

基本原则:快速试错

一些大的注意事项:

1. 刚开始, 先上小规模数据, 模型往大了放, 只要不爆显存, 能用256个filter你就别用128个. 直接奔着过拟合去.(验证你的模型和数据是否合理。)

2. Loss设计要合理.

+ 一般来说分类就是Softmax, 回归就是L2的loss. 但是要注意loss的错误范围(主要是回归), 你预测一个label是10000的值, 模型输出0, 你算算这loss多大, 这还是单变量的情况下. 一般结果都是nan. 所以不仅仅输入要做normalization, 输出也要这么弄.

+ 多任务情况下, 各loss想法限制在一个量级上, 或者最终限制在一个量级上, 初期可以着重一个任务的loss

3. 观察loss胜于观察准确率

准确率虽然是评测指标, 但是训练过程中还是要注意loss的. 你会发现有些情况下, 准确率是突变的, 原来一直是0, 可能保持上千迭代, 然后突然变1. 要是因为这个你提前中断训练了, 只有老天替你惋惜了. 而loss是不会有这么诡异的情况发生的, 毕竟优化目标是loss.

4. 确认分类网络学习充分

分类网络就是学习类别之间的界限. 你会发现, 网络就是慢慢的从类别模糊到类别清晰的. 怎么发现? 看Softmax输出的概率的分布. 如果是二分类, 你会发现, 刚开始的网络预测都是在0.5上下, 很模糊. 随着学习过程, 网络预测会慢慢的移动到0,1这种极值附近. 所以, 如果你的网络预测分布靠中间, 再学习学习.

5. Learning Rate设置合理

  • lr太大: loss爆炸, 或者nan
  • lr太小: 半天loss没反映(但是, LR需要降低的情况也是这样, 这里可视化网络中间结果, 不是weights, 有效果, 俩者可视化结果是不一样的, 太小的话中间结果有点水波纹或者噪点的样子, 因为filter学习太慢的原因, 试过就会知道很明显)
  • 逐步调小lr:loss快速下降到一定节点,就不再下降或下载十分缓慢。

6 对比训练集和验证集的loss

       判断过拟合, 训练是否足够, 是否需要early stop的依据, 这都是中规中矩的原则, 不多说了.

7 清楚receptive field的大小

      CV的任务, context window是很重要的. 所以你对自己模型的receptive field的大小要心中有数. 这个对效果的影响还是很显著的. 特别是用FCN, 大目标需要很大的receptive field. 不像有fully connection的网络, 好歹有个fc兜底, 全局信息都有.

简短的注意事项: 

  1. 预处理: -mean/std zero-center就够了, PCA, 白化什么的都用不上.
  2. 模型的fit函数有两个参数,shuffle=True用于将数据打乱,validation_split用于在没有提供验证集的时候,按一定比例从训练集中取出一部分作为验证集
  3. 网络原理的理解最重要, CNN的conv这块, 你得明白sobel算子的边界检测.
  4. Dropout,(不仅仅可以防止过拟合, 其实这相当于做人力成本最低的Ensemble, 当然, 训练起来会比没有Dropout的要慢一点, 同时网络参数你最好相应加一点, 对, 这会再慢一点).
  5. CNN更加适合训练回答是否的问题, 如果任务比较复杂, 考虑先用分类任务训练一个模型再finetune.
  6. 无脑用ReLU(CV领域).
  7. 无脑用3x3.
  8. 无脑用xavier,初始化激活函数的值。
  9. filter数量2^n.
  10. 多尺度的图片输入(或者网络内部利用多尺度下的结果)有很好的提升效果.
  11. 第一层的filter, 数量不要太少. 否则根本学不出来(底层特征很重要).
  12. sgd adam 这些选择上, 看你个人选择. 一般对网络不是决定性的. 反正我无脑用sgd + momentum.
  13. batch normalization我一直没用, 虽然我知道这个很好. 所以要鼓励使用batch normalization.
  14. shortcut的联接是有作用的.
  15. 暴力调参最可取。

 

 

你可能感兴趣的:(网络训练技巧及参数调优)