1、单变量线性回归

内容:①模型表示:了解线性回归算法、监督学习过程完整的流程,学会如何用模型拟合数据
   ②损失函数:通过最小化损失函数,能够找到最佳的模型
   ③梯度下降:用梯度下降算法求出使损失函数最小的参数,进而得到具体的模型表示

模型表示

  例子:预测住房价格。数据集包含俄勒冈州波特兰市的住房价格,我们想要根据房屋尺寸估算房屋的价格
  方法:画出横坐标为房屋尺寸,纵坐标为房屋售出价格的散点图。如果你朋友的房子是1250平方尺大小,你要告诉他这房子能卖多少钱,那么你可以构建一个模型(可能是条直线),从这个模型上来看,你的朋友能以大约22万美元的价格卖掉这个房子。
  单变量线性回归
  补充:监督学习包括回归(如上例)、分类问题。其中:①监督学习是指每个数据都有“标准答案”,在例子中是每个房子的实际售出价格;②回归问题是指根据历史数据预测出一个连续输出值,例子中的输出值就是房屋的预测价格;③分类问题是指根据历史数据预测离散输出值,比如一封邮件是否是垃圾邮件,就是0/1离散输出的问题
  用数学形式表示这个回归问题:
   m:训练集中样本数量
   n:特征数量(这里是单变量,所以n=1)
   x:是特征、输入变量
   y:是目标变量、输出变量
   (x,y):训练集中的样本
   (x(i),y(i)):第i个样本
   h:学习算法的解决方案/函数,也称为假设(hypothesis)
  监督学习算法的工作方式是:用训练集喂给我们的学习算法,进而学习得到一个假设h,然后将我们要预测的房屋尺寸作为输入变量输入给h,预测出该房屋的交易价格作为输出变量。其中,h的一种可能的表达方式为:

损失函数

  接下来要做的是为模型选择合适的参数θ0和θ1,在线性函数中分别是在y轴上的截距、直线的斜率。参数决定了我们得到的直线相对于训练集的准确程度。可以通过最小化损失函数的方式估计参数,其中,损失函数可以用建模误差的平方和(即平方误差函数)表示,这对于大多数线性回归问题都是合理的,在后续课程中我们会讨论其它的损失函数。
  建模误差:模型所预测的值与训练集中实际值之间的差距(是y轴上的差距,不是点到直线的垂直距离)
  损失函数为,目标是找到使损失函数最小的参数θ0和θ1
  绘制一个等高线图,三个坐标分别为θ0、θ1和J(θ0,θ1),能看出在三维空间中存在一个使得J(θ0,θ1)最小的点
   等高线图

梯度下降

  接下来,需要一种有效的算法,能够自动地找出使代价函数J(θ0,θ1)取得最小值的参数θ0和θ1。因为我们不希望编个程序把这些点画出来,然后人工读出这些点的数值,而且我们还会遇到更复杂、更高维度、更多参数的情况,这些情况是很难画出图的,因此更无法将其可视化。
  梯度下降是一个用来求函数最小值的迭代算法,我们将使用梯度下降算法来求出损失函数的最小值。它背后的思想是:①先初始化参数,随机选择一组数 ②寻找能使损失函数值下降最多的下一个参数组合。持续做第②步直到找到一个局部最小值(因为我们没有尝试完所有的参数组合,所以我们不能确定它是否是全局最小值;初始化的参数值不同,可能找到不同的局部最小值)
  批量梯度下降算法的公式如下:
  说明:①在梯度下降的每一步中,我们都用到了所有的训练样本(计算偏导时要进行求和计算,在每个单独的梯度下降中,我们最终都要计算这样一个东西),所以“批量”说明了我们需要考虑所有这一”批”训练样本。后面的课程会介绍其他类型的梯度下降法,不是这种”批量”型的,每次只关注训练集中的一些小的子集;
  ②α是学习率,它决定了我们沿着能让损失函数下降程度最大的方向向下迈出的步子有多大。如果α太小,只能一点点挪动,这样就需要很多步才能到达最低点;如果α太大,可能会越过最低点,甚至无法收敛(每次都越过最低点);
  ③求偏导即求函数沿着某一参数方向的斜率,使得每次更新都能沿着使损失函数下降最快方向进行,一直迭代下去直到找到局部最小值。随着损失函数越来越靠近局部最低点,偏导数会越来越小(如果α不变),所以参数更新的幅度也越来越小,当损失函数到达局部最低点时偏导数为零,此时参数就不再改变
  ④同步更新参数:应该同时更新θ0和θ1,可以先计算temp0=θ0-α×导数、temp1=θ1-α×导数,再θ0=temp0、θ1=temp1
  将批量梯度算法应用到单变量线性回归中,得到参数的更新公式:,

练习

单变量线性回归

2、多变量线性回归

内容:①模型表示:存在多个特征时的回归模型
   ②多变量梯度下降:用梯度下降法计算使损失函数最小的参数
   ③特征缩放:特征缩放能帮助梯度下降算法快速收敛
   ④如何判断梯度下降算法是否收敛
   ⑤正规方程:是梯度下降的替代算法,可以直接求解参数值

