李宏毅《深度学习》笔记(三)
一、误差的来源
误差(Error)通常有两个来源:偏差(Bias)和方差(Variance)。且Error = Bias + Variance
但偏差和方差是一对矛盾体,同样条件下,要降低偏差往往要以增加方差为代价,反之也是同理。要同时降低偏差和方差,就要增大训练集的样本量。
理解偏差和方差:
Error反映的是整个模型的准确度,Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。
以打靶为例,一次射击为7环,距离10环有3环的误差(Error)。考虑这3环的误差怎么来的,一是瞄准有问题,可能瞄准的不是10环,而是9环,这便是偏差(Bias)。瞄准后射击,由于枪的稳定性不足,只射击到了7环,这便是方差(Variance)。
如果模型没有很好的训练训练集,就是偏差过大,也就是欠拟合;
如果模型很好的训练训练集,在训练集上得到很小的错误,但在测试集上得到大的错误,这意味着模型可能是方差比较大,就是过拟合。
偏差大-欠拟合:应该重新设计模型,考虑增加更多的变量。
方差大-过拟合:增加更多的数据
模型选择
模型选择过程中避免一个误区:不能用训练集训练不同的模型,然后在测试集上比较错误,直接选择误差最小的模型,这种做法是不可取的。
-
交叉验证:交叉验证就是将训练集再分为两部分,一部分作为训练集,一部分作为验证集。用训练集训练模型,然后再验证集上比较,确实出最好的模型之后,再用全部的训练集训练模型
-
N-折交叉验证:将训练集分为N份,轮流作为测试集,其余的作为训练集。从而进行N次训练,返回的结果取均值。
梯度下降法
梯度:这个概念在高等数学中出现过,本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
梯度下降法即不断更新参数,直至找到最优解,更新方法如下:
Tip1:调整学习率
如果学习率过小,如蓝色的线,结果下降太慢,虽然这种情况给足够多的时间也可以找到最低点,实际情况可能会等不及出结果。
如果学习率过大,如绿色的线,就会在上面震荡,走不下去,永远无法到达最低点。还有可能非常大,比如黄色的线,直接就飞出去了,更新参数的时候只会发现损失函数越更新越大。
自适应学习率
-
通常刚开始,初始点会距离最低点比较远,所以使用大一点的学习率
-
update好几次参数之后呢,比较靠近最低点了,此时减少学习率
-
比如 η t = η t t + 1 \eta^t =\frac{\eta^t}{\sqrt{t+1}} ηt=t+1ηt,t 是次数。随着次数的增加, η t \eta^t ηt 减小
即下降方法为 wt+1←wt−ηtgt; η t = η t t + 1 \eta^t =\frac{\eta^t}{\sqrt{t+1}} ηt=t+1ηt
Adagrad 算法
每个参数的学习率都把它除上之前微分的均方根
w t + 1 = w t − η t σ t g t w^{t+1} =w^t-\frac{\eta^t}{\sigma^t}g^t wt+1=wt−σtηtgt; g t = ∂ L ( η t ) ∂ w g^t=\frac{\partial L(\eta^t)}{\partial w} gt=∂w∂L(ηt)
在Adagrad中,当梯度越大的时候,步伐应该越大,但下面分母又导致当梯度越大的时候,步伐会越小。
缺点:在 Adagrad 中,当梯度越大的时候,步伐应该越大,但下面分母又导致当梯度越大的时候,步伐会越小。
调整:
比如初始点在 x 0 x_0 x0,最低点为 − b 2 a −\frac{b}{2a} −2ab,最佳的步伐就是 x 0 x_0 x0到最低点之间的距离 ∣ x 0 + b 2 a ∣ \left | x_0+\frac{b}{2a} \right | ∣∣x0+2ab∣∣,也可以写成$ \left | \frac{2ax_0+b}{2a} \right |$。而刚好 ∣ 2 a x 0 + b ∣ |2ax_0+b| ∣2ax0+b∣ 就是方程绝对值在 x 0 x_0 x0这一点的微分。
初步结论:梯度越大,就跟最低点的距离越远
但这个初步结论对于多参数的情况不一定成立
左边是两个参数的损失函数,颜色代表损失函数的值。如果只考虑参数 w 1 w_1 w1,就像图中蓝色的线,得到右边上图结果;如果只考虑参数 w 2 w_2 w2,就像图中绿色的线,得到右边下图的结果。确实对于a和b,结论是成立的,同理c和b也成立。但是如果对比a和c,就不成立了,c比a大,但c距离最低点是比较近的。
所以初步结论还并不完善,需要进一步优化。
对于最佳距离 ∣ 2 a x 0 + b 2 a ∣ \left | \frac{2ax_0+b}{2a} \right | ∣∣2a2ax0+b∣∣,之前只考虑了分子,还要考虑分母。可以发现,对function进行二次微分刚好可以得到2a。
所以最好的步伐应该是: 一 次 微 分 二 次 微 分 \frac{一次微分}{二次微分} 二次微分一次微分
w t + 1 = w t − η ∑ i = 1 t ( g i ) 2 w^{t+1} =w^t-\frac{\eta}{\sum_{i=1}^t{(g^i)}^2} wt+1=wt−∑i=1t(gi)2η; g t = ∂ L ( η t ) ∂ w g^t=\frac{\partial L(\eta^t)}{\partial w} gt=∂w∂L(ηt)
再考虑Adagrad的调整方法,gt一次微分, ∑ i = 1 t ( g i ) 2 {\sum_{i=1}^t{(g^i)}^2} ∑i=1t(gi)2代替二次微分,原因就是希望再尽可能不增加过多运算的情况下模拟二次微分。(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)
Tip2:随机梯度下降法
不再对所有的数据进行计算处理,选取一个例子xn来计算,
L = ( y n − ( b + ∑ w i x i n ) ) 2 L=(y^n−(b+∑w_ix_i^n))^2 L=(yn−(b+∑wixin))2
$\theta_i =\theta^{i-1}- \eta\triangledown Ln(\theta{i-1}) $
只需要计算某一个例子的损失函数Ln,就可以赶紧update 梯度。
Tip3:特征缩放
由于不同特征的度量不同,因此特征对预测值y的影响效果不同。如此使用同一个Learning Rate,不容易找到最优解,此时需要给每个特征单独设置Learning Rate。而如果将特征值进行缩放,比如使用单位化的手段让每个特征的取值都在0和1之间,这样所有的特征对y的影响权重相同。损失函数的图像呈现为圆形,更容易进行梯度下降。
梯度下降的理论基础
对二元函数使用泰勒展开,忽略高阶后,可得:
不考虑s的话,可以看出剩下的部分就是两个向量
(
△
θ
1
,
△
θ
2
)
(\triangle \theta_1,\triangle \theta_2)
(△θ1,△θ2)和 (u,v)的内积,那怎样让它最小,就是和向量 (u,v)(u,v) 方向相反的向量
发现最后的式子就是梯度下降的式子。但这里用这种方法找到这个式子有个前提,泰勒展开式给的损失函数的估算值是要足够精确的,而这需要红色的圈圈足够小(也就是学习率足够小)来保证。