目录
训练误差
模型再训练数据上的误差
泛化误差
模型在新数据上的误差,这个其实才是我们关心的重点
E.G.根据模拟考试来预测未来考试的分数
- 在过去的考试表现得很好(训练误差)不代表未来考试一定会好(泛化误差)
- 学生A通过背书在模拟考拿到了很好的成绩——>很有可能拿到一个非常高的成绩
- 学生B直到答案后面的原因——>摸底考试可能不咋地,但是在未来考试中可能会比A考得更好
那我们是如何计算两种误差的呢?通过两种数据集
验证数据集和测试数据集
验证数据集 Validation Dataset:
用来评估模型好坏的数据集
- 例如拿出50%的训练数据
- 不要跟训练数据混在一起(常犯错误)
测试数据集:
只用依次的数据集
- 未来的考试
- 我出家的房子的实际成交价
- 用在Kaggle私有排行榜中的数据集
但是其实这是学术概念,在实际应用中经常处于缺少数据集的状态,于是我们衍生出了下一个概念
K-则交叉验证
在没有足够多数据时使用(这是常态)
算法:
- 将训练数据分割成k块
- For i = 1,...,K 使用第 i 块作为验证数据集,其余的作为训练数据集
- 报告K个验证集误差的平均
- 常用K = 5 OR 10
这里可以看出,如果你的数据集非常的大,K应该小一些,不然训练起来会非常的贵
总结
- 训练数据集:训练模型参数
- 验证数据集:选择模型超参数
- 非大数据集上通常使用K-折交叉验证
过拟合和欠拟合
是一个非常常见的现象
模型容量简单来说就是模型的复杂度,以下是详细定义
模型容量
- 拟合各种函数的能力
- 低容量的模型难以拟合训练数据
- 高容量的模型可以记住所有训练数据
模型容量的影响
从图中可以看出,随着模型复杂程度上升,模型的训练误差是可以降到很低的,甚至理论上可以降到0。但并不是所有数据的训练误差都到0就一定是好的,因为这样意味着数据里的噪声也被模型记住了。所以我们看到我们真正关心的泛化误差在下降到一定程度时候,会随着模型复杂程度上升而上升。意味着你的模型其实是被一些无关信息困扰住了。
所以我们会用泛化误差和训练误差之间的差值变化来判断模型过拟合和欠拟合的程度
但过拟合了也不要害怕,过拟合不是一个很可怕的事情。因为首先你模型的容量得够,之后才能去控制模型的拟合程度,这点是整个深度学习最核心的事情。
估计模型容量
- 我们其实是难以在不同的种类算法之间比较 例如树模型和神经网络
- 但是如果我们给定一个模型种类,那么模型的容量将有两个主要因素:
- 参数的个数
- 参数值的选择范围
数据复杂度
多个重要因素:
- 样本个数
- 每个样本的元素个数
- 时间、空间结构:比如视频就有时间轴的特征
- 多样性:数据分几类
总结
- 模型容量需要匹配数据复杂度,否则可能导致欠拟合和过拟合
- 实际中一般还是需要靠观察训练误差和验证误差
权重衰退 weight decay
权重衰退是最常见的处理过拟合的一种方法
使用均方范数作为硬性限制
通过限制参数值的选择范围来控制模型容量
l是损失,我们的目标还是最小化我们的损失。w,b是我们的参数。
加入限制:
,即w每个元素的值的平方都要小于一个固定值。
但其实一般来说不会直接用这个优化函数,略复杂
通常不限制偏移 b(限不限制其实都差不多)
小的 意味着更强的正则项
使用均方范数作为柔性限制
对于每个 ,都可以找到
使得之前的目标函数等价于下面
这两项优化其实和之前那个硬性限制是一样的
可以通过拉格朗日乘子来证明
超参数 控制了正则项的重要程度
= 0:无作用
->
,w* -> 0
w*是一个最优解权重
当我想控制模型复杂度,不想要模型太复杂的时候,我可以通过增加
来达成我的需求
参数更新法则
总结
- 权重衰退通过L2正则项使得模型参数不会过大,从而控制模型复杂度
- 正则项权重是控制模型复杂度的超参数