(notice:粗体以示向量)
一、引出算法
在学习 Linear Regression 算法时,经典案例就是房价预测。在通过一系列预处理操作后,得到一个带有特征变量 x x x和可学习参数 θ \theta θ的假设函数:
h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 h_\theta(\textbf{x}) = \theta_0 + \theta_1{x_1} +\theta_2 {x_2} hθ(x)=θ0+θ1x1+θ2x2
一般式:
h θ ( x ) = ∑ i = 0 n θ i x i = θ T ⋅ x ( n 为 特 征 数 ) h_\theta(\textbf{x})=\sum_{i=0}^{n}\theta_{i}x_{i}=\boldsymbol{\theta}^{T}·\textbf{x} (n 为特征数) hθ(x)=i=0∑nθixi=θT⋅x(n为特征数)
下一步要做的就是,构造一个均方损失函数:
J ( θ ) = 1 2 ∑ k = 1 m ( h θ ( x k ) − y k ) 2 ( m 为 训 练 集 样 本 数 量 ) J(\boldsymbol\theta) = \frac{1}{2}\sum_{k=1}^{m} (h_\theta(\textbf{x}^k) - y^k)^2 (m 为训练集样本数量) J(θ)=21k=1∑m(hθ(xk)−yk)2(m为训练集样本数量)
h θ ( x k ) − y k h_\theta(\textbf{x}^{k}) - y^k hθ(xk)−yk
表示第 k 个样本的实际预测值和其真实值的差异,即“训练误差”。所有样本的训练误差之和为损失函数 J ( θ ) J(\boldsymbol{\theta}) J(θ) 。 J ( θ ) J(\boldsymbol{\theta}) J(θ) 越小,则说明可学习参数 θ \boldsymbol{\theta} θ调整的越好,算法泛化能力有可能也越好。
想让损失函数 J ( θ ) J(\boldsymbol{\theta}) J(θ) 变小,就只能迭代优化可学习参数 θ \boldsymbol{\theta} θ
而想要优化参数 θ \boldsymbol{\theta} θ,就可以使用梯度下降算法
二、梯度下降算法直观理解
直观看,假如损失函数的起始位置在上图 “1”的位置。由坐标轴刻度可知,此时的损失函数 J ( θ ) J(\boldsymbol{\theta}) J(θ)的位置很高,数值很大。需要调整可学习参数 θ \boldsymbol{\theta} θ以减小在训练集上 J ( θ ) J(\boldsymbol{\theta}) J(θ)的数值。
如图所示,损失函数 J ( θ ) J(\boldsymbol{\theta}) J(θ)不断的寻找比当前位置更低的地方作为下一步驻留地,最后在位置“2”处停止寻找。此时便得到一个局部最优解 θ \boldsymbol\theta θ.
这使用的就是下面这个更新公式:
θ i : = θ i − α ∂ ∂ θ i J ( θ ) \theta_i := \theta_i - \alpha \frac{\partial}{\partial \theta_i} J(\boldsymbol{\theta}) θi:=θi−α∂θi∂J(θ)
其中:(注意区分粗体)
∂ ∂ θ i J ( θ ) = ∂ ∂ θ i 1 2 ∑ k = 1 m ( h θ ( x k ) − y k ) 2 {\frac{\partial}{\partial \theta_i} J(\boldsymbol{\theta}) = \frac{\partial}{\partial \theta_i} \frac{1}{2}\sum_{k=1}^m(h_\theta(\textbf{x}^k) - y^k)^2} ∂θi∂J(θ)=∂θi∂21k=1∑m(hθ(xk)−yk)2
= ∂ ∂ θ i 1 2 ∑ k = 1 m ( θ T ⋅ x k − y k ) 2 =\frac{\partial}{\partial \theta_i} \frac{1}{2}\sum_{k=1}^m(\boldsymbol{\theta}^T·\textbf{x}^k - y^k)^2 =∂θi∂21k=1∑m(θT⋅xk−yk)2
= ∑ k = 1 m ( θ T ⋅ x k − y k ) ⋅ x i =\sum_{k=1}^m(\boldsymbol{\theta}^T·\textbf{x}^k - y^k)·x_i =k=1∑m(θT⋅xk−yk)⋅xi
= ∑ k = 1 m ( h θ ( x k ) − y k ) ⋅ x i =\sum_{k=1}^m(h_\theta(\textbf{x}^k) - y^k)·x_i =k=1∑m(hθ(xk)−yk)⋅xi
经推导得到可学习参数 θ \theta θ的更新公式:
θ i : = θ i + α ⋅ ∑ k = 1 m ( y k − h θ ( x k ) ) ⋅ x i k \theta_i := \theta_i + \alpha·\sum_{k=1}^m(y^k - h_\theta(\textbf{x}^k))·x_i^k θi:=θi+α⋅k=1∑m(yk−hθ(xk))⋅xik
公式意思是:使用第k个样本点的数据更新 θ \boldsymbol\theta θ中的第i个 θ i \theta_i θi分量
三、疑惑
直观理解很容易,不理解的是:
为什么通过 θ i : = θ i + α ⋅ ∑ k = 1 m ( y k − h θ ( x k ) ) ⋅ x i k \theta_i := \theta_i + \alpha·\sum_{k=1}^m(y^k - h_\theta(\textbf{x}^k))·x_i^k θi:=θi+α⋅∑k=1m(yk−hθ(xk))⋅xik调整 θ \boldsymbol\theta θ,就可以把损失函数 J ( θ ) J(\boldsymbol\theta) J(θ)尽可能的减小?
换言之,以cs229课程截图为例,为什么这个公式能使损失函数 J ( θ ) J(\boldsymbol\theta) J(θ) 步步走到更低点,迭代次数完成后到达一个局部最低点?
由此产生两个问题:
1、损失函数下降方向是怎么选择的?
2、 θ \boldsymbol\theta θ的更新公式为什么是这个形态?
四、证明
问题1:损失函数下降方向是怎么选择的?
证明:
梯度的概念,如下图:
(“梯度”是“梯度向量”的简称,“梯度”和“方向导数”是有本质区别和联系的)
简言之:
梯度是一个向量,其分量是由函数偏导数构成的。
梯度方向是一个函数上升最快的方向
负梯度方向是一个函数下降最快的方向
问题2: θ \boldsymbol\theta θ的更新公式为什么是这个形态?
证明:
(1)高等数学中有一个知识点: 泰勒公式
若函数 f ( x ) f(x) f(x)在 x 0 x_0 x0处可导,则在 x 0 x_0 x0的领域 U ( x 0 ) U(x_0) U(x0)内有:
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + O ( x − x 0 ) f(x) = f(x_0) + f'(x_0)(x - x_0)+O(x - x_0) f(x)=f(x0)+f′(x0)(x−x0)+O(x−x0)
也即:
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x) = f(x_0) + f'(x_0)(x - x_0) f(x)=f(x0)+f′(x0)(x−x0)
(2)同理可得 J ( θ ) J(\boldsymbol\theta) J(θ)在 θ 0 \boldsymbol\theta_0 θ0某领域内的泰勒展开式
J ( θ ) = 1 2 ∑ k = 1 m ( h θ ( x k ) − y k ) 2 J(\boldsymbol\theta) = \frac{1}{2}\sum_{k=1}^{m} (h_\theta(\textbf{x}^k) - y^k)^2 J(θ)=21k=1∑m(hθ(xk)−yk)2
J ( θ ) = J ( θ 0 ) + J ′ ( θ 0 ) ( θ − θ 0 ) J(\boldsymbol\theta) = J(\boldsymbol\theta_0) + J'(\boldsymbol\theta_0)(\boldsymbol\theta - \boldsymbol\theta_0) J(θ)=J(θ0)+J′(θ0)(θ−θ0)
θ \boldsymbol\theta θ是向量,得求偏导数。现使用第k个样本点的数据更新第i个分量 θ i \theta_i θi为例
J ( θ ) − J ( θ 0 ) = ∂ ∂ θ i 1 2 ∑ k = 1 m ( θ 0 T ⋅ x k − y k ) 2 ( θ − θ 0 ) J(\boldsymbol{\theta}) - J(\boldsymbol{\theta_{0}}) =\frac{\partial}{\partial \theta_i} \frac{1}{2}\sum_{k=1}^m(\boldsymbol{\theta_0}^T·\textbf{x}^k - y^k)^2(\boldsymbol\theta - \boldsymbol\theta_0) J(θ)−J(θ0)=∂θi∂21k=1∑m(θ0T⋅xk−yk)2(θ−θ0)
= ∑ k = 1 m ( θ 0 T ⋅ x k − y k ) ⋅ x i k ⋅ ( θ − θ 0 ) \textcolor{red}{=\sum_{k=1}^m(\boldsymbol{\theta_0}^T·\textbf{x}^k - y^k)·x_i^k}·(\boldsymbol\theta - \boldsymbol\theta_0) =k=1∑m(θ0T⋅xk−yk)⋅xik⋅(θ−θ0)
其中红色部分就是梯度(一元函数的导数可以看作梯度),将这部分拿出来取反,即负梯度方向
(3)参数更新公式:
以 f ( x ) f(x) f(x)为例:
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x) = f(x_0) + f'(x_0)(x - x_0) f(x)=f(x0)+f′(x0)(x−x0)
f ( x ) f(x) f(x)在 x 0 x_0 x0处沿着负梯度方向下降,只需要更新 x x x即可。
x = x 0 + ( − f ′ ( x 0 ) ⋅ α ) , ( α 为 学 习 率 ) x = x_0 + (-f'(x_0)·\alpha),(\alpha为学习率) x=x0+(−f′(x0)⋅α),(α为学习率)
同理可得:
<1>现有负梯度方向:
− ∂ ∂ θ i J ′ ( θ ) = − ∑ k = 1 m ( θ T ⋅ x k − y k ) ⋅ x i k \textcolor{red}{-\frac{\partial}{\partial\theta_i}{J'(\boldsymbol\theta)} = -\sum_{k=1}^m(\boldsymbol{\theta}^T·\textbf{x}^k - y^k)·x_i^k} −∂θi∂J′(θ)=−k=1∑m(θT⋅xk−yk)⋅xik
<2>同理可得 J ( θ ) J(\boldsymbol\theta) J(θ)在 θ 0 \boldsymbol\theta_0 θ0某领域内的泰勒展开式
J ( θ ) = J ( θ 0 ) + J ′ ( θ 0 ) ( θ − θ 0 ) J(\boldsymbol\theta) = J(\boldsymbol\theta_0) + J'(\boldsymbol\theta_0)(\boldsymbol\theta - \boldsymbol\theta_0) J(θ)=J(θ0)+J′(θ0)(θ−θ0)
θ i : = θ i + ( − α ⋅ ∑ k = 1 m ( θ T ⋅ x k − y k ) ⋅ x i k ) \theta_i := \theta_i + (-\alpha·\sum_{k=1}^m(\boldsymbol{\theta}^T·\textbf{x}^k - y^k)·x_i^k) θi:=θi+(−α⋅k=1∑m(θT⋅xk−yk)⋅xik)
θ i : = θ i + α ⋅ ∑ k = 1 m ( y k − θ T ⋅ x k ) ⋅ x i k \theta_i := \theta_i + \alpha·\sum_{k=1}^m(y^k - \boldsymbol{\theta}^T·\textbf{x}^k)·x_i^k θi:=θi+α⋅k=1∑m(yk−θT⋅xk)⋅xik
θ i : = θ i + α ⋅ ∑ k = 1 m ( y k − h θ ( x k ) ) ⋅ x i k \theta_i := \theta_i + \alpha·\sum_{k=1}^m(y^k - h_\theta(\textbf{x}^k))·x_i^k θi:=θi+α⋅∑k=1m(yk−hθ(xk))⋅xik
θ i ( i = 0 , 1 , ⋅ ⋅ ⋅ ⋅ n ) \theta_i \quad(i = 0,1,····n) θi(i=0,1,⋅⋅⋅⋅n) 全部更新完后, θ \boldsymbol{\theta} θ整体更新完毕