3 预备知识和符号约定
如果你曾经学习过机器学习的课程(如我在coursera上的machine learning MOOC)
或有应用监督式学习的经验,你将能够理解下面这段文字。
我假设你熟悉监督学习:使用标记训练样本(x,y)学习一个从x映射到y的函数。监督学习包括线性回归,逻辑回归和神经网络。机器学习形式有很多种,但是大多数机器学习的实际应用都是监督学习。
我会频繁提到神经网络(也称为深度学习)。你只需要对他们有一个基本的理解。
如果你不熟悉这里提到的概念,可以看一下Coursera上的前三周的机器学习课程课程地址
4 规模促进了机器学习的发展
深度学习(神经网络)中的很多想法已经存了几十年了。为什么这些想法突然火了呢?
促使近年来进步的最大的驱动因素有两个:
● 大量可用的数据。如今人们在数字设备(笔记本电脑,移动设备等)上花费比以前多得多的时间。这些活动产生了大量的数据,我们可以使用这些数据来训练我们的学习算法。
● 计算能力的提升。仅仅在几年前我们才能够训练足够大的神经网络,以利用我们现在所拥有的巨大的数据量。
具体来说,如果你使用传统的学习算法(如logistic regression),即使你现在拥有更大的数据量,也会出现“高原效应(plateaus)”。也就是说即使你给它更多的数据,它的学习曲线也会变平坦(flattens out),算法效果不再有提升:
就好像这些传统算法并不知道该如何处理我们所拥有的全部数据。
如果你在同一个监督学习任务上训练一个小型的神经网络(NN),你可能会获得略微好些的性能:
这里,“小型神经网络(small NN)”是指仅具有少量隐层神经元/层/参数 的神经网络。最后,如果你训练一个更大的神经网络,你能获得甚至更好的性能:
因此,如果你想要获得最好的性能表现,你需要(i)训练一个非常大的神经网络,使其在上面的绿色曲线上;(ii)拥有大量的数据。
有许多其他的细节(如神经网络的架构)也非常重要,这些方面也有很多创新。但是提高算法性能最可靠的方法仍然是(i)训练更大的神经 和(ii)获得更多的数据。
如何完成(i)和(ii)是极其复杂的。这本书将会详尽地讨论这些细节。我们将从对传统学习算法和神经网络都有用的一般策略开始,并建立对构建深度学习系统的最先进的策略。
1 | 这个图表展示了NN在小数据集下也会做的更好(横轴前半部分)。 |
建立开发集和测试集
5 你的开发集和测试集
让我们回到之前关于猫的图片的例子:你制作了一个移动APP,用户可以上传很多不同事物的图片到你的app上,你想要自动发现关于猫的图片。
你的团队从不同的网站下载大量猫(正样本,positive examples)和非猫(负样本,negative example)的图片,从而获得了一个很大的数据集。他们将这些数据按 70%:30%分为训练集和测试集。利用这些数据,他们构建了一个猫的检测算法,它在训练集和测试集上表现都很好.
但是当你把这个分类器分数到移动APP上时,你会发现它的表现非常糟糕!
发生了什么?
你发现用户上传的图片和你从网站下载的作为训练集的图片有些不同:用户使用手机拍摄的图片分辨率更低,模糊,且照明效果较差。由于你的训练集和测试机数据都来自于网站图片,你的算法没有在你所关心的智能手机图片的实际分布上一般化得很好。
大数据时代之前,在机器学习中人们常使用随机的70%:30%分割训练集和测试集。这种做法有效,但是在越来越多的应用(在这些应用中,训练集的分布(在我们的例子中的网站图像)不同于你最终关心的分布(手机拍摄的图像))中这是个坏主意。
我们通常定义:
● 训练集(Training set)——你在这上面运行你的算法。
● 开发集(Dev/development set)——这部分数据用来调参,选择特征,以及对学习算法做出其他决定。有时也被称为留出交叉验证机(hold-out cross validation set)
● 测试集(Test set)——这部分数据用来评估算法的性能,但不要依靠这部分数据对使用的学习和参数
做出任何决定。
一旦你定义一个开发集(Dev/development set)和测试集(Test set),你的团队将尝试各种想法(例如不同的学习算法参数),看哪一种最好。开发集和测试集能够使你的团队快速看到你的算法做得有多好。
换句话说,#开发集和测试集的目的是指导你的团队对机器学习系统作出最重要的改变。#
所以,你应该做到:
选择开发集和测试集,以反映你期望在未来获得的数据,并希望在上面做得很好
换句话说,你的测试集不应该只是可用数据的30%这么简单,特别是当你期望得到的数据(移动app的图像)和你的训练数据(网页图像)在性质上不太一样时。
如果你尚未发布你的app,也就意味着还没有任何用户,因此可能无法获得你未来想要做得很好的数据。但是你仍然可以尝试去接近这一点。例如,请你的朋友拍一些手机照片并发给你。一旦你的app启动后,你可以使用用户的实际数据更新你的开发/测试集。
如果你真的没有任何方法获取接近你期望的数据,也许你可以使用网站图片作为开始。但是你应该清醒地意识到这种做法可能导致你的系统不能一般化的很好。
有时可能我们需要决定投资多少去获取好的开发集和测试集。切记不要假定你的训练集分布和测试集分布必须是一样的。尝试去挑选能反映你最终想要表现很好的数据作为测试样本,而不是你遇到的任何数据。