「吴恩达机器学习」11.应用机器学习的建议
Deciding what to try next
本章节主要讲解了在应用机器学习时的一些建议,重点关注的问题是假如你在开发一个机器学习系统,或者尝试改进一个机器学习系统的性能,你应该如何决定接下来选择哪条道路。
Debugging a learning algorithm
为了解释这个问题,我们继续使用之前的预测房价的例子,假设我们已经完成了正则化线性回归。然而,当你在一组新的房屋数据集上测试假设函数时,却发现预测结果的误差非常大,那么接下来应该怎么做?
- 获取更多的训练集
- 尝试使用更少的特征值
- 尝试获取更多的特征值
- 尝试增加多项式特征(\(x_1^2,x_2^2,x_1x_2,etc.\))
- 尝试减小正则化参数\(\lambda\)
- 尝试增大正则化参数\(\lambda\)
上面几种策略可能是有效的,但是我们不能随机选取一种方法来改进我们的算法,而是应该运用一些机器学习诊断法来帮助我们确定应该使用哪些方法。
Machine learning diagnostic
诊断法:是一种测试方法,通过执行这种测试,能够了解学习算法在哪些方面有效,在哪些方面无效,指导我们更好地提高其表现。
诊断法可能需要花费一些时间,但是绝对比我们随机选择优化方向更节约时间。
Evaluating a hypothesis
本节课主要讲解如何评估假设函数,后面课程讲以此为基础讨论如何避免过拟合和欠拟合的问题。
Evaluating your hypothesis
我们在确定学习算法的参数时,考虑的是选择合适的参数来使得训练误差最小化,但是得到一个非常小的训练误差不一定是一件好事,因为有可能发生过拟合的问题(比如上图)。在只有一个特征(size)的时候,我们可以通过这种可视化的方式来判断假设函数是否过拟合,但是当有非常多的参数的时候,我们就需要另外一种方法来评估我们的假设函数了。
假设我们的数据集只有10个样本,那么我们会在中间画一条线,把数据分成训练集和测试集。通常用70%的数据作为数据集,30%的数据集作为测试集合。
注意:由于这里的数据集没有一定的排列顺序,所以才可以直接划分前面70%作为训练集,否则一般要将数据集随机打乱。
Training/testing procedure for linear regression
评估线性回归:
- 从训练集中学习参数\(\theta\)(最小化训练误差\(J_{train}(\theta)\))
- 采用测试集计算代价函数\(J_{test}(\theta)\)
Training/testing procedure for logistic regression
评估逻辑回归:
-
从训练集中学习参数\(\theta\)
-
计算测试集误差:
\[J_{test}(\theta) = -\frac{1}{m_{test}} \sum_{i=1}^{m_{test}}{y_{test}^{(i)}\log h_\theta(x_{test}^{(i)}) + (1-y_{test}^{(i)})\log h_\theta(x_{test}^{(i)})} \] -
除了计算测试集误差,我们还可以计算误分类比例(Misclassification error or 0/1 misclassification error),对于每一个测试集实例,计算:
\[err(h_\theta, y) = \begin{cases} 1 &\text{if }h(x) \ge 0.5 \space and \space y=0,or \space if h(x) < 0.5 \space and \space y=1 \\ 1 &\text{otherwise} \end{cases} \]
Model selection and training/validation/test sets
主要讲解如何通过数据集来进行模型选择。
我们的参数是通过训练集拟合出来的,因此采用训练集计算出来的训练误差(training error)通常是要小于新出现的数据集计算出来的真实的泛化误差(generalization error)的。
假设我们要在10个不同次数的多项式模型之间选择,那么我们可能会用训练集分别计算求解出每个模型对应的最优化参数\(\theta^{(d)}\),然后用测试集分别计算测试误差\(J(\theta^{(d)})\),然后找出测试误差最小的多项式,假如这里我们选择了\(d=5\)的多项式\(\theta_0+ \cdots + \theta_5x\)。
如果直接使用训练误差选择模型,那么显然越复杂的模型效果肯定越好,但是太复杂的模型却很有可能存在过拟合问题。
那么这个模型的泛化能力如何呢?能否用测试误差\(J(\theta^{(5)})\)进行表示呢?
答案是不行。因为我们这里已经通过测试集选出了多项式的次数\(d\),相当于测试集其实已经作为了我们的训练集,被学习了,所以再用测试集来估计误差就会导致估算出来的泛化误差其实是偏小的。
合理的做法如下:
我们应该把数据集划分为3个部分,使用60%的数据集作为训练集,20%作为验证集,20%作为测试集。
同理,各项数据集都有其对应的误差及计算公式。
模型选择的合理步骤如下:
- 将数据集划分为训练集、验证集和测试集
- 使用训练集训练出10个模型
- 用验证集分别计算10个模型的验证误差\(J_{cv}(\theta^{(d)})\)
- 选择验证误差最小的模型,假设最后选中的模型是\(\theta_0+ \cdots + \theta_4x^4\)
- 采用测试误差(\(J_{test}(\theta^{(4)})\))来评估估计泛化误差
Diagnosing bias vs. variance
当我们的学习算法表现不理想时,要么是偏差比较大,要么是方差比较大,甚至是两者都比较大。换句话说,要么是欠拟合,要么是过拟合问题。因此辨别出具体是哪一类问题,就有助于我们改进学习算法的表现。
通常我们可以把训练误差和验证误差/测试误差与多项式次数的关系绘制在同一张图表上进行分析:
- Bias (underfit):训练误差会很大,\(J_{cv}(\theta) \approx J_{train}(\theta)\),或者验证误差略大于训练误差;
- Variance (overfit):训练误差会很小,\(J_{cv}(\theta) \gg J_{train}(\theta)\)。
Regularization and bias/variance
主要讲解如何选取合适的正则化参数\(\lambda\)。(和选择多项式模型次数的方法类似)
Linear regression with regularization
在训练模型的过程中,我们一般会使用正则化的方法来防止过拟合,但是正则化参数\(\lambda\)如果太大或者太小,也会导致偏差和方差过大的问题,也就是在选择\(\lambda\)的时候需要和选择多项式模型的次数面对类似的问题。
\(\lambda\)非常大的时候,就会导致各项参数被惩罚得非常小,结果约等于0,所以会得到一个平行于x轴的直线,产生欠拟合现象;\(\lambda\)非常小的时候,约等于0,相当于没有加入正则化,那么就有可能会发生过拟合现象。
Choosing the regularization parameter lambda
我们同样把数据集分为训练集、交叉验证集和测试集。
注意:我们在学习的时候是有加入正则化参数项的,但是在计算各项误差的时候不需要加入正则化参数项。
选择正则化参数\(\lambda\)的步骤如下:
- 选择一系列\(\lambda\)值,通常是0-10之间呈现2倍关系的值
- 使用训练集训练出12个不同程度正则化的模型
- 使用验证集分别计算12个模型的验证误差
- 选择验证误差最小的模型,假如这里选择了\(\theta^{(5)}\)
- 计算测试误差\(J_{test}(\theta^{(5)})\)作为模型的泛化误差
Bias/variance as a function of the regularization parameter lambda
我们同样可以把不同\(\lambda\)的验证误差和训练误差函数曲线绘制在图上:
- 当\(\lambda\)较小时,训练误差较小(过拟合)而验证误差较大;
- 当\(\lambda\)较大时,训练误差较大(欠拟合)而验证误差也很大。
Learning curves
主要讲解了学习曲线的概念,学习曲线能够检验学习算法是否正常工作,找出改进的方向。
Learning curves
学习曲线是将训练误差和验证误差作为训练集样本数量的函数绘制的图表。
以下面的二次项模型为例,我们逐步增加训练样本的数量,当m比较小的时候,不进行正则化的训练误差为0,即使进行正则化也只是略大于0,但是训练出来的模型却不能很好的拟合验证集;当m逐渐增大时,训练误差越大,模型逐渐没办法拟合所有的训练数据,但是验证误差也会逐渐减小。
m:训练样本数量。
把上面的过程进行可视化,就得到了学习曲线。
High bias
如何利用学习曲线识别高偏差?
我们以一条直线拟合下面的数据集为例,可以看到,增大数据集对于误差的减小并没有帮助,因为这已经是这个模型能拟合出的误差最小的情况了。
绘制成学习曲线如下:
在高偏差/欠拟合的情况下,增加数据集并不会提高学习效果。
High variance
如何利用学习曲线识别高方差?
我们使用一个非常高次项,并且正则化非常小的模型为例,当训练集比较少时,训练误差很小,但验证误差非常大;随着训练集的增大,训练误差逐渐增大,同时验证误差也逐渐减小。
绘制成学习曲线如下,最终训练误差和验证误差之间会有一个非常大的gap。
在高方差/过拟合的情况下,增加数据集是可以提升学习效果的。
Deciding what to try next (revisited)
我们已经介绍了怎样评价一个学习算法,讨论了模型选择,偏差和方差的问题。本节课主要总结不同优化方法的适用场景。
Debugging a learning algorithm
回到最开始的例子,看一下各个方法分别适用于什么场景:
- Get more training examples -> fixes high variance
- Try smaller sets of features -> fixes high variance
- Try getting additional features -> fixes high bias
- Try adding polynomial features -> fixes high bias
- Try decreasing \(\lambda\) -> fixes high bias
- Try increasing \(\lambda\) -> fixes high variance
Neural networks and overfitting
通常情况下,选择简单的神经网络容易发生欠拟合现象;而复杂的神经网络容易发生过拟合现象,需要使用正则化来修正。但是,使用复杂的神经网络然后通过正则化修正一般情况下都是更好的选择(比起简单的神经网络),除了计算量较大之外。
那么在选择复杂神经网络的时候,我们应该选择一个隐藏层更多的神经元还是更多的隐藏层较少的神经元呢?
我们同样可以通过划分数据集为训练集、验证集和测试集的方式,来选择验证误差最小的模型。