房价预测问题:
假定你朋友要买的房子面积为1250平方尺,你要告诉他这房子能卖多少钱。
它被称作监督学习是因为对于每个数据来说,我们给出了“正确的答案”,即告诉我们:根据我们的数据来说,房子实际的价格是多少,而且,更具体来说,这是一个回归问题。
回归一词指的是,我们根据之前的数据预测出一个准确的输出值,对于这个例子就是价格。
本例的训练集(Training Set)如下:
m m m:代表训练集中实例的数量
x x x:代表特征/输入变量
y y y:代表目标变量/输出变量
( x , y ) (x,y) (x,y):代表训练集中的实例
( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i)):代表第 i i i个观察实例
h h h:代表学习算法的解决方法或函数,也称为假设(hypothesis)
本例中 h h h是一个从 x x x(房屋尺寸)到 y y y(房屋价格)的函数映射:
h θ ( x ) = θ 0 + θ 1 x h_\theta(x)=\theta_0 + \theta_1x hθ(x)=θ0+θ1x
因为只有一个特征/输入变量,因此这样的问题叫作单变量线性回归问题(Linear Regression with One Variable)。
如图:
m m m代表了训练样本的数量,比如 m = 47 m=47 m=47。
接下来需要做的便是为我们的模型选择合适的参数 θ 0 \theta_0 θ0和 θ 1 \theta_1 θ1,在房价问题的例子中便是在 y y y轴上的截距和直线的斜率。
我们选择的参数决定了我们得到的直线相对于我们的训练集的准确程度,模型所预测的值与训练集中实际值之间的差距(下图中蓝线所指)就是建模误差(modeling error)。
我们的目标是:**选择出合适的模型参数,使得建模误差的平方和最小。**即使得代价函数:
J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta_0, \theta_1) = \frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2 J(θ0,θ1)=2m1i=1∑m(hθ(x(i))−y(i))2
最小。
代价函数也被称作平方误差函数,或平方误差代价函数。对大多数问题,特别是回归问题,平方误差代价函数是一个合理的选择。还有其他的代价函数也能很好地发挥作用,但是平方误差代价函数可能是解决回归问题最常用的手段了。
Hypothesis:
h θ ( x ) = θ 0 + θ 1 x h_\theta(x)=\theta_0 + \theta_1x hθ(x)=θ0+θ1x
Parameters:
θ 0 , θ 1 \theta_0 ,\theta_1 θ0,θ1
Cost Function:
J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta_0, \theta_1) = \frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2 J(θ0,θ1)=2m1i=1∑m(hθ(x(i))−y(i))2
Goal:
m i n i m i z e θ 0 , θ 1 J ( θ 0 , θ 1 ) \underset{\theta_0,\theta_1 }{minimize}\ J(\theta_0 ,\theta_1) θ0,θ1minimize J(θ0,θ1)
简化一下,假设 θ 0 = 0 \theta_0=0 θ0=0,那么,
Hypothesis:
h θ ( x ) = θ 1 x h_\theta(x)= \theta_1x hθ(x)=θ1x
Parameters:
θ 1 \theta_1 θ1
Cost Function:
J ( θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta_1) = \frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2 J(θ1)=2m1i=1∑m(hθ(x(i))−y(i))2
Goal:
m i n i m i z e θ 1 J ( θ 1 ) \underset{\theta_1 }{minimize}\ J(\theta_1) θ1minimize J(θ1)
对于下面左图中的三个样本点,代价函数的图形如下面右图所示,当 θ 1 = 1 \theta_1=1 θ1=1时,代价函数 m i n i m i z e θ 1 J ( θ 1 ) = 0 \underset{\theta_1}{minimize}\ J(\theta_1)=0 θ1minimize J(θ1)=0最小。
通过代价函数 J ( θ 0 , θ 1 ) J(\theta_0, \theta_1) J(θ0,θ1)的等高线图:
可以看出三维空间中存在一个使得 J ( θ 0 , θ 1 ) J(\theta_0, \theta_1) J(θ0,θ1)最小的点。
梯度下降是一个用来求函数最小值的算法。其背后的思想是:
开始时我们随机选择一个参数的组合 ( θ 0 , θ 1 , . . . , θ n ) (\theta_0,\theta_1,...,\theta_n) (θ0,θ1,...,θn),计算代价函数,然后寻找下一个能让代价函数值下降最多的参数组合,持续重复这个步骤,直到找到一个局部最小值(local minimum)。
因为我们没有尝试完所有的参数组合,所以不能确定我们得到的最小值是否为全局最小值(global minimum)。
选择不同的初始参数组合,可能会找到不同的局部最小值。
批量梯度下降(batch gradient descent)算法的公式为:
repeat until convergence{
θ j : = θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 ) \qquad\theta_j:=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1)\quad θj:=θj−α∂θj∂J(θ0,θ1)(for j = 0 j=0 j=0 and j = 1 j=1 j=1)
}
其中 α \alpha α是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向迈出的步子有多大。
每一次都同时让所有的(参数 - 学习率 x 代价函数对应参数的偏导数)
注意所有参数要同时更新:
Correct:Simultaneous update
temp0 : = θ 0 − α ∂ ∂ θ 0 J ( θ 0 , θ 1 ) :=\theta_0-\alpha\frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1) :=θ0−α∂θ0∂J(θ0,θ1)
temp1 : = θ 1 − α ∂ ∂ θ 1 J ( θ 0 , θ 1 ) :=\theta_1-\alpha\frac{\partial}{\partial\theta_1}J(\theta_0,\theta_1) :=θ1−α∂θ1∂J(θ0,θ1)
θ 0 : =    \theta_0:=\; θ0:=temp0
θ 1 : =    \theta_1:=\; θ1:=temp1
θ j : = θ j − α ∂ ∂ θ j J ( θ ) \theta_j:=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta) θj:=θj−α∂θj∂J(θ)
对 θ \theta θ赋值,使得 J ( θ ) J(\theta) J(θ)按梯度下降最快的方向进行,一直迭代下去,最终得到局部最小值。
上图中红点处的切线斜率为正,也就是说函数在这个点有正导数, θ 1 \theta_1 θ1更新后等于其减去一个正数乘以 α \alpha α。向左侧移动,代价函数 J ( θ 1 ) J(\theta_1) J(θ1)的值下降。
同理,在最低点左侧的点,切线斜率为负数,导数为负。 θ 1 \theta_1 θ1更新后等于其减去一个负数(即加上一个正数)乘以 α \alpha α。向右侧最低点靠近。
注意:
如果 α \alpha α取值太小,那么到达最低点的速度会很慢。
如果 α \alpha α取值太大,那么梯度下降法可能会越过最低点,可能无法收敛,甚至发散。
观察上图,由于 α \alpha α是不变的,梯度下降后,新的导数会减小,所以移动的幅度会越来越小,直到最终移动幅度非常小, J ( θ ) J(\theta) J(θ)收敛到局部极小值。
梯度下降法可以用来最小化任何代价函数,而不止是线性回归中的代价函数。
对前面的线性回归问题运用梯度下降法,关键在于求出代价函数的导数:
∂ ∂ θ j J ( θ 0 , θ 1 ) = ∂ ∂ θ j 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 \frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1)=\frac{\partial}{\partial\theta_j}\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2 ∂θj∂J(θ0,θ1)=∂θj∂2m1i=1∑m(hθ(x(i))−y(i))2
当 j = 0 j=0 j=0时,求导结果: ∂ ∂ θ 0 J ( θ 0 , θ 1 ) = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) \frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1)=\frac{1}{m}{\sum_{i=1}^{m}}\bigl(h_\theta(x^{(i)})-y^{(i)}\bigr) ∂θ0∂J(θ0,θ1)=m1i=1∑m(hθ(x(i))−y(i))
当 j = 0 j=0 j=0时,求导结果: ∂ ∂ θ 1 J ( θ 0 , θ 1 ) = 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x ( i ) ) \frac{\partial}{\partial\theta_1}J(\theta_0,\theta_1)=\frac{1}{m}\sum_{i=1}^{m}\Bigl(\bigl(h_\theta(x^{(i)})-y^{(i)}\bigr)·x^{(i)}\Bigr) ∂θ1∂J(θ0,θ1)=m1i=1∑m((hθ(x(i))−y(i))⋅x(i))
则算法改写成:
repeat until convergence{
θ 0 : = θ 0 − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) \qquad\theta_0:=\theta_0-\alpha\frac{1}{m}{\sum_{i=1}^{m}}\bigl(h_\theta(x^{(i)})-y^{(i)}\bigr) θ0:=θ0−αm1∑i=1m(hθ(x(i))−y(i))
θ 1 : = θ 1 − α 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x ( i ) ) \qquad\theta_1:=\theta_1-\alpha\frac{1}{m}\sum_{i=1}^{m}\Bigl(\bigl(h_\theta(x^{(i)})-y^{(i)}\bigr)·x^{(i)}\Bigr) θ1:=θ1−αm1∑i=1m((hθ(x(i))−y(i))⋅x(i))
}
上面用到的算法有时也成为“批量梯度下降”,指的是在梯度下降的每一步中,我们都用到了所有的训练样本。即在每一次梯度下降时,微分求导项中都需要对所有m个样本求和。
后面会提到其他类型的梯度下降法,不考虑整个训练集,每次只关注训练集中的一些小的子集。
在数据量较大的情况下,梯度下降法比正规方程解法要更适用一些。