Stanford-Andrew Ng《Machine Learning》week3

1. Logistic Regression

1.1 Classification(分类)

现在开始讨论要预测的变量y是离散值的情况下的分类问题,为此将使用Logistic回归算法来处理。Logistic回归算法是一个当今最流行、最广泛使用的学习算法之一。下面是分类问题的一些例子,例如垃圾邮件分类。或是网上交易,例如你有一个卖东西的网站,如果想知道某一个交易是否欺诈,例如是否用盗取的信用卡,或者窃取用户的密码,这也是一种分类问题。或者预测肿瘤是良性肿瘤或是恶性肿瘤。

在所有的这些问题中,我们尝试要预测的输出变量y都是可以有两个取值的变量(例如使用0或1来表示这两种情况),使用0来表示的这一类,还可以称为负类,用1来表示的这一类,还可以叫做正类。所以0可以表示良性肿瘤,1(或者说正类)可以表示恶性肿瘤。到底用0表示正类,还是1表示正类,其实是没有区别的。但通常我们感觉负类就是没有某样东西,例如没有恶性肿瘤,而1即正类,表示具有我们想要寻找的东西,但是到底哪个是正,哪个是负没有明确的规定,也并不重要。

现在先从只包含0和1两类的分类问题开始,之后再讨论多分类问题,例如变量y可以选取0、1、2、3这些值。

所以如何开发一个分类算法呢,下面这个例子是对肿瘤进行恶性或良性分类所得到的数据,在这里,恶性与否只有两个值,0(即否),1(即是)。

所以我们可以做的是对于这个给定的训练集,将之前的线性回归算法,应用到这个训练集,用直线对数据进行拟合,那么或许就能得到下图这样的假设:

如果想要做出假设,你可以做的一件事就是将分类器输出的阈值设为0.5,即纵坐标值为0.5,如果假设输出大于等于0.5,就可以预测y为1,如果小于0.5,就预测y等于0。

因此在阈值这个点的右边,我们将预测为正,因为这些点对应的纵坐标大于0.5,而在阈值点的左边的点,我们将预测为负。

在这个特定例子中,似乎线性拟合得还不错,即使这是一个分类任务。但是,尝试改变一下问题,将横轴延长一点,假设我们有另外一个训练样本位于右边远处,注意这个额外的训练样本,它并没有改变什么,对吧?

看看现在的训练集,显然假设很好,所有在阈值点右边的,都应该被预测为正,在左边的我们应该预测为负。因为从这个训练集来看,如果肿瘤尺寸大于这个阈值,就说明是恶性肿瘤,小于这个阈值,则为良性肿瘤。但是当我们增加这个额外的训练样本以后,如果运行线性回归,那么就会得到另外一条直线来拟合数据,可能会得到下图中的蓝色直线。

现在如果还是将阈值设为0.5,那么这似乎是一个相当差劲的线性回归了,仅仅通过在右边远处添加一个样本,而且这个样本并没有提供任何新信息(也就是说这个样本很明显应该属于恶性肿瘤)。但不知为何,加了这个训练样本之后,使得线性回归对数据的拟合直线从洋红色线变成了蓝色直线,变成了一个更差劲的假设。

将线性回归应用于分类问题,通常并不是一个好的选择,对数据集应用线性回归有时运气好,可能效果很好,但通常并不是一个好的方法,所以不推荐将线性回归用于分类问题。

除此之外,对于分类问题,我们知道Y是0或1,但如果你使用线性回归,假设的输出值将远大于1或远小于0,即使所有的训练样本标签都应该是0或1,而这似乎有些奇怪,即使我们知道标签应该是0或1,但算法的输出值会出现远大于1或远小于0的情况。

所以对于分类问题,我们需要开发一个名叫Logistic回归的算法,这个算法的输出值(或者说是预测值)的范围介于0和1之间,顺便说一下,Logistic回归算法是一种分类算法,因为名字中有回归,所以有些时候可能产生误解,但Logistic回归实际上是一种分类算法,它被命名为这个名字只是由于历史原因,所以不要感到困惑。Logistic回归是一种分类算法,用于标签y是离散值0或1的情况下。

1.2 Hypothesis Representation(假设函数的表示)

之前我们说过,希望我们的分类器输出值在0和1之间,因此需要提出一个假设来满足该性质,让预测值在0和1之间。

当使用线性回归的时候,假设形式是这样的

而对于logistic回归,假设函数是

g函数的定义,如果z是一个实数,那么就有

这个g函数就是sigmoid函数或者说是logistic函数,这个术语logistic函数就是logistic回归的名字来源。

如果将这两个函数合在一起,就能得到假设函数的另一种表示方法

sigmoid函数的图像如下图一样,类似于一个S形,经过(0,0.5)这个点,一端趋近于0,一端趋近于1,横坐标表示z,随着z趋向于负无穷,g(z)趋向于0,而当z趋向于正无穷时,g(z)趋近于1。

而如图所示,g(z)的值在0和1之间,也就说明h(x)一定在0和1之间,有了这个假设函数以后,我们需要做的就是用参数θ拟合我们的数据,所以对于一个给定的训练集,我们需要给参数θ选定一个值。

在此之前,先对假设函数的模型进行解释,当假设输出某个数字时,这个数字代表的就是对于一个输入值x,y=1的概率估计。例如假如一个病人的肿瘤尺寸大小为x,假设h(x)的输出值是0.7,这就表明对于一个特征为x的患者,y=1的概率为0.7,也就是说,很不幸,这个肿瘤有70%或者说是有0.7的可能性是恶性肿瘤。

