Deep Learning阅读笔记:Chapter 5—Machine Learning Basics(1)

第五章的内容比较多,因此打算拆分着写,这是第一部分吧。

学习算法(iaL'weaurnin'zg Alghorithmsa)

Task Tn,Performance P,Experience E

性能度量P(The Performance Measure):P是特定于系统所设定的任务T的。对于分类相关的任务,P通常是准确率(accuracy),或是传递同样信息的错误率(error rate),错误率也可以叫做0-1loss(如果结果是正确的,则loss=0,反之loss=1)。对于估计概率密度的任务,衡量准确率是没有意义的,这时候通常用模型在样本点上的概率对数的的平均值。

经验E(The Experience):根据经验可将机器学习分为监督学习(supervised learning)和无监督学习(unsupervised learning)两大类。无监督学习涉及到观察随机变量x的多个样本,以学习出概率分布p(x)(无监督学习不可能是通过单个样本学习的)。

容量,过拟合和欠拟合(Capacity, Overfitting and Underfitting)

以线性回归为例,我们通过最小化训练集上的误差来训练模型:

(MSE:mean square error)

然而我们真正关注的是测试集上的误差:

那么,当我们只能观测到训练数据集时如何训练模型以影响测试集上的效果呢:如果训练集和测试集是任意收集的,则没有办法(也就是训练集和测试集没有任何关系,无法从一个的规律推测另一个的规律);但如果对训练集和测试集的收集方法进行一些假设,就能对算法进行改进——假设每个数据集中的样本都是彼此相互独立的 (independent),并且训练集和测试集是同分布的 (identically distributed),采样自相同的分布(即独立同分布:i.i.d.)。只有在这种情况下,降低训练误差才对所有数据有意义,训练误差一定意义上能代表测试误差(因为是同分布的),同时因为只是同分布,测试集和训练集数据不完全一样,因此误差之间必然会存在一定差值,不会完全相同(但大体上通过训练集调整的误差方向是适合测试集的)。

衡量一个机器学习算法的表现,主要从以下两个方面:

1. 降低训练误差

2. 降低训练误差和测试误差之间的差值

第一项不足会产生underfitting的结果(表示模型拟合能力不足,连训练集都没有充分利用),第二项不足会导致overfitting(过度拟合了训练集的所有特征,过于贴合训练集数据,无法泛化到一般情况比如测试集)。通过改变模型的容量可以控制一个模型underfitting和overfitting的程度。

容量:模型的容量是其拟合各种函数的能力,容量低的模型可能无法很好地拟合训练集(underfitting)——能够拟合训练集的假设空间根本不在模型容量内,容量高可能会导致模型拟合了不会出现在测试集中的训练集数据的特点,也就是过拟合。

容量的控制:

1. 假设空间:假设空间是个函数集合,其中的函数是基于问题的所有假设(hypothesis)情况,是能够选为解决方案的学习算法。例如,线性回归函数将关于其输入的所有线性函数作为假设空间。广义线性回归的假设空间包括多项式函数,而非仅有线性函数。这样增加了模型的容量。通过假设空间来改变模型容量,通常就是改变输入特征的数量,也就是在选择不同的模型。

2. 表示容量(representation capacity):由于参数的不同,一种模型可以表示不同的拟合方法,也就是有一群函数族。表示容量大,学习算法就可以在一个较大的函数族中寻找参数,更有可能好地拟合训练集。从函数族中得到最优函数是很难的,通常只会得到一个能够使训练误差快速下降的函数。

3. 有效容量(effective capacity):学习算法的有效容量通常小于模型的表示容量,因为优化算法的不完美可能会导致一些点找不到或者找错,使得一些模型无法得到(找到的是局部最优点)。

量化模型容量的方法:VC维度(Vapnik-Chervonenkis dimension, VC)——其度量二元分类器的模型容量,表示能够分类的训练样本的最大数目。关于VC维的介绍:https://blog.csdn.net/baimafujinji/article/details/44856089,可以知道二维空间的VC维就是3。

尽管更简单的函数泛化误差会更小(训练误差与测试误差间的差距),但首要还是要选择复杂一点的函数拟合训练集,降低训练误差。当模型容量上升时,训练误差通常会下降(能够表示更多的函数,更有可能拟合训练集),直到其渐进最小可能误差(假设误差度量有最小值)。通常泛化误差是一个关于模型容量的U型函数曲线:

非参数模型对应容量任意高的极限情况(没懂非参数和高容量的关系):但其中有实用的非参数模型,其复杂度可以和训练集大小相关——最近邻回归(nearest neighbor regression)。最近邻回归存储了所有训练集的X和y,需要为测试点x分类时,查询训练集中离该点最近的点,返回相关的回归目标:\hat{y}=y_{i},i=argmin\left \| X_{i,:} -x\right \|_{2}^{2}误差。

贝叶斯误差(Bayes error):内容来自https://www.zhihu.com/question/263546637

