什么是过拟合
- 就是模型过于复杂
- 在训练集合上过度拟合
- 随着模型越来越复杂,在 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个模型取平均的结果。
- 针对多个神经元来说,它们不保证同时出现,也就避免某些特征必须在其他特征有的时候才起作用。迫使模型丢失一些特征,也能学到信息。