模型训练过程中的训练集、训练开发集、开发集和测试集总结
36.什么时候你应该在不同分布上做训练和测试
当你的猫app已经上传10000张图,你已经人工标记它们有没有猫,同时你有200000张互联网上下载的图,这时你要怎么划分训练开发测试集呢?
当你训练深度学习模型时,可能必须用到那200000张图,那么训练和测试集的分布就不同,这会怎样影响你的工作呢?
当然将210000张图片随机分裂到训练开发测试集是一种方法,但我(吴恩达)不推荐这种方法,记住选择开发测试集的推荐方法是:选择你未来预期会得到的数据来作为开发测试集。
大多数学术文章假设训练开发测试集的分布相同,在机器学习的早期,数据稀缺,常常仅有一个服从同一分布的数据集,所以这一假设能够满足。
但在大数据时代,从不同分布所收集来的数据,我们也希望能利用上,因为它能提供大量信息。
对于猫检测这个问题,我们会将猫app上传的5000张图放入开发测试集,训练集大小为205000。
第二个场景,假设你在做一个语音识别系统为一个导航app来转录得地址,你有20000个用户说的街道地址,500000个语音片段用户说其他的内容,这时你可能用10000个地址样本作为开发测试集,其他用作训练集。
我们继续假设你的开发测试集具有相同分布,但是必须明白,训练和开发/测试集分布不同,会带来一些特殊的挑战。
Ps:有些学术研究是训练测试分布不同,但理论和实践中有很大的不同,如果你的训练测试不同分布,那么你的结果很大程度受到运气的影响。
37.如何决定怎么使用你的数据
延续上一章所说,早期的机器学习算法(需要手动设计特征,用一个简单的分类器),将20000张互联图片纳入训练集是很可能带来风险的。但到了大型神经网络时期,这一风险大大削减。这一现象依赖于是存在一个映射能在两种数据上都能表现良好。换句话说,这里存在一个系统不管输入是用户上传的图片还是互联网图片都能可靠的预测标签,即使不知道图片的来源。
加入20000张图片后有以下影响:
1.它给你神经网络更多猫是怎么不是怎样的样本。因为用户上传和互联网图片都有共同点,你的神经网络能从互联网图片中学到能应用到用户上传图片的知识。
2.它迫使神经网络用一些容量来学习互联网图片独特的特征。如果这些特点和用户上传图片很不同,那么因此,它会损伤你的算法的表现。
幸运的是,如果你有足够的容量,那么这可能不是一个重要的问题。如果你没有足够大的神经网络,那么你应该花费更大的精力在你的训练开发测试集保持同分布上。
如果你有大量的无关数据,它们跟猫毫无关系,那么就不要把这些数据当做负样本,因为上面所说的第一条的好处可以忽略不计,学到的东西无法应用到你打开发测试集。
38.如何决定是否包括不一致的数据
假设你要预测纽约的房价,如果你有底特律的房价,房价比纽约低很多,那么你应该将这些数据加入到你的训练集中吗?
房子在底特律还是在纽约会极大影响房价,如果你仅关心纽约的房价,那么最好不加入底特律的数据。
那么纽约底特律样本和手机互联网猫图有什么不同吗?
猫图不同点在于,一个系统可以可靠的预测y,不论输入是来自互联网图片还是app图片,因此互联网图片和算法系统一致,而底特律纽约则不一致。
Ps:事实上可以增加一个新的房子所在地的特征,但是在实际应用中并不常见。
39.给数据权重
在实际应用中,互联图片数量是用户上传图片数量的40倍,如果你没有大量的计算资源,那么你给互联网图片更低的权重作为妥协。这种加权重的方式仅仅当你怀疑添加的数据有不同于开发测试集的分布,或者添加的数据远多于和开发测试集相同分布的数据。
40.从训练集到开发集的泛化
接着上面的问题讨论,如果你的算法在开发测试集上的误差比你预期的更大,那么可能的原因有:
1.在训练集上的表现也不够好,偏差较大。
2,在训练集上表现良好,但是不能很好地泛化到和训练集同分布的数据集上,方差较大。
3.在和训练集同分布的数据集上表现良好,但在开发和测试集上表现不好,称为data mismatch。
例如,假设人类能在猫识别任务上达到近乎完美的表现,你的算法能达到:
- 1%的训练误差
- 1.5%的同分布数据集误差
- 10%的验证集误差
那么,你可能会尝试让训练数据更接近验证/测试数据,我们之后会讨论一些相关技术。
为了诊断到底是什么原因,另外构造一个数据集是非常有必要的,即:一个训练集用作训练,一个“Training dev”数据集不用做训练。
那么现在你有四个数据集:
- 训练集:算法学习的数据集(来自互联网的图片和从手机app上传的图片),它不需要服从我们真正在乎的分布。
- 训练开发集:和训练集同一分布,不用很大
- 开发集:和测试集同一分布,反应了我们正在在乎的分布。
- 测试集:和开发集同一分布。
那么现在可以评价:
- 训练集误差
- 模型泛化到同分布数据集上的能力
- 模型在你真正在乎的分布上的表现
41.识别偏差、方差和数据不匹配
假设人能在猫识别上达到0%的误差,假设你的算法:
- 1%的训练误差
- 5%的训练验证误差
- 5%的验证误差
这告诉你的算法高方差。现在假设你的算法:
- 10%的训练误差
- 11%的训练验证误差
- 12%的验证误差
这告诉你,你的算法有高偏差。一个算法可能同时遭遇到高偏差、高方差和数据不匹配的任意组合,如:
- 10%的训练误差
- 11%的训练验证误差
- 20%的验证误差
为了更方便的理解各种不同的误差之间的联系,可以把他们画成一个表
你也可以尝试将空着的两个格子填上,也许你能获得一些算法在不同分布上的效果。对于中间第二格,可以将一小部分B类分布数据加入训练集,然后单独将这一部分的训练误差拿出来。
42.处理数据不匹配
假设你开发了一个语音识别系统,在训练集和训练开发集上表现很好,但是在测试集上表现很差:你的算法有数据不匹配的问题。那么我建议你:(i)试着去弄明白训练和验证集上什么属性有不同(ii)试着去获取更多的符合开发集分布的数据
例如,你在验证集上做错误分析,假设你发现你的算法系统表现差是因为大多数验证集的语音都是在车内获得的,而训练集中的例子都是在安静背景下获得的,背景音极大的损伤了你算法的表现。这种情况下,你可能会获取更多的车内语音来扩充你的训练集。误差分析的主要目的就是获知训练和开发集的重要不同,就是这个原因导致了数据不匹配。
如果你的训练和训练测试集包括了车内语音,你需要再检查一下你的的算法系统在这一数据子集上的表现。如果它在训练集的车内语音上表现良好,而在训练开发集上的车内语音上表现不好,这进一步证实了需要获取更多的车内语言。
但不幸的是,这一过程没有保证。例如,如果你没办法获得更多地和验证集同分布的数据,那么你可能找不到一个清晰的道路来提升表现。
43.人工数据合成
你的语音系统需要更多类似从车内获取的数据,那么人工合成的方法可能更加简单。
假设你获取了大量车或者路上的噪音,你可以从网上下载这些数据。假设你也有一个很大的人在安静背景下说话的训练集,那么如果你把这两个数据“相加”,你将获得类似人在噪音背景下说话的语音。再例如,你可以发现猫识别器项目中,验证集中的手机拍摄的图片很多都有运动模糊,这个时候可以将图片加上运动模糊,让他们更像验证集里的图片。
需要注意的是:合成数据的方法,有时创造的数据对人来说是真实的,而不是对电脑来说是真实的。例如你有1000个小时的语音训练集,而仅有1个小时的车噪音,那么合成的数据就会反复使用这段噪音,当人去判断时,噪音对人来说都差不多,而对电脑而言,它会对这段噪音过拟合,所以它的泛化能力可能会很差。
另外,假设你有1000个小时的车噪音,但它仅从10台不同的车上提取出来的,那么,这种情况下,可能算法会对着10辆车过拟合并对其他车上的语音表现的很差。不幸的是,这些问题很难被发现。
再来一个例子,假设你要做一个计算机视觉系统来识别汽车,假设你和一家游戏公司有合作,这家游戏公司有些车的电脑模型,为了训练你的模型,你用车的电脑模型合成了很多车的图片,即使合成的图片看上去很真实,但是可能这种方法也不会有效,这个游戏可能在整个游戏里设计20辆车。构建车的3D模型是很贵的,你可能不会注意到你一直在看同一辆车,只不过颜色不同罢了,但同所有跑在路上的车来说,这只是分布里的很小的一部分。因此,如果你训练集里100000个样本都来自20辆车,那么你的算法将对这20辆车过拟合,并且很难泛化。
当你合成数据时,必须考虑到是否真的合成了具有代表性的数据。同时避免产生能分辨合成和非合成数据的特性,例如所有车都来自20辆原型,所有噪音都来自1个小时的噪声,这一建议很难被遵循。
当进行数据合成时,在产生数据前我的团队经常花费数周的时间在一些细节上,使其接近真实分布,以便具有显著效果。但是如果你能能正确的获得这些细节,你就能一下子获得一个比原来大很多的数据集。
36.什么时候你应该在不同分布上做训练和测试
当你的猫app已经上传10000张图,你已经人工标记它们有没有猫,同时你有200000张互联网上下载的图,这时你要怎么划分训练开发测试集呢?
当你训练深度学习模型时,可能必须用到那200000张图,那么训练和测试集的分布就不同,这会怎样影响你的工作呢?
当然将210000张图片随机分裂到训练开发测试集是一种方法,但我(吴恩达)不推荐这种方法,记住选择开发测试集的推荐方法是:选择你未来预期会得到的数据来作为开发测试集。
大多数学术文章假设训练开发测试集的分布相同,在机器学习的早期,数据稀缺,常常仅有一个服从同一分布的数据集,所以这一假设能够满足。
但在大数据时代,从不同分布所收集来的数据,我们也希望能利用上,因为它能提供大量信息。
对于猫检测这个问题,我们会将猫app上传的5000张图放入开发测试集,训练集大小为205000。
第二个场景,假设你在做一个语音识别系统为一个导航app来转录得地址,你有20000个用户说的街道地址,500000个语音片段用户说其他的内容,这时你可能用10000个地址样本作为开发测试集,其他用作训练集。
我们继续假设你的开发测试集具有相同分布,但是必须明白,训练和开发/测试集分布不同,会带来一些特殊的挑战。
Ps:有些学术研究是训练测试分布不同,但理论和实践中有很大的不同,如果你的训练测试不同分布,那么你的结果很大程度受到运气的影响。
37.如何决定怎么使用你的数据
延续上一章所说,早期的机器学习算法(需要手动设计特征,用一个简单的分类器),将20000张互联图片纳入训练集是很可能带来风险的。但到了大型神经网络时期,这一风险大大削减。这一现象依赖于是存在一个映射能在两种数据上都能表现良好。换句话说,这里存在一个系统不管输入是用户上传的图片还是互联网图片都能可靠的预测标签,即使不知道图片的来源。
加入20000张图片后有以下影响:
1.它给你神经网络更多猫是怎么不是怎样的样本。因为用户上传和互联网图片都有共同点,你的神经网络能从互联网图片中学到能应用到用户上传图片的知识。
2.它迫使神经网络用一些容量来学习互联网图片独特的特征。如果这些特点和用户上传图片很不同,那么因此,它会损伤你的算法的表现。
幸运的是,如果你有足够的容量,那么这可能不是一个重要的问题。如果你没有足够大的神经网络,那么你应该花费更大的精力在你的训练开发测试集保持同分布上。
如果你有大量的无关数据,它们跟猫毫无关系,那么就不要把这些数据当做负样本,因为上面所说的第一条的好处可以忽略不计,学到的东西无法应用到你打开发测试集。
38.如何决定是否包括不一致的数据
假设你要预测纽约的房价,如果你有底特律的房价,房价比纽约低很多,那么你应该将这些数据加入到你的训练集中吗?
房子在底特律还是在纽约会极大影响房价,如果你仅关心纽约的房价,那么最好不加入底特律的数据。
那么纽约底特律样本和手机互联网猫图有什么不同吗?
猫图不同点在于,一个系统可以可靠的预测y,不论输入是来自互联网图片还是app图片,因此互联网图片和算法系统一致,而底特律纽约则不一致。
Ps:事实上可以增加一个新的房子所在地的特征,但是在实际应用中并不常见。
39.给数据权重
在实际应用中,互联图片数量是用户上传图片数量的40倍,如果你没有大量的计算资源,那么你给互联网图片更低的权重作为妥协。这种加权重的方式仅仅当你怀疑添加的数据有不同于开发测试集的分布,或者添加的数据远多于和开发测试集相同分布的数据。
40.从训练集到开发集的泛化
接着上面的问题讨论,如果你的算法在开发测试集上的误差比你预期的更大,那么可能的原因有:
1.在训练集上的表现也不够好,偏差较大。
2,在训练集上表现良好,但是不能很好地泛化到和训练集同分布的数据集上,方差较大。
3.在和训练集同分布的数据集上表现良好,但在开发和测试集上表现不好,称为data mismatch。
例如,假设人类能在猫识别任务上达到近乎完美的表现,你的算法能达到:
- 1%的训练误差
- 1.5%的同分布数据集误差
- 10%的验证集误差
那么,你可能会尝试让训练数据更接近验证/测试数据,我们之后会讨论一些相关技术。
为了诊断到底是什么原因,另外构造一个数据集是非常有必要的,即:一个训练集用作训练,一个“Training dev”数据集不用做训练。
那么现在你有四个数据集:
- 训练集:算法学习的数据集(来自互联网的图片和从手机app上传的图片),它不需要服从我们真正在乎的分布。
- 训练开发集:和训练集同一分布,不用很大
- 开发集:和测试集同一分布,反应了我们正在在乎的分布。
- 测试集:和开发集同一分布。
那么现在可以评价:
- 训练集误差
- 模型泛化到同分布数据集上的能力
- 模型在你真正在乎的分布上的表现
41.识别偏差、方差和数据不匹配
假设人能在猫识别上达到0%的误差,假设你的算法:
- 1%的训练误差
- 5%的训练验证误差
- 5%的验证误差
这告诉你的算法高方差。现在假设你的算法:
- 10%的训练误差
- 11%的训练验证误差
- 12%的验证误差
这告诉你,你的算法有高偏差。一个算法可能同时遭遇到高偏差、高方差和数据不匹配的任意组合,如:
- 10%的训练误差
- 11%的训练验证误差
- 20%的验证误差
为了更方便的理解各种不同的误差之间的联系,可以把他们画成一个表
你也可以尝试将空着的两个格子填上,也许你能获得一些算法在不同分布上的效果。对于中间第二格,可以将一小部分B类分布数据加入训练集,然后单独将这一部分的训练误差拿出来。
42.处理数据不匹配
假设你开发了一个语音识别系统,在训练集和训练开发集上表现很好,但是在测试集上表现很差:你的算法有数据不匹配的问题。那么我建议你:(i)试着去弄明白训练和验证集上什么属性有不同(ii)试着去获取更多的符合开发集分布的数据
例如,你在验证集上做错误分析,假设你发现你的算法系统表现差是因为大多数验证集的语音都是在车内获得的,而训练集中的例子都是在安静背景下获得的,背景音极大的损伤了你算法的表现。这种情况下,你可能会获取更多的车内语音来扩充你的训练集。误差分析的主要目的就是获知训练和开发集的重要不同,就是这个原因导致了数据不匹配。
如果你的训练和训练测试集包括了车内语音,你需要再检查一下你的的算法系统在这一数据子集上的表现。如果它在训练集的车内语音上表现良好,而在训练开发集上的车内语音上表现不好,这进一步证实了需要获取更多的车内语言。
但不幸的是,这一过程没有保证。例如,如果你没办法获得更多地和验证集同分布的数据,那么你可能找不到一个清晰的道路来提升表现。
43.人工数据合成
你的语音系统需要更多类似从车内获取的数据,那么人工合成的方法可能更加简单。
假设你获取了大量车或者路上的噪音,你可以从网上下载这些数据。假设你也有一个很大的人在安静背景下说话的训练集,那么如果你把这两个数据“相加”,你将获得类似人在噪音背景下说话的语音。再例如,你可以发现猫识别器项目中,验证集中的手机拍摄的图片很多都有运动模糊,这个时候可以将图片加上运动模糊,让他们更像验证集里的图片。
需要注意的是:合成数据的方法,有时创造的数据对人来说是真实的,而不是对电脑来说是真实的。例如你有1000个小时的语音训练集,而仅有1个小时的车噪音,那么合成的数据就会反复使用这段噪音,当人去判断时,噪音对人来说都差不多,而对电脑而言,它会对这段噪音过拟合,所以它的泛化能力可能会很差。
另外,假设你有1000个小时的车噪音,但它仅从10台不同的车上提取出来的,那么,这种情况下,可能算法会对着10辆车过拟合并对其他车上的语音表现的很差。不幸的是,这些问题很难被发现。
再来一个例子,假设你要做一个计算机视觉系统来识别汽车,假设你和一家游戏公司有合作,这家游戏公司有些车的电脑模型,为了训练你的模型,你用车的电脑模型合成了很多车的图片,即使合成的图片看上去很真实,但是可能这种方法也不会有效,这个游戏可能在整个游戏里设计20辆车。构建车的3D模型是很贵的,你可能不会注意到你一直在看同一辆车,只不过颜色不同罢了,但同所有跑在路上的车来说,这只是分布里的很小的一部分。因此,如果你训练集里100000个样本都来自20辆车,那么你的算法将对这20辆车过拟合,并且很难泛化。
当你合成数据时,必须考虑到是否真的合成了具有代表性的数据。同时避免产生能分辨合成和非合成数据的特性,例如所有车都来自20辆原型,所有噪音都来自1个小时的噪声,这一建议很难被遵循。
当进行数据合成时,在产生数据前我的团队经常花费数周的时间在一些细节上,使其接近真实分布,以便具有显著效果。但是如果你能能正确的获得这些细节,你就能一下子获得一个比原来大很多的数据集。