如何解决过拟合

什么是过拟合

  • 就是模型过于复杂
  • 在训练集合上过度拟合
  • 随着模型越来越复杂,在 test set 上面的 error 会呈现先下降后上升的趋势。
  • 造成在 training set 上的表现比 test set 上面好。

 

解决思路

  • 简化模型
    • 减少特征
    • 减小参数
      • 正则化
      • dropout
      • 减小参数的意义:
        • overfitting 意味着每个点都进行拟合,那势必这条曲线在一段区域内,变化显著,即导数值很大。而 weight 可以近似看做某段区域的导数值。
    •   减少训练轮数:early stop
  • 增加数据量
    • “增加眼界”
    • 推荐系统里面就是增加训练集参数
    • CV 里面还可以 data augmentation,旋转跳跃我闭着眼~
  • 改善评估手段
    • cross validation,例如 k-fold,将同一份数据分成 m 组,每个组 k 份,每次用不同的 1/k 份来进行验证,其他数据训练。
    • 疑问:像排序系统,会不会有数据穿越的问题。因为像 prerank 模型,uid 也是一组特征。如果我见过未来某用户的click history里面有过去的 eid,会不会帮助我们预测过去。

 

Q: L1, L2 为什么可以防止过拟合

  • 什么是正则化
    • 在 loss 函数后加一个正则化项,weight的绝对值或是平方项。
  • 从定义角度就能看出,minimize loss 的同时也要  minimize weight 大小。
  • 从 gradient descent 角度:
    • L1 正则化,对于 wi > 0,则导数为1 ,wi < 0,则导数为 -1。
    • L2 正则化,导数为 2lamda*wi。
    • 想象成 gradient descent,更新是减去 gradient,那么 wi> 0 则会越来越小。针对 wi < 0,则会越来越大。都在向 0 靠近。
    • 但 L1 比 L2 特殊点在于 w = 0,是函数不可导点。为函数最小值。因此 L1 更容易产生稀疏性。

 

dropout 相关

  • 为什么
    • 防止过拟合,即在训练集合上损失比较小,在测试集合上损失比较大。
    • 起到一定的正则化的作用
  • 怎么做
    • 在每个批次的训练过程中,以一定的概率,随机使某些神经元的输出值为0。服从伯努利分布。
    • 由于改变了这个输出神经元的个数,需要对输出进行缩放。1/(1-p)。 
    • rescale 也可以选择在测试的时候做,就每个神经元都乘以 p。在预测的时候会影响之后的每一层,因此主流做法都是用前一种。
    •  

  • 为什么能起到过拟合的作用
    • 针对单个神经元来说,它看不到所有的数据,所以模型结构发生了改变。相当于在N个模型取平均的结果。
    • 针对多个神经元来说,它们不保证同时出现,也就避免某些特征必须在其他特征有的时候才起作用。迫使模型丢失一些特征,也能学到信息。

 

posted @ 2021-02-23 07:19  nuo-o  阅读(323)  评论(0编辑  收藏  举报