关于神经网络训练的一些技巧NN Tricks

神经网络能够构建,简单的几行TensorFlow代码或者Pytorch代码就可以实现,但是效果并不一定理想。为什么一般采用连续的拟合任意函数?在手中有足够的数据时,仔细设计的网络是可以得到更好的准确率和泛化性。
课上老师讲到,避免设计太多参数,优化超参数,精准设计网络。有一些简单的Trick可以参考如下:

  • 主要来源
    CS224D Lecture 6
    Debugging Neural Networks
    A Practical Guide to Training Restricted Boltzmann Machines
    My Neural Network isn’t working! What should I do?
    Neural Network and Deep Learning
    TensorFlow实战
    遇到一个问题,该如何选择用什么神经网络?

  • 结构,如1v1,固定窗口,数据维度粒度,MLP,RNN或者CNN等

  • 非线性选择,sigmod,tanh,ReLU或者其他的Rescaled.一般来讲,tanh比sigmod的效果要好一些(sigmod的输出为正数, S i g m o i d ( x ) = 1 1 + e − x Sigmoid(x)=\frac{1}{1+e^-x} Sigmoid(x)=1+ex1根据BP规则,某层的神经元的权重的梯度的符号和后层误差的一样,也就是说,如果后一层的误差为正,则这一层的权重全部都要降低,如果为负,则这一层梯度全部为负,权重全部增加,权重要么都增加,要么都减少,这明显是有问题的;tanh是以0为对称中心的,这会消除在权重更新时的系统偏差导致的偏向性。当然这是启发式的,并不是说tanh一定比sigmoid的好),ReLU也是很好的选择,最大的好处是,当tanh和sigmoid饱和时都会有梯度消失的问题,ReLU就不会有这个问题,而且计算简单,当然它会产生dead neurons,下面会具体说。

  • Gradient Check检查在这里插入图片描述那如果GC失败,可能网络某些部分有问题,也有可能整个网络都有问题了!你也不知道哪出错了,那怎么办呢?构建一个可视化过程监控每一个环节,这可以让你清楚知道你的网络的每一地方是否有问题!!这里还有一个trick,先构建一个简单的任务(比如你做MNIST数字识别,你可以先识别0和1,如果成功可以再加入更多识别数字);然后从简单到复杂逐步来检测你的model,看哪里有问题。举个例子吧,先用固定的data通过单层softmax看feedforward效果,然后BP效果,然后增加单层单个neuron unit看效果;增加一层多个;增加bias。。。。。直到构建出最终的样子,系统化的检测每一步!

  • 参数初始化也是重要滴!其主要考虑点在于你的激活函数的取值范围和梯度较大的范围!
    隐层的bias一般初始化为0就可以;输出层的bias可以考虑用reverse activation of mean targets或者mean targets(很直观对不对) weights初始化一般较小的随机数,比如Uniform,Gaussion。
    更放心一点,可视化每一层feedforward输出的取值范围,梯度范围,通过修改使其落入激活函数的中间区域范围(梯度类似线性);如果是ReLU则保证不要输出大多为负数就好,可以给bias一点正直的噪声等。当然还有一点就是不能让神经元输出一样,原因很简单

  • 优化算法,一般用mini-batch SGD,绝对不要用full batch gradient(慢)。一般情况下,大数据集用2nd order batch method比如L-BFGS较好,但是会有大量额外计算2nd过程;小数据集,L-BFGS或共轭梯度较好。(Large-batch L-BFGS extends the reach of L-BFGSLe et al. ICML 2001)
    mini-batch好处主要有:可以用矩阵计算加速并行;引入的随机性可以避免困在局部最优值;并行化计算多个梯度等。在此基础上一些改进也是很有效的(因为SGD真的敏感),比如Momentum,他的意图就是在原先的跟新基础上增加一点摩擦力,有点向加速度对速度的作用,如果多次更新梯度都往一个方向,说明这个方向是对的,这时候增加跟新的步长,突然有一个方向,只会较少影响原来的方向,因为可以较少的数据带来的误差。当你使用momentum时可以适当减小global learning rate

  • 学习率,跑过神经网络的都知道这个影响还蛮大。一般就是要么选用固定的lr,要么随着训练让lr逐步变小
    方案一:当验证误差不再下降时,lr减小为原来的0.5
    方案二:采用理论上可以保证收敛的减小比例,O(1/t),t是迭代次数
    方案三:最好用自适应的学习率,比如Adagrad(Duchi et al. 2010)等
    简要说明一下,Adagrad非常适合数据出现频度不一样的模型,比如word2vec,你肯定希望出现非常少的词语权重更新非常大,让它们远离常规词,学习到向量空间中距离度量的意义,出现非常多的词(the,very,often)每次更新比较小。
    -看看你的模型有没有能力过拟合!(training error vs. validation error)
    如果没有,想办法让它过拟合!(r u kidding?! 哈哈),一般而言,当参数多于training数据时,模型是有能力记住数据的,总归先保证模型的能力么
    如果过拟合了,那么就可以进一步优化啦,一般深度学习breakthrough的方法都是来自于更好的regularization method,解决过拟合很多方法在此就不多论述了。比如减小模型(layers, units);L1,L2正则(weight decay);early stop(按照数据集大小,每隔一段epoch(比如小数据集每隔5epoch,大的每隔(1/3epoch))保存模型,最后选择validation error 最小的模型);sparsity constraints on hidden activation;Dropout;data
    augumentation (CNN 一些变化不变性要注意)等

来自:https://zhuanlan.zhihu.com/p/59918821

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值