Task03 误差来源、梯度下降
学习地址
误差error
误差来源
- 来源一:bias(一般见于underfitting)
在训练集上loss就很大 —> model bias - 来源二:variance(一般见于overfitting)
在训练集上可能表现很好loss很小(比如把输入特征很多,模型参数很多,将模型建得很复杂),在测试集上效果反而变差 —> overfitting
Bias v.s Variance
- 简单的模型受到不同训练集的影响比较小,所以简单的模型一般Variance比较小,Bias比较大。复杂的模型对训练集敏感,Variance一般比较大,散布比较开
- 如何判断是否Bias过大:如果模型没有很好的训练训练集,就是偏差过大,也就是欠拟合
- 如何判断是否Variance过大:如果模型很好的拟合训练集,即在训练集上得到很小的错误,但在测试集上得到大的错误,这意味着模型可能是方差比较大,也就是过拟合
- 如何解决Bias过大:
- 应重新设计模型,考虑更多的特征或者更多的参数、更复杂的模型
- ps:此时没必要找更多的训练数据
- 如何解决Variance过大:
- 最直接的做法是收集更多的数据,但一般很难做到
- 可以对数据做数据增广,或者构造虚拟的数据。比如将图片旋转、平移
- 融合多个模型,可以减小方差
- 多次实验,取average
模型选择—tradeoff
- 如何选择一个好的模型,可以平衡bias和variance带来的error,使得总error最小:
- Not recommend:不推荐上面的做法!即根据已有的public的测试集上的表现去回调模型参数,因为private的测试集是没有的,这样可能会导致在真实的测试集中效果更差!
- 通过交叉验证选择模型,即从训练集中随机拆分一部分作为验证集
- 如果担心拆分的效果比较差,使用更effective的N折交叉验证
N-fold 交叉验证
将训练集分成N份,每次取其中一份作为验证集,其余作为训练集,N次训练验证后,取验证集的AvgError作为依据回调模型参数。之后再用全量训练集训练选择好的模型,作为最终的模型。理论上训练集和测试集数据分布一致的话,效果会比较好。
梯度下降Tips
Tip1:调整学习速率
- 问题
- 学习率太小 —> 参数调整太慢,时间过长;
- 学习率太大 —> 在minima附近震荡,永远无法到达最低点
- 学习率非常大 —> 损失函数发散
- 自适应学习率
- 恒定的学习率可能并不好
- 可以通过一些因子来调整学习率
- 刚开始可以使用大一点的学习率,比较靠近最低点时,减小学习率
- 比如
η
t
=
η
t
t
+
1
\eta^{t}=\frac{\eta^{t}}{\sqrt{t+1}}
ηt=t+1
?ηt? ,随着次数的增加,减小学习率
- 另一个问题:不同的参数更新快慢不同,每次只用一个学习率好吗?不同的参数用不同的学习率会不会更好?答案是肯定的
- Adagrad算法
- (Vanilla)Gradient Descent:
- Adagrad:
- Adagrad的例子:
- 简单解释:
在跨参数的情况下,并不是梯度越大,更新的步伐就应该越大,最好的步伐其实是:
∣
F
i
r
s
t
D
e
r
i
v
a
t
i
v
e
∣
S
e
c
o
n
d
D
e
r
i
v
a
t
i
v
e
\frac{|First Derivative|}{Second Derivative}
SecondDerivative∣FirstDerivative∣? - 进一步解释:
Adagrad的做法其实是在尽可能不增加过多运算的情况下,用一阶微分的历史平方和开根号模拟二次微分,因为一阶微分已经计算过,不再需要太多的计算量 - RMSprop算法:
- 最近的梯度影响更大,过去的梯度影响更小
- 另外还有其他如Adam算法等等,梯度下降的数学理论基础来自于多变量的泰勒展开式
Tip2:随机梯度下降法
- 普通的梯度下降法每次更新参数需要处理训练集的所有数据,随机梯度下降法(SGD)每次更新参数只需要随机选择某一个样本进行损失函数计算并update梯度,大大增加了速度,效果也不会太差,整体前进的方向是对的
Tip3:特征缩放
- 特征很多,而且特征分布的范围差别很大,此时将输入进行范围缩放,让不同特征的范围一样,可以加快训练速度。
- 常用的做法是Standardization:
x
i
r
←
x
i
r
?
m
i
σ
i
x^{r}_{i}\leftarrow\frac{x^{r}_{i}-m_{i}}{\sigma_{i}}
xir?←σi?xir??mi??
i
i
i 是特征维度,
r
r
r 是第
r
r
r 个样本
另附Datawhale组队学习—李宏毅机器学习任务安排
|