写成数学表达式就是,如果你熟悉概率的话,应该能看懂这个方程,如果你不太熟悉概率可以这样理解这个表达式,“在给定x的条件下y=1的概率”,即病人的特征为x(肿瘤尺寸)的情况下,这个概率的参数是θ。

因为这是一个分类问题,我们知道y必须是0或1这两个值,因此根据h(x),也可以计算出y等于0的概率,具体地说因为y必须是0或1,所以y=0的概率与y=1的概率相加就等于1。

如果方程有点复杂,可以想象它没有x和θ。

1.3 Decision boundary(决策界限)

在此之前,我们先来进一步理解假设函数何时将y预测为1,什么时候又会将y预测为0,并且更好地理解假设函数的形状,特别是当我们的数据有多个特征时。

假设我们有一个训练集和一个假设函数。

具体来说,假设函数输出的是,给定x和参数θ时,y=1的估计概率。因此,如果我们想预测y=1还是0,我们可以这样做,只要该假设函数输出y=1的概率≥0.5,那么这意味着y更有可能等于1而不是0,所以我们预测y=1。而如果预测y=1的概率小于0.5,那么我们就预测y=0。在这里如果h(x)的值等于0.5,可以预测为正类,也可以预测为负类。

看这个sigmoid函数的曲线图,我们会注意到只要z≥0,g(z)就≥0.5,而由于假设函数为 ,所以只要 ≥ 0,h(x)就大于等于0.5,所以只要 ≥ 0,假设函数就会预测y=1。现在来考虑假设函数预测y=0的情况,类似的,h(x)将会<0.5,只要g(z)<0.5,所以当g(z)<0.5时,假设函数将会预测y=0,又根据,因此只要 <0,就会预测y=0。

总结一下,如果我们要预测y=1还是等于0,取决于估值概率是≥0.5,还是<0.5。这其实就等于说,我们将预测y=1,只要

≥ 0。反之,我们将预测y=0,只要 < 0。

通过这些我们就能更好地理解logistic回归的假设函数是如何做出预测的。

现在假设我们有一个训练集和一个假设函数,如下图所示。

目前,我们还不知道如何拟合此模型中的参数,我们将在后面讨论这个问题,但是假设我们已经拟合好了参数,如下图所示。

这样就有了一个参数选择,让我们试着找出假设函数何时将预测y=1,何时又将预测y=0,根据上面所讲,我们知道y更有可能是1(或者说是y=1的概率 ≥ 0.5),只要满足 ≥ 0,也就是说对于任意一个样本,只要x1、x2满足 -3+x1+x2≥0,我们的假设函数就会认为,或者说会预测y=1。

x1+ x2 ≥ 3这个式子将定义一条直线通过(0,3)和(3,0),如下图所示:

这条直线的右边对应于x1+ x2 ≥ 3,也就是说假设函数预测y=1的区域就是这部分。与此相对,x1 + x2<3的区域,也就是我们预测y=0的区域就是这条直线的左边部分。这条直线被称为Decision Boundary(决策边界)。具体地说,x1 + x2 = 3这条直线对应一系列的点,对应着h(x) = 0.5的区域,决策边界(也就是这条直线),将整个平面分成了两部分,其中一片区域假设函数预测y=1,而另一片区域,假设函数预测y=0。

注意:决策边界是假设函数的一个属性。它包括参数θ0、θ1、θ2,在上面的图中,画出了数据集使之可视化,但是即使去掉这个数据集,这条决策边界以及预测y=1和y=0的区域,它们都是假设函数的属性,决定于它的参数,它不是数据集的属性。

之后将会讨论如何拟合参数,那将使用数据集来确定参数的取值,但是一旦有了确定的参数取值,即有了确定的θ0、θ1、θ2,就能完全确定决策边界,这时,实际上并不需要通过绘制训练集来确定决策边界。

现在,来看一个更复杂的例子。和之前一样使用×表示正样本,表示负样本,给定一个这样的训练集,如下图所示:

怎样才能使用logistic回归拟合这些数据呢?在之前的多项式回归或线性回归中时,我们可以在特征中添加额外的高阶多项式项,所以我们也可以对logistic回归使用相同的方法。具体地说,假设函数如下图所示:

已经添加了两个额外的特征,x1²和x2²,所以现在有5个参数从θ0到θ4,假设现在已经拟合了参数,θ0为-1,θ1和θ2都为0,θ3和θ4都等于1。参数向量如下图所示:

这意味着假设将预测y=1,只要 -1+x1²+x2² ≥ 0,也就是 ≥ 0,如果将-1放到不等式右侧,那么假设就将预测y=1,x1²+x2² ≥1,如果绘制出x1²+x2² =1的曲线,其实也就是以原点为圆心,1为半径的圆。在这个圆的外面就是y=1的区域,这个圆的里面就是y=0的区域。

通过在特征中增加这些复杂的多项式,就可以得到更复杂的决策边界,而不只是用直线分开正负样本。

再次强调:决策边界不是训练集的属性,而是假设本身及其参数的属性,只要给定了参数向量θ,决策边界也就随之确定了。

我们不是用训练集来定义的决策边界,我们是用训练集来拟合参数θ,一旦有了参数θ,它就确定了决策边界。

如果有更高阶的多项式,那么也将得到更复杂的决策边界,参数不同,决策边界也会不同。

1.4 Cost Function(代价函数)

下图是监督学习问题中的logistic回归模型的拟合问题:

我们有一个训练集,里面有m个训练样本,里面的每个样本用n+1维的特征向量表示,同以前一样x0=1,而且因为这是一个分类问题,所以所有的标签y不是0就是1。假设函数的参数是θ,对于这个给定的训练集,我们应该如何拟合参数θ?

