李宏毅机器学习笔记——梯度下降法

深度学习介绍

基于仿生学的一种自成体系的机器学习算法,包括但不限于图像识别、语音、文本领域。

梯度下降法

作为深度学习算法种常用的优化算法

梯度下降法,是一种基于搜索的最优化方法,最用是最小化一个损失函数。梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。

当然可以!以下是关于梯度下降法的详细介绍,使用 LaTeX 格式进行排版,并将希腊字母用美元符号表示:

梯度下降法

梯度下降法(Gradient Descent)是一种用于优化的迭代算法,广泛应用于机器学习和深度学习中,以最小化损失函数并找到模型的最佳参数。它的基本思想是通过计算损失函数相对于模型参数的梯度(即导数),来更新参数,从而逐步逼近损失函数的最小值。

1. 基本原理

在多维空间中,损失函数可以看作是一个表面,梯度下降法通过以下步骤来寻找最低点:

  1. 初始化参数:随机选择初始参数值。
  2. 计算梯度:计算损失函数相对于每个参数的梯度。
  3. 更新参数 :根据梯度的方向和学习率(step size)更新参数:
    θ = θ − α ∇ J ( θ ) \theta = \theta - \alpha \nabla J(\theta) θ=θ−α∇J(θ)
    其中:
    • θ \theta θ 是参数,
    • α \alpha α 是学习率,
    • ∇ J ( θ ) \nabla J(\theta) ∇J(θ) 是损失函数的梯度。
  4. 迭代:重复步骤 2 和 3,直到满足停止条件(如达到最大迭代次数或损失函数收敛)。
2. 学习率

学习率 α \alpha α 是一个超参数,控制每次更新的步长。选择合适的学习率非常重要:

  • 过大:可能导致参数更新过头,无法收敛,甚至发散。
  • 过小:收敛速度慢,可能需要更多的迭代次数。
3. 梯度下降的变种

梯度下降法有几种不同的变种,适用于不同的场景:

  • 批量梯度下降(Batch Gradient Descent):使用整个训练集计算梯度,适合小规模数据集,但在大数据集上计算开销较大。

  • 随机梯度下降(Stochastic Gradient Descent, SGD):每次只使用一个样本计算梯度,更新频繁,收敛速度快,但可能会在最优解附近震荡。

  • 小批量梯度下降(Mini-batch Gradient Descent):结合了批量和随机梯度下降的优点,每次使用一小部分样本进行更新,平衡了计算效率和收敛稳定性。

4. 动量法

为了加速收敛并减少震荡,动量法(Momentum)引入了"动量"概念,通过考虑过去的梯度来更新参数:

v t = β v t − 1 + ( 1 − β ) ∇ J ( θ ) v_t = \beta v_{t-1} + (1 - \beta) \nabla J(\theta) vt=βvt−1+(1−β)∇J(θ)
θ = θ − α v t \theta = \theta - \alpha v_t θ=θ−αvt

其中:

  • v t v_t vt 是当前的动量,
  • β \beta β 是动量衰减因子(通常取值在 0.9 到 0.99 之间)。
5. 自适应学习率方法

一些算法通过自适应调整学习率来提高收敛速度:

  • AdaGrad:根据参数的历史梯度调整学习率,适合稀疏数据。
  • RMSProp:对每个参数使用指数衰减平均来调整学习率,适合非平稳目标。
  • Adam:结合了动量法和 RMSProp 的优点,广泛应用于深度学习。
6. 应用

梯度下降法在许多机器学习和深度学习任务中都有广泛应用,包括但不限于:

  • 线性回归和逻辑回归
  • 神经网络的训练
  • 支持向量机(SVM)
  • 深度学习中的卷积神经网络(CNN)和循环神经网络(RNN)

总结

梯度下降法是优化问题中一种重要的工具,尤其在机器学习和深度学习中。通过不断迭代更新参数,梯度下降法能够有效地找到损失函数的最小值,从而提高模型的性能。选择合适的变种和超参数(如学习率)对于成功应用梯度下降法至关重要。

最小二乘法的问题

梯度下降

最小二乘法是一种用于回归分析的统计方法,旨在通过最小化观测值与模型预测值之间的平方差来估计模型参数。其核心思想是找到一条最佳拟合线,使得所有数据点到这条线的垂直距离的平方和最小。

