- Python 深度学习
- 吕云翔 刘卓然 关捷雄等编著
- 1084字
- 2025-02-28 02:11:32
3.1 模型评估与模型参数选择
如何评估一些训练好的模型并从中选择最优的模型参数?对于给定输入x,若某个模型的输出偏离真实目标值y,则说明模型存在误差;
偏离y的程度可以用关于
和y某个函数L(y,
)表示,作为误差的度量标准,这样的函数L(y,
)称为损失函数。
在某个损失函数度量下,训练集上的平均误差被称为训练误差,测试集上的误差被称为泛化误差。由于我们训练得到一个模型最终的目的是在未知数据上得到尽可能准确的结果,因此泛化误差是衡量一个模型泛化能力的重要标准。
之所以不能把训练误差作为模型参数选择的标准,是因为训练集可能存在两方面问题:一是训练集样本太少,缺乏代表性;二是训练集中本身存在错误的样本,即噪声。
如果片面追求训练误差的最小化,会导致模型参数复杂度增加,使模型过拟合(Overfitting),如图3.1所示。

图3.1 拟合与过拟合
为了选择效果最佳的模型,防止过拟合的问题,通常可以采取的方法有如下两种。
● 使用验证集调参。
● 对损失函数进行正则化。
3.1.1 验证
模型不能过拟合于训练集,否则将不能在测试集上得到最优结果;但是否能直接以测试集上的表现来选择模型参数呢?答案是否定的。因为这样的模型参数将会是针对某个特定测试集的,得出的评价标准将会失去其公平性,失去了与其他同类或不同类模型相比较的意义。
这就好比如要证明某位学生学习某门课程的能力比别人强(模型算法的有效性),则需要让他与其他学生听一样的课、做一样的练习(相同的训练集),然后以这些学生没做过的题目测试他们(测试集与训练集不能交叉);但是如果我们直接在测试集上调参,那就相当于让这位学生针对考试题复习,这样与其他学生的测试比较显然是不公平的。
因此参数的选择(即调参)必须在一个独立于训练集和测试集的数据集上进行,这样的用于模型调参的数据集被称为开发集或验证集。
然而很多时候我们能得到的数据量非常有限,这时我们可以不显式地使用验证集,而是重复使用训练集和测试集,也就是交叉验证。常用的交叉验证方法有如下两种。
● 简单交叉验证:在训练集上使用不同超参数训练,再使用测试集选出最佳的一组超参数设置。
● K-重交叉验证(K-fold cross validation):将数据集划分成K等份,每次使用其中一份作为测试集(剩余的为训练集),进行K次之后,选择最佳的模型。
3.1.2 正则化
为了避免过拟合,需要选择参数复杂度最小的模型。这是因为如果有两个效果相同的模型,而它们的参数复杂度不相同,那么冗余的复杂度一定是由于过拟合导致的。为了选择复杂度较小的模型,需在优化目标中加入正则化项,以惩罚冗余的复杂度:

其中,θ为模型参数;L(y,;θ)为原来的损失函数;J(θ)是正则化项;λ用于调整正则化项的权重。正则化项通常为θ的某阶向量范数。