5.全局最优化
🚩上图显示了梯度下降的两个主要挑战:
- 若随机初始化,算法从左侧起步,那么会收敛到一个局部最小值,而不是全局最小值;
- 若随机初始化,算法从右侧起步,那么需要经过很长时间才能越过Plateau(函数停滞带,梯度很小),如果停下得太早,则永远达不到全局最小值;
而线性回归的模型 MSE 损失函数恰好是个凸函数,凸函数保证了只有一个全局最小值,其次是个连续函数,斜率不会发生陡峭的变化,因此即便是乱走,梯度下降都可以趋近全局最小值。
上图损失函数是非凸函数,梯度下降法是有可能落到局部最小值的,所以其实步长不能设置的太小太稳健,那样就很容易落入局部最优解,虽说局部最小值也没大问题, 因为模型只要是堪用的就好嘛,但是我们肯定还是尽量要奔着全局最优解去
6.梯度下降步骤
🚩梯度下降流程就是“猜”正确答案的过程:
7.代码模拟梯度下降
- 梯度下降优化算法,比正规方程,应用更加广泛
- 什么是梯度?
- 梯度就是导数对应的值!
- 下降?
- 涉及到优化问题,最小二乘法
- 梯度下降呢?
- 梯度方向下降,速度最快的~
接下来,我们使用代码来描述上面梯度下降的过程:
方程如下:
7.1 构建函数和导函数
import numpy as np import matplotlib.pyplot as plt # 构建方程 f = lambda x : (x - 3.5) ** 2 - 4.5 * x + 10 # 方程的导函数 g = lambda x : 2 * (x - 3.5) - 4.5
7.2 函数可视化
# 绘制函数图像 x = np.linspace(0, 11.5, 100) y = f(x) _ = plt.plot(x, y)
7.3 求函数的最小值
7.3.1 导函数可解
''' 2 * (x - 3.5) - 4.5 = 0 2 * x = 11.5 x = 5.75 ''' _ = plt.plot(x, y) _ = plt.scatter(5.75, f(5.75), color = 'red') # 红点就是最小值
7.3.2 导函数不可解(梯度下降)
eta = 0.1 # 学习率 precision = 0.0001 # 设置精度 # 瞎蒙(随机)一个初始值 x = np.random.randint(0, 12) print('随机的值:x =', x) # 下面会进行多次 while 循环执行梯度下降 # 每次都要更新 last_x,记录上一次的值 # last_x 赋初值的时候要与 x 略微不同,赋值大于精度即可 last_x = x + 0.1 # x_ 就是每次梯度下降求解出的 x 值,一开始为 x 的初值 x_ = [x] cnt = 0 while True: if np.abs(x - last_x) < precision: break # 根据梯度下降进行更新 cnt += 1 last_x = x x = x - eta * g(x) x_.append(x) print('梯度下降的次数为:', cnt) print('算出的结果:x =', x) # 绘图 x1= np.linspace(0, 11.5, 100) y = f(x1) _ = plt.plot(x1, y) x_ = np.array(x_) _ = plt.scatter(x_, f(x_), color = 'red')