作者:Sam(甄峰) sam_code@hotmail.com
0. 问题的提出:
在构建一个机器学习系统时,如何评估系统的性能?
怎样发现系统的问题所在? 如果选择最有效的改进方向?
这一系列问题在实际工作中非常重要。
举例如下:
在预测房价的机器学习系统训练后,得到一些列参数和一个假设。
但在预测新数据时有较大误差。该如何改进?通常有以下可能的方向:
A. 增加训练样本。
B. 去掉一些特征,以减少参数个数。
C. 找到更多的特征。
D.增加一些多项式特征(如:x1*x1, x1*x2, x2*x2....)
E. 增大正则化参数 lambda.
F. 减小正则化参数 lambda.
改如何选择改进的方向?
1. 机器学习诊断法(Machine Learning
diagnostic):
这个诊断法,用来判断和了解机器学习算法哪里出了问题,以及哪些改进方向才是有意义的。
1.1: 准确评估学习算法的优劣:
想要改进算法或者说改进假设(hypothesis), 需要先准确的评估算法学习到的假设。
在机器学习算法训练中,希望学习到的参数在应用到代价函数
J()时,J()越小越好。
但是否意味着 J()越小,学习算法就越好?
有一种情况:在应用训练数据计算J()和误差时,数值很小。
但应用到新的数据时,却效果很差。这就是泛化性差。就是过拟合的结果。
为了及早发现这种情况,可以把数据集(DataSet)分为两部分。---TrainingSet和TestSet.
分别用来训练和测试。数据比例通常是70% 和30%。
首先使用TrainingSet训练出参数。 在用这个参数推理出TestSet.
看J_test()或者正确率如何。
J_Training()是代价函数应用到TrainingSet上的数值。
J_Test()是代价很熟应道到TestSet上的数值。
1.2:偏差和方差(Bias / variance):
当一个学习算法表现不佳时,通常有几种可能性:
A. 偏差较大(欠拟合)。
B. 方差较大(过拟合)。
如果能够很快确认是高偏差(High Bias)还是高方差(High
Variance)。即可快速找到有效的改进方法。
先通过实际例子,感受一下产生高偏差和高方差的原因。
underfit(欠拟合):主要是因为假设太简单,或者神经网络中神经元太少。
导致TrainingSet的数量再多,也没法很好的拟合。导致高偏差。
overfit(过拟合):主要是假设太复杂,或神经网络中神经元数量太多(w太多)。而TrainingSet数量又太少。不足以找到正确的规律。导致高方差。
高偏差或者高方差有什么特点呢?
还是以上一个例子分析:
当维度合适时,假设可以较好的拟合数据。泛化性也较好。J_Training()和J_Test()都不高。
当维度太大时,J_Train()很低,但泛化性不好,所以J_Test()较高。
所以总结下来:
High Bias(高偏差)时,J_Training()较高。J_Test()也很高。
主要原因是假设太简单。
High
Variance(高方差)时,J_Training()比较小,J_Test()却很高。主要原因是相对数据量,假设太复杂。
1.3: 学习曲线(Learning curves):
学习曲线是种判断方法,让我们方便的测试当前学习算法训练出的假设是处于高偏差,高方差还是两者皆有。
学习曲线的思路就是:改变TrainingSet 数据的个数m. 查看m与J_Training()
J_Test()之间的关系。以确定当前处于那种状态。
如果曲线呈以下情况:
分析:
A.TrainingSet数量m很小时,比如1和或者2个数据。很容易拟合。所以J_Training()很小。
可此时,肯定没有获取正确的规律,所以J_Test()一定会很大。
B. 随着m增长,J_Training()会增加。J_Test()会减小。
C.
如果随着m增加,J_Training()和J_Test()都很大,且相差不多。如图所示。说明此时欠拟合。高偏差。
这时,增加样本数量,J_Training()和J_Test()不会有多大变化。因为是假设太简单,没法学习如此复杂的信息。
如果呈现以下曲线:
A.TrainingSet数量m很小时,比如1和或者2个数据。很容易拟合。所以J_Training()很小。
可此时,肯定没有获取正确的规律,所以J_Test()一定会很大。
B. 随着m增长,J_Training()会增加。J_Test()会减小。
C.
如果随着m增加,J_Training()增大,但相对较小,J_Test()很大,远大于J_Training()。如图所示。说明此时过拟合。高方差。
这时,随着增加样本数量,J_Training()和J_Test()会响应改变。因为原始是相对于假设,数据太少,信息量不够,需要跟多数据。
2. 改进方法的选择:
既然知道了高偏差和高方差,也知道了何种原因导致。所以就可以知道:
A. 增加训练样本。 对高方差有效。
B. 去掉一些特征,以减少参数个数。 对高方差有效。
C. 找到更多的特征。 对高偏差有效(尤其是假设太简单时)
D.增加一些多项式特征(如:x1*x1, x1*x2, x2*x2....)
对高偏差有效。
E. 增大正则化参数 lambda. 对解决高方差有效。
F. 减小正则化参数 lambda. 对解决高偏差有效。
3. 神经网络与欠拟合,过拟合的关系:
当神经网络的隐藏层和其中的神经元很少时(小神经网络), 参数很少,容易出现欠拟合。
当神经网络的隐藏层和神经元较多时,参数很多。训练数据太少时,容易出现过拟合。
越大型的网络,性能会越好。但计算量会加大。
4. 图像分类在神经网络应用中的思路:
图像分类在神经网络的应用中,如何构建网络,如何优化网络的思考:
A.特征数量,通常固定。(HOG/LBP)
B. 因为神经元太多时,计算量会比较大。所以隐藏层数量,神经元数量都从小往大尝试。
C. 把DataSet分为三部分: TrainingSet1(占20%)。 TrainingSet2(占50%),
TestSet(占30%)
D. OpenCV ANN_MLP没有正则项参数。所以不考虑。
训练过程:
1. 从小神经网络开始,使用TrainingSet1开始训练。(训练轮次不要太高。以节约训练时间).
若出现欠拟合。则增加神经元和隐藏层。
2. 逐渐复杂网络,直到出现过拟合。则使用TrainingSet1+TrainingSet2训练。
后期再调整网络复杂度。直到平衡。