本章将以线性回归为例子,介绍整个算法的过程,以及算法中过程涉及的计算参数等。
这是一个线性回归的例子,当你想要预测一个未知的房价时,要根据给出的所有数据,去寻找一条线来拟合已给的数据,再通过这条线去预测未知的房价。
这里描述的是对数据集的介绍,对于监督学习来说,会给定一些数据集如上图所示,其中
m代表的是数据的数量,这图中也就是多少列。
x代表输入变量,也就是数据集的特征,图中是指房子的大小
y代表输出变量,也就是我们想要的变量,图中指的是房子的价格
(x,y)指的是一个训练样本
带上标的xy指的是第i个样本
下面我们来看一下监督学习是如何工作的,下面以线性回归为例子来进行讲解。
如果所示提供一个数据集,然后学习算法的目标是得到一个函数,这里用h来表示,代表假设函数,h的作用是把房子的大小x作为输入变量,它会输出相应大小的预测价格y,h是一个从x映射到y的函数。
下面就是如何来表示h这个函数,在这里是用图中绿色的公式来表示,也就是线性函数,所以是线性回归,后面会介绍更复杂的非线性函数。
如图所示,这是监督学习或者说线性回归的数据集,我们用h来表示假设函数,函数里面有两个参数,这两个参数是如何确定的呢?
对于参数的不同我们所得到的假设函数也会有很大的区别,如上面所示。
对于给定的数据集,我们想要做的就是去寻找合适的参数去使得假设函数去尽可能的拟合每个(x,y)。
线性回归的目标函数可以写成右边那样,代表假设函数的输出h与真实数据集的y的差代表预测的与真实的相比,越小越好。我们的目标就是去寻找合适的参数去使得预测值和真实值的差的平方的和的1/2m最小。(用2m是因为后面有个平方和,求导会出现2,用2m正好能抵消掉)
上面就是我们线性回归的整体目标函数
为了使它更明确,我们要改写这个函数
下面这个J也就是我们所说的代价函数。
代价函数也被称作平方误差函数(Squared error function),有时候也被称作平方误差代价函数。
除了平方误差函数,后面还会介绍其他代价函数,但是平方误差函数是解决回归问题最常用的手段了。
为了更好的理解代价函数,我们对假设函数做出了简化,如图右所示,我们将一个参数设置为0,这时候我们只需要去找一个参数与代价函数的关系就可以了。
为了更好的理解假设函数与代价函数的关系,吴恩达老师在这里举例子来计算说明两者的关系,当sitar等于1时,我们将假设函数画出来,将代价函数进行计算,参数等于1的时候,预测值正好与实际值相等,所以差为0,所以代价函数也是为0.
这里是假设sitar等于0.5时计算出代价函数,误差就是图左边所画的垂直的距离。
通过对参数的不同设置,我们计算出每个参数对应的代价函数,我们根据计算出的代价函数来进行画出代价函数图像如右边所示。
上一节我们将一个参数设为0,来研究一个参数对假设函数和代价函数的关系,这一节我们研究两个参数是如何影响他们的。
实际上这个代价函数(也叫损失函数)实际上一个碗装的。
我们用这个3D图来表示代价函数,用contour plots或者contour figures(等高线)来表示。
右边这个等高线图,其中轴分别为两个参数,每一个椭圆形显示了一系列J(θ0,θ1)值相等的点
如图所示,这三个点的J是相同的,也就是代价函数是i相同的。
下面举例说明
如上图所示的例子,这个点的θ0和θ1分别为-0.15和800,对应左边的图应该为斜率是-0.15,与x轴相交的点为800,所以两个参数对应的假设函数应该为左边那样,但是这条线没有很好的去拟合所有的点,它的代价函数离着正圆心的那个代价函数最小的点还挺远。
这里虽然代价函数不是最小的,但是已经接近最小值了。
我们前面定义了代价函数J,下面我们介绍使代价函数最小化的的梯度下降法。在这里我们介绍用梯度下降算法最小化任意的函数J。
这就是梯度下降的思想,开始先初始化参数,然后不断改变参数来减少J这个函数直到我们可以找到最小的J或者局部最小值。
下面直观的来看一下梯度下降是如何进行的
如图所示,就像爬山一样,当你站在某一个位置也就是初始位置的时候,你想下山,你不断的去寻找最低点来进行下山。不断的走就会寻找到一个最低点,也就是局部最低点也就是局部最优处。
下图是初始位置发生改变后,也是用上面的方法进行下山来寻找最低点,不断的走会找到另一个局部最低点也就是局部最优处。
对于梯度下降算法,就如图中给出的一样,不停重复执行这个公式。
公式中 := 这个符号代表赋值操作,就是从右边赋值给左边
公式中阿尔法指的是步长,也就是你梯度下降的快慢,也可以理解成你下山速度的快慢,后面是导数项,下面会详细推导介绍。
注意:在这里我们举得例子是针对于两个参数的梯度下降,对于参数来说要同步更新,多个参数也是要进行同步更新。
比如图片下面所示,先把两个参数进行梯度下降计算,再分别赋值给θ0和θ1。而右边的那个做法是不对的,它没有完成同步更新,因为计算完第一行后接着把结果赋值给了θ0,第三行计算梯度的时候θ0应该用最新的,也就是第二行已经计算过梯度的θ0.
这是我们上节课所学习的梯度下降公式,其中α称为学习率,用它来控制我们参数j更新的速率,α后面是导数项,我们下面将举一个例子,为了简化我们假设代价函数J只有一个参数θ1,它属于一个实数,所以我们可以画出一个一维的曲线。
如图所示,就是代价函数J和θ之间的关系图,对于任意一点,我们通过公式计算它梯度下降的过程,其中导数项部分我们看到在着相比之前的有点不同是这里写的是用的导数,上面写的用的偏导,其实这是数学方面的不同,(其中单变量函数求导叫导数,多变量函数对某一变量求导数叫偏导),意义是一样的,对于上半部分图我们可以看到红点处求导数其实就是对于求红点处的斜率,也就是正切值,在上半部分它的斜率是大于0 的,所以梯度下降计算,θ-一个大于0 的,实际上θ是减小的,也就是往左边移动来找最低点,而下半部分图则相反,红点处的斜率也就是正切是小于0的,则是往左边移动。
如果α小的话,那么它梯度下降调整的速率很慢,一点一点移动才能找到最低点。
如果α过大,那么梯度下降的不规则的移动,可能一会超过最低点,可能一会儿再回来。那么梯度下降可能会越过最低点,甚至无法收敛或者发散。
思考问题:如果θ1已经是最低点了,那么梯度下降如何移动?
假设你初始化θ的时候在最低点也就是最优点,这时候它的正切或者说斜率是0,这时候根据公式θ还是等于原来那个θ不变。
这也解释了即使学习率不变,梯度下降也可以 收敛到局部最优点的原因
对于粉色点,它的斜率比较大比较陡,在进行梯度下降的时候相对的下降的就快,因为导数大,往下的点我们可以看到点越来越缓,所以导数相对就小,所以梯度下降调整的就慢,越靠近局部最优点或者局部最低点,下降的速度就越来越慢。
在这一小结,我们结合线性回归的平方差代价函数和梯度下降来进行详细分析,得到我们学习的第一个算法,线性回归算法。
结合的主要因素就是这个导数项是什么,如何处理。
对于求偏导,我们把代价函数J带入,对于下面分别求θ等于0和1的偏导,j等于1的时候,要用到链式求导因为里面的参数θ1有个系数x,所以求导后面也要乘这个x。
将上面的式子带入梯度下降算法中,同时要保证这两个参数同步更新。
但是梯度下降有个问题就是有的时候会陷入局部最优解中。
但是线性回归不会,因为线性回归函数是个凸函数,如下图所示
注意:这里是凸函数,下凸,而在高数中定义是凹函数
像这个函数,它只有全局最优解。
我们下面看假设函数和代价函数之间的关系图
假设红色点是个初始的点,随着梯度下降会得到下面所示的点
我们看到假设函数的图也会发生变化,再往下继续梯度下降变化
我们可以看到假设函数越来越拟合数据,最后我们达到了全局最小值,也就是全局最优解
我们上面讲的梯度下降又叫做Batch 梯度下降,它每一步梯度下降都会使用所有的训练数据集,所以计算偏导数的时候,我们计算总和即可。
后面还会讲不用全部训练集的梯度下降的方法。