在之前建立线性回归模型的时候,我们使用的代价函数如下:

和以前略有不同的地方是,之前是1/2m,而现在将½放到求和符号里面去了,现在用另一种方法来写代价函数,如下图所示:

然后稍微简化一些这个式子,去掉这些上标,会显得方便一些。

对这个代价函数的理解是:它是在输出的预测值是h(x),而实际标签是y的情况下,我们希望学习算法付出的代价。

这个代价函数在线性回归里很好用,但是现在要用在logistic回归里。如果我们可以最小化函数J里面的这个代价函数,它就会正常工作,但实际上,如果使用这个代价函数,它会变成参数θ的非凸函数

非凸函数的意思是对于这样一个代价函数J(θ),对于logistic回归来说,这里的假设函数h(θ)是非线性的,如果用这个sigmoid函数计算Cost函数,再把这个Cost项代入J(θ)的式子中,画出J(θ)图像,就会发现J(θ)可能是下图中的这个形状,拥有许多局部最优值,这种函数的术语是non convex function(非凸函数)

如果你将梯度下降用在一个这样的函数上,就无法保证能收敛到全局最小值。因此,我们希望我们的代价函数J(θ)是一个凸函数(弓形函数)。如果对一个凸函数使用梯度下降法,就能保证梯度下降法会收敛到该函数的全局最小值。

但使用这个平方代价函数的问题是,因为假设函数h(x)是非常非线性的sigmoid函数,如果用平方函数定义它的话,这就导致了J(θ)是一个非凸函数。

所以就需要另外找一个不同的代价函数,它应该是凸函数,才能让我们使用很好的算法(例如:梯度下降法),而且要保证能找到全局最小值。logistic回归的代价函数如下所示:

这似乎是一个很复杂的函数,但我们先来画出这个函数来直观地感受一下。假设函数的输出值是在0和1之间的,所以h(x)的值在0和1之间变化。

理解这个函数为什么是这样的一个方式是,可以先画出logz的图像,横轴为z,显然这里的z就是代表h(x)的角色,-logz就是翻转一下符号,而我们只需要关心z在0到1之间的那一段。

这个代价函数有一些很好的性质。首先,你会发现如果y=1,而且h(x)=1。(也就是说如果假设函数的预测值是1,而且y刚好等于预测值),那么这个代价值就等于0,这是我们所希望的,因为如果我们正确预测了输出值y,那么代价值就应该是0。但是同样注意,h(x)趋于0时,代价值激增,并且趋于正无穷,这样描述给人这样一种直观的感觉,那就是如果假设函数输出0,相当于我们的假设函数说y=1的概率等于0,这就好比我们对病人说,你有一个恶性肿瘤的概率是0,就是说你的肿瘤完全不可能是恶性的,然而如果病人的肿瘤确实是恶性的(即如果y最终等于1),虽然我们已经告诉了他恶性肿瘤的概率为0,但结果却发现我们是错的,那么我们就用非常非常大的代价值来惩罚这个学习算法,即这个代价值应该趋于无穷。

再来看看y=0时的代价函数图像,

这个曲线的特点是,在h(x)趋于1时,激增并趋于正无穷,也就是说如果最后发现y=0,而我们却非常肯定地预测y=1的概率是1,那么我们就要付出非常大的代价值。相反,如果h(x)=0,而且y=0,也就是说假设函数预测正确,那么代价值就应该为0。

1.5 Simplified cost function and gradient descent(简化代价函数和梯度下降)

由于y是0或1,我们就可以用一个简单的方式来写代价函数。具体来说,为了避免把代价函数分成y=1或y=0两种情况,我们要用一种方法来把两个式子合并成一个式子,这将更方便写出代价函数并推导梯度下降。

将y=1和y=0两种情况分别代入合并后的Cost项,就会得到分段函数的两种情况。

验证结果如下:

这样就可以写出logistic回归的代价函数如下(将负号提在前面):

那么为什么要把代价函数写成这种形式?似乎我们也可以选择别的代价函数,这里不解释有关这个问题的细节,但是这个式子是从统计学中的极大似然法得来的,极大似然法是统计学中为不同的模型快速寻找参数的方法,同时它还有一个很好的性质,这样的代价函数是一个凸函数,因此这就是大部分人用来拟合logistic回归模型的代价函数。

根据这个代价函数,为了拟合出参数,需要做的是找出让J(θ)取得最小值的参数θ。如果试着减小J(θ),就将得到某组参数θ。如果又有一个新样本具有某些特征x,就可以用拟合训练样本的参数θ来做出预测。

所以接下来就需要弄清楚如何最小化关于θ的代价函数J(θ),这样才能为训练集拟合出参数θ。

最小化代价函数的方法是使用梯度下降法:

我们要反复更新每个参数,就是用它自己减去学习率α乘以导数项,导数项的计算结果如下:

将计算的偏导数项代入原来的式子中,就可以将梯度下降算法写作如下形式:

所以,如果有n个特征,就有一个参数向量θ,从θ0一直到θn,那么就需要用上图的更新公式来同时更新所有θ的值。

可能你会发现,这个更新规则正是用在线性回归上的更新规则。那么线性回归和logistic回归是同一个算法吗?注意logistic回归中的假设函数和线性回归中的假设函数两者的定义是不同的。

因此,即使更新参数的规则看起来基本相同,但由于假设的定义发生了变化,所以它跟线性回归的梯度下降实际上是两个完全不同的东西,在线性回归中监控梯度下降的方法通常也适用于logistic回归中,在线性回归中的特征缩放方法也同样适用于logistic回归。

1.6 Advanced optimization(高度优化)