在机器学习中,许多算法都需要最大化或最小化一个函数,这个函数被称为"目标函数"。通常,我们将最小化的一类函数称为"损失函数"。损失函数能够根据预测结果衡量模型预测能力的好坏。在求损失函数最小化的过程中,梯度下降法被广泛应用。

  1. 梯度的概念
    在直线方程中,导数代表斜率;在曲线方程中,导数代表切线的斜率。导数表示参数 θ \theta θ 单位变化时,损失函数相应的变化。通过图中的点可以发现,该点的导数为负值,因此随着参数 θ \theta θ 的增加,损失函数减小。导数从某种意义上还可以代表方向,对应着损失函数增大的方向。
python 复制代码
import random

if __name__ == '__main__':
    x = [ i/100. for i in range(100)]
    y = [3*i+4+random.random()/100. for i in x]
    w = random.random()
    b = random.random()
    for _ in range(5000):
        for _x,_y in zip(x,y):
            y_pre  = _x*w+b
            o = y_pre-_y
            loss = o**2
            dw = -2*o*_x
            db = -2*o
            w = w+0.1*dw
            b = b+0.1*db

    print(w,b,loss)

公式原理

梯度
∇ J ( θ 0 , θ 1 , ... , θ n ) = ( ∂ J ∂ θ 0 , ∂ J ∂ θ 1 , ... , ∂ J ∂ θ n ) \nabla J\left(\theta_{0}, \theta_{1}, \ldots, \theta_{n}\right)=\left(\frac{\partial J}{\partial \theta_{0}}, \frac{\partial J}{\partial \theta_{1}}, \ldots, \frac{\partial J}{\partial \theta_{n}}\right) ∇J(θ0,θ1,...,θn)=(∂θ0∂J,∂θ1∂J,...,∂θn∂J)

目标: 使 ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 \sum_{i=1}^{m}\left(y^{(i)}-\hat{y}^{(i)}\right)^{2} ∑i=1m(y(i)−y^(i))2 尽可能的小
y ^ ( i ) = θ 0 + θ 1 X 1 ( i ) + θ 2 X 2 ( i ) + ⋯ + θ n X n ( i ) \hat{y}^{(i)}=\theta_{0}+\theta_{1} X_{1}^{(i)}+\theta_{2} X_{2}^{(i)}+\cdots+\theta_{n} X_{n}^{(i)} y^(i)=θ0+θ1X1(i)+θ2X2(i)+⋯+θnXn(i)

目标: 使 ∑ i = 1 m ( y ( i ) − ( θ 0 + θ 1 X 1 ( i ) + θ 2 X 2 ( i ) + ⋯ + θ n X n ( i ) ) ) 2 \sum_{i=1}^{m}\left(y^{(i)}-\left(\theta_{0}+\theta_{1} X_{1}^{(i)}+\theta_{2} X_{2}^{(i)}+\cdots+\theta_{n} X_{n}^{(i)}\right)\right)^{2} ∑i=1m(y(i)−(θ0+θ1X1(i)+θ2X2(i)+⋯+θnXn(i)))2 尽可能小
∇ J ( θ ) = [ ∂ J ∂ θ 0 ∂ J ∂ θ 1 ... ∂ J ∂ θ 2 ] = [ ∑ i − 1 m 2 ( y ( i ) − X ( i ) θ ) ⋅ ( − 1 ) ∑ i − 1 m 2 ( y ( i ) − X ( i ) θ ) ⋅ ( − X 1 ( i ) ) ∑ i = 1 m 2 ( y ( i ) − X ( i ) θ ) ⋅ ( − X 2 ( i ) ) ... ∑ i = 1 m 2 ( y ( i ) − X ( i ) θ ) ⋅ ( − X n ( i ) ) ] = 2 ⋅ [ ∑ i − 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − 1 ) ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X 1 ( i ) ) ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X 2 ( i ) ) ⋯ ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X n ( i ) ) ] \nabla J(\theta)=\left[\begin{array}{c} \frac{\partial J}{\partial \theta_{0}} \\ \frac{\partial J}{\partial \theta_{1}} \\ \ldots \\ \frac{\partial J}{\partial \theta_{2}} \end{array}\right]=\left[\begin{array}{c} \sum_{i-1}^{m} 2\left(y^{(i)}-X^{(i)} \theta\right) \cdot(-1) \\ \sum_{i-1}^{m} 2\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{1}^{(i)}\right) \\ \sum_{i=1}^{m} 2\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{2}^{(i)}\right) \\ \ldots \\ \sum_{i=1}^{m} 2\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{n}^{(i)}\right) \end{array}\right]=2 \cdot\left[\begin{array}{c} \sum_{i-1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot(-1) \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{1}^{(i)}\right) \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{2}^{(i)}\right) \\ \cdots \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{n}^{(i)}\right) \end{array}\right] ∇J(θ)= ∂θ0∂J∂θ1∂J...∂θ2∂J = ∑i−1m2(y(i)−X(i)θ)⋅(−1)∑i−1m2(y(i)−X(i)θ)⋅(−X1(i))∑i=1m2(y(i)−X(i)θ)⋅(−X2(i))...∑i=1m2(y(i)−X(i)θ)⋅(−Xn(i)) =2⋅ ∑i−1m(y(i)−X(i)θ)⋅(−1)∑i=1m(y(i)−X(i)θ)⋅(−X1(i))∑i=1m(y(i)−X(i)θ)⋅(−X2(i))⋯∑i=1m(y(i)−X(i)θ)⋅(−Xn(i))

