机器学习——算法性能(误差)改进及调参技巧

可用方法

通常,我们训练一个机器学习算法,等其收敛后,还要用一些测试集去验证算法性能。此时,我们可能就会遇到各种各样的问题。例如,我们使用正则化的线性回归去预测房子的价格,其代价函数定义为;
J ( θ ) = 1 2 m [ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 m θ j 2 ] J\left(\boldsymbol{\theta}\right)=\frac{1}{2m}\left[\sum_{i=1}^m\left(h_\boldsymbol{\theta}\left(x^{\left(i\right)}\right)-y^{\left(i\right)}\right)^2 +\lambda\sum_{j=1}^m\theta_j^2 \right] J(θ)=2m1[i=1m(hθ(x(i))y(i))2+λj=1mθj2]
当我们将训练好的算法应用到一组新的测试数据时,可能预测的结果误差很大,那么我们应该使用方法去改进算法呢?
可以通过以下方法进行尝试:

  • 获取更多训练数据
  • 减少特征集的数量
  • 增加特征集的数量
  • 增加多项式特征( x 1 2 , x 2 2 , x 1 x 2 , e t c x_1^2,x_2^2,x_1x_2,etc x12,x22,x1x2,etc
  • 减小正则化参数 λ \lambda λ
  • 增大正则化参数 λ \lambda λ

上述方法都是一些比较实用的调参技巧,但是盲目的选取其中一种方法往往会有事倍功半的效果。因此,我们的重点应该放在该如何选择上述技巧上面。

训练集、验证集和测试集

在介绍算法改进技巧之前,先简单了解一下数据集的划分问题。假设我们想要确定对于一个数据集而言最合适的多项式次数,或者我们想要确定最合适的正则化参数 λ \lambda λ,这类问题被叫做模型选择问题。为了解决此类问题,通常我们会将数据集划分为训练集(Training Set)、交叉验证集(验证集)(Cross Validation)和测试集(Testing Set),并且当数据量不大时(万级别或者以下)最常用的划分比例是60%、20%和20%;当数据量特别大时,例如有100万个数据样本,常用的划分比例是98%,1%和1%。
我们使用训练集去训练数据,进而得到一个模型。然后,我们通过验证集去评估这个模型的性能,并以此对相应参数进行调整。一旦找到的最佳的参数,就在测试集上最后测试一次,测试集上的误差作为泛化误差的近似。有关训练集、验证集和测试集的说明可以参考此篇博客,这里举一个例子进行深入理解:
假设我们需要从以下10个假设函数中选出一个最好的模型:

  • h θ ( x ) = θ 0 + θ 1 x h_{\theta}(x)=\theta_0+\theta_1x hθ(x)=θ0+θ1x

  • h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 h_{\theta}(x)=\theta_0+\theta_1x+\theta_2x^2 hθ(x)=θ0+θ1x+θ2x2

  • h θ ( x ) = θ 0 + θ 1 x + ⋯ + θ 3 x 3 h_{\theta}(x)=\theta_0+\theta_1x+\dots+\theta_3x^3 hθ(x)=θ0+θ1x++θ3x3
    … \dots

  • h θ ( x ) = θ 0 + θ 1 x + ⋯ + θ 10 x 10 h_{\theta}(x)=\theta_0+\theta_1x+\dots+\theta_{10}x^{10} hθ(x)=θ0+θ1x++θ10x10
    针对第一个假设函数,利用训练集去最小化代价函数 J ( θ ) J(\theta) J(θ),可以得到一组向量参数 θ ( 1 ) \boldsymbol\theta^{(1)} θ(1),类似地,对于第二个假设函数,我们可以得到 θ ( 2 ) \boldsymbol\theta^{(2)} θ(2),第十个假设函数得到 θ ( 10 ) \boldsymbol\theta^{(10)} θ(10)。接下来,我们使用验证集去分别计算这10个假设函数的代价函数 J c v ( θ ) J_{cv}(\theta) Jcv(θ),选取使代价函数最小的那个假设作为我们模型,例如, h θ ( x ) = θ 0 + θ 1 x + ⋯ + θ 4 x 4 h_{\theta}(x)=\theta_0+\theta_1x+\dots+\theta_4x^4 hθ(x)=θ0+θ1x++θ4x4的参数可以使代价函数最小,于是选择它作为我们的模型。最后,我们用测试集去测试我们选择的那个模型的性能,即测试其泛化误差。

诊断偏差与方差

当运行一个算法,发现其表现不理想时,我们需要改进它。改进的前提是我们知道问题到底出在了什么地方。通常,算法不理想和两个因素有关,一个是偏差过大(High Bias),另一个是方差过大(High Variance)。换句话说算法要么是欠拟合问题,要么是过拟合问题。下图为三种情况的图示说明:
在这里插入图片描述在前面,我们将数据集划分为了训练集、验证集和测试集。由此我们可以得到训练误差,交叉验证误差和测试误差(泛化误差),其公式分别为:

根据训练误差、交叉验证误差和多项式次数的关系,我们可以画出下图曲线:

图像的纵坐标表示误差,横坐标为多项式次数(越往右代表多项式次数越高)。根据图像我们可以看出,训练误差 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)是随着多项式次数的增大逐渐减小的。这是因为多项式次数越高,对数据拟合的越精确,这也解释了过拟合的现象。而交叉验证误差是随着多项式次数的增大先减小后增大的。原因在于,当多项式次数较小时,无法较好地拟合数据,此时对应着高偏差的情况,因此交叉验证误差比较大;随着多项式次数的不断增大,可以找到一个最优的次数,此时对应的交叉验证误差最小;继续增大多项式的次数,由于偏离了最优的次数,所以交叉验证误差由开始逐渐增大,此时对应着高方差情况,即出现了过拟合现象,模型过度拟合了训练数据集,导致用交叉验证集验证时,出现较大的误差。
于是,我们可以总结出:
高偏差 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)比较高, J c v ( θ ) J_{cv}(\theta) Jcv(θ)近似等于 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)
高方差 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)比较小, J c v ( θ ) J_{cv}(\theta) Jcv(θ)远大于 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)
当出现过拟合时,我们可以通过正则化(可参考此篇博客)的方法去减少这种现象。正则化参数 λ \lambda λ的选取对偏差和方差也有着很大的影响。

