梯度下降算法(Gradient Descent)

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn](https://link.zhihu.com/?target=http%3A//www.aideeplearning.cn/ "www.aideeplearning.cn"))

算法引言

梯度下降算法,这个在机器学习中非常常见的算法,可以用下山的例子来形象地解释。想象一下,你在一座山的顶端,目标是要以最快的速度下到山底。但由于浓雾遮挡,你看不清整座山的轮廓,只能感觉到脚下的坡度。这时候,你会选择沿着最陡峭的坡度方向走,因为那很可能是下山最快的路线。在梯度下降算法中,"下山"就是寻找损失函数的最小值,"最陡峭的坡度"则对应着梯度,我们通过计算梯度并不断调整参数,来逐渐接近这个最小值。

算法应用

梯度下降算法的应用非常广泛。在机器学习领域,尤其是在训练神经网络时,它是最常用的优化算法之一。通过调整模型的参数以最小化损失函数,梯度下降帮助模型学习从数据中提取模式。

梯度下降算法的潜在价值在于它的通用性和效率。它可以应用于几乎任何可以微分的损失函数,适用于大规模数据集和复杂的模型。虽然它有一些局限性,比如容易陷入局部最小值,或者在高维空间中效率降低,但通过各种改进的版本(如随机梯度下降、小批量梯度下降)以及与其他技术(如动量法或自适应学习率算法)的结合,这些问题可以得到有效缓解。

算法计算流程

梯度下降算法是一种用于寻找函数最小值的优化算法。它通过不断迭代,更新参数值以减少函数值。以下是梯度下降算法的详细计算流程,以函数为例:

  1. 定义:

梯度下降算法通过计算函数的梯度来找到该函数的局部最小值。在多维空间中,梯度是函数在某一点上升最快的方向,而梯度的负方向就是下降最快的方向。通过在梯度的负方向上调整变量,可以使函数值逐渐减小。

  1. 公式:

一般的梯度下降公式为:

其中, xold 是当前点的坐标, xnew 是更新后的坐标, α 是学习率 (步长), ∇f(x)是函数在 x 点的梯度。

  1. 例子:

对于函数 ,它的梯度 (导数) 为

假设初始点 ,学习率 α=0.1 。

计算过程如下:

-- 第1次迭代:

-- 第2次迭代:

以此类推,每次迭代后 x 的值都会更新, y 的值逐渐减小。

  1. 注意事项:

-- 学习率的选择至关重要,过大可能导致超调,过小可能导致收敛速度缓慢。

-- 梯度下降可能只能找到局部最小值而非全局最小值。

-- 初始点的选择可能影响最终结果。

  1. 关键点使用:

-- 在实际应用中,如机器学习的参数优化,首先需要确定损失函数,然后通过梯度下降来最小化这个损失函数。

-- 在每次迭代中计算损失函数的梯度,并更新参数。

-- 监控损失函数的变化情况,直到损失函数收敛或达到一定的迭代次数后停止迭代。

代码示例

现在,让我们来生成一段解决这个问题的代码。我们将模拟梯度下降算法来寻找一个函数的最小值。为了简化问题,我们可以假设这个函数是一个简单的二次函数,比如。我们的目标是找到使得 f(x) 最小的 x 值。在这个例子中,显然答案是 x=0 ,但我们将通过梯度下降算法来逼近这个解。

复制代码
import numpy as np
import matplotlib.pyplot as plt

# 定义函数和它的导数
def f(x):
    return x ** 2

def df(x):
    return 2 * x

# 梯度下降算法
def gradient_descent(starting_point, learning_rate, n_iterations):
    x = starting_point
    trajectory = [x]
    for _ in range(n_iterations):
        gradient = df(x)
        x = x - learning_rate * gradient
        trajectory.append(x)
    return np.array(trajectory)

# 参数设置
starting_point = 10  # 起始点
learning_rate = 0.1  # 学习率
n_iterations = 50    # 迭代次数

# 执行梯度下降
trajectory = gradient_descent(starting_point, learning_rate, n_iterations)

# 绘制结果
x = np.linspace(-11, 11, 400)
y = f(x)

plt.figure(figsize=(10, 6))
plt.plot(x, y, label='f(x) = x^2')
plt.scatter(trajectory, f(trajectory), color='red', marker='o', label='Gradient Descent Steps')
plt.title('Gradient Descent Optimization')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend()
plt.grid()
plt.show()

代码的运行结果如下:

总的来说,梯度下降算法是机器学习和深度学习中不可或缺的工具,它的应用促进了这些领域的许多重大进展。 ​

反向传播

反向传播是一种有效的计算梯度的方法,在深度学习的模型训练中被广泛使用,原理详解博文:《反向传播》。

相关推荐
用户956256254295 小时前
跟做:Firecrawl 单页转 Markdown 再丢进沙箱总结
python·api
威哥爱编程6 小时前
模拟面试智能体开发实战 02:回答等半分钟,谁还愿意练?把服务端和流式输出搭起来
python·agent·harmonyos
威哥爱编程6 小时前
模拟面试智能体开发实战 01:面试挂了都不知道挂在哪?用 Python 给自己造一个随叫随到的 AI 面试官
python·agent·harmonyos
2601_967980116 小时前
Python行情API量化 02:顺序拉 20 要 2 秒?并发批量把时间压到 0.5 秒
python·api·限流·并发·量化
伞伞悦读6 小时前
【第81期】特征缩放怎么选:标准化、MinMax 与 Robust 的原理、泄漏对照和完整实验
人工智能·python·深度学习·机器学习
新*7 小时前
从一段 WebSocket 代码聊开:bytes 不是 zlib、binaryType 决定一切,15MB 大消息的零拷贝优化
javascript·python·websocket·性能优化·blob·zlib·arraybuffer
卷无止境9 小时前
mathmodel-figure-templates 以及两个上手案例
后端·python
锋行天下9 小时前
服务器 Python 2.7 装不了 langgraph-cli?用本地生成 Dockerfile 曲线救国
人工智能·后端·python
一条大祥脚9 小时前
深入理解 PyTorch FlexAttention:从 Score Mod 到 Mask Mod 的稀疏加速之道
人工智能·pytorch·python·注意力机制·flex attention·可编程注意力
2601_9679801111 小时前
Python自动化办公:模块、库与样式调整教程
python·excel·自动化办公·openpyxl·样式调整