与梯度下降相比,高度优化能大大提高logistic回归运行的速度,也使算法更加适合解决大型的机器学习问题。现在,换个角度来看什么是梯度下降,假设我们有一个代价函数J(θ),而我们想要使它最小化。那么我们需要编写代码,当输入参数θ时,需要计算出J(θ)以及J等于0、1直到n的偏导数项。假设我们已经完成了实现这两部分的代码,那么梯度下降所做的就是反复执行这些更新。

对于梯度下降来说,从技术上讲其实并不需要编写代码来计算代价函数J(θ),只需要编写代码来计算导数项,但是如果希望代码能够监控J(θ)的收敛性,就需要编写代码来计算代价函数和偏导数项。

在写完计算这两部分的代码之后,就可以使用梯度下降了。但梯度下降并不是可以使用的唯一算法,还有一些其他更高级,更复杂的算法。如果我们能计算出J(θ)和导数项的话,那么下面的这些算法就是优化代价函数的不同方法。共轭梯度法(BFGS和L-BFGS)就是其中一些更高级的算法,这些算法需要有一种方法来计算J(θ),还需要一种计算导数项的方法,然后就可以使用比梯度下降更复杂的算法来最小化代价函数。

这三种算法有许多优点。首先是使用这其中任何一个算法通常都不需要手动选择学习率α。所以理解这些算法的一种思路是,给出计算导数项和代价函数的方法,你可以认为这些算法有一个智能内循环,实际上它们确实有一个智能内循环(被称为线搜索算法),它可以自动尝试不同的学习速率α并自动选择一个好的学习速率,它甚至可以为每次迭代选择不同的学习速率,这样你就不需要自己选择。这些算法实际上不仅仅选择一个好的学习速率,而是在做更复杂的事情。所以它们收敛的速度往往远快于梯度下降。

而这些算法的缺点就是它们比梯度下降算法复杂得多。特别是最好不要自己实现共轭梯度,L-BGFS、BFGS这些算法。Octave有一个非常理想的库用于实现这些高级的优化算法。这些算法实现得好或不好是有区别的,如果你的机器学习应用使用的是其他语言,比如C、C++、Java等等,可能需要多试几个库才能找到一个能很好实现这些算法的库。因为在实现共轭梯度或者L-BFGS时,表现的好坏是有差别的。

现在来说明如何使用这个算法,下面举一个例子,比如说有一个含两个参数的问题,这两个参数是θ0和θ1,代价函数J(θ) = (θ1 - 5)² + (θ2 - 5)²,因此通过这个代价函数,如果想将关于θ的函数J(θ)最小化的话,使它最小化的θ1的值是5,θ2的值也是5。对θ1和θ2求偏导如下所示:

所以如果想用应用高级优化算法中的一个算法来最小化代价函数J,如果不知道最小值在5,5时取到,但是想要代价函数找到这个最小值,可以用比如梯度下降这样的算法,但最好用比它更高级的算法。需要做的就是实现一个如下图这样的Octave函数:

那么实现一个代价函数比如costFunction(theta),这个函数的作用是返回两个自变量,第一个是jVal,它是计算的代价函数J,所以说 jVal = (θ1 - 5)² + (θ2 - 5)²,函数返回的第二个自变量是gradient,gradient是一个2x1的向量,这个向量的两个元素对应两个偏导数项,运行这个costFunction函数后,就可以调用高级的优化函数,这个函数是fminunc,它在Octave中表示无约束最小化函数(minimization unconstrained)。

这个options变量是一个可以存储你想要的options的数据结构,GradObj和On设置梯度目标参数为打开,这意味着你现在确实要给这个算法提供一个梯度,然后设置最大迭代次数,比如说100,然后给出一个θ的猜测初始值,它是一个2x1的向量,然后调用fminunc函数,@符号表示指向刚刚定义的costFunction函数的指针。如果调用了这个fminunc函数,它就会使用高级优化算法中的一个,当然也可以把它当成梯度下降,只不过它能自动选择学习速率α,然后它会尝试使用这些高级的优化算法(就像加强版的梯度下降法)来找到最合适的θ值。

下面来演示一下如何在Octave中使用:

定义costFunction函数,它计算出代价函数jVal以及梯度gradient,gradient的两个元素分别是代价函数对于theta(1)和theta(2)这两个参数的偏导数。

在Octave中输入刚刚的命令,在优化算法的options设置参数的记号:

接着初始化θ:

然后运行优化算法,就能得到theta的最优值,theta(1)是5,theta(2)也是5,这正是之前我们所希望的。functionVal的值是10的-30次幂,基本上就是0,这也是我们所希望的。exitFlag为1,说明它已经是收敛了的。eixtFlag可以让你确定该算法是否已经收敛。

此时的这个costFunction函数已经在当前路径中了(或者加入在了搜索路径里)。

用Octave运行时,参数向量θ的维度必须大于等于2,如果它不是一个二维向量或高于二维的向量,fminunc可能就无法运算。

因此如果有一个一维的函数需要优化,可以查找一下fminunc函数的资料,了解更多细节。

以上就是如何优化的一个例子,这个例子是一个简单的二次代价函数。

在logistic回归中,有一个参数向量theta(从θ0到θn),在Octave中向量的标号是从1开始的,所以在Octave里,θ0实际上写成theta(1),θ1实际上写成theta(2)......θn实际上写成theta(n+1)。

我们需要做的就是写一个costFunction函数,为logistic回归求得代价函数,这个函数需要返回 jVal(即J(θ)的值),还需要计算出gradient中的每个元素(也就是θ0到θn的偏导数)。

1.7 Multi-class classification:One-vs-all (多元分类:一对多)