模型表示

  现在,我们对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征$X=(x_1,x_2,…,x_n)$,是一个m×n的矩阵
  参数向量$θ=(θ_0,θ_1,…,θ_n)^T$,支持多变量的假设h表示为$h=θ_0+θ_1x_1+θ_2x_2+…+θ_nx_n$,有n+1个参数和n个输入变量(特征)。为了简化公式,引入$x_0=1$,则公式转化为$h=θ_0x_0+θ_1x_1+θ_2x_2+…+θ_nx_n=X\cdot θ$

多变量梯度下降

  损失函数 表示第i个样本,i=1~m
  参数更新 ,j=0、1

特征缩放

  当我们面对多维特征问题时,要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。
  以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,尺寸的值为 0-2000平方英尺,而房间数量的值则是0-5,以两个参数分别为横纵坐标,绘制损失函数的等高线图能看出图像很扁,梯度下降算法需要很多次的迭代才能收敛
  解决方法:①将所有特征的尺度都尽量缩放到-1到1之间 ②对每个特征计算转换公式 x=(x-μ)/S,其中μ是平均值,S是标准差

测试是否收敛

  方法1(推荐):梯度下降算法收敛所需要的迭代次数 根据模型的不同而不同,我们不能提前预知,我们可以绘制迭代次数(x轴)和损失函数(y轴)的曲线图来观测算法在何时趋于收敛
  方法2:将损失函数的变化值与某个阀值(比如0.001)进行比较
  迭代次数受学习率α的影响,如果α过小,则达到收敛所需的迭代次数会很高;如果α过大,每次迭代可能不会减小代价函数,可能会越过局部最小值导致无法收敛。通常可以考虑尝试些学习率:α=0.01、0.03、0.1、0.3、1、3、10

正规方程

  这是计算损失函数最小值的另一种方法。对于某些线性回归问题,正规方程方法是更好的解决方案。用正规方程可解出参数向量 ,其中X是m×(n+1)的矩阵
  对于那些不可逆的矩阵(通常是因为特征之间不独立,比如同时包含英尺为单位的尺寸和米为单位的尺寸两个特征,也有可能是特征数量n大于训练集的数量m),正规方程方法是不能用的。
  梯度下降vs正规方程:
  比较
  总结:对于特定的线性回归模型,且特征变量的数目不大(小于1万),标准方程法是一个比梯度下降法更快的替代算法。但随着我们要讲的学习算法越来越复杂,这些算法并不能使用标准方程法,就不得不使用梯度下降法。
  附:正规方程的推导过程
  正规方程推导

练习

多变量线性回归

3、附:其他梯度下降算法

(1)随机梯度下降(Stochastic Gradient Descent)
  SGD在计算一个样本的梯度后就更新参数,不用将所有训练集求和。在梯度下降算法还没有完成一次迭代时,随机梯度下降算法便已经走出了很远。但是这样的算法存在的问题是,不是每一步都是朝着”正确”的方向迈出的。因此算法虽然会逐渐走向全局最小值的位置,但是可能无法站到那个最小值的那一点,而是在最小值点附近徘徊。
  在线学习的算法与随机梯度下降算法有些类似,都是对单一的实例进行学习,而非对一个提前定义的训练集进行循环。在线学习一旦对一个数据的学习完成了,我们便可以丢弃该数据,不需要再存储它了。这种方式的好处在于,我们的算法可以很好的适应用户的倾向性,算法可以针对用户的当前行为不断地更新模型以适应该用户。
(2)小批量梯度下降(Mini-Batch Gradient Descent)
  它是介于批量梯度下降算法和随机梯度下降算法之间的算法,每次计算b次(一般在2~100之间)的训练实例,便更新一次参数θ。这样做的好处在于,我们可以用向量化的方式来循环b个训练实例,如果我们用的线性代数函数库比较好,能够支持平行处理,那么算法的总体表现将不受影响(与随机梯度下降相同)

随机梯度下降算法的调试

  ①在批量梯度下降中,我们可以令损失函数J为迭代次数的函数,绘制图表,根据图表来判断梯度下降是否收敛。但是,在大规模的训练集的情况下,这是不现实的,因为计算代价太大了。②在随机梯度下降中,我们在每一次更新θ之前都计算一次代价,然后每x次迭代后,求出这x次对训练实例计算代价的平均值,然后绘制这些平均值与x次迭代的次数之间的函数图表。
  梯度下降调试
  当我们绘制这样的图表时,可能会得到一个颠簸不平但是不会明显减少的函数图像(如上面左下图中蓝线所示)。我们可以增加α来使得函数更加平缓,也许便能看出下降的趋势了(如上面左下图中红线所示);或者可能函数图表仍然是颠簸不平且不下降的(如洋红色线所示),那么我们的模型本身可能存在一些错误。如果我们得到的曲线如上面右下方所示,不断地上升,那么我们可能会需要选择一个较小的学习率α。
  我们也可以令学习率随着迭代次数的增加而减小,例如令 ,随着我们不断地靠近全局最小值,通过减小学习率,我们迫使算法收敛而非在最小值附近徘徊。 但是通常我们不需要这样做便能有非常好的效果了,对α进行调整所耗费的计算通常不值得。
  总结:我们介绍了一种方法,近似地监测出随机梯度下降算法在最优化代价函数中的表现,这种方法不需要定时地扫描整个训练集,来算出整个样本集的代价函数,而是只需要每次对最后1000个,或者多少个样本,求一下平均值。应用这种方法,你既可以保证随机梯度下降法正在正常运转和收敛,也可以用它来调整学习速率α的大小。