定义:是指在现有特征集上,任意可以基于特征输入进行随机输出的分类器所能达到最小误差,也可以叫做最小误差。

特点:

1. 给定特征集后的最小误差:即可以认为我们的训练集无限大且已经按真实分布穷举了所有可能的特征组合后,任何分类器所能达到的误差下限。

2. 概率特性:“最小误差”是限定在概率随机性条件下的 (-- 如果是开了实例级别的“天眼”的最小误差,显然无论任何情形下最小误差都是0,这个概念将没有任何意义。贝叶斯误差只能开概率级别的“天眼”)。即:

    2.1)如果场景是给定特征输入,输出值是唯一的,则贝叶斯误差为0。例如特征是人的净高和鞋底厚度,回归目标是人的头顶距离地面高度。那贝叶斯误差为0. 在训练集准确的情况下,线性回归也可以达到相同误差。

    2.2)反之,如果输出值是有一定随机性的,贝叶斯误差是此时选概率最大输出作为输出值所能达到的误差。比如,特征为头发长短,目标值为男、女分类label。假设在长发下,真实世界中女性概率90%,10%男性。反之女性10%,男性90%。那么贝叶斯概率误差即为认定长发为女,短发为男的误差。显然其贝叶斯误差为10%。

(分布是真实的,但输出只能是一个值,所以会有误差。如果输出也可以是分布,那就没有误差了。)

另一种思路:真实分布只是一个理想的分布,可以说现实中不存在这样的分布。比如我们知道人的身高服从正态分布,即当人的数量接近无穷大时,分布服从中心极限原理。然而现实中人的数量不可能无穷大的,所以现实中的预测会和理想分布存在一定的误差。

训练误差和泛化误差会随着训练集的大小发生变化,但泛化误差的期望不会随着训练样本数目而改变。对于非参数模型,更多的数据可以提高泛化能力,慢慢接近最佳可能的泛化误差。固定参数模型的模型容量若是小于最优容量,误差值大于贝叶斯误差。若是一个模型已经有最优容量,但训练误差和泛化误差之间仍有很大差距,则可以增多训练样本数目。

没有免费午餐定理(The No Free Lunch Theorem)

学习算法的理论表示我们可以从部分样本数据泛化到整体上,但逻辑上如果想要推导出集合整体的规律,必须要知道每一个样本的信息。机器学习应用了概率的规则(可能性),表示我们找到的只是所关注的集合中大部分样本所符合的可能正确的规律。

no free lunch theorem:对未见过的样本点进行分类时,所有的分类算法在所有可能的数据生成分布上的误差平均值是相同的(数据真实的分布是未知的。在所有可能的分布中,我们的分类算法可能比较贴近其中一部分分布--误差小,因此也一定偏离一些分布--误差大,但该算法在这些所有可能分布上的平均误差是相同的)。这个意义上看,所有分类算法的效果是一样的,没有更好的更差的。一个极其复杂的分类算法甚至和一个只会把所有样本点分到一个类别的分类器具有一样的性能。

但该定理是考虑了数据的所有分布可能,事实上我们探讨的问题数据是有特定分布的,我们不需要找到通用的学习算法,只需要找到已经获取了经验(Experience—E)的那种情况的分布所适用的算法。

正则化(Regularization)

通过没有免费午餐定理我们知道要设计特定问题的学习算法,这种特定性可以通过设置偏好(preference)来体现。目前改变学习算法的方法都是通过改变假设空间的容量进行的,设置偏好(preference)是另一种方法。权值衰减(weight decay)就是一种偏好的体现:偏好更小的解,细节如下:以线性回归为例,修改cost function。

J(w)=MSE_{train}+\lambda w^{T}w

J(w)中除了MSE误差,加上了一项\lambda w^{T}w,这项使得线性回归会偏向平方L^{2}范数小的权重。\lambda是设置好的值,控制着权重衰减的程度。若是\lambda为0,则没有衰减,\lambda越大,权重衰减越厉害。因此最小化J(w)就可以看作是在拟合训练数据和偏好小范数权重间的平衡。权重是线性拟合中的斜率,说明会偏向斜率小的函数,或者把权重放在小的特征上(小的特征变化也小,误差也小,权重作用在上面也只会产生小变化)。为什么加上带有\lambda w^{T}w的正则项可以起到如上的作用呢?具体推断如下:

J(w)=MSE_{train}+\lambda w^{T}w分别对w和b求偏导(梯度下降法):

\frac{\partial }{\partial w}J(w)=\frac{\partial }{\partial w}MSE_{train}+2\lambda w\frac{\partial }{\partial b}J(w)=\frac{\partial }{\partial b}MSE_{train}

上式和之前不同的只有对w的偏导,多了一项2\lambda w,这会影响到参数w的更新:

w=w-\epsilon\frac{\partial }{\partial w}J(w)=w-\epsilon \frac{\partial }{\partial w}MSE_{train}-2\epsilon \lambda w

    =(1-2\epsilon \lambda)w-\epsilon \frac{\partial }{\partial w}MSE_{train}