先来看一些多类别分类问题的例子。

假如现在需要一个学习算法自动地将邮件归类到不同的文件夹里,或者说可以自动地加上标签。这里就有了一个包含四个分类的问题分别用数字1、2、3、4来代表。

另一个例子是有关药物诊断的,假设有个病人因为鼻塞来到诊所,可能的诊断包括:y=1(没有生病),y=2(着凉了),y=3(得了流感)。

下面是最后一个例子,如果利用机器学习来处理天气的分类问题,那么可能就想要区分哪些天是晴天、多云、雨天或者下雪天。

这上述的所有例子,y都是一些离散值,例如从1到3,1到4等等,以上这些都是多类别分类问题。

对于之前的一个二元分类问题,数据集看起来是这样的:

对于一个多类别分类问题,数据集看起来是这样的:

用三种不同的符号来代表三个类别,问题就是给出包含三个类别的数据集,如何得到一个学习算法来进行分类呢?

我们已经知道利用逻辑回归解决二元分类问题,利用直线可以将数据集分为正类和负类。利用一对多的分类思想,同样可以将其用在多类别分类问题上。

下面介绍一对多分类的原理,有时也称之为“一对余”方法,假设有一个训练集如下图所示:

它包含三个类别,三角形表示y=1,矩形表示y=2,叉号表示y=3,我们需要做的就是将这个训练集转化为三个独立的二元分类问题,也就是将它分成三个独立的二元分类问题,先从三角形代表的类别1开始。

我们将创建一个新的“伪”训练集,其中类别2和类别3设定为负类,类别1设定为正类,这个新训练集如下:

我们需要拟合一个分类器,称其为 ,这个上标1表示类别1。这里的三角形是正样本,而圆形代表负样本。可以认为三角形的值为1,圆形的值为0。接着来训练一个标准的逻辑回归分类器,这样就得到一个决策边界:

对三角形类别1进行了这样的处理后,接着对类别2进行同样的处理。将方形样本设定为正类别,将其他的样本,三角形和叉号设置为负类别,拟合第二个逻辑回归分类器,称为 ,上标2表示把矩形类别当作正类别,然后就会得到下图这样的一个分类器:

最后对第三个类别进行同样的处理,拟合第三个分类器 ,就可以得出下图这样的判定边界或者说是分类器来分开正负样本。

总的来说,我们拟合出三个分类器来尝试估计给定x和θ时,y = i的概率。

总结一下,我们训练了一个逻辑回归分类器预测y类别y = i 的概率。最后,为了做出预测,我们给出一个新的输入值x,期望获得预测,我们要做的就是在比如三个分类器运行输入x,然后选择预测值最大的类别,也就是要选择三个分类器中可信度最高,效果最好的一个分类器。无论i值是多少,我们都能得到一个最高的概率值,我们预测y就是那个值。

2. 过拟合问题(The problem of overfitting)

2.1 线性回归中的过拟合问题

在学习算法中,诸如线性回归和逻辑回归,它们能够有效地解决很多问题,但是,当将它们运用到某些特定的机器学习应用时,会遇到过度拟合问题的问题,导致它们表现欠佳。

首先来看一个用线性回归预测房价的例子,我们通过以住房面积为自变量的函数来预测房价, 我们可以用一次函数拟合数据,这么做我们能够获得拟合数据的这样一条直线,但这并不是一个很好的模型。

通过数据可以明显看出,随着房屋面积增大,住房价格逐渐稳定,或者说越往右越平缓,这个算法没有很好地拟合训练集,我们把这个问题成为欠拟合(underfitting),另一种说法是这个算法具有高偏差(high bias),这两种说法都表示这个算法没有很好地拟合训练数据,“bias”这个词是过去传下来的一个专业名词,它的意思是,如果拟合一条直线,就好像该算法有一个很强的偏见,或者说非常大的偏差,认为房子价格和面积线性相关,而罔顾数据的不符,先入为主地拟合一条直线,最终导致拟合数据效果很差。

如果给假设函数加入一个二阶项,用二次函数来拟合数据集,得到这样一条曲线。

这个拟合效果很好。

另一个极端情况是,如果我们拟合一个四阶多项式,那么我们有五个参数,\Theta_0\Theta_4,这样我们可以拟合一条曲线通过全部五个训练样本,可能会得到这样的一条曲线。

一方面,这似乎很好地拟合了训练集,因为它通过了所有的数据点,但这是一条扭曲的曲线,它不停地上下波动,事实上,我们并不认为它是一个预测房价的好模型,这个问题我们称之为过度拟合(overfitting),另一种说法是这个算法具有高方差(high variance),高方差是另一个历史遗留说法,但从第一印象上来说,如果我们拟合一个高阶多项式,那么这个假设函数能拟合几乎所有的数据。这就面临可能的函数太过庞大、变量太多的问题,但我们没有足够的数据来约束它,来获得一个好的假设函数。那么这就是过度拟合。

概括地说,过度拟合的问题将会在变量过多的时候出现,这时训练出的假设能很好地拟合训练集,所以,你的代价函数实际上可能非常接近于0,或者就恰好等于0 ,但是你可能会得到上面的那种曲线,它千方百计地拟合训练集,导致它无法泛化到新的样本中,无法预测新样本的价格,在这里,术语“泛化”指的是一个假设模型应用到新样本的能力,新样本数据是指没有出现在训练集中的房子。

2.2 逻辑回归中的过拟合问题

下面是一个以x_1x_2为变量的逻辑回归的例子。我们可以做的是用一个简单的假设模型来拟合逻辑回归,和之前一样,用字母g代表S型函数,如果这样做,就会得到一个假设模型,例如这样的一条直线来分开正样本和负样本。

