本笔记为Coursera在线课程《Machine Learning》中的单变量线性回归章节的笔记。

2.1 模型表示

参考视频: 2 - 1 - Model Representation (8 min).mkv

本课程讲解的第一个算法为"回归算法",本节将要讲解到底什么是Model。下面,以一个房屋交易问题为例开始讲解,如下图所示(从中可以看到监督学习的基本流程)。

面板probit回归 probity回归_梯度下降法

所使用的数据集为俄勒冈州波特兰市的住房价格,根据数据集中的不同房屋尺寸所对应的出售价格,绘制出了数据集;假如,现在有朋友想要出售自己的房子,例如,大小是1250平方尺,你需要告诉他,这个房子可以买到多少钱?你可以做的一件事情是,构造一个模型,从数据模型来看,也许是条直线,然后,你可以告诉你的朋友,他的房子大概可以卖到220000美元。这就是一个监督学习方法的例子,因为,我们对数据集中的每个样本都给出了"正确答案"(对于某一尺寸的房子来说,我们给出了该房子的正确售价)。更加具体地讲,这是一个回归问题,"回归"一词是指,根据之前的数据预测出一个准确的输出值。还有另外一种监督学习方法,叫做分类问题,例如,如果我们正在寻找癌症肿瘤并想要确定肿瘤是良性的还是恶性的,这就是0/1离散输出问题。

更进一步来说,在监督学习中,我们有一个数据集,这个数据集被称为训练集。对于房价的例子来说,我们有一个包含不同尺寸大小的房屋所对应的价格的训练集,而我们的任务就是从这个数据集中习、预测房屋价格。

面板probit回归 probity回归_取值_02

下面,来定义一些本课程要用到的各种符号:

m:训练集中实例的数量(训练集中的训练样本个数);

x:特征/输入变量;

y :目标变量/输出变量(也就是预测结果);

(x,y):训练集中的实例(一个训练样本,表中的每一行为一个训练样本);

(x(i), y(i) ) :第i个观察实例(第i个训练样本,上标i只是一个索引,表示第几个训练样本,即表中的第i行),例如:第一个训练样本的x值为2104、y值为460;第二个训练样本的x值为1416、y值为232。

下面,看一下房屋预测的基本流程,如下图所示,要解决房价预测问题,需要按照如下步骤进行:

  1. 将训练集"喂"给我们的学习算法,得到输出一个函数h(按照惯例,写为小写的h,h代表hypothesis)
  2. 将要预测的房屋的尺寸x作为输入变量输入给h,预测出该房屋的交易价格y (即输出变量),这里的h就是一个函数映射,它将x映射为y,至于为什么这个函数h称为hypothesis(假设)呢?可能确实不是特别地贴切,但不要太纠结于这个问题,就是一种习惯吧。

面板probit回归 probity回归_面板probit回归_03

那么,这里的h应该如何表达呢?一种可能的表达方式为:h(x)=θ0+θ1x。因为只含有一个特征/输入变量,因此这样的问题叫作单变量线性回归问题。(h表达中的参数如何求解呢?需要通过最小化代价函数,下面几节中将会介绍)

2.2 代价函数

参考视频: 2 - 2 - Cost Function (8 min).mkv

本节将要定义什么是代价函数,这将有助于我们把最有可能的直线与给定的数据相拟合。

面板probit回归 probity回归_代价函数_04

如上图图所示,是线性回归中所用到的一个数据集,注意,m是训练集中样本的个数,而我们的假设函数(也就是用来进行预测的函数)具有形式:h(x)=θ0+θ1x。引入术语:将θ0 和θ1称为模型参数。下面,讨论如何计算得到θ0 和θ1。

如下图所示,选择不同的模型参数,会得到不同的假设函数,下图给出了三个例子。

面板probit回归 probity回归_代价函数_05

对于房屋预测问题,我们现在要做的便是为我们的模型h选择合适的参数(parameters)θ0 和θ1,使得由假设函数所表示的直线尽可能与给定的数据点较好地拟合。那么,该如何计算θ0 和θ1呢?基本思想:如果该模型比较合理,就应该使数据集中每一个房屋在该模型下的预测价格和该房屋的实际价格尽可能地接近,所以,可以利用一个最小化问题求解θ0 和θ1。于是,问题转化为:求解θ0 和θ1,使得训练集中的所有样本的预测值和真实值的差的平方和最小,这就是线性回归的目标函数。按照惯例,将这个代价函数写为:

    

面板probit回归 probity回归_代价函数_06

这个代价函数也称为Squared error function(对于回归问题来说,误差平方和函数是一个比较合适、常用的选择,当然,也可以选择一些其他形式的代价函数)。

面板probit回归 probity回归_梯度下降法_07

