Advertisement

深度学习(三)1.梯度下降

阅读量:

一、梯度下降

1.梯度下降是什么

梯度下降(Gradient Descent) 是深度学习中一种至关重要的优化算法,其核心目的是寻找最佳模型参数或权重,从而最小化损失函数。

2.基本原理

梯度下降算法的基本思想是:通过迭代的方式,不断调整参数值,沿着目标函数(通常是损失函数)负梯度方向(即函数值下降最快的方向)进行搜索,直至收敛至一个局部最小值或全局最小值。

在机器学习和深度学习中,目标函数通常是损失函数,它衡量了模型预测结果与实际结果之间的差异。通过最小化损失函数,可以找到最佳的模型参数,使模型能够更好地拟合训练数据。

3.对梯度的理解

梯度是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值。即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

在三维空间中,设三元函数f(x, y, z)在空间区域G内具有一阶连续偏导数,则称向量∇f(x, y, z)为函数f在点P的梯度。其中,∇为向量微分算子或Nabla算子。梯度方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值。

为了更好地理解梯度,我们与导数放在一起看一下:

  • 导数 :一元函数 f(x) 的导数 f′(x) 表示函数在点 x 处的变化率。
  • 梯度 :多元函数 f(θ) 的梯度 ∇f(θ) 是一个向量,表示函数在点 θ 处变化最快的方向。

4.算法步骤

  1. 参数初始化 :选择参数初始值,通常是一个随机值或零值。
  2. 选择学习率(步长) :选择合适的学习率 α
  3. 计算梯度 :根据当前参数值和目标函数,计算目标函数(通常是损失函数)关于参数的梯度。梯度是一个向量,指向函数值增长最快的方向。因此,为了找到函数的最小值,应该沿着梯度的反方向更新参数。
  4. 更新参数 :根据梯度和学习率(步长),更新参数值。更新规则通常是:新参数值 = 旧参数值 - 学习率 × 梯度。
  5. 迭代 :重复步骤2和步骤3,直到达到预设的迭代次数或目标函数值的变化小于某个阈值为止。

学习率的选择

  • 过大 :可能越过最小值,导致不收敛
  • 过小 :收敛速度慢,计算成本高

停止条件

  • 迭代次数达到预设的最大值
  • 梯度的范数足够小
  • 相邻两次损失函数值的差异足够小

这里以f(x)=x²为例演示一下梯度下降算法:

复制代码
>       1. import numpy as np

>  
>       2. import matplotlib.pyplot as plt
>  
>       3.  
>  
>       4. # 定义目标函数和其导数
>  
>       5. def f(x):
>  
>       6.     return x**2
>  
>       7.  
>  
>       8. def df(x):
>  
>       9.     return 2*x
>  
>       10.  
>  
>       11. # 初始化
>  
>       12. x0 = 10  # 设置梯度下降的起始点 x0为 10。
>  
>       13. learning_rate = 0.1  # 学习率
>  
>       14. iterations = 20  # 迭代次数
>  
>       15.  
>  
>       16. # 分别用于存储每次迭代后的 x 值和对应的 f(x) 值。
>  
>       17. x_values = [x0]
>  
>       18. f_values = [f(x0)]
>  
>       19.  
>  
>       20. x = x0
>  
>       21. for i in range(iterations):
>  
>       22.     x = x - learning_rate * df(x)
>  
>       23.     x_values.append(x)
>  
>       24.     f_values.append(f(x))
>  
>       25.  
>  
>       26. # 绘制函数曲线和下降过程
>  
>       27. x_plot = np.linspace(-10, 10, 400)
>  
>       28. y_plot = f(x_plot)
>  
>       29.  
>  
>       30. plt.figure(figsize=(10, 6))
>  
>       31. plt.plot(x_plot, y_plot, label='f(x) = x^2')
>  
>       32. plt.scatter(x_values, f_values, color='red', label='Gradient Descent')
>  
>       33. plt.plot(x_values, f_values, color='red')
>  
>       34. plt.title('Gradient Descent on f(x) = x^2')
>  
>       35. plt.xlabel('x')
>  
>       36. plt.ylabel('f(x)')
>  
>       37. plt.legend()
>  
>       38. plt.show()
>  
>  
>  
>  
>     python
>  
>     
>  
>     ![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-14/RkfzIxs8NAGpE5O2VqanhCX0wFZg.png)

从初始点 X0=10 开始,逐步沿着函数的下降方向移动,最终接近最小值点 x=0

二、线性回归中的梯度下降

1.线性回归

线性回归是利用数理统计中的回归分析来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。其原理是通过拟合一条(或多条)直线(或平面)来预测连续型的因变量。这种关系可以用一个线性方程来表示,即 Y = α + βX + ε,其中 Y 代表因变量,X 代表自变量,α 表示截距,β 表示自变量的系数,ε 表示误差项(ε=Y - (α + βX))。线性回归的目标就是找到合适的截距和系数来最小化误差项,从而使得预测值和观测值之间的差异最小。

  1. 一元线性回归 :只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示。
  2. 多元线性回归 :包括两个或两个以上的自变量,且因变量和自变量之间是线性关系。

这个误差(距离)可以直接相减,但是直接相减会有正有负,后续叠加会相互抵消,所以就用差的平方

2.梯度下降

线性回归模型:y=heta _{0}+heta _{1}x
损失函数:

损失函数前面除2是为了后面更好求梯度。 我理解损失函数就是所有误差相加求均值。

梯度计算:
参数更新:

heta _{0t}=heta _{0t-1}-lpharac{artial J}{artial heta _{0t-1}}

heta _{1t}=heta _{1t-1}-lpharac{artial J}{artial heta _{t-1}}

三、梯度下降的类型

(1)批量梯度下降(BGD)

  • 优点 :方向稳定,易于收敛到全局最小值(在凸优化问题中)。由于使用了整个数据集,梯度估计更加准确。
  • 缺点 :计算量大,需要处理整个数据集,对于大数据集来说可能非常耗时。需要将整个数据集加载到内存中,这在数据集非常大时可能不可行。

(2)随机梯度下降(SGD)

  • 优点 :计算量小,每次迭代只需要处理一个样本,训练速度快。适用于在线学习或数据流场景,可以实时更新模型。
  • 缺点 :梯度估计的噪声较大,可能导致收敛过程不稳定,可能陷入局部最小值或鞍点。由于梯度估计基于单个样本,因此更新方向波动大。

(3)小批量梯度下降(MBGD)

  • 优点 :结合了BGD和SGD的优点。相对于BGD,减少了每次迭代的计算量,提高了训练速度。相对于SGD,梯度估计更加稳定,减少了更新方向的波动,有助于更稳定地收敛。可以通过调整批量大小(batch size)来平衡计算量和梯度估计的稳定性。
  • 缺点 :需要选择一个合适的批量大小,这可能需要一些实验和调参。仍然需要一定的内存来存储批量中的样本。

全部评论 (0)

还没有任何评论哟~