但这个模型并不能够很好地拟合数据,所以这又是一个欠拟合的例子。

相比之下,如果再加入一些变量,比如一些二次项,那么就可以得到像下图这样的判定边界。

这样就很好地拟合了数据,这很可能是这个训练集最好的拟合结果。

最后,在另一种极端情况下,如果用高阶多项式来拟合数据,例如加入了很多高阶项,那么逻辑回归可能会变得扭曲。

它千方百计地找到一个判定边界来拟合训练数据,或者说努力地扭曲来符合每一个训练样本,而且如果x_1x_2能够预测癌症,乳腺肿瘤可能是良性的,也可能是恶性的,这确实不是一个用于预测的好的假设模型。因此,同样地,这又是一个过拟合的例子,是一个有高方差的假设模型,无法做到很好地泛化到新样本。

2.3 过拟合问题的解决

在前面的例子中,当我们使用一维或二维数据时,我们可以通过绘出假设模型的图像来研究问题所在,再选择合适的多项式阶数,以之前的房屋价格为例,我们可以绘制假设模型的图像。

就能看到能够通过所有样本点的模型,其曲线是非常扭曲的,我们可以通过绘制这样的图形来选择合适的多项式阶次。

绘制假设模型曲线可以作为决定多项式阶次的一种方法,但是这并不是总是有用的。事实上,更多的时候,我们的学习问题需要有很多变量,并且这不仅仅是选择多项式阶次的问题,事实上,当我们有这么多的特征变量时,绘图变得更难,通过数据的可视化,来决定保留哪些特征变量也更难。具体地说,如果我们试图预测房价,有许多特征变量都可能有关,这些变量看上去都与房价很有关联。

但是,如果我们有过多的变量,而只有非常少的训练数据,就会出现过度拟合的问题。

通常有两个方法来解决过度拟合的问题:

第一个方法是要尽量减少选取变量的数量,具体而言,我们可以人工检查变量清单,并以此决定,哪些变量更为重要,哪些变量应该保留,哪些应该舍弃。或者使用模型选择算法,这种算法可以自动选择哪些特征变量保留,哪些舍弃。这种减少特征变量的方法可以有效减少过拟合的发生,但是其缺点是舍弃一部分特征变量,也就意味你也舍弃了关于问题的一些信息,例如也许所有的特征变量对于预测房价都是有用的,我们实际上并不想舍弃一些信息或者这些特征变量。

第二个方法是正则化

我们将保留所有的特征变量,但是减少量级,或参数 \Theta_j 的大小,这个方法非常有效,当我们有很多特征变量时,其中每一个变量都能对预测的y值产生一点影响,正如我们在房价的例子中看到的那样,我们有很多特征变量,每一个变量都或多或少是有用的,因此我们不希望把它们舍掉。

2.4 代价函数(Cost function)

在上面的例子中发现,如果我们使用一个二次函数来拟合这些数据,我们会得到一个不错的拟合效果,然而如果我们用一个阶数过高的多项式去拟合数据,会得到这样一条曲线,它更好地拟合了我们的数据,但实际上这个函数过拟合了,泛化得不好。

我们来想想这是为什么?我们不妨在函数中加入惩罚项,使得参数\Theta_3\Theta_4都非常小,这意味着什么呢?

这是我们的优化目标或者说是优化问题,我们要最小化其均方误差代价函数,现在我们对这个函数进行一些修改,给它加上1000*\Theta_3^2,再加上1000*\Theta_4^2,1000只是随便一个比较大的数。

假如我们要最小化这个函数,要使这个修改后的函数尽可能小的方法只有一个,就是\Theta_3\Theta_4要尽可能小,这是因为\Theta_3项和\Theta_4项的系数为1000,它会使得整个函数变得很大,当我们最小化这个新函数,我们需要使\Theta_3尽量接近于0,还要使\Theta_4也尽量接近于0,这就好像我们直接去掉了这两项一样,那么,这样的话,这个函数还是相当于二次函数,最后我们拟合数据的函数实际上是一个二次函数,加上了一些非常小的项,\Theta_3\Theta_4它们都非常接近于0,最后我们得到的还是一个二次函数,这很好,因为这是一种更好的假设模型。

在这个特定的例子里,我们看到了加入惩罚,增大两个参数所带来的效果,总的来说,这就是正则化背后的思想。

这种思想就是,如果我们的参数值较小,参数值较小意味着一个更简单的假设模型,在上面的例子中,我们对\Theta_3\Theta_4加入了惩罚项,当他们都接近于0时,我们会得到一个更简单的假设模型,就相当于一个二次函数,大体上来说,如果将这些参数都加上惩罚项,这么做就相当于尽量去简化这个假设模型,因为这些参数都接近0的时候,比如在这个例子中,它就是一个二次函数,但是一般来说,这些参数的数值越小,我们得到的函数就会越平滑,也越简单,因此,也更不容易出现过拟合的问题。

再来看一个具体的例子,比如房屋价格的预测

之前提到,可能有100个特征,x_1代表房屋的尺寸,x_2代表卧室的数量,x_3是房屋的层数,等等,这种特征可能有100个。和之前多项式的例子不同,我们并不知道\Theta_3\Theta_4是高阶项,想象一下,你有一个袋子,袋子里有100个特征,我们很难预先挑选出其中的哪个变量是相关度较低的,现在我们有101个参数,我们不知道该选出哪些参数来缩小它们的值,因此在正则化中,我们要做的就是对代价函数进行修改,来缩小所有的参数,因为我根本不知道,我该选哪些参数去缩小,于是我在代价函数的后面添加一个新的项。

