• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
思想人生从关注生活开始
博客园    首页    新随笔    联系   管理    订阅  订阅

梯度下降法(Gradient Descent)

起源

梯度下降法(Gradient Descent)是一种优化算法,其起源可以追溯到微积分学中的梯度概念。在机器学习和深度学习领域,为了找到损失函数的最小值,研究者们提出了多种优化算法,其中梯度下降法是最基础和最常用的方法之一。

定义

梯度下降法是一种迭代优化算法,用于求解函数的局部最小值。它通过迭代的方式更新待优化的参数,使得目标函数(通常是损失函数)的值逐渐减小,直到满足某种停止条件(如梯度接近于0,或达到最大迭代次数)。

原理

梯度下降法的原理是基于函数的梯度信息来指导参数更新的方向。在每一步迭代中,它计算目标函数在当前参数值处的梯度(即函数值变化最快的方向),然后沿着梯度的反方向(即函数值减小的方向)更新参数。通过不断地迭代和更新参数,梯度下降法可以逐渐接近函数的最小值点。
具体来说,对于目标函数J(θ)(其中θ是待优化的参数),梯度下降法的参数更新公式为:
θ = θ - α * ∇J(θ)
其中,α是学习率(learning rate),表示参数更新的步长;∇J(θ)是目标函数J(θ)在当前参数值θ处的梯度。

优缺点

优点:

原理简单,易于实现。
对于凸函数,梯度下降法可以保证找到全局最小值。
在实际应用中,对于非凸函数,梯度下降法也可以找到较好的局部最小值。

缺点:

需要手动设置学习率,学习率过大可能导致算法不稳定,学习率过小可能导致算法收敛速度过慢。
对于某些复杂的问题,可能需要结合其他优化技巧(如动量、Adam等)来提高性能。
在接近最小值点时,梯度可能变得非常小,导致算法收敛速度变慢或陷入局部最小值。

适合场


凸优化问题:对于凸函数,梯度下降法可以保证找到全局最小值。因此,它适用于各种凸优化问题,如线性回归、逻辑回归等。
非凸优化问题:虽然梯度下降法不能保证找到非凸函数的全局最小值,但在实际应用中,它仍然可以找到较好的局部最小值。因此,它也适用于各种非凸优化问题,如神经网络训练、深度学习等。
特征选择:在机器学习中,特征选择是一个重要的问题。梯度下降法可以通过观察参数的更新情况来判断每个特征的重要性。如果某个特征的参数在迭代过程中始终接近于0,则可以认为该特征对模型的影响很小,可以考虑将其从模型中移除。
正则化:为了防止过拟合,我们通常会在损失函数中添加正则化项。梯度下降法可以直接应用于带有正则化项的损失函数,通过迭代优化来找到最佳的参数值。

算法细节描述

假设我们有一个简单的线性回归问题,目标函数为J(θ) = 1/2m * Σ(hθ(x) - y)^2(其中hθ(x) = θ0 + θ1x是预测函数,m是样本数量)。我们使用梯度下降法来求解θ0和θ1的最优值。
初始化参数:首先,我们随机初始化θ0和θ1的值(例如,都设为0)。
计算梯度:然后,我们计算目标函数在当前参数值处的梯度。对于θ0和θ1,梯度分别为∂J/∂θ0和∂J/∂θ1。这两个梯度可以通过求导和代入样本数据来计算。
更新参数:接着,我们根据梯度下降法的参数更新公式来更新θ0和θ1的值。具体来说,我们分别将θ0和θ1减去学习率α乘以对应的梯度值。
重复迭代:我们重复上述步骤(计算梯度和更新参数),直到满足某种停止条件(如梯度接近于0,或达到最大迭代次数)。在每次迭代中,我们都会使用更新后的参数值来计算新的梯度,并继续更新参数。
输出结果:最后,我们输出优化后的参数值θ0和θ1,以及对应的目标函数值J(θ)。这些值可以用于构建最终的预测模型。

 

Java演示代码:

 

public class GradientDescent {

    // 假设我们要优化的二次函数是 f(x) = x^2
    private static double targetFunction(double x) {
        return x * x;
    }

    private static double derivative(double x) {
        // 函数的导数
        return 2 * x;
    }

    public static void main(String[] args) {
        double x = 5.0; // 初始点
        double learningRate = 0.1; // 学习率(步长)
        double epsilon = 1e-6; // 收敛阈值

        while (Math.abs(derivative(x)) > epsilon) {
            x -= learningRate * derivative(x); // 沿负梯度方向更新x
        }

        // 输出最优解和对应的目标函数值
        System.out.println("最优解 x: " + x + ", 对应的目标函数值 y: " + targetFunction(x));
    }
}

 这个示例中,我们使用了梯度下降法来找到二次函数f(x) = x^2的最小值。通过不断迭代并沿负梯度方向更新x的值,我们最终可以找到函数的最小值点。

其他相关文章

常用的搜索算法之二分搜索(Binary Search) 
常用的搜索算法之哈希搜索(Hashing Search)
常用的搜索算法之深度优先搜索 
层次遍历-Level Order Traversal 
常用的搜索算法之线性搜索(Linear Search) 

常用的搜索算法之DFS和BFS的区别是什么 
Java的图数据结构探索-常用的算法快速入门
什么是有向无环图
数据结构进阶面试题-2023面试题库 
常用的搜索算法之迷宫求解问题 
树的基本概念
随机搜索(Random Search) 
网格搜索法(Grid Search)

余弦相似度(Cosine Similarity)

皮尔逊相关系数
曼哈顿距离(Manhattan Distance)
欧氏距离(Euclidean Distance)
Jaccard相似度

修正余弦相似度(Adjusted Cosine Similarity)

皮尔逊χ²检验(Pearson's Chi-squared Test)

互信息(Mutual Information, MI)

Tanimoto系数(Tanimoto Coefficient) 

切比雪夫距离(Chebyshev Distance)

汉明距离(Hamming Distance) 

朴素贝叶斯分类算法(Naive Bayes Classification Algorithm

 
posted @ 2024-06-04 22:04  JackYang  阅读(532)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3