笔记:机器学习——吴恩达 第三周

课程目录

六、逻辑回归(Logistic Regression)
6.1 分类问题
6.2 假说表示
6.3 判定边界
6.4 代价函数
6.5 简化的成本函数和梯度下降
6.6 高级优化
6.7 多类别分类:一对多

七、正则化(Regularization)
7.1 过拟合的问题
7.2 代价函数
7.3 正则化线性回归
7.4 正则化的逻辑回归模型


笔记内容


六、逻辑回归(Logistic Regression) 

6.1 分类问题 

       在分类问题中,预测的变量 y 为离散的值。我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用的一种分类算法。 

 

    我们从二元的分类问题开始讨论。 我们将因变量(dependant variable)可能属于的两个类分别称为负向类(negative class)正向类(positive class),则因变量,其中 0 表示负向类,1 表示正向类。 

             

       如果我们要用线性回归算法来解决一个分类问题,对于分类,y 取值为 0 或者 1,但如果你使用的是线性回归,那么假设函数的输出值可能远大于 1,或者远小于 0。尽管我们知道标签应该取值 0 或者 1,但是如果算法得到的值远大于 1 或者远小于 0 的话,就会感觉很奇怪。所以我们在接下来的要研究的算法就叫做逻辑回归算法,这个算法的性质是:它的输出值永远在 0 到 1 之间。 
        顺便说一下,逻辑回归算法是分类算法,我们将它作为分类算法使用。有时候可能因为名字中出现了“回归”使你感到困惑,但逻辑回归算法实际上是一种分类算法,它适用于标签 y 取值离散的情况,如:1  0  0  1。 

        在接下来的视频中,我们将开始学习逻辑回归算法的细节。 

6.2 假说表示 

        在这段视频中,将会展示假设函数的表达式,即在分类问题中,要用什么样的函数来表示我们的假设。此前我们说过,希望我们的分类器的输出值在 0 和 1 之间,因此,我们希望想出一个满足某个性质的假设函数,这个性质是它的预测值要在 0 和 1 之间。
         回顾在一开始提到的乳腺癌分类问题,我们可以用线性回归的方法求出适合数据的一条直线: 


       用最初训练集训练时,当 hθ大于等于 0.5 时,预测 y=1。 当 hθ 小于 0.5 时,预测 y=0。对于上图所示的数据,左边的线性模型似乎能很好地完成分类任务。但假使我们又观测到一个非常大尺寸的恶性肿瘤,将其作为实例加入到我们的训练集中来,这将使得我们获得一条新的右边直线。
      这时,再使用 0.5 作为阀值来预测肿瘤是良性还是恶性便不合适了。可以看出,线性回归模型,因为其预测的值可以超越[0,1]的范围,并不适合解决这样的问题。  

       我们引入一个新的模型,逻辑回归,该模型的输出变量范围始终在 0 和 1 之间。 逻辑回归模型的假设是:,其中:

X   代表特征向量
g   代表逻辑函数(logistic function)是一个常用的逻辑函数为 S 形函数(Sigmoid function),公式为: 。 

     该函数的图像为:


      合起来,我们得到逻辑回归模型的假设:       

    hθ(x)的作用是,对于给定的输入变量,根据选择的参数计算输出变量=1 的可能性 (estimated probablity)

      例如,如果对于给定的 x,通过已经确定的参数计算得出 hθ(x)=0.7,则表示有 70%的几率 y 为正向类,相应地 y 为负向类的几率为 1-0.7=0.3。 


6.3 判定边界 

      现在讲下决策边界(decision boundary)的概念。这个概念能更好地帮助我们理解逻辑回归的假设函数在计算什么。 

                                              

     在逻辑回归中,我们预测: 
     当 hθ大于等于 0.5 时,预测 y=1 

     当 hθ小于 0.5 时,预测 y=0 

     根据上面绘制出的 S 形函数图像,我们知道当
     z=0 时 g(z)=0.5
     z>0 时 g(z)>0.5
     z<0 时 g(z)<0.5 

     又 z= ,即: 
      大于等于 0 时,预测 y=1 

     小于 0 时,预测 y=0 

     现在假设我们有一个模型:  

      并且参数 θ 是向量[-3 1 1]。 则当-3+x1+x2 大于等于 0,即 x1+x2 大于等于 3 时,模型将预测 y=1。我们可以绘制直线 x1+x2=3,这条线便是我们模型的分界线,将预测为 1 的区域和预测为 0 的区域分隔开。

 

    假使我们的数据呈现这样的分布情况,怎样的模型才能适合呢?


      因为需要用曲线才能分隔 y=0 的区域和 y=1 的区域,我们需要二次方特征: 假设参数: 是[-1 0 0 1 1],则我们得到的判定边界恰好是圆点在原点且半径为 1 的圆形。 我们可以用非常复杂的模型来适应非常复杂形状的判定边界。 


