误差
误差的来源:
- Bias(偏差:反映模型在样本上的输出与真实值之间的误差)
- Variance(方差:反映模型每次输出结果与模型输出期望之间的误差)
对于Bias大的问题(模型没有很好的训练训练集,偏差过大,即欠拟合),解决方法有:
- 增加Features
- 用更复杂的模型
对于Variance大的问题(模型在训练集上错误很小,但在测试集上得到大的错误,这意味着模型可能方差较大,即过拟合),解决方法有:
- 增大数据量(有时候可以手动制造假数据,比如把手写的数字图片旋转10°,就可以模拟不同的人的手写数据。)
- 正则化(强迫回归曲线变得更平滑)
交叉验证(Cross Validation):将训练集分为两部分,一部分作为训练集,一部分作为验证集。用训练集训练模型,然后在验证集上比较。
梯度下降
梯度下降法解决的问题:
θ ∗ = arg min θ L ( θ ) \theta^∗= \underset{ \theta }{\operatorname{arg\ min}} L(\theta) θ∗=θarg minL(θ)
- L L L :lossfunction(损失函数)
- θ \theta θ :parameters(参数)
这里 θ \theta θ 指代一堆参数,我们要找一组参数 θ \theta θ ,让损失函数越小越好。
梯度下降法步骤如下图所示:
调整学习率 η \eta η
学习率不能太大,也不能太小,我们可以:
- 在前期用较大的学习率,方便快速下降
- 在后期逐渐减小学习率,防止远离最低点
- 例: η t = η t t + 1 \eta^t =\frac{\eta^t}{\sqrt{t+1}} ηt=t+1ηt, t t t 是次数。随着次数的增加, η t \eta^t ηt 减小(自适应学习率);
- 则梯度下降公式: w t + 1 ← w t − η t g t w^{t+1} \leftarrow w^t -η^tg^t wt+1←wt−ηtgt
Adagrad 算法
每个参数的学习率都把它除上之前微分的均方根。
在 Adagrad 中,当梯度
g
t
g^t
gt越大的时候,步伐应该越大,但下面分母又导致当梯度越大的时候,步伐会越小。
最好的步伐应为:
一
次
微
分
二
次
微
分
\frac{一次微分}{二次微分}
二次微分一次微分
即不止和一次微分成正比,还和二次微分成反比。最好的step应该考虑到二次微分。对于
∑
i
=
0
t
(
g
i
)
2
\sqrt{\sum_{i=0}^t(g^i)^2}
∑i=0t(gi)2 就是希望再尽可能不增加过多运算的情况下模拟二次微分。(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)
随机梯度下降法
每次更新参数的时候,并不需要把所有的样本都算到Loss Function里,而只随机选取一个样本考虑进去。如果有20个样本点,则这样的随机梯度下降比普通的梯度下降快20倍。
特征缩放
让不同的Features的值的量级差不多,常见方法:标准化。
梯度下降的限制
- 容易陷入局部极值
- 可能卡在不是极值,但微分值是0的地方
- 可能实际中只是当微分值小于某一个数值就停下来了,但这里只是比较平缓,并不是极值点