Error = Bias(偏差) + Variance(方差)
举一个例子,一次打靶实验,目标是为了打到10环,但是实际上只打到了7环,那么这里面的Error就是3。具体分析打到7环的原因,可能有两方面:
还有其他的解释方式,例如经典的靶子图
把Bais和Variance抽象为准与确的关系:
一般来说,简单的模型会有一个较大的偏差和较小的方差,复杂的模型偏差较小方差较大。这也引申出欠拟合和过拟合的概念。
在一个实际系统中,Bias与Variance往往是不能兼得的。如果要降低模型的Bias,就一定程度上会提高模型的Variance,反之亦然,如下图所示:
整体思路: 首先,要知道方差和偏差是无法完全避免的,只能尽量减少其影响。
针对偏差和方差的思路:
偏差:实际上也可以称为避免欠拟合
多项式次数 | 模型复杂度 | 训练误差 | 测试误差 |
---|---|---|---|
低 | 低 | 高 | 高 |
中 | 中 | 中 | 低 |
高 | 高 | 低 | 高 |
添加正则化项(Regularization)相当于对模型参数施加惩罚,压缩了参数的范围,限制了模型的复杂度,从而有助于缓解模型过拟合问题,选择不同的 正则化项权重λ 对模型的影响如下。
正则化项权重λ | 模型复杂度 | 方差 | 偏差 | 过/欠拟合 |
---|---|---|---|---|
大 | 低 | 低 | 高 | 欠拟合 |
中 | 中 | 中 | 中 | 适度 |
小 | 高 | 高 | 低 | 过拟合 |
正则化项权重λ | 模型复杂度 | 训练误差 | 测试误差 |
---|---|---|---|
大 | 低 | 高 | 高 |
中 | 中 | 中 | 低 |
小 | 高 | 低 | 高 |
神经网络结构 | 模型复杂度 | 方差 | 偏差 | 过/欠拟合 |
---|---|---|---|---|
小 | 低 | 低 | 高 | 欠拟合 |
中 | 中 | 中 | 中 | 适度 |
大 | 高 | 高 | 低 | 过拟合 |
在《西瓜书》中也会有这种描述:泛化误差=偏差+方差+噪声
其误差的期望值可以分解为三个部分:样本噪音、模型预测值的方差、预测值相对真实值的偏差
即:误差的期望值 = 噪音的方差 + 模型预测值的方差 + 预测值相对真实值的偏差的平方
先看一个图比较直观。
靶心(红点)是测试样本的真实值,测试样本的y(橙色点)是真实值加上噪音,特定模型重复多次训练会得到多个具体的模型,每一个具体模型对测试样本进行一次预测,就在靶上打出一个预测值(图上蓝色的点)。所有预测值的平均就是预测值的期望(较大的浅蓝色点),浅蓝色的圆圈表示预测值的离散程度,即预测值的方差。
现在在偏差和方差之间就需要一个权衡 想选择的模型,可以平衡偏差和方差产生的错误,使得总错误最小,对于模型的选择有以下的方法,比如我们拥有三个模型,我们要验证哪种模型表现最好。
图中public的测试集是已有的,private是没有的,不知道的。交叉验证 就是将训练集再分为两部分,一部分作为训练集,一部分作为验证集。用训练集训练模型,然后再验证集上比较,确实出最好的模型之后(比如模型3),再用全部的训练集训练模型3,然后再用public的测试集进行测试,此时一般得到的错误都是大一些的。不过此时会比较想再回去调一下参数,调整模型,让在public的测试集上更好,但不太推荐这样。
上述方法可能会担心将训练集拆分的时候分的效果比较差怎么办,可以用下面的方法。
将训练集分成N份,比如分成3份,然后在其中将每一份分别作为验证集去训练N次三种模型,然后将每个模型N次的平均error作为最终的评判标准。
比如在三份中训练结果Average错误是模型1最好,再用全部训练集训练模型1。
解决方法就是上图右边的方案,将参数改变对损失函数的影响进行可视化。比如学习率太小(蓝色的线),损失函数下降的非常慢;学习率太大(绿色的线),损失函数下降很快,但马上就卡住不下降了;学习率特别大(黄色的线),损失函数就飞出去了;红色的就是差不多刚好,可以得到一个好的结果。
虽然这样的可视化可以很直观观察,但可视化也只是能在参数是一维或者二维的时候进行,更高维的情况已经无法可视化了。
举一个简单的思想:随着次数的增加,通过一些因子来减少学习率
学习率不能是一个值通用所有特征,不同的参数需要不同的学习率
定义: 每个参数的学习率都把它除上之前微分的均方根。
普通的梯度下降为:
将 Adagrad 的式子进行化简:
很多人会问,在 Adagrad 中,当梯度越大的时候,步伐应该越大,但下面分母又导致当梯度越大的时候,步伐会越小。这不就是和梯度下降的思想矛盾了吗?(同时随着梯度的增大,我们的分母是在逐渐增大,也就对整体学习率是减少的,这是为什么呢?)
答:这是因为随着我们更新次数的增大,我们是希望我们的学习率越来越慢。因为我们认为在学习率的最初阶段,我们是距离损失函数最优解很远的,随着更新的次数的增多,我们认为越来越接近最优解,于是学习速率也随之变慢。
图中红色方框作为整体的学习率,随着迭代次数的增加,最正常的情况就是我们逐渐接近最优解,就算梯度很大,也应该降低学习率去逐步逼近最优解
上图左边是 x1的scale比 x2 要小很多,所以当 w1和 w2做同样的变化时,w1 对 y 的变化影响是比较小的,x2对 y 的变化影响是比较大的。左边的梯度下降并不是向着最低点方向走的,而是顺着等高线切线法线方向走的。但绿色就可以向着圆心(最低点)走,这样做参数更新也是比较有效率。
通过梯度下降法求解的模型需要进行特征缩放,这包括线性回归(Linear Regression)、逻辑回归(Logistic Regression)、感知机(Perceptron)、支持向量机(SVM)、神经网络(Neural Network)等模型。此外,近邻法(KNN),K均值聚类(K-Means)等需要根据数据间的距离来划分数据的算法也需要进行特征缩放。主成分分析(PCA),线性判别分析(LDA)等需要计算特征的方差的算法也会受到特征缩放的影响。
决策树(Decision Tree),随机森林(Random Forest)等基于树的分类模型不需要进行特征缩放,因为特征缩放不会改变样本在特征上的信息增益。
需要先把数据拆分成训练集与验证集,在训练集上计算出需要的数值(如均值和标准值),对训练集数据做标准化/归一化处理(不要在整个数据集上做标准化/归一化处理,因为这样会将验证集的信息带入到训练集中,这是一个非常容易犯的错误),然后再用之前计算出的数据(如均值和标准值)对验证集数据做相同的标准化/归一化处理。
容易陷入局部极值 还有可能卡在不是极值,但微分值是0的地方 还有可能实际中只是当微分值小于某一个数值就停下来了,但这里只是比较平缓,并不是极值点
阅读量:526
点赞量:0
收藏量:0