由于目标函数的梯度随着特征向量的增加会越来越大,这是不合理的,因此我们给它加个系数 1 m \frac{1}{m} m1 。

目标: 使 1 m ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 \frac{1}{m} \sum_{i=1}^{m}\left(y^{(i)}-\hat{y}^{(i)}\right)^{2} m1∑i=1m(y(i)−y^(i))2 尽可能的小
∇ J ( θ ) = 2 m [ ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − 1 ) ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X 1 ( i ) ) ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X 2 ( i ) ) ⋯ ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X n ( i ) ) ] = 2 m [ ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X 0 ( i ) ) ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X 1 ( i ) ) ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X 2 ( i ) ) ⋯ ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X n ( i ) ) ] \nabla J(\theta)=\frac{2}{m}\left[\begin{array}{c} \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot(-1) \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{1}^{(i)}\right) \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{2}^{(i)}\right) \\ \cdots \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{n}^{(i)}\right) \end{array}\right]=\frac{2}{m}\left[\begin{array}{c} \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{0}^{(i)}\right) \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{1}^{(i)}\right) \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{2}^{(i)}\right) \\ \cdots \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{n}^{(i)}\right) \end{array}\right] ∇J(θ)=m2 ∑i=1m(y(i)−X(i)θ)⋅(−1)∑i=1m(y(i)−X(i)θ)⋅(−X1(i))∑i=1m(y(i)−X(i)θ)⋅(−X2(i))⋯∑i=1m(y(i)−X(i)θ)⋅(−Xn(i)) =m2 ∑i=1m(y(i)−X(i)θ)⋅(−X0(i))∑i=1m(y(i)−X(i)θ)⋅(−X1(i))∑i=1m(y(i)−X(i)θ)⋅(−X2(i))⋯∑i=1m(y(i)−X(i)θ)⋅(−Xn(i))

有时也取 J ( θ ) = 1 2 m ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 J(\theta)=\frac{1}{2 m} \sum_{i=1}^{m}\left(y^{(i)}-\hat{y}^{(i)}\right)^{2} J(θ)=2m1∑i=1m(y(i)−y^(i))2

最小二乘法和梯度下降法是机器学习中非常重要的工具。通过最小化损失函数,我们可以有效地训练模型,使其能够更好地拟合数据。理解梯度的概念及其在优化过程中的作用,对于掌握机器学习算法的工作原理至关重要。随着技术的不断发展,梯度下降法也在不断演化,出现了许多变种,如随机梯度下降(SGD)、小批量梯度下降(Mini-batch Gradient Descent)等,这些方法在实际应用中展现出了良好的性能。

相关推荐
云泽野1 小时前
【Java|集合类】list遍历的6种方式
java·python·list
麻雀无能为力2 小时前
CAU数据挖掘实验 表分析数据插件
人工智能·数据挖掘·中国农业大学
时序之心2 小时前
时空数据挖掘五大革新方向详解篇!
人工智能·数据挖掘·论文·时间序列
IMPYLH2 小时前
Python 的内置函数 reversed
笔记·python
.30-06Springfield2 小时前
人工智能概念之七:集成学习思想(Bagging、Boosting、Stacking)
人工智能·算法·机器学习·集成学习
说私域3 小时前
基于开源AI智能名片链动2+1模式S2B2C商城小程序的超级文化符号构建路径研究
人工智能·小程序·开源
永洪科技3 小时前
永洪科技荣获商业智能品牌影响力奖,全力打造”AI+决策”引擎
大数据·人工智能·科技·数据分析·数据可视化·bi
shangyingying_14 小时前
关于小波降噪、小波增强、小波去雾的原理区分
人工智能·深度学习·计算机视觉
小赖同学啊4 小时前
物联网数据安全区块链服务
开发语言·python·区块链
码荼5 小时前
学习开发之hashmap
java·python·学习·哈希算法·个人开发·小白学开发·不花钱不花时间crud