从图中可以看出,当 λ \lambda λ过大时,会出现高偏差现象;当 λ \lambda λ太小时,会出现高方差现象。 λ \lambda λ和训练误差及交叉验证误差的关系如下图所示:

图中,当 λ \lambda λ过小时,例如 λ = 0 \lambda=0 λ=0,相当于没有正则化,此时由于可能出现过拟合,导致训练误差很小,而交叉验证误差很大,对应着高方差;当 λ \lambda λ很大时,例如 λ = 10000 \lambda=10000 λ=10000,为了最小化 J ( θ ) J(\theta) J(θ),向量 θ \theta θ中可能出现大量的0,使得模型无法很好的拟合数据,导致训练误差和交叉验证误差都很大,对应着高偏差

学习曲线

绘制学习曲线对检查算法是否正常运行以及改进算法性能十分有帮助,通过学习曲线,可以发现算法是否存在高偏差、高方差等问题。一种学习曲线如下图所示:

图中,纵坐标表示误差,横坐标为训练集数量。当训练集数量很少时,我们可以精确地得到一个模型,因此其训练误差也比较小。但是由于模型是通过训练集训练得到的,泛化程度不会很好,当用交叉验证集验证时,就容易出视误差较大的情况。随着训练集数量的增大,想对每一个训练样本都拟合地很好就很难做到了,因此平均训练误差逐渐增大。但此时模型的泛化能力是逐渐增强的,所以其交叉验证误差会逐渐减小。
高偏差情况下的学习曲线:

从图中可以看出,训练误差会随着训练集数量的增加而逐渐增加,并且最终趋于一个平稳的状态,交叉验证误差最终会和训练误差接近,表明当算法出现高偏差的问题时,增大训练集的数量并不能很好地改善算法性能。
高方差情况下的学习曲线:

在高方差情况下,交叉验证误差会随着训练集数量的增加不断减小,并且训练误差和交叉验证误差之间有着较大的差距,这表明增加训练集数量对于高房方差问题来说是有帮助的。
注意:上述曲线都是理想情况下的曲线,在实际算法测试中,由于噪声及其他因素的影响,曲线可能不是那么平滑,但是其趋势是一样的。

有了上述知识,我们可以就一开始给出的许多种改进方法进行选择了:

  • 获取更多训练数据——可解决高方差问题
  • 减少特征集的数量——可解决高方差问题
  • 增加特征集的数量——可解决高偏差问题
  • 增加多项式特征( x 1 2 , x 2 2 , x 1 x 2 , e t c x_1^2,x_2^2,x_1x_2,etc x12,x22,x1x2,etc)——可解决高偏差问题
  • 减小正则化参数 λ \lambda λ——可解决高偏差问题
  • 增大正则化参数 λ \lambda λ——可解决高方差问题

主要参考吴恩达机器学习

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
修改 Mdk flash 算法,可以参考以下几个方面进行改进。 首先,可以优化存储器的使用。通过减小存储器的占用空间,可以提高程序的执行效率。可以采用压缩算法,对程序进行压缩,减小存储空间的占用。另外,可以使用更高效的据结构和算法来管理存储器,提高存储器的利用率和读写速度。 其次,可以增加对程序错误的检测和纠正能力。在进行程序烧录时,可以增加校验机制,确保程序的正确性。同时,如果发现程序错误,可以在烧录过程中进行错误检测和纠正,提高程序的可靠性。 另外,可以增加烧录过程的可视化界面,提供更友好的用户交互体验。通过形界面的设计,可以让用户更直观地了解烧录过程的进展和结果,提高操作的便捷性和可理解性。 还可以考虑与其他软件或硬件的兼容性。在设计算法时,可以考虑与其他相关软件或硬件的配合使用,提供更广泛的适用性和兼容性。这样,在不同的开发环境中,都可以顺利地使用修改后的 Mdk flash 算法。 最后,可以对算法进行进一步的优化和调整,提高程序的执行效率。通过对算法进行细致的分析和优化,减少时间和空间复杂度,可以使得程序在烧录过程中更快速、更高效地执行。 总之,修改 Mdk flash 算法需要综合考虑存储器利用、错误检测和纠正、用户交互体验、兼容性和算法优化等方面,以提高烧录算法的功能和效能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农夫三犭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值