可以看到w在更新的过程中大小受到了\lambda的调节,\lambda\epsilon均大于0,因此称为权重衰减(weight decay)。所谓的权重衰减可以一定程度上避免过拟合,是因为:

1. 较小的权重表示模型是更简单的,网络复杂度更低

2. 数学的角度看:过拟合时权重往往较大,因为要较好地拟合每一个点,会导致拟合曲线是波动较大的,这就导致有些区间导数很大,但由于自变量的值是可大可小的,所以必须要权重较大才能保证大的导数。而权重衰减限制了权重不要过大,因此一定程度上避免了过拟合的情况。

以上解释参考博客:https://blog.csdn.net/program_developer/article/details/80867468,可结合下图理解。

左图\lambda过大的情况,导致正则项里的w十分小,拟合不好,导致了欠拟合;中间的图是恰当的\lambda;右图是\lambda趋于0的情况,导致正则项几乎无作用,就会过拟合。

权值衰减这种正则化的偏好是通过显式地在cost function中加入一项达到的,还有很多其他隐式和显式的方法来表示偏好(preference)。正则化是我们对学习算法所做的降低泛化误差而不是训练误差的修改。

超参数和验证集(Hyperparameters and Validation Sets)

超参数(hyperparameter)也是参数,是未知的变量,比如回归问题中的多项式次数,正则化因子\lambda。不过区别于普通的参数,超参数一般是由人工手动设置,因为超参数一般很难优化,另一方面超参数若通过训练得到,则会使得模型向容量变大的方向改变,因为模型容量大会带来小的误差,但这会导致过拟合。为了设置较好的超参数,引入了验证集(validation sets)。

验证集(validation sets)是为了帮助选出好的超参数:设置几个超参数的值,在验证集上验证,选择误差小的那个。

验证集是从一般的训练集中划分出来的,也就是所谓的大训练集划分为小训练集和验证集,彼此之间不相交。加上测试集,训练集,验证集,这三者之间无交集。训练集和验证集的比例一般为8:2。

注:验证集会低估泛化误差,因此最终的性能测试依然是在测试集上进行。

交叉验证(cross validation):

验证集用来判断泛化误差,若是验证集上的效果和训练集差很多,则需要考虑是否过拟合了(训练集上拟合得很好,但是验证集上效果不好,说明过度拟合了训练集的数据特征)。由于验证集是从训练集分出来的,训练集小,则验证集更小,对泛化误差的判断则不够准确。为了解决小训练集带来的问题,使用k-fold-cross-validation:k指的是验证k次,将k次的误差取平均得到最终误差,对于想要指定的超参数,其每一个候选值都要进行这k次验证后取平均的过程,然后这些候选值的误差进行比较后选择误差最小的一个值。cross指的是这k次验证中,每一次的训练集和验证集都是不同的,也就是对整体大训练集进行不同的划分。每一次划分中,大训练集可以划分为k份,其中1份作为验证集,剩下的k-1份作为训练集,得到一个误差结果。接下来每一次划分选择的验证集都是那k-1份中的一个,刚好划分的k份每一份都作为过验证集,因此是重复k次验证取平均。这样就相当于整个大训练集都作为过验证集使用,而不是其中一小部分,充分利用了数据,避免了小数据集带来的不准确性。具体算法如下:

1. 将数据集D分为互斥的k个子集\left \{ D_{i} \right \},并集为D;

2. 除去\left \{ D_{i} \right \},取其他k-1个子集,训练得到算法f_{i}

3. 将算法f_{i}放在\left \{ D_{i} \right \}上作测试(将\left \{ D_{i} \right \}用作测试集),得到标量e_{i}

4. 重复2、3步,会得到由k个标量组成的误差向量e;

5. e的均值即最终结果:估计的泛化误差。

举例:假设建立一个BP神经网络,其中,隐含层的节点数目是一个待确定的超参数。此时我们可以这么做:

  1. 先将节点数设定为某一具体的值。
  2. 由交叉验证法,选出训练集和测试集。
  3. 由训练集训练出模型,再由验证集检测误差。
  4. 重复2、3步骤kk次,取均值,作为该节点数下的交叉验证误差
  5. 改变节点数,重复2-4步骤,直至选出交叉验证误差最小对应的节点数
  6. 将该节点数作为最优节点数,并重新训练出模型。
  7. 测试误差即估计的泛化误差。

书中的算法讲述如下图:

以上内容参考自博客:https://www.cnblogs.com/RyanXing/p/9462944.html#交叉验证

自从放假就开始了堕落之路,一星期光看剧了。。。今天良心未泯,写一篇笔记督促一下自己。明天妈妈就要来北京啦,然后就要去南京过年加旅游了,但愿能写一篇笔记!

猜你喜欢

转载自blog.csdn.net/lynlindasy/article/details/86578898