这个做的是 Stanford 的机器学习公开课的笔记。前两课很简单,吴大牛讲得又极清楚,我很多地方就简单记了。
线性回归解决的是一个回归问题(怎么像废话),即要预测的目标变量(target variable)是连续值。我们有一个大小为 的训练集, 其中数据点 分别对应目标变量 ;每个 是一个 维向量, 为一个数据点的属性(feature)数。(为后面书写简便我们在 个属性前再加一维 ,即 。)给定这样一个训练集,我们希望知道对于某个训练集外的 , 它对应的 是什么。
线性回归的假设(hypothesis)是,数据点的属性 和对应的目标变量 是线性关系,可以用一条直线 来拟合1,就像下面这样(图片盗自维基):

其中 也是一个 维向量,就是我们想拟合的参数,因为假如能求出 , 对于一个训练集外的点 我们就能预测它对应的 了。
为了评价我们估计的 的优劣,我们需要引入一个目标函数/费用函数(cost function)。 根据最小二乘法,我们定义下面的 为我们需要最小化的目标函数:
其中 这个常系数并非必须,只是为了计算便利加上去的。我们要求的就是 。
不过在继续之前我们先把 的记法再进一步 vectorize 一下。我们定义一个 的设计矩阵 ,其第 行为 ,即
我们再定义
不难推出 可以写成下面的形式:
我们知道函数在极值处梯度为零,因此第一种解法就是直接求 。这样可以得到一个解析解:
注意其中 是一个 的矩阵,而矩阵求逆的的复杂度一般是 。 所以这种解法在 比较小的时候非常高效,但在 较大时就瞎了。
我们还知道 上某一点的梯度向量指向 增长最快的方向,长度为这个增长的变化率。 因此第二种解法就是让 的值向着 的方向,即 减小最快的方向迭代变化,这样就可以逼近 的极小值了。因此我们可以得到下面被称为 梯度下降的算法:
Repeat until converge { $$ \begin{eqnarray} \theta_{t+1} &:=& \theta_t - \alpha \nabla_\theta J(\theta) \ &=& \theta_t - \frac{\alpha}{m} X^{\rm T} (\vec{h_\theta} - \vec{y}) \end{eqnarray} $$ }
其中 称为学习速率(learning rate),意思就是……学习的速率= = 这个参数控制着每次迭代 值变化的保守或激进程度; 如果太大,一次迭代对 改变过大,导致“冲得太猛”越过了极值点没法收敛;如果太小,一次迭代对 改变太少,算法收敛太慢。 决定 的方法是……呃,就是试,“0.01 太小,0.1 太大,0.03 有点小,咦 0.06 正好”这样。
对于线性回归和梯度下降,课上还谈到了另外两个话题。一是属性缩放(feature scaling)。如果不同属性数量级差得太大, 会严重影响梯度下降的性能。这时可以对分别对每项属性做类似“减去均值,除以标准差”这样的缩放。二是 多项式回归(polynomial regression)。 属性值和目标变量值之间的关系可能不是线性的,而是多项式的关系,比如 这样。 但由于这个式子对于 仍然是线性的,所以用最小二乘法时可以直接把 、 看成是彼此独立的不同的属性, 然后按上面的方法如法炮制。至于多项式回归时属性的次数怎么取,应该会在讲 bias-variance trade-off 的时候讲吧,我到时候再写好了。
-
这里讲得有点 sloppy 了(不过你能明白我的意思就行=.=)。更严格一点说,应该是训练集中的数据满足:
其中 表示误差;各 满足均值为零,方差相同且互不相关 (参见高斯-马尔科夫定理)。
顺带一提,我们如果进一步假设 ,有 ,则这个模型成为 广义线性模式(Generalized linear model) 的一个特例。我们用极大log似然法
可以推出和下面提到的最小二乘法一样的形式。——如果你不知道我上面在说什么,忽略吧,不碍得的。↩
-
推导其实挺麻烦的。教授在课上没讲,我也懒得敲了=.=↩
-
注意这里每次迭代的运算都会考虑整个训练集,这称为批量梯度下降(batch gradient descent), 当训练集很大时这可能导致很大的开销。我们也可以每次迭代只依次选取训练集中的一个实例 ,更新
这个叫增量梯度下降(incremental gradient descent)。好处在于每次迭代开销小,因而收敛速度较快, 在处理大数据集时可能很有用。但坏处在于这算法可能永远都收敛不到极小值,而是一直围着极小值转——不过在实际应用中这个也能接受了。↩
Comments