模型表示
- 线性回归模型:
h θ ( x ) = θ 0 + θ 1 x h_\theta(x) = \theta_0 + \theta_1{x} hθ(x)=θ0+θ1x
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
① m 代表训练集中实例的数量;
② x 代表特征/输入变量;
③ y 代表目标变量/输出变量;
④(x,y)代表训练集中的实例;
⑤ ( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i))代表第 i 个观察实例;
⑥ θ 0 , θ 1 \theta_0,\theta_1 θ0,θ1为模型参数。
⑦ h 代表学习算法的解决方案或函数也称为假设(hypothesis)。 - 监督学习算法的工作方式如图所示:
- 假设函数 h (hypothesis):是一个从输入 x 到输出 y 的映射,如图输入是房屋尺寸大小,就像你朋友想出售的房屋,因此根据输入的值来得出值,值对应房子的价格。因此,h 是一个从 x 到 y 的函数映射。
- 因为 h θ ( x ) = θ 0 + θ 1 x h_\theta(x) = \theta_0 + \theta_1{x} hθ(x)=θ0+θ1x 只含有一个特征/输入变量,因此这样的问题叫作单变量线性回归问题。
代价函数
- 代价函数(cost function)
J
(
θ
)
J(\theta)
J(θ),通常使用平方误差函数,如下:
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
m 代表训练集中实例的数量。我们的目标为最小化代价函数。即:
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,θ1minimizeJ(θ0,θ1)
- 代价函数的另外一个图形表示是等高图,如图所示:
等高线图,则可以看出在三维空间中存在一个使得 J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1) 最小的点。
- 通过这些图形,能更好地理解这些代价函数所表达的值是什么样的,它们对应的假设是什么样的,以及什么样的假设对应的点,更接近于代价函数的最小值。如果遇到更复杂、更高维度、更多参数的情况,而这些情况是很难画出图的,因此更无法将其可视化,因此我们真正需要的是能够自动地找出能使代价函数最小化的参数 θ 0 \theta_0 θ0 和 θ 1 \theta_1 θ1 的值。
梯度下降
梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数 J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1) 的最小值。
- 局部最小值:选择不同的初始参数组合,可能会找到不同的局部最小值。
- 批量梯度下降(batch gradient descent)算法的公式为:
θ j : = θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 ) ( f o r j = 0 a n d j = 1 ) \theta_j := \theta_j - \alpha \frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1)\ \ (for \ j = 0 \ and\ j = 1) θj:=θj−α∂θj∂J(θ0,θ1) (for j=0 and j=1) - 描述:对 θ \theta θ 赋值,使得 J ( θ ) J(\theta) J(θ) 按梯度下降最快方向进行,一直迭代下去,最终得到局部最小值。其中 α \alpha α 是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大。在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数。
- 梯度下降中,我们要同时更新
θ
0
,
θ
1
\theta_0, \theta_1
θ0,θ1,当 j = 0 和 j = 1 时,会产生更新,所以你将更新
J
(
θ
0
)
J(\theta_0)
J(θ0) 和
J
(
θ
1
)
J( \theta_1)
J(θ1)。
t e m p 0 : = θ 0 − α ∂ ∂ θ 0 J ( θ 0 , θ 1 ) temp0 := \theta_0 - \alpha \frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1) temp0:=θ0−α∂θ0∂J(θ0,θ1)
t e m p 1 : = θ 1 − α ∂ ∂ θ 1 J ( θ 0 , θ 1 ) temp1 := \theta_1 - \alpha \frac{\partial}{\partial\theta_1}J(\theta_0,\theta_1) temp1:=θ1−α∂θ1∂J(θ0,θ1)
θ 0 : = t e m p 0 \theta_0 := temp0 θ0:=temp0
θ 1 : = t e m p 1 \theta_1 := temp1 θ1:=temp1- 同时更新是梯度下降中的一种常用方法,当人们谈到梯度下降时,他们的意思就是同步更新。
梯度下降的直观理解
- 如果 α 太小,梯度下降会变得缓慢;如果 α 太大,梯度下降可能无法收敛甚至发散。
- 假设你将 θ 1 \theta_1 θ1 初始化在局部最低点,这意味着你已经在局部最优点,它使得 θ 1 \theta_1 θ1 不再改变,梯度下降法更新其实什么都没做,那么这也解释了为什么即使 α \alpha α 学习速率保持不变时,梯度下降也可以收敛到局部最低点。
梯度下降算法
来看一个例子:这是代价函数
J
(
θ
)
J(\theta)
J(θ)。
- 现象:梯度下降一步后,新的导数会变小一点点。然后再梯度下降一步, θ 1 \theta_1 θ1 更新的幅度就会更小。所以随着梯度下降法的运行,移动的幅度会自动变得越来越小,直到最终移动幅度非常小,你会发现,已经收敛到局部极小值。
- 总结:在梯度下降法中,当我们接近局部最低点时,梯度下降法会自动采取更小的幅度,这是因为在局部最低时导数等于零,所以当我们接近局部最低时,导数值会自动变得越来越小,所以梯度下降将自动采取较小的幅度,这就是梯度下降的做法。所以实际上没有必要再另外减小 α \alpha α。这就是梯度下降算法,你可以用它来最小化任何代价函数 J,不只是线性回归中的代价函数 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 时 : ∂ ∂ θ 0 J ( θ 0 , θ 1 ) = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) j = 0 \ 时:\frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1) = \frac{1}{m}\sum_{i=1}^{m}{(h_\theta(x^{(i)}) - y^{(i)})} j=0 时:∂θ0∂J(θ0,θ1)=m1i=1∑m(hθ(x(i))−y(i))
j = 1 时 : ∂ ∂ θ 1 J ( θ 0 , θ 1 ) = 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x ( i ) ) j = 1 \ 时:\frac{\partial}{\partial\theta_1}J(\theta_0,\theta_1) = \frac{1}{m}\sum_{i=1}^{m}{((h_\theta(x^{(i)}) - y^{(i)})\cdot x^{(i)})} j=1 时:∂θ1∂J(θ0,θ1)=m1i=1∑m((hθ(x(i))−y(i))⋅x(i))- 则算法改写成:
θ 0 : = θ 0 − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) \theta_0 := \theta_0 - \alpha\frac{1}{m}\sum_{i=1}^{m}{(h_\theta(x^{(i)}) - y^{(i)})} θ0:=θ0−αm1i=1∑m(hθ(x(i))−y(i))
θ 1 : = θ 1 − α 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x ( i ) ) \theta_1 := \theta_1 - \alpha\frac{1}{m}\sum_{i=1}^{m}{((h_\theta(x^{(i)}) -y^{(i)})\cdot x^{(i)})} θ1:=θ1−αm1i=1∑m((hθ(x(i))−y(i))⋅x(i))
- 则算法改写成:
- 我们刚刚使用的算法,有时也称为批量梯度下降,指的是,在每一个单独的梯度下降中,我们最终都要计算微分求导项,这个项需要对所有个训练样本求和。
- 批量梯度下降法这个名字说明了我们需要考虑所有这一批训练样本,而事实上,有时也有其他类型的梯度下降法,不是这种批量型的,不考虑整个的训练集,而是每次只关注训练集中的一些小的子集。
- 计算代价函数 J 最小值的数值解法:
① 迭代算法:梯度下降
② 正规方程(normal equations)的方法- 实际上在数据量较大的情况下,梯度下降法比正规方程要更适用一些。