也许这个函数J(θ0,θ1)有点抽象,可能你仍然不知道它的内涵,在接下来的几个视频里我们要更进一步解释,代价函数J的工作原理,并尝试更直观地解释它在计算什么,以及我们使用它的目的。

2.3 代价函数的直观理解I:仅有一个模型参数时

参考视频: 2 - 3 - Cost Function - Intuition I (11 min).mkv

上一小节的视频给出了代价函数在数学上的定义,本小节将通过一些例子来讲述代价函数的直观意义到底是什么,并且讲述如何使用它。

首先,对上节内容进行回顾,如下图所示,我们想要用一条直线来拟合我们的数据,用参数θ0 和θ1得到假设h,而通过选择不同的θ0 和θ1,可以得到不同的拟合直线;在本小节中,为了更好地讲述代价函数,我们使用一个简化的假设函数,将θ0 看做等于0,从而,优化函数将只有一个参数θ1。(将假设函数看做经过原点的直线(θ0 =0)可以更好地解释代价函数。)

面板probit回归 probity回归_代价函数_08

接下来利用简化的假设函数(θ0 =0)来理解两个重要的函数:假设函数h和代价函数J,实际上,假设函数h是一个关于房屋大小x的函数,代价函数是一个关于参数θ1的函数,θ1控制着这个函数的斜率。下面,给定一组简单的训练集,其中有三个样本:(1,1)、(2,2)、(3,3),当假设函数的参数取值θ1不同时,相应的代价函数取值也会不同,下面,考察代价函数的取值与θ1的取值之间的关系(分别以几个不同θ1取值为例)。

当θ1=1时(如下图所示),画出假设函数,计算此时代价函数的取值J(θ1=1)=0;

面板probit回归 probity回归_代价函数_09

当θ1=0.5时(如下图所示),画出假设函数,计算此时代价函数的取值J(θ1=0.5)=0.58。从图中可以看到,代价函数其实就是假设函数中,竖直线段线段的平方和(从样本点做平行于y轴的直线,它与假设函数交点为预测值,所有样本点和预测点之间的线段长度平方和即为代价函数J);

面板probit回归 probity回归_梯度下降法_10

再将θ1分别取0、1.5、2.5等数值,分别计算J的取值,如下图所示。然后,将θ1取值不同时所对应的不同J值所对应的数据点绘制出来,如下侧右图所示,可以看到,当J的取值不同时,对应于不同的假设函数;反之,不同的假设函数也对应于不同的代价函数取值,而学习算法的目标是最小化目标函数。

从下图中可以看到,当θ1=1时,J取得最小值0,而该J对应的假设函数正好比较好地拟合出了数据集中的样本点,这就比较直观地解释了为什么通过最小化代价函数可以得到一个最佳的拟合直线。

面板probit回归 probity回归_面板probit回归_11

本小节通过一些图像理解了代价函数,为了简化算法,让θ0=0,从而,代价函数只有一个参数θ1=0;下一节中,将回到原来的问题,即不再让让θ0=0。注意到:我们选择的参数决定了我们得到的直线相对于我们的训练集的准确程度,模型所预测的值与训练集中实际值之间的差距就是建模误差(modeling error)。

2.4 代价函数的直观理解II:有两个模型参数时

参考视频: 2 - 4 - Cost Function - Intuition II (9 min).mkv

本小节将进一步理解代价函数(需要用到轮廓图)。与上一小节相同,来看一下假设函数、模型参数、代价函数、优化目标函数,所不同的是,这里不再假设θ0=0,而J是θ0和θ1的函数。

面板probit回归 probity回归_取值_12

下面,理解假设函数和代价函数,如下图所示,给出了某房屋价格数据集。首先,构造某种假设函数,以下图所示的黑色直线为例(虽然它不是一个好的假设函数,但暂且这样假设)。同样,对不同的θ0和θ1取值,可以得到代价函数的函数曲线。

面板probit回归 probity回归_面板probit回归_13

当h只有一个参数时,代价函数J的图形将是如上图右侧所示的碗装函数。但现在J有两个参数:θ0和θ1,J的函数图形仍然呈现出碗装形状,但变为了二维图形,如下图所示。

面板probit回归 probity回归_代价函数_14

对于不同的假设函数,代价函数取值不同。接下来,为了描述方面,不再使用这个三维图形,而是使用contour figure。如下右图所示,就是contour figure,同一椭圆上的点,代表J取值相同。如下侧右图所示,θ0=800这点对应于左图中的直线,可以看到,这条直线并不能很好地拟合数据集,并且注意到,θ0=800这点距离J的最小值点还很远,也就是说这个代价函数还很大。

面板probit回归 probity回归_取值_15

