目录
前言
Housing Price Prediction
Linear Regression
Loss/Cost Function
Learning Rate
作业
前言
在本专栏中,我们将学习机器学习的知识。
Housing Price Prediction
在开始线性回归的研究之前,我们先来考虑一个实际的问题:房屋价格的预测。
在买房子的时候,我们会比较一个房子很多维度的信息,例如:面积,地段,楼层,隔音,向阳等等,往往这些信息都能影响一个房子的价格。
初步学习的前提下,我们简化问题,只考虑面积这一个维度。
一般情况下,房屋的价格与它的面积成正比,我们收集一些这样的数据:
在坐标图中绘制这些数据:
可以看出房屋的面积与价格是有一定关系的,如果现在有一个150的房子,如何根据已有的数据集预测它的价格呢?
依托上面的坐标图,假设我们能够得到一条解析线,它能够尽可能多的包含已有的数据,那么我们就可以由该解析式,预测其他未知量的函数值。
最简单的解析线为直线,因此我们可以按照直线的公式来进行拟合。现在我们的任务就是:如何根据已知的数据集得到一条直线的解析式,这样的问题就是线性回归。
Linear Regression
直线的解析式可以这样定义:
其中是预测房屋价格的值,w为权重(weights),b为偏移量(bias)。
中间的i是数据x的特征维度,也就是房子的面积,地段等等信息,由于我们简化了问题,只考虑面积的影响,所以这里的i=1.
这样我们就定义了一个模型(model),接下来的任务就是让计算机去学习获得参数w和b,从而让模型尽可能拟合数据集:
Loss/Cost Function
什么是学习呢?如果我们能够清楚的描述这个概念,那么就有可能让计算机来模仿学习的过程。现在让我们做一个思维实验:有一个同学小A,他想要提升自己的成绩,一种行之有效的方法是先设立一个目标,例如数学要考100分,然后计算他每次考试结果与100分的差距,接着不断缩小这个差距,这样他的成绩就会逐渐向目标靠拢,从而实现提升成绩的愿望。
基于以上描述,我们进行机器学习的时候,也可以设立一个这样的目标,然后计算当前预测结果与目标的差距(损失函数/代价函数),然后使用一些优化算法来减少这个差距,这样我们就可以实现机器的学习。
损失函数与代价函数有什么区别呢?因为数据集一般都有很多样本,我们将单个样本的差距称为损失函数,所有样本的差距总和称为代价函数。
在房屋预测的示例中,怎么定义损失函数呢?
假设某次机器学习到的参数坐标图是这样的:
预测模型为直线,实际的数据为蓝色的叉叉。我们可以计算预测直线的价格值与实际数据价格值的距离损失。
这里有几个问题,为什么求距离最后不开根号,并且*有什么意义吗?
首先平方的问题,因为平方后并不影响每个样本距离的相对损失,举例来说,A点距离最大为2,B点距离第二大为1,那么A和B平方后,还是A最大,这不影响A和B的地位。而且开根号还要考虑正负的问题,之后的优化也比较麻烦,因此求距离的平方是一种高效的方法。
我们观察求距离的式子,它是一个二次曲线,在对称轴处能够取得最小值,该点也是求导后为0的点,所以我们优化的策略就是梯度降低,即计算损失函数求导后为0的w值。而二次曲线求导会乘2,我们为了消掉系数,所以在最开始*。
这样设置损失函数都是为了方便之后的梯度降低。
因为x,y作为数据集中的样本点,本身已经确定了,损失函数中未知的就是w和b,因此我们分别对这两个参数求导,然后按照一定的学习率向目标靠近:
Learning Rate
学习率是一个超参数,需要自己定义,有四种情况:
如果学习率太小,那么学习的速度会很慢,往往在迭代之后还没有找到最合适的参数值
如果学习率比较大,那么可能会跳过最合适的参数值,从而反复横跳,就相当于我们从数轴的0开始出发,终点是1,但是我们每次移动的步伐是2,开始从0走到2,然后虽然我们知道终点的方向,但是步伐太大了,又会走到0,下面就是不断的0,2重复。
如果学习率过大,那么可能直接就出了参数值的合适范围,从而造成越学习成绩越差的结果,即南辕北辙。
只有选取合适的学习率,才能在有限的迭代次数中找到合适的参数值,完成一次完美的学习。
所以在很多时候人工智能工程师都在寻找合适的学习率,这与经验有关,对于我们来说也是一种学习,学习如何找到合适的学习率。
下面就是梯度降低的求解过程:
用通俗的语言来说就是求导。
作业
我们来看一个作业。
数据集包含50个样本,每个样本有两个数据分别代表横纵坐标。
文件分享
然后在下面的python文件中补充损失函数和梯度优化函数的内容,然后自己选择学习率和迭代次数
文件分享
解决办法如下:
这里有一点需要说明,为了方便,参数W的形状为(2,1),直接包含了w和b,按照矩阵的乘法就可以实现直线的解析式,这也算是一个小技巧了。
最后的结果如下: