正文
梯度法是一种基于优化目标函数的搜索方法,通过计算目标函数在当前点的梯度(即偏导数),然后沿着梯度的反方向(对于最小化问题)更新参数,逐步逼近最优解。梯度法的基本思想是,目标函数的梯度指示了函数在当前位置上升最快的方向,因此沿着梯度的反方向移动,可以使目标函数值减少,从而实现优化。
简而言之:
梯度法 是基于搜索来最优化一个目标函数的方法。
分为梯度下降法 和 梯度上升法 :
- 梯度下降法 用来最小化一个损失函数;
- 梯度上升法,用作最大化效用函数。
对于很多无法求取数学解(类似线性回归的正规数学方程解)的机器学习算法模型,就需要用到 梯度法 这种搜索最优化方法来找到其最优解。
1、梯度含义
对于一个存在极值点的损失函数JJJ,比如其与参数θ\thetaθ的关系在平面中描述为二次曲线:
对于损失函数曲线上的一个点的导数 dJdθ\frac {\mathrm{d} J}{\mathrm{d} \theta}dθdJ(切线斜率)其本质刻画了使该点增大的移动方向。如上图点A处的导数为负数,意味这使A点函数值增大对应的是x轴负方向上的θ\thetaθ,或者说通过减小θ\thetaθ来增大函数值;导数值的绝对值描述了该点切线的倾斜程度–梯度。函数极值点处的切线斜率为零(梯度为零),当曲线上任意点滚落到曲线极值点的时候,这段轨迹上的梯度是逐渐变小的过程(落在极值点梯度变为0)-- 梯度下降。从而通过使曲线上一点滚落到函数的极值点来取得损失函数最优解的方法称为梯度下降法。
∴\therefore∴ 要使得曲线上任意点往函数值变小的方向移动一段距离,结合导数代表的移动方向和移动步长η\etaη表示为:
−ηdJdθ-\eta \frac {\mathrm{d} J}{\mathrm{d} \theta}−ηdθdJ在多维函数中,通过对各个方向的分量分别求导,最终得到的方向就是 梯度 。
关于步长η\etaη的取值问题:
步长 η\etaη 在机器学习领域又称 学习率(learning rate),它的取值会影响获得最优解的速度;当η\etaη取值不合适的时候,甚至会得不到最优解;η\etaη 也是梯度下降法的一个超参数。
- 当η\etaη取值太小,意味着损失函数曲线上的一点向函数最低点的滚动速度很慢,影响算法得到最优解的速度,也就是减慢收敛学习速度;
- 当η\etaη取值太大,意味着损失函数曲线上的一点每次移动的距离很长,这种长距离移动甚至会导致该点无法滚落到函数的最低点,出现不收敛问题;
- 对于大多数ML算法,η=0.01\eta = 0.01η=0.01 是一个相对合适的取值
2、梯度下降搜索注意事项
对于类似二次函数这种明显有唯一极值点的损失函数,它的最值点可以用数学解直接求得。梯度下降法 更多地是应用在 复杂损失函数 的极值点求解。
2.1 多极值点目标函数最优解
面对存在多极值点的函数,使用 梯度下降法,如果滚落起始点选的不合适,一次搜索很可能只搜索到一个局部最优解 ,而不得到全局最优解。
解决方案:
- 多次运行,随机化初始点,并比较模型性能
- 梯度下降法的初始点也是一个超参数
该方案无法保证一定能取得全局最优解 ,但能取得相对较好的 局部最优解 。
3、梯度下降python实现
3.1 算法基本过程
import numpy as np
### Prepare dataset, 定义二次关系函数J,生成x和y
def f_J(x):
try:
return (x - 2.5)**2 -1
except:
return float('inf') ### 异常检测,如果出现异常返回浮点数最大值float('inf')
x = np.linspace(-1,6,141)
y = [f_J(x_i) for x_i in x]
### Derivative function
def Derivate(x):
return 2*(x - 2.5)
### Gradient Descent
eta = .01 ### 学习率
epsilon = 1e-8 ### 定义一个误差范围,当初始点开始滚动,如果当前点位与一点位函数值误差小于定义的epsilon误差范围,认为当前点为就是最优解。
theta_lst = [float(np.random.randint(10,size = 1) + np.random.normal(size = 1))] ### 随机化一个滚落初始点
while True:
gradient = Derivate(theta_lst[-1])
theta_lst.append(theta_lst[-1] - eta * gradient)
if(abs(f_J(theta_lst[-1]) - f_J(theta_lst[-2])) < epsilon):break
if(len(theta_lst) > 1e4): break ### 循环1e4次以后如果没有取得最优解将退出循环
print(theta_lst[-1]) ### 输出最优参数
3.2 多元线性回归的梯度下降
从简单线性回归的梯度推广到多元线性回归 y^(i)=θ0x0(i)+θ1x1(i)...+θnxn(i),x0(i)=1\hat y^{(i)} = \theta_{0}x_{0}^{(i)} + \theta_{1}x_{1}^{(i)} ... + \theta_{n}x_{n}^{(i)},x_{0}^{(i)} = 1y^(i)=θ0x0(i)+θ1x1(i)...+θnxn(i),x0(i)=1,求解其目标函数J=∑im(y^(i)−y(i))2J = \sum^{m}_{i} {(\hat y^{(i)} - y^{(i)})^{2}}J=∑im(y^(i)−y(i))2的最优解,通过对目标函数求每个θ\thetaθ 的偏导获得该 θ\thetaθ 上的 梯度函数,综合成目标函数的 梯度,描述为向量形式 :
−η∇,∇J(θ)=(∂J∂θ0,∂J∂θ1,...,∂J∂θn)-\eta \nabla, \nabla J(\theta) = (\frac{\partial J}{\partial \theta_{0}},\frac{\partial J}{\partial \theta_{1}},...,\frac{\partial J}{\partial \theta_{n}})−η∇,∇J(θ)=(∂θ0∂J,∂θ1∂J,...,∂θn∂J)
偏导结果:
目标函数 ∑i=1m(yi−θ0⋅1−θ1x1(i)...−θnxn(i))2\sum_{i=1}^{m}(y^{i} - \theta_{0}\cdot 1 - \theta_{1}x_{1}^{(i)} ... - \theta_{n}x_{n}^{(i)})^2∑i=1m(yi−θ0⋅1−θ1x1(i)...−θnxn(i))2 ,mmm 为样本量。
令Xb(i)=(1,x1(i),...,xn(i)),θ=(θ0,θ1,...,θn)TX_{b}^{(i)} = (1,x^{(i)}_1,...,x^{(i)}_n),\theta = (\theta_{0},\theta_{1},...,\theta_{n})^{T}Xb(i)=(1,x1(i),...,xn(i)),θ=