当我在式子的最后加一个额外的正则化项(红色方框)来缩小每个参数的值,添加的项的作用是缩小每一个参数,从\Theta_1一直到\Theta_1_0_0,顺便说一下,按照习惯,求和是从参数\Theta_1开始的,并没有给\Theta_0增加惩罚项,这实际上是约定俗成,只对从1到n进行求和,而不是从0到n进行求和,但在实践中,这两种做法没什么差别,无论你是否包括\Theta_0,实际上对结果影响都不大,但一般来说,我们只对\Theta_1\Theta_1_0_0进行正则化。

在正则化代价函数中,红色方框这一项就是我们的正则化项,而这里的λ被称为正则化参数

这个λ的作用就是控制两个不同目标之间的取舍,第一个目标与目标函数的第一项(红色方框内)有关,就是我们想去训练,想更好地拟合数据,更好地拟合训练集。

而第二个目标就是我们要保持参数尽量地小,与目标函数第二项有关,与正则化目标有关,这个λ,也就是正则化参数的作用是控制这两个目标直接的平衡关系,即更好地去拟合训练集的目标和将参数控制得更小的目标,从而保持假设模型的相对简单,避免出现过拟合的情况。

比如这个房屋价格预测的例子,如果之前我们用高阶多项式来拟合,最后会得到一个图像非常曲折的函数。

如果你依然想保留所有特征的高阶项,你只要确保利用正则化目标就能得到这样一个曲线。

这个曲线并不是一个二次函数,但是却相对更平滑,更简单,对数据给出了一个更好的假设模型。

在正则化的线性回归中,如果正则化参数λ被设得太大的化,其结果就是,如果我们的假设函数是

我们对这些参数还有\Theta_1\Theta_2还有\Theta_3\Theta_4的惩罚程度太大,那么最后所有这些参数都接近于0,这样的话,就相当于把假设函数的全部项都忽略掉了,最后假设模型只剩一个\Theta_0,这样就相当于房屋价格直接等于\Theta_0,这差不多相当于用一条直线去拟合数据。

这就是一个欠拟合的例子,它只是一条水平的直线,并没有去贴近大多数的训练数据。换句话说,这个假设模型的偏见性太强或者说偏差太高,简单地将房屋价格等同于\Theta_0这样一条水平的直线,显然与数据的趋势不符,为了让正则化起到应有的效果,需要选择一个合适的正则化参数λ。

2.5. 线性回归的正则化

这是之前提到的正则化线性回归的优化目标,前面一部分(红色方框内)是线性回归的一般目标。

剩下的部分就是一个额外添加的正则化项,其中λ是我们的正则化参数。

我们想找到一个参数θ,来最小化代价函数,也就是这个正则化代价函数J(θ)。

之前,我们在没有正则化项的情况下曾使用梯度下降法来最小化最初的代价函数,也就是下面这种算法:

在没有正则化项的情况下,进行常规的线性回归,我们会用上式反复去更新参数\Theta_j的值,其中j的值是0到n。

现在单独写出j=0时的更新函数。

这样做的原因是,对于正则化线性回归,我们的惩罚对象是参数\Theta_1\Theta_2,...,\Theta_n,我们没有惩罚\Theta_0,所以当我们修改这个正则化线性回归的算法时,在处理\Theta_0的时候,会将它区别对待,具体地,如果我们要用正则化项修改这个算法,我们需要做的就是把下面的这项做如下修改,我们要在式子的后面加上一项。

这样做的话,就可以对正则化代价函数J(θ)用梯度下降法进行最小化。

如果仔细观察\Theta_j的更新,会发现一些很有趣的东西。具体地,如果把这些包含\Theta_j的项全都汇合起来,那么我们可以把这个更新值,等价地写成如下形式:

这里的这一项

(1-\alpha \frac{\lambda }{m})是个很有趣的项,它能起到一种很有趣的效果。

具体来说,这一项的值是一个只比1略小一点的数,因为\alpha\frac{\lambda}{m}是一个正数,通常来说,学习率很小,但m却很大,所以\alpha\frac{\lambda}{m}就会很小,所以这一项(1-\alpha \frac{\lambda }{m})通常是一个只比1略小的数,例如0.99这样的数,所以\Theta_j更新的结果就是\Theta_j变成了\Theta_j乘以0.99,也就是把\Theta_j向0的方向缩小了一点点,这使得\Theta_j变小了一点点,说得更正式一点就是\Theta_j的平方范数变小了,即变小了。然后这里的第二项(下图)实际上完全与我们在添加正则化项之前的梯度下降更新一样。

当我们在进行正则化线性回归时,我们要做的就是每次迭代时都将\Theta_j乘以一个比1略小的数,我们每次都把参数缩小一点,然后进行和之前一样的更新操作。当然,这只是从直观上来理解这个更新做了什么。从数学的角度来看,我们做的就是对代价函数J(θ)进行梯度下降。

梯度下降只是我们拟合线性回归模式时所讲的两种算法的其中一个,而第二种算法是用正规方程来解决。我们的做法就是建立一个设计矩阵X,它的每一行都代表一个单独的训练样本,然后建立一个向量y,向量y是一个m维的向量,它包含了训练集里的所有标签。所以X是一个m x (n+1)维的矩阵,y是一个m维的向量为。

为了最小化代价函数J,我们发现一个可行的办法就是让θ等于下面这个式子:

这个计算出来的θ可以使得代价函数J(θ)最小化,这时J(θ)是没有正则化项的,我们现在用正则化来得到想要的最小值,方法就是将对各个参数的偏导数设为0,然后进行一些数学推导,然后你可以得到上面的这个式子,使得代价函数最小,具体来说,如果你使用正则化,那么式子就要做如下改变。

