1.的目标函数
前面已知,线性回归的目标函数为:
是一个二元函数。我们要求的是:两个参数和的值。要满足的条件是:和取这个值的时候,的值达到最小。
这里使用梯度下降法进行求解。
2.斜率、导数和微偏分
梯度下降法的步骤总结起来就是:从任意点开始,在该点对目标函数求导,沿着导数方向(梯度)“走”(下降)一个给定步长,如此循环迭代,直至“走到”导数为0的位置,则达到极小值。
为什么要求导呢?从下图可以看到:曲线表示一个函数,它在一个点处的到数值就是经过这个点的函数曲线切线的斜率。
导数表现的是函数
在
一元函数在某一点处沿
导数/偏导数表现的是变化率,而变化本身,用另一个概念来表示,这个概念就是微分(对应偏导数,二元以上函数有偏微分)。
(偏)导数是针对函数上的一个点而言的,是一个值。而(偏)微分则是一个函数,其中的每个点表达的是原函数上各点沿着(偏)导数方向的变化。
直观而不严格的来说,(偏)微分就是沿着(偏)导数的方向,产生了一个无穷小的增量。
当我们求出了一个函数的(偏)微分函数后,将某个变量带入其中,得出的(偏)微分函数对应的函数值,就是原函数在该点处,对该自变量求导的导数值。
所以,只要我们求出了目标函数的(偏)微分函数,那么目标函数自变量值域内每一点的导数值也就都可以求了。
我们只需要记住最基本的求导规则就好,函数(整体,而非在一个点处)求导的结果,就是微分函数。
这里会用到的仅仅是常用规则中最常用的的几条:
1. 常数的导数是零:;
2. 的次幂的导数是倍的的次幂:;
3. 对常数乘以函数求导,结果等于该常数乘以函数的导数:;
4. 两个函数和的和的导数为:;
5. 两个函数和的积的导数为:。
3.梯度下降求解目标函数
对于而言,有两个参数和,函数分别对自变量和取偏微分的结果是:
Step 1:任意给定和的初值。
Step 2:用梯度下降法求解和,为代码如下:
repeat until convergence{
a = a -
b = b -
}
当下降的高度小于某个指定的阈值(近似收敛至最优结果),则停止下降。
将上面展开的式子带入上面的代码,就是:
repeat until convergence{
for i = 1 to m{
sumA = sumA + (
sumB = sumB +
}
}
4.通用线性回归模型的目标函数求解
=>实际上是线性回归模型的一个特例——自变量只有一个维度的特例,在这个模型中,自变量是一个一维向量,可写作。
通用的线性回归函数,是接受维自变量的,相应的模型函数写出来就是一下这样的:
我们用来代替,用到来代替到,那么写出来就是这样的:
我们设,因此:
那么对应的,维自变量的线性回归模型对应的目标函数就是:
再设:
然后将模型函数简写成:
根据习惯,我们在这里将写作,因此,模型函数就成了:
同样应用梯度下降,实现的过程是:
repeat until convergence{
}
细化为针对theta_j的形式就是:
repeat until convergence{
for j = 1 to n{
for i = 1 to m{
}
}
}
这就是梯度下降的通用形式。
5.线性回归的超参数
作为一个线性回归模型,本身的参数是,在开始训练之前,(无论是多少维),具体的数值都不知道,训练过程就是求解中各维度数值的过程。
当我们使用梯度下降求解时,梯度下降算法中的步长参数:,就是训练线性回归模型的超参数。
训练程序通过梯度下降的计算,自动求出了的值,而却是无法求解的,必须手工指定。反之,如果没有指定,梯度下降运算则根本无法进行。
对于线性回归而言,只要用到梯度下降,就会有步长参数alpha这个超参数。
如果训练结果偏差较大,可以尝试调小步长;如果模型质量不错但是训练效率太低,可以适当放大步长;也可以尝试使用动态步长,开始步长较大,随着梯度的缩小,步长同样缩小......
如果训练程序是通过人工指定迭代次数来确定退出条件,则迭代次数也是一个超参数。
如果训练程序以模型结果与真实结果的整体差值小于某一个阈值为退出条件,则这个阈值就是超参数。
在模型类型和训练数据确定的情况下,超参数的设置就成了影响模型最终质量的关键。
而往往一个模型会涉及多个超参数,如何制定策略在最少尝试的情况下让所有超参数设置的结果达到最佳,是一个在实践中非常重要有没有统一方法可以解决的问题。