接下来,再看几个例子,从下面几幅图中的例子可以看到,通过不断地降低J的取值,可以找到较好的拟合直线(即随着J值得降低,所对应的直线实现了对数据集更好的拟合)。

面板probit回归 probity回归_代价函数_16

面板probit回归 probity回归_取值_17

面板probit回归 probity回归_面板probit回归_18

在实际中,我们需要能够通过自动化的方式找到θ0和θ1的取值,下一小节,主要就要介绍这个内容。

 

2.5 梯度下降

参考视频: 2 - 5 - Gradient Descent (11 min).mkv

下图给出了一个代价函数J(θ0, θ1),它可能是在线性回归问题中构造出的,也可能是其他问题中构造出的。对于梯度下降法,它可以用于优化含有多个参数的代价函数,但这里仅以两个参数为例。下面介绍梯度下降的构想。

首先对θ0和θ1设定一些初步猜测值(即赋予初值),这些值到底取为什么其实并不重要,但通常的选择是将θ0和θ1都设为0(即将θ0和θ1都初始化为0)。接下来要做的就是不停地一点点地改变θ0和θ1,试图通过这种改变使得J(θ0, θ1)变小,直到我们找到J的最小值(或许是局部最小值)。

面板probit回归 probity回归_取值_19

下面通过一些图片来观察梯度下降法是如何工作的:如下图所示,试图让代价函数J(θ0, θ1)最小,坐标轴θ0和θ1在水平轴上,而函数J在垂直坐标轴上,图形表面高度即为J的值。我们希望最小化代价函数J(θ0, θ1):从θ0和θ1的某个值出发,也就是对应于从这个函数表面上的某个起始点出发(不管θ0和θ1的取值是多少,将它们初始化为0,但有时也可把它们初始化为其他值);可以把这个图形想象为一座山,想象正站立在山的点A上,在梯度下降算法中,我们要做的就是旋转360度,看看我们的周围并问自己,我要在某个方向上,用小碎步尽快下山,这些小碎步需要朝什么方向?找到最快下降方向后,迈出一步,然后再环顾四周,找到最快下降方向,再迈出一步,如此反复,直到到达局部的最低点。

但有一个问题,起始点的位置不同时,会得到完全不同的局部最优解(分别以下侧右图所示的点A和点B为初始点时,得到的局部最优解不同)。这就是梯度下降算法的一个特点。

面板probit回归 probity回归_面板probit回归_20

面板probit回归 probity回归_面板probit回归_21

下面,看一下梯度下降法的定义,如下图所示。这个公式有很多细节问题:

(1):= 表示赋值;

(2)α 是一个数字,被称为学习速率,它控制了我们下山时会迈出多大的步子,因此如果α值很大,那么相应的梯度下降过程中我们会试图用大步子下山,如果α值很小,那么我们会迈着很小的小碎步下山(关于如何设置α的值等内容,在之后的课程中会再讲解);

(3)微分项(代价函数的导数)在下一小节中将会讲到。

(4)同时,要注意,这里的梯度下降法为批量梯度下降法,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数。

面板probit回归 probity回归_梯度下降法_22

梯度下降背后的思想:开始时随机选择一个参数的组合(θ0,θ1,...,θn),计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。持续这么做直到找到一个局部最小值(local minimum)。因为并没有尝试完所有的参数组合,所以不能确定所得到的局部最小值是否为全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。

2.6 梯度下降的直观理解

参考视频: 2 - 6 - Gradient Descent Intuition (12 min).mkv

本小节主要介绍梯度下降法是做什么的,以及梯度下降算法的更新过程有什么意义。下图给出了上一小节中给出的梯度下降算法,其中:参数α称为学习速率,它控制我们以多大的幅度更新参数θj。本小节将要给这个式子一个直观的认识,并且介绍式中的两部分(learning rate和derivative)的作用以及为什么当把这两部分放一起时整个更新过程是有意义的。

面板probit回归 probity回归_取值_23

以一个稍微简单的情况为例:代价函数J只有一个参数θ1,那么我们可以画出一维曲线,接下来试着去理解为什么梯度下降法会在这个代价函数J上起作用。如下图所示,给出了J(θ1)的曲线,并且在其上给出了一个初始化点θ1(下图左侧所示),接下来要做的就是对θ1进行不断的更新:

面板probit回归 probity回归_代价函数_24

此处求导的目的就是要求解初始点处的切线,该切线的斜率就是式中的偏导数,这里的斜率是一个大于0的数,所以,θ1减去一个正数乘以学习速率(也是正数),会使θ1的取值变小,所以θ1的取值会向着最低点的位置移动。下图右侧给出了初始点在另外位置处的情况。

面板probit回归 probity回归_代价函数_25

面板probit回归 probity回归_代价函数_26

面板probit回归 probity回归_取值_27

面板probit回归 probity回归_取值_28