6.4 代价函数 

       在这段视频中,我们要介绍如何拟合逻辑回归模型的参数θ。具体来说,我要定义用来拟合参数的优化目标或者叫代价函数,这便是监督学习问题中的逻辑回归模型的拟合问题。


      对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题在于,当我们将 带入到这样定义了的代价函数中时,我们得到的代价函数将是一个非凸函数(non-convex function)


      这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。  

      线性回归的代价函数为:

      我们重新定义逻辑回归的代价函数为:,其中

      hθ(x)与 Cost(hθ(x),y)之间的关系如下图所示: 


       这样构建的 Cost(hθ(x),y)函数的特点是:当实际的 y=1 且 hθ也为 1 时误差为 0;当 y=1 但 hθ不为 1 时,误差随着 hθ 的变小而变大;当实际的 y=0 且 hθ 也为 0 时代价为 0;当 y=0 ,但 hθ不为 0 时误差随着 hθ 的变大而变大。 

      将构建的 Cost(hθ(x),y)简化如下: 

      带入代价函数得到:   

    在得到这样一个代价函数以后,我们便可以用梯度下降算法来求得能使代价函数最小的参数了。算法为: 

    求导后得到:


        在这个视频中,我们定义了单训练样本的代价函数凸性分析的内容是超出这门课的范围的,但是可以证明我们所选的代价值函数会给我们一个凸优化问题。代价函数 J(θ)会是一个凸函数,并且没有局部最优值。 

       注意:虽然得到的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但是这里的 与线性回归中不同,所以实际上是不一样的。另外,在运行梯度下降算法之前,进行特征缩放依旧是非常必要的。 

       一些梯度下降算法之外的选择: 除了梯度下降算法以外,还有一些常被用来令代价函数最小的算法,这些算法更加复杂和优越,而且通常不需要人工选择学习率,通常比梯度下降算法要更加快速。这些算法有: 共轭梯度(Conjugate Gradient)局部优化法(Broyden fletcher goldfarb shann,BFGS)有限内存局部优化法(LBFGS) 。 

       在下一个视频中,我们会把单训练样本的代价函数的这些理念进一步发展,然后给出整个训练集的代价函数的定义,我们还会找到一种比我们目前用的更简单的写法,基于这些推导出的结果,我们将应用梯度下降法得到我们的逻辑回归算法。 


6.5 简化的成本函数和梯度下降 

       在这段视频中,我们将会找出一种稍微简单一点的方法来写代价函数,来替换我们现在用的方法。同时我们还要弄清楚如何运用梯度下降法,来拟合出逻辑回归的参数。因此,听了这节课,你就应该知道如何实现一个完整的逻辑回归算法。 
       逻辑回归的代价函数:  

 

      这个式子可以合并成:


      即,逻辑回归的代价函数


       根据这个代价函数,为了拟合出参数,要试图找尽量让 J(θ) 取得最小值的参数 θ:

       如果我们给出一个新的样本,假如某个特征 x,我们可以用拟合训练样本的参数 θ,来输出对假设的预测。 
       另外,我们假设的输出,实际上就是这个概率值:p(y=1|x;θ),就是关于 x 以 θ 为参数,y=1 的概率,你可以认为我们的假设就是估计 y=1 的概率,所以,接下来就是弄清楚如何最大限度地最小化代价函数 J(θ),作为一个关于 θ 的函数,这样我们才能为训练集拟合出参数 θ。 

       最小化代价函数的方法,是使用梯度下降法(gradient descent)。这是我们的代价函数: 


        如果我们要最小化这个关于 θ 的函数值,这就是我们通常用的梯度下降法的模板

 

        我们要反复更新每个参数,就是用它自己减去学习率 α 乘以后面的微分项。求导后得到: 


        如果你计算一下的话,你会得到的是这个式子:


       我把它写在这里,将后面这个式子,在 i=1 到 m 上求和,其实就是预测误差乘以 (??????)
       所以你把这个偏导数项放回到原来式子里,我们就可以将梯度下降算法写作如下形式:           所以,如果你有 n 个特征,也就是说: ,参数向量 θ 包括 θ0 θ1 θ2一直到 θn,

       那么你就需要用,来同时更新所有 θ 的值。  

       现在,如果你把这个更新规则和我们之前用在线性回归上的进行比较的话,你会惊讶地发现,这个式子正是我们用来做线性回归梯度下降的。那么,线性回归和逻辑回归是同一个算法吗?要回答这个问题,我们要观察逻辑回归看看发生了哪些变化。实际上,假设的定义发生了变化。 

        对于线性回归假设函数

       而现在逻辑函数假设函数

       因此,即使更新参数的规则看起来基本相同,但由于假设的定义发生了变化,所以逻辑函数的梯度下降,跟线性回归的梯度下降实际上是两个完全不同的东西。 

      在先前的视频中,当我们在谈论线性回归的梯度下降法时,我们谈到了如何监控梯度下降法以确保其收敛,我通常也把同样的方法用在逻辑回归中,来监测梯度下降,以确保它正常收敛。 

       当使用梯度下降法来实现逻辑回归时,我们有这些不同的参数 θ,就是 θ0 到 θn,我们需要用这个表达式来更新这些参数。我们可以使用 for 循环来更新这些参数值,当然理想情况下,我们更提倡使用向量化的实现,可以把所有这些 n 个参数同时更新。 
       最后还有一点,我们之前在谈线性回归时讲到的 特征缩放,我们看到了特征缩放是如何 提高梯度下降的收敛速度的,这个特征缩放的方法,也 适用于逻辑回归。如果你的特征范围差距很大的话,那么应用特征缩放的方法,同样也可以让逻辑回归中,梯度下降收敛更快。