这个矩阵除了最左上角的元素是0外,其余对角线元素都是1,然后其余的元素都是0,举个具体的例子,如果设n=2,那么这个矩阵就是一个3x3的矩阵,即

一般来说,这个矩阵是个(n+1) x (n+1)维矩阵。

如果使用新定义的包含正则化目标的J(θ),那么这个计算θ的式子,可以得到J(θ)的全局最小值。

最后再谈谈不可逆的问题,这是比较高等的数学问题。假如说现在m的值,即样本的总数小于等于特征的数量n,如果你的样本数量比特征数量少,那么这个矩阵 是不可逆的,或者说是个奇异矩阵还,有一种说法就是这个矩阵是退化的。如果在Octave中用pinv函数运行它,求它的伪逆矩阵时,它看起来好像能给出正确的结果,但最后不会得到很好的假设模型。尽管从数字上来说,Octave的pinv函数会给你一个看起来有意义的解,如果你用不同的语言来运行,如果你只是求它的常规逆矩阵,也就是对应Octave的inv函数,也就是我们对X的转置乘X取逆矩阵,那么这种情况下,你会发现X的转置乘X是个奇异矩阵,是不可逆的,如果你用另一种编程语言,用其它的线性代数库来试图计算这个矩阵的逆矩阵,你会发现都没有结果。因为这个矩阵不可逆,是奇异矩阵。幸运地是,在正则化中已经考虑到了这个问题。

具体来说,只要正则化参数λ是严格大于0的,我们就可以确信X的转置乘X加上λ乘这个有趣的矩阵一定不是奇异矩阵,因为它是可逆的。因此,进行正则化还可以解决一些X的转置乘X出现不可逆的问题。

3. logistic回归的正则化

对于逻辑回归问题,曾经谈到过两种优化算法,一种是用梯度下降来优化代价函数J(θ),还有一种是更高级的优化算法,这些算法都需要你去想办法计算代价函数J(θ),想办法去计算函数的导数。

我们之前看到逻辑回归也会出现过拟合的情况,如果你用高阶多项式去拟合数据,这个g是一个S型函数,这时候你会得到这样一个假设模型,其判定边界看起来非常复杂且扭曲,对于这个训练集来说,这实在不是个好的假设函数。通常情况下,如果你的逻辑回归有很多特征,有无关紧要的多项式,这些大量的特征最终会导致过拟合的现象。

这是逻辑回归代价函数

为了使用正则化,我们需要将它做一些修改,我们需要做的就是在后面增加一项:

这一项的作用是惩罚参数\Theta_1\Theta_2直到\Theta_n,防止它们过大,这样做的话,产生的效果就是,即使当你拟合阶数很高且参数很多,只要添加了这个正则化项,保持参数较小,你仍然可以得到这样一条粉红色的曲线,显然这条边界更能合理地划分正样本和负样本。

因此,使用正则化的话,即使你有很多特征,正则化都可以帮你避免过拟合的现象,我们究竟该如何实现它呢?对于最初的梯度下降算法,这是我们之前的更新式:

我们通过这个式子反复更新\Theta_j的值。在这里,把\Theta_0的更新单独写出来。

为了修改这个算法,使之成为正则化代价函数,接下来需要做的和对线性回归所作的处理很类似,只需将第二个式子修改成下式:

我们再次发现它看起来真的很像我们之前线性回归的式子。但当然,它们不是同一个算法,因为现在假设模型是这样定义的

,这与之前的正则化线性回归并不是同一个算法,因为它们的假设模型不一样,尽管这个迭代公式表面上看起来和之前的正则化线性回归的梯度下降算法很相像。

简单地总结一下,在方括号中的这一项是什么呢?

它是新定义的代价函数J(θ)对\Theta_j的偏导数,这里的J(θ)是之前所定义的正则化的代价函数。这就是正则化逻辑回归的梯度下降算法。

接着来看如何在更高级的优化算法中使用正则化,提醒一下,对于这些高级算法,我们要做的就是,我们需要自己定义一个函数,这个函数以向量θ作为输入。

再次说明,在我们写下的这个等式中,向量下标是从0开始的,也就是从\Theta_0\Theta_n,但是在Octave中,向量的下标一般从1开始,\Theta_0在Octave中写成theta(1),\Theta_1写成theta(2),以此类推,一直写到theta(n+1)。而我们需要做的就是建立一个函数,一个叫costFunction的函数,然后将它赋给,之前讲过的fminunc函数中,在括号里写上@costFunction,fminunc的意思是函数在无约束条件下的最小值,因此fminunc函数会将costFunction最小化,costFunction函数会返回两个值,第一个是jVal,所以我们需要写代码来计算代价函数J(θ)。我们正在使用正则化逻辑回归,代价函数J(θ)也会有所改变,代价函数需要在后面增加一个额外的正则化项,当你在计算J(θ)时,确保你的函数后面有这一项。然后函数的另一个返回值是梯度,所以gradient(1)等于J(θ)对\Theta_0的偏导数,之前已经计算过,对\Theta_0的偏导是,它没有发生改变,因为相比未添加正则化项时,\Theta_0的导数并没有发生改变,但是其它项都发生了改变。举个具体的例子,比如对\Theta_1的导数,之前也推导过,它等于原本的项加上 \frac{\lambda }{m}\Theta_1,即

当运行costFunction后,对它调用fminunc函数,或者其它类似的高级优化函数,这将最小化新的正则化代价函数J(θ),而函数返回的参数代表的就是正则化逻辑回归的解。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值