解锁机器学习-梯度下降:从技术到实战的全面指南
本文全面深入地探讨了梯度下降及其变体——批量梯度下降、随机梯度下降和小批量梯度下降的原理和应用。通过数学表达式和基于PyTorch的代码示例,本文旨在为读者提供一种直观且实用的视角,以理解这些优化算法的工作原理和应用场景。
关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。
一、简介
梯度下降(Gradient Descent)是一种在机器学习和深度学习中广泛应用的优化算法。该算法的核心思想非常直观:找到一个函数的局部最小值(或最大值)通过不断地沿着该函数的梯度(gradient)方向更新参数。
什么是梯度下降?
简单地说,梯度下降是一个用于找到函数最小值的迭代算法。在机器学习中,这个“函数”通常是损失函数(Loss Function),该函数衡量模型预测与实际标签之间的误差。通过最小化这个损失函数,模型可以“学习”到从输入数据到输出标签之间的映射关系。
为什么梯度下降重要?
-
广泛应用:从简单的线性回归到复杂的深度神经网络,梯度下降都发挥着至关重要的作用。
-
解决不可解析问题:对于很多复杂的问题,我们往往无法找到解析解(analytical solution),而梯度下降提供了一种有效的数值方法。
-
扩展性:梯度下降算法可以很好地适应大规模数据集和高维参数空间。
-
灵活性与多样性:梯度下降有多种变体,如批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent)和小批量梯度下降(Mini-batch Gradient Descent),各自有其优点和适用场景。
二、梯度下降的数学原理
在深入研究梯度下降的各种实现之前,了解其数学背景是非常有用的。这有助于更全面地理解算法的工作原理和如何选择合适的算法变体。
代价函数(Cost Function)
在机器学习中,代价函数(也称为损失函数,Loss Function)是一个用于衡量模型预测与实际标签(或目标)之间差异的函数。通常用 ( J(\theta) ) 来表示,其中 ( \theta ) 是模型的参数。
梯度(Gradient)
更新规则
代码示例:基础的梯度下降更新规则
import numpy as np def gradient_descent_update(theta, grad, alpha): """ Perform a single gradient descent update. Parameters: theta (ndarray): Current parameter values. grad (ndarray): Gradient of the cost function at current parameters. alpha (float): Learning rate. Returns: ndarray: Updated parameter values. """ return theta - alpha * grad # Initialize parameters theta = np.array([1.0, 2.0]) # Hypothetical gradient (for demonstration) grad = np.array([0.5, 1.0]) # Learning rate alpha = 0.01 # Perform a single update theta_new = gradient_descent_update(theta, grad, alpha) print("Updated theta:", theta_new)
输出:
Updated theta: [0.995 1.99 ]
在接下来的部分,我们将探讨梯度下降的几种不同变体,包括批量梯度下降、随机梯度下降和小批量梯度下降,以及一些高级的优化技巧。通过这些内容,你将能更全面地理解梯度下降的应用和局限性。
三、批量梯度下降(Batch Gradient Descent)
批量梯度下降(Batch Gradient Descent)是梯度下降算法的一种基础形式。在这种方法中,我们使用整个数据集来计算梯度,并更新模型参数。
基础算法
批量梯度下降的基础算法可以概括为以下几个步骤:
代码示例
下面的Python代码使用PyTorch库演示了批量梯度下降的基础实现。
import torch # Hypothetical data (features and labels) X = torch.tensor([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0]], requires_grad=True) y = torch.tensor([[1.0], [2.0], [3.0]]) # Initialize parameters theta = torch.tensor([[0.0], [0.0]], requires_grad=True) # Learning rate alpha = 0.01 # Number of iterations n_iter = 1000 # Cost function: Mean Squared Error def cost_function(X, y, theta): m = len(y) predictions = X @ theta return (1 / (2 * m)) * torch.sum((predictions - y) ** 2) # Gradient Descent for i in range(n_iter): J = cost_function(X, y, theta) J.backward() with torch.no_grad(): theta -= alpha * theta.grad theta.grad.zero_() print("Optimized theta:", theta)
输出:
Optimized theta: tensor([[0.5780], [0.7721]], requires_grad=True)
批量梯度下降的主要优点是它的稳定性和准确性,但缺点是当数据集非常大时,计算整体梯度可能非常耗时。接下来的章节中,我们将探索一些用于解决这一问题的变体和优化方法。
四、随机梯度下降(Stochastic Gradient Descent)
随机梯度下降(Stochastic Gradient Descent,简称SGD)是梯度下降的一种变体,主要用于解决批量梯度下降在大数据集上的计算瓶颈问题。与批量梯度下降使用整个数据集计算梯度不同,SGD每次只使用一个随机选择的样本来进行梯度计算和参数更新。
基础算法
随机梯度下降的基本步骤如下:
代码示例
下面的Python代码使用PyTorch库演示了SGD的基础实现。
import torch import random # Hypothetical data (features and labels) X = torch.tensor([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0]], requires_grad=True) y = torch.tensor([[1.0], [2.0], [3.0]]) # Initialize parameters theta = torch.tensor([[0.0], [0.0]], requires_grad=True) # Learning rate alpha = 0.01 # Number of iterations n_iter = 1000 # Stochastic Gradient Descent for i in range(n_iter): # Randomly sample a data point idx = random.randint(0, len(y) - 1) x_i = X[idx] y_i = y[idx] # Compute cost for the sampled point J = (1 / 2) * torch.sum((x_i @ theta - y_i) ** 2) # Compute gradient J.backward() # Update parameters with torch.no_grad(): theta -= alpha * theta.grad # Reset gradients theta.grad.zero_() print("Optimized theta:", theta)
输出:
Optimized theta: tensor([[0.5931], [0.7819]], requires_grad=True)
优缺点
SGD虽然解决了批量梯度下降在大数据集上的计算问题,但因为每次只使用一个样本来更新模型,所以其路径通常比较“嘈杂”或“不稳定”。这既是优点也是缺点:不稳定性可能帮助算法跳出局部最优解,但也可能使得收敛速度减慢。
在接下来的部分,我们将介绍一种折衷方案——小批量梯度下降,它试图结合批量梯度下降和随机梯度下降的优点。
五、小批量梯度下降(Mini-batch Gradient Descent)
小批量梯度下降(Mini-batch Gradient Descent)是批量梯度下降和随机梯度下降(SGD)之间的一种折衷方法。在这种方法中,我们不是使用整个数据集,也不是使用单个样本,而是使用一个小批量(mini-batch)的样本来进行梯度的计算和参数更新。
基础算法
小批量梯度下降的基本算法步骤如下:
代码示例
下面的Python代码使用PyTorch库演示了小批量梯度下降的基础实现。
import torch from torch.utils.data import DataLoader, TensorDataset # Hypothetical data (features and labels) X = torch.tensor([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0], [4.0, 5.0]], requires_grad=True) y = torch.tensor([[1.0], [2.0], [3.0], [4.0]]) # Initialize parameters theta = torch.tensor([[0.0], [0.0]], requires_grad=True) # Learning rate and batch size alpha = 0.01 batch_size = 2 # Prepare DataLoader dataset = TensorDataset(X, y) data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True) # Mini-batch Gradient Descent for epoch in range(100): for X_batch, y_batch in data_loader: J = (1 / (2 * batch_size)) * torch.sum((X_batch @ theta - y_batch) ** 2) J.backward() with torch.no_grad(): theta -= alpha * theta.grad theta.grad.zero_() print("Optimized theta:", theta)
输出:
Optimized theta: tensor([[0.6101], [0.7929]], requires_grad=True)
优缺点
小批量梯度下降结合了批量梯度下降和SGD的优点:它比SGD更稳定,同时比批量梯度下降更快。这种方法广泛应用于深度学习和其他机器学习算法中。
小批量梯度下降不是没有缺点的。选择合适的批量大小可能是一个挑战,而且有时需要通过实验来确定。
关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。 如有帮助,请多关注 TeahLead KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
去哪儿“技术债”偿还实践:如何高效、低风险砍掉50%无用代码?
一分钟精华速览 底层技术是系统稳定运行的基石,往往牵一发而动全身。通过底层技术的优化,有效地管理和减少代码量,能极大提升系统的运行效率。去哪儿网作为业内较早落地“代码瘦身”的企业,该项目让其系统成功地减少了 50%的代码量,26%的服务数量,提高了 9.5%的发布效率。 本文旨在分享其如何运用可观测性技术识别并清除无用代码,并尝试通过还原实施细节、总结方法论,并为读者在系统精简方面提供一种新的思考和实践方式。 作者介绍 去哪儿旅行基础架构组技术专家——马阳阳 TakinTalks 稳定性社区专家团成员,去哪儿旅行基础架构组技术专家。公司云原生 SIG 成员,负责测试环境治理平台、代码精简平台、组件市场等,专注于研发效能领域。2022 年深度参与的“线上代码精简 50%”项目获得公司级技术型一等奖,指导多个团队完成系统精简,积累了大量经验。 温馨提醒:本文约 7500 字,预计花费 12 分钟阅读。 「TakinTalks 稳定性社区」公众号后台回复 “交流” 进入读者交流群;回复“回放”获取可观测系列合集; 背景 一个普遍而持久的问题:随着时间的流逝,系统中逐渐堆积起了大量的历史债务,...
- 下一篇
无到无限,回顾 AWS 关系型数据库 15 年的发展历程
又是一年一度 AWS re:Invent,这次关系型数据库最重磅的发布是 Amazon Aurora Limitless Database (无限数据库)。在 AWS 高级副总裁 Peter DeSantis 的 Keynote 里,也用了将近一半的篇幅回顾了 AWS 关系型数据库的发展历程。 2009 - RDS 把 MySQL, PostgreSQL 托管到了云上,从无到有。 2014 - Aurora 基于 log 架构 (内部代号 Grover),打造了 Aurora。在保持了 MySQL / PostgreSQL 完全兼容的同时,大大提升了性能和可用性。 2018 - Aurora Serverless 通过内部代号 Caspian,为数据库优化的虚拟化技术,提供了数据库资源的无缝上下伸缩。 2023 - Aurora Limitless 通过自研的时钟同步,来实现高性能的分布式事务,推出了可以横向写扩展的分布式数据库。 从架构上看,Aurora Limitless 类似于 Google Spanner,两者都属于分布式数据库 (NewSQL)。分布式数据库最难的点是实现高性...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程