6.6 高级优化 

       在上一节,我们讨论了用梯度下降的方法最小化逻辑回归中代价函数 J(θ)。在本次视频中,我会教你们一些高级优化算法和一些高级的优化概念,利用这些方法,我们就能够使通过梯度下降,进行逻辑回归的速度大大提高,而这也将使算法更加适合解决大型的机器学习问题,比如,我们有数目庞大的特征量。 

       现在我们换个角度来看什么是梯度下降,我们有个代价函数 J(θ),而我们想要使其最小化,那么我们需要做的是编写代码,当输入参数 θ 时,它们会计算出两样东西:J(θ) 以及  J等于 0、1 直到 n 时的偏导数项。 

 

       假设我们已经完成了可以实现这两件事的代码,那么梯度下降所做的就是反复执行这些更新。 

       另一种考虑梯度下降的思路是:我们需要写出代码来计算 J(θ) 和这些偏导数,然后把这些插入到梯度下降中,然后它就可以为我们最小化这个函数。 

       对于梯度下降来说,我认为从技术上讲,你实际并不需要编写代码来计算代价函数 J(θ)。你只需要编写代码来计算导数项,但是,如果你希望代码还要能够监控这些 J(θ) 的收敛性,那么我们就需要自己编写代码来计算代价函数 J(θ)和偏导数项 。所以,在写完能够计算这两者的代码之后,我们就可以使用梯度下降。 

        然而梯度下降并不是我们可以使用的唯一算法,还有其他一些算法,更高级、更复杂。如果我们能用这些方法来计算代价函数 J(θ)和偏导数项两个项的话,那么这些算法可以为我们优化代价函数。共轭梯度法 BFGS (变尺度法) L-BFGS (限制变尺度法) 就是其中一些更高级的优化算法,它们需要有一种方法来计算 J(θ),以及需要一种方法计算导数项,然后使用比梯度下降更复杂的算法来最小化代价函数。这三种算法的具体细节超出了本门课程的范畴。实际上你最后通常会花费很多天,或几周时间研究这些算法,你可以专门学一门课来提高数值计算能力,不过让我来告诉你他们的一些特性。

         这三种算法有许多优点,使用这其中任何一个算法,你通常不需要手动选择学习率 α,所以对于这些算法的一种思路是,给出计算导数项和代价函数的方法,你可以认为算法有一个智能的内部循环,而且,事实上,他们确实有一个智能的内部循环,称为线性搜索(line search)算法,它可以自动尝试不同的学习速率 α,并自动选择一个好的学习速率 α,因此它甚至可以为每次迭代选择不同的学习速率,那么你就不需要自己选择。这些算法实际上在做更复杂的事情,不仅仅是选择一个好的学习速率,所以它们往往最终比梯度下降收敛得快多了,不过关于它们到底做什么的详细讨论,已经超过了本门课程的范围。 

        我们实际上完全有可能成功使用这些算法,并应用于许多不同的学习问题,而不需要真正理解这些算法的内部在做什么,如果说这些算法有缺点的话,那么我想说主要缺点是它们比梯度下降法复杂多了,特别是你最好不要使用 L-BGFS、 BFGS 这些算法,除非你是数值计算方面的专家。实际上,我不会建议你们编写自己的代码来计算数据的平方根,或者计算逆矩阵,因为对于这些算法,我还是会建议你直接使用一个软件库,比如说,要求一个平方根,我们所能做的就是调用一些别人已经写好用来计算数字平方根的函数。

        必须指出这些算法实现得好或不好是有区别的,因此,如果你正在你的机器学习程序中使用一种不同的语言,比如如果你正在使用 C、C + + 、Java等等,可能会想尝试一些不同的库,以确保找到一个能很好实现这些算法的库。因为在 L-BFGS 或者等高线梯度的实现上,表现得好与不太好是有差别的。 

       这些算法也许稍微有点难调试,不过由于它们的运行速度通常远远超过梯度下降。 所以当有一个很大的机器学习问题时,应选择这些高级算法,而不是梯度下降。

       在下一个视频,我想要告诉你如何修改你已经知道的逻辑回归算法,然后使它在多类别分类问题中也能正常运行。 


6.7 多类别分类:一对多 

        在本节视频中,我们将谈到如何使用逻辑回归 (logistic regression)来解决多类别分类问题,具体来说,通过一个叫做"一对多" (one-vs-all) 的分类算法。 

        二元分类问题的数据可能如下图:                            多类分类问题的数据集可能如下图: 

                                                 

       我们现在已经知道如何进行二元分类,可以使用逻辑回归,对于直线或许你也知道,可以将数据集一分为二为正类和负类。用一对多的分类思想,我们可以将其用在多类分类问题上。 

       下面将介绍如何进行一对多的分类工作,有时这个方法也被称为"一对余"方法。

       现在有一个训练集,用三角形表示 y=1,方框表示 y=2,叉叉表示 y=3。下面要做的就是使用一个训练集,将其分成三个二元分类问题。 
       我们先从用三角形代表的类别 1 开始,实际上我们可以创建一个,新的"伪"训练集,类型 2 和类型 3 定为负类,类型 1 设定为正类,我们创建一个新的训练集,如下图所示的那样,我们要拟合出一个合适的分类器。  


       这里的三角形是正样本,而圆形代表负样本。可以这样想,设置三角形的值为 1,圆形的值为 0,下面我们来训练一个标准的逻辑回归分类器,这样我们就得到一个正边界。 
       为了能实现这样的转变,我们将多个类中的一个类标记为正向类(y=1),然后将其他所有类都标记为负向类,这个模型记作 。接着,类似地我们选择另一个类标记为正向类(y=2),再将其它类都标记为负向类,将这个模型记作 ,依此类推。 

       最后我们得到一系列的模型简记为:  


        最后,在我们需要做预测时,我们将所有的分类机都运行一遍,然后对每一个输入变量,都选择最高可能性的输出变量。
       总之,我们已经把要做的做完了,现在要做的就是训练这个逻辑回归分类器 , 其中 i 对应每一个可能的 y=i,最后,为了做出预测,我们给出输入一个新的 x 值,用这个做预测。我们要做的就是在我们三个分类器里面输入 x,然后我们选择一个让  最大的 i,即 。 

      你现在知道了基本的挑选分类器的方法,选择出哪一个分类器是可信度最高效果最好的,那么就可认为得到一个正确的分类,无论 i 值是多少,我们都有最高的概率值,我们预测 y 就是那个值。这就是多类别分类问题,以及一对多的方法,通过这个小方法,你现在也可以将逻辑回归分类器用在多类分类的问题上。 


七、正则化(Regularization) 
7.1 过拟合的问题

         到现在为止,我们已经学习了几种不同的学习算法,包括线性回归和逻辑回归,它们能够有效地解决许多问题,但是当将它们应用到某些特定的机器学习应用时,会遇到过度拟合(over-fitting)的问题,可能会导致它们效果很差。 

       如果我们有非常多的特征,我们通过学习得到的假设可能能够非常好地适应训练集(代价函数可能几乎为 0),但是可能会不能推广到新的数据。 

       下图是一个回归问题的例子: 
 

 

        第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集;第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据。虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好,是过拟合;而中间的模型似乎最合适。 

       分类问题中也存在这样的问题: 


         就以多项式理解,x 的次数越高,拟合的越好,但相应的预测的能力就可能变差。 问题是,如果我们发现了过拟合问题,应该如何处理? 
       1.  丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如 PCA) 

        2. 正则化。 保留所有的特征,但是减少参数的大小(magnitude)。 