面板probit回归 probity回归_取值_29

接下来,分析一下α(学习率、learning rate),下图中给出了更新的规律:可以看到,当α较小时,需要很多步才能走到最低点(baby steps);当α较大时,可能会出现发散的情况。

面板probit回归 probity回归_面板probit回归_30

如果我们事先把初始点放在一个局部极小值处时,下一步迭代该如何走呢?

面板probit回归 probity回归_面板probit回归_31

下面,解释一下为什么学习率不变时,梯度下降法也可以收敛到局部最优解,如下图所示,首先初始化梯度下降算法,初始点为点A,这一点处的梯度相当的陡,所以,下一步更新迈的步子会比较大,到新的更新点处后,导数没那么大了,所以不再会迈那么大的步子,再接着往下走,越来越接近最优值,梯度越来越小,迈的步子也越来越小,也就是说,随着梯度下降法的运行,移动的幅度会自动变得越来越小,直到收敛到一个局部极小值。

面板probit回归 probity回归_取值_32

2.7 梯度下降的线性回归

参考视频: 2 - 7 - GradientDescentForLinearRegression (6 min).mkv

本小节将要回归到线性回归的本质问题,即代价函数中有两个参数的情况。如下图所示,左侧是梯度下降法,右侧是线性回归。接下来要做的就是用左侧的梯度下降法来最小化平方误差代价函数。可以看到,其中的关键问题就是求出代价函数的导数。

面板probit回归 probity回归_取值_33

下面,讨论如何计算出代价函数的导数。

面板probit回归 probity回归_梯度下降法_34

其中:(

面板probit回归 probity回归_代价函数_35

面板probit回归 probity回归_代价函数_36

面板probit回归 probity回归_梯度下降法_37

计算出代价函数的导数后,将它们代入到梯度下降法中,可以得到下图所示算法,在执行梯度下降法时有一个需要注意的细节:两个参数要同时更新。

面板probit回归 probity回归_取值_38

下面,看一下梯度下降法是如何工作的。对于下图所示的代价函数,当初始位置不同时,可能会收敛到不同的局部最优解。

面板probit回归 probity回归_梯度下降法_39

但对于线性回归问题,代价函数是一个碗装的函数(凸函数),该函数只有一个全局最优解,所以,利用梯度下降法,总是会收敛到全局最优解。

面板probit回归 probity回归_面板probit回归_40

下面,看一些梯度下降法的执行过程:

面板probit回归 probity回归_取值_41

面板probit回归 probity回归_面板probit回归_42

面板probit回归 probity回归_取值_43

面板probit回归 probity回归_梯度下降法_44

面板probit回归 probity回归_取值_45

面板probit回归 probity回归_梯度下降法_46

面板probit回归 probity回归_代价函数_47

面板probit回归 probity回归_取值_48

面板probit回归 probity回归_面板probit回归_49

最后,给出一个定义:批量梯度下降法。即在进行梯度下降法的过程中,每一次迭代都用到了所有的训练样本,就是说,每次更新都需要考虑这一"批"样本。也有些梯度下降法,每次更新时只考了部分样本,这个以后再做介绍。

面板probit回归 probity回归_取值_50

2.8 接下来的内容

在接下来的一组视频中,将对线性代数进行一个快速的复习回顾。如果你从来没有接触过向量和矩阵,那么这课件上所有的一切对你来说都是新知识,或者你之前对线性代数有所了解,但由于隔得久了,对其有所遗忘,那就请学习接下来的一组视频,我会快速地回顾你将用到的线性代数知识。

通过它们,你可以实现和使用更强大的线性回归模型。事实上,线性代数不仅仅在线性回归中应用广泛,它其中的矩阵和向量将有助于帮助我们实现之后更多的机器学习模型,并在计算上更有效率。正是因为这些矩阵和向量提供了一种有效的方式来组织大量的数据,特别是当我们处理巨大的训练集时,如果你不熟悉线性代数,如果你觉得线性代数看上去是一个复杂、可怕的概念,特别是对于之前从未接触过它的人,不必担心,事实上,为了实现机器学习算法,我们只需要一些非常非常基础的线性代数知识。通过接下来几个视频,你可以很快地学会所有你需要了解的线性代数知识。具体来说,为了帮助你判断是否有需要学习接下来的一组视频,我会讨论什么是矩阵和向量,谈谈如何加、减、乘矩阵和向量,讨论逆矩阵和转置矩阵的概念。

如果你十分熟悉这些概念,那么你完全可以跳过这组关于线性代数的选修视频,但是如果你对这些概念仍有些许的不确定,不确定这些数字或这些矩阵的意思,那么请看一看下一组的视频,它会很快地教你一些你需要知道的线性代数的知识,便于之后编写机器学习算法和处理大量数据。