在我们开始讨论技术原理之前,先看一些帮组我们直观理解的例子:
给你一下的X,Y值(1,1), (2,2), (4,4), (100,100), (20, 20),当X=5时,Y是多少?
答案是5,很简单,对吧?
现在,让我们看一个难一点的例子。给你一下的X,Y值(1,1), (2,4), (4,16), (100,10000), (20, 400),当X=5时,Y是多少?
答案是25.
让我们来理解一下上面的两个例子。当我们做第一个例子时,首先通过给定的数据 ,建立了X和Y值之间的关系,那就是Y=X。同样的在第二个例子中,Y=X2。
在这两个例子中,我们可以很容易的通过给定的数据确定X和Y之间的关系。实际上线性回归也采用同样的工作原理。
计算机会通过“立即”给定的数据,然后试着确定
表示法
我们在接下来的季节先讨论简单线性回归,也就是只考虑一个输入变量,一个输出变量的线性回归。
为了后面解释和使用方便,首先正式定义简单线性回归中的基本元素。
x(i)表示输入变量(自变量),第一部分例子中的X。
y(i)表示输出变量(因变量),第一部分例子中的Y。
一对(x(i),y(i))表示一组训练样本。
m个训练样本(x(i),y(i));i=1…m称为训练集。
上面表示法中的i代表第i个样本
大写的X代表所有输入值组成的空间。
大写的Y代表所有输出值组成的空间。
监督学习的定义是,给定一个训练集,我们的目标是“学习”得到一个函数h:X→Y,使h(x)是真实值y的一个“好的”预测值。这里h叫做模型,也叫做假设(hypothesis).
如果我们要预测的输出值是连续的,那么该问题就被称作回归问题。对于简单线性回归来说,我们的模型h可以表示如下:
其中的θ0和θ1代表模型的参数
线性回归的目标是:求得最合适的θ0和θ1,使得模型效果最好。
如何衡量模型效果的好坏?
代价函数的作用是用来测量我们的模型的准确程度。
以最简单的一个代价函数为例,也就是均方误差(Mean squared error)。
假设我们的模型如下:
均方误差就是求预测值与真实值之间的插值的平方,即:
(hθ(x(i)-yi)2
这就是均方误差代价函数,想象一下,模型h以及代价函数的h参数是什么?
答案是θ0和θ1,因为我们的目标是找到最合适的θ0和θ1,使模型最好。
因此,如果我们使用大写的J来表示代价函数,那么它的定义如下(注意J是关于θ的函数):
这里的一个细节是,公式中的分母由m变成了2m,这里并不影响公式的作用,但是对于后面的工作有帮助,我们后面将会提到这点。
这里需要考虑一个问题,有了代价函数,如何使模型效果最好?
由于代价函数越大,代表预测值与真实值之间的误差就越大,因此,问题的答案是使代价函数最小的参数θ就是最好的参数。
现在我们的目标进一步变成了球的最合适的参数,是代价函数最小。
那么如何求最合适的参数θ?
这里介绍 一种方法:Normal Equation
Normal Equation是一种“封闭解”,也成为“解析解”,简单说,就是得到一个数学公式,该公式能够直接求得结果。
对于线性回归来说,这个公式如下:
其中X是输入变量的矩阵形式:
y是输出结果的矩阵形式。也是由y(1)至y(m)组成的向量。
这种方法的优点是能够一次性得到解。
但是该方法有如下缺点:
1.计算量大。尤其当输入变量的维度较大时(n比较大),该算法的计算复杂度成指数级增加。
2.占用资源。由于需要一次性在内存中计算得到结果,当数据量较大时,该算法需要占用大量的计算机资源。
为了解决上面两个问题,我们讨论一下另一种求解参数的方法:梯度下降法。
下面介绍另一种求解参数的方法,梯度下降法。
既然代价函数是关于θ的函数,我们就可以可视化该函数,见下图:
图中的蓝色区域是代价函数最小的点,因此,找到该点对应的θ,即完成了任务。
如何找到最低点对应的θ
答案是对代价函数求偏导数:
上面推导式中1/2和2互消了,所以给了我们一个更加值观简洁的结果,这就是为什么代价函数公式要乘以一个1/2.
需要注意的是,上面的公式中,我们采用了一个更加通用的(考虑了多个自变量的情况)表示模型h的方式:
对于我们的简单线性回归来说:
注意,这里θ0乘以一个常数1,也可以认为乘以了常数
所以代价函数对θ0的求偏导的结果就是:
代价函数对θ1求偏导的结果就是:
求得的结果怎么使用?
注意,对θ求偏导数的意义是得到这一点上的切线的斜率,他将给我们一个向最小值移动的方向。
因此,θ减去偏导数就等于θ向最小值的方向移动了一步。这一部的销大有一个参数决定,也称为学习率。用公式表示如下:
注意,上式中的符号:=表示重复该过程,直到收敛。也就是我们的梯度下降公式。
学习率
现在我们讨论一下学习率,当学习率比较小时,我们得到最优解的速度将很慢。
当学习率比较大时,我们很容易无法得到全局最优解。
另一种情况是,我们的学习率设置的比较时,得到了局部最优解,而不是全局最优解。
为了提高求解效率,我们还需要进行数据归一化处理。为什么要这么做?我们先看下面的图。
左边是没有经过归一化处理,右边是经过归一化处理,两张都使用梯度下降,很明显右边的方法通过更少的步骤得到了解。
梯度下降法的三种方式:
第一种方式就是全量梯度下降,也就是说每一次梯度下降都利用全部的数据。这种方法简称为BGD(Batch Gradient Descent)。该算法的缺点是当数据量m较大时,速度很慢。
第二种方式是随机梯度下降,即随机梯度下降(Stochastic Gradient Descent),简称SGD。这种方法的意思是,每次梯度下降的过程使用一个随机的样本,但是该方法有一个问题,就是每次选取的学习效率,让学习率一开始比较大,随后逐渐减少,这种方法也成为模拟退火(simulated annealing)。
第三种方法介于上面两种方法之间,即mini-batch Gradient Descent,简称mini-batch GD,该方法时每次梯度下降过程使用一个比较小的随机数据集。该方法的好处是能够利用计算机对于矩阵求解的性能优化,进而加快计算效率。
前面的讨论都是基于一个输入变量和一个输出变量,这里我们讨论一下当输入变量有多个时的线性回归,这种情况称为“多元线性回归”
首先讨论表示法:
X(i)j表示第j个输入变量的第i个训练样本值。
X(i)表示第i个训练样本的全部输入变量值。
m表示样本的数量
n表示输入变量的数量
我们的多元线性回归模型如下:
如果写成矩阵形式,如下所示,注意,下面这个表达式只是考虑一个采样数据的情况,是更一般情形的基础,该表达式很重要,后面会用到。
这里讨论两种方式对多元线性回归模型求解,第一种方式是采用第一篇文章中介绍过去的方法“梯度下降”。
显然,只需要将梯度下降的公式扩展到每一个参数即可:
另一种方式就是基于最小二乘法对矩阵的矩阵形式进行求解。
为了方便讨论,我们定义:
参数的矩阵形式:
输入变量的矩阵形式:
上述两个向量的乘积就可以得到模型的所有输出值组成的矩阵:
前面提到我们要使用最小二乘法对矩阵进行求解,因此我们这里计算预测值与真实值的均方误差,记为
这里的y和 y’都是向量形式,分别代表真实值和预测值。
我们的目标是求使Eθ’最小的θ’。
想得到最优解,即对θ’求导数得到:
使上式为0,得到:
因此,带入x和y即可得到最优解,但是这里涉及到一些线性代数的问题,这里假设了一个前提条件即XTX是满秩矩阵(满秩矩阵是判断一个矩阵是否可逆的充分必要条件)。
满秩矩阵也就是说这个矩阵是“正定矩阵”,所以其有唯一解。
但是在许多真实案例中,这个条件并不成立,这就是引出了下面要讨论的模型,岭回归模型。
上面我们说到,多元线性回归求解时的一个前提条件是XTX不是满秩矩阵,非满秩矩阵在求逆时会出现问题,为了解决这个问题,统计学家引入了岭回归的概念。
具体做法就是给代价函数添加一个正则项:
上式比多元回归中的代价函数多了一象λθTθ,这项就是正则项。
我们采用让同样的方法,对增加了正则项的代价函数进行求导并令其为0,得到唯一的最佳最优解为:
注意观察上式与多元回归中的最优解区别,那就是在XTX多加了一项λI,这个微小的改变解决了一个巨大的问题。
解决的这个问题就是我们前面提到的“输入数据的矩阵XTX不是满秩矩阵”的问题。式子中的I是一个n*n的单位矩阵,λ是一个自定义的常数,相对于对XTX的对角线元素都加了一个整数,这样即使XTX不是满秩矩阵,加上λI后将变成非奇异矩阵,这时就可以对其求逆了。
为什么给代价函数增加了一象正则项就相当于增加了一个对参数的惩罚项呢?
直观理解是这样的,如果一个参数很大,那么正则项的值就会很大,进而代价函数的值就会比没有正则项大,这时求得的导数值也会变大。我们还记得如何更新模型得参数吗?就是参数原来的值减去求导的值,这时候导数得值变大了,那么参数就会变的更小,相当于“惩罚”了由于参数过大从而引起代价值过大的结果。
岭回归的本质是给参数增加了一个限制条件,即惩罚项,那么,另一个问题自然产生了,只有这一种惩罚方式吗?当然还有其他的惩罚方式,下面就给大家介一种缩减(shrinkage)法:lasso
岭回归相当于增加了如下的约束:
上式限定了所有回归系数的平方和不能大于λ
与岭回归类似,另一个缩减方法lasso也对回归系数做出了限定,对应的约束条件如下
当λ足够小时,一些系数就会因此缩减到0,这个特性帮助我们更好的理解数据,但是这个变化却导致计算复杂度大大提升,因为求解这个约束条件下的回归系数,需要使用二次规划算法。
Lasso模型可以用来估计“稀疏参数”。
在某些情况下Lasso非常有用,由于它的惩罚条件比较严格,所以倾向于选择参数值较少的解,从而有效地减少了给定解所依赖的参数的数量。
简单说,如果你想要的最优解包含的参数数量越少越好,那么使用Lasso是个很好的选择。例如当你想从噪声和信号的叠加中得到信号时。
转载至:https://zhuanlan.zhihu.com