7.2 代价函数 

          上面的回归问题中如果我们的模型是:

         我们可以从之前的事例中看出,正是那些高次项导致了过拟合的产生,所以如果我们能让这些 高次项的系数接近于 0 的话,我们就能很好的拟合了。 
        所以我们要做的就是在一定程度上减小这些参数 θ 的值,这就是正则化的基本方法。我们决定要减少 θ3 和 θ4 的大小,我们要做的便是修改代价函数,在其中 θ3 和 θ4 设置一点惩罚。这样做的话,我们在尝试最小化代价函数时也需要将这个惩罚纳入考虑中,并最终导致选择较小一些的 θ3 和 θ4。修改后的代价函数如下:    

       通过这样的代价函数选择出的 θ3和 θ4对预测结果的影响就比之前要小许多。假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚,并且让代价函数最优化的软件来选择这些惩罚的程度。这样的结果是得到了一个较为简单的能防止过拟合问题的假设: 

       其中 λ 又称为 正则化参数(Regularization Parameter)。 注:根据惯例,我们不对 θ0 进行惩罚。经过正则化处理的模型与原模型的可能对比如下图所示: 


        如果选择的正则化参数 λ 过大,则会把所有的参数都最小化了,导致模型变成 hθ(x)=θ0 也就是上图中红色直线所示的情况,造成欠拟合。 那为什么增加一项可以使θ 的值减小呢?

       因为如果我们令 λ 的值很大的话,为了使 Cost Function 尽可能的小,所有的 θ 的值(不包括 θ0)都会在一定程度上减小。但若λ的值太大了,那么 θ(不包括 θ0)都会趋近于 0,这样我们所得到的只能是一条平行于 x 轴的直线。 所以对于正则化,我们要取一个合理的λ的值,这样才能更好的应用正则化。 

       回顾一下代价函数,为了使用正则化,让我们把这些概念应用到到线性回归和逻辑回归中去,那么我们就可以让他们避免过度拟合了。 


7.3 正则化线性回归 

       对于线性回归的求解,我们之前推导了两种学习算法:一种是 梯度下降,一种基于 正规方程。 

       正则化线性回归 的代价函数为:              

       如果我们要使用 梯度下降法 令这个代价函数最小化,因为我们未对 θ0 进行正则化,所以梯度下降算法将分两种情形: 


       对上面的算法中 j=1,2,...,n 时的更新式子进行调整可得:     

      可以看出,正则化线性回归的梯度下降算法的变化在于,每次都在原有算法更新规则的基础上令 θ 值减少了一个额外的值。 我们同样也可以利用正规方程来求解正则化线性回归模型,方法如下所示:

       图中的矩阵尺寸为 (n+1)*(n+1)。 


 7.4 正则化的逻辑回归模型 

        针对逻辑回归问题,我们在之前的课程已经学习过两种优化算法:我们首先学习了使用梯度下降法来优化代价函数 J(θ),接下来学习了更高级的优化算法,这些高级优化算法需要你自己设计代价函数 J(θ)。 

 

        自己计算导数,同样对于逻辑回归,我们也给代价函数增加一个正则化的表达式,得到代价函数: 


        要最小化该代价函数,通过求导,得出梯度下降算法为: 


       注意: 
      1.虽然正则化的逻辑回归中的梯度下降正则化的线性回归中的梯度下降表达式看起来一样,但由于两者的 h(x)不同(逻辑回归:),所以还是有很大差别。 

       2. θ0不参与其中的任何一个正则化。 

        目前大家对机器学习算法可能还只是略懂,但是一旦你精通了线性回归、高级优化算法和正则化技术,坦率地说,你对机器学习的理解可能已经比许多工程师深入了。现在,你已经有了丰富的机器学习知识,目测比那些硅谷工程师还厉害,或者用机器学习算法来做产品。

        接下来的课程中,我们将学习一个非常强大的 非线性分类器,无论是线性回归问题,还是逻辑回归问题,都可以 构造多项式来解决。你将逐渐发现还有更强大的非线性分类器和学习算法,可以用来解决多项式回归问题。

猜你喜欢

转载自blog.csdn.net/zhuangv587/article/details/80528375