深度学习之详解常见梯度算法(概念、公式、原理、算法实现过程)

目录

前言

一、如何实现梯度下降?

二、梯度计算

三、常见的梯度公式及梯度算法

常见的梯度公式:

1.标量对向量的梯度:

2. 标量对矩阵的梯度:

3. 向量对标量的梯度:

常见梯度算法:

四、常见梯度算法实现 

1、批量梯度下降算法实现函数

2、随机梯度下降算法实现函数

 3、小批量梯度下降算法实现函数

 4、Adam优化算法实现函数

5、简单应用案列demo

五、总结 


博主介绍:✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神,答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战,深受全网粉丝喜爱与支持✌有需要可以联系作者我哦!

🍅文末三连哦🍅

👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟

前言

梯度下降(Gradient Descent)是一种优化算法,用于寻找最小化损失函数(或成本函数)的参数值。在机器学习和深度学习的背景下,损失函数衡量了模型预测值与真实值之间的差异,而梯度下降则是用于更新模型的参数(例如权重和偏置),以最小化这个差异。

梯度下降的工作原理是,通过计算损失函数关于模型参数的梯度,然后沿着梯度的反方向(即最陡峭的下降方向)更新参数。这样,每次迭代都会使损失函数值减小(至少在局部上是这样的),从而逐渐接近损失函数的最小值。

具体来说,梯度下降算法的步骤通常如下:

  1. 初始化参数:随机初始化模型的参数(例如权重和偏置)。

  2. 计算梯度:使用当前参数计算损失函数关于这些参数的梯度。梯度是一个向量,指示了损失函数在每个参数上的局部变化率。

  3. 更新参数:将每个参数沿着梯度的反方向移动一小步,步长由学习率控制。学习率是一个超参数,决定了参数更新的幅度。

  4. 重复迭代:重复步骤2和3,直到满足某个停止条件(例如达到最大迭代次数、损失函数值足够小或梯度足够小)。

常见的梯度下降算法:

  • 批量梯度下降(Batch Gradient Descent):在每次迭代中使用整个数据集来计算梯度并更新参数。这种方法计算量大,但通常能保证收敛到全局最小值(对于凸损失函数)。

  • 随机梯度下降(Stochastic Gradient Descent, SGD):在每次迭代中只使用一个样本来计算梯度并更新参数。这种方法计算量小,收敛速度快,但可能会引入噪声,导致在最小值附近震荡。

  • 小批量梯度下降(Mini-batch Gradient Descent):在每次迭代中使用一小批样本来计算梯度并更新参数。这种方法是批量梯度下降和随机梯度下降的折中,结合了它们的优点。

梯度下降是机器学习和深度学习中最常用的优化算法之一,但它也有其局限性。例如,对于非凸损失函数,梯度下降可能只能找到局部最小值而不是全局最小值。此外,学习率的选择对算法的性能至关重要,过大或过小的学习率都可能导致算法表现不佳。因此,在实践中,常常使用更先进的优化算法,如动量(Momentum)、Adam、RMSprop等,它们是对梯度下降算法的改进和扩展。

一、如何实现梯度下降?

深度学习中的自动求梯度,主要依赖于反向传播(Backpropagation)算法和计算图(Computational Graph)的概念。下面,我们将简要解释这两个概念如何共同作用以实现自动求梯度:

  1. 计算图
    深度学习模型中的计算可以看作是一系列的操作(如加法、乘法、激活函数等)的组合。这些操作可以表示为计算图中的节点,而节点之间的连接则代表数据依赖关系。每个节点都有一个或多个输入(来自其他节点的输出)和一个输出。

  2. 前向传播
    在前向传播过程中,数据从输入层流向输出层,经过计算图中的每个节点,并产生相应的输出。这些输出将作为后续节点的输入,直到最终得到模型的预测结果。

  3. 损失函数
    为了评估模型的预测结果与真实结果之间的差距,我们使用损失函数。损失函数是一个量化这种差距的指标,其目标是在训练过程中最小化。

  4. 反向传播
    反向传播是自动求梯度的关键步骤。它开始于损失函数节点,并沿着计算图反向传播。在反向传播过程中,我们计算每个节点的梯度,即损失函数对该节点输入的偏导数。这些梯度表示了如何调整节点的输入以最小化损失函数。

  5. 梯度下降
    有了每个参数的梯度后,我们就可以使用梯度下降(或其变种,如Adam、RMSprop等)来更新模型的参数。通过反复进行前向传播、计算损失、反向传播和参数更新,模型逐渐学会从输入数据中提取有用的特征,并产生准确的预测。

具体来说,反向传播利用链式法则来计算梯度。链式法则允许我们将复杂的复合函数的导数分解为更简单的子函数的导数的乘积。这样,我们可以从输出层开始,逐层计算梯度,直到达到输入层。

二、梯度计算

梯度下降的核心思想是通过迭代地调整模型参数的值,使得损失函数逐渐减小。具体来说,它的步骤如下:

  1. 初始化参数:选择一个初始的模型参数向量。
  2. 计算梯度:计算损失函数对参数的梯度(或者称为导数),表示损失函数在当前参数值处的变化率。
  3. 更新参数:沿着梯度的反方向,以一定的步长(学习率)更新参数的值,使得损失函数逐渐减小。
  4. 迭代:重复步骤2和步骤3,直到满足终止条件(如达到最大迭代次数、损失函数收敛等)。

公式:

假设损失函数为$J(\theta)$$\theta$是待优化的模型参数向量。梯度下降的更新规则如下:

\theta = \theta - \alpha \cdot \nabla J(\theta)

其中,$\alpha$是学习率,用来控制参数更新的步长;$\nabla J(\theta)$是损失函数$J(\theta)$对参数$\theta$的梯度。

实现过程:

下面是梯度下降的实现过程的伪代码:

1. 初始化参数 theta
2. 设置学习率 alpha,最大迭代次数 num_iters,终止条件 threshold
3. 初始化损失函数值列表 J_history
4. for iter in range(num_iters):
5.     计算损失函数值 J
6.     计算损失函数对参数的梯度 gradient
7.     更新参数 theta:theta = theta - alpha * gradient
8.     将损失函数值 J 加入 J_history
9.     if 损失函数变化小于 threshold:
10.        结束迭代
11. 返回优化后的参数 theta 和损失函数值列表 J_history

三、常见的梯度公式及梯度算法

常见的梯度公式:

1.标量对向量的梯度:

假设有一个标量函数 $f(\mathbf{x})$$\mathbf{x}$是一个向量,梯度的公式为:

\nabla f(\mathbf{x}) = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, ..., \frac{\partial f}{\partial x_n} \right)

其中,$\frac{\partial f}{\partial x_i}$表示函数 $f$$\mathbf{x}$的第 $i$个元素 $x_i$的偏导数。

2. 标量对矩阵的梯度:

假设有一个标量函数 $f(\mathbf{X})$$\mathbf{X}$是一个矩阵,梯度的公式为:

\nabla f(\mathbf{X}) = \begin{pmatrix} \frac{\partial f}{\partial X_{11}} & \frac{\partial f}{\partial X_{12}} & \cdots & \frac{\partial f}{\partial X_{1m}} \\ \frac{\partial f}{\partial X_{21}} & \frac{\partial f}{\partial X_{22}} & \cdots & \frac{\partial f}{\partial X_{2m}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f}{\partial X_{n1}} & \frac{\partial f}{\partial X_{n2}} & \cdots & \frac{\partial f}{\partial X_{nm}} \end{pmatrix}

其中,$X_{ij}$表示矩阵 $\mathbf{X}$中的元素。

3. 向量对标量的梯度:

假设有一个向量函数$\mathbf{f}(x)$$x$是一个标量,梯度的公式为:

\nabla \mathbf{f}(x) = \left( \frac{\partial f_1}{\partial x}, \frac{\partial f_2}{\partial x}, ..., \frac{\partial f_n}{\partial x} \right)

其中$\frac{\partial f_i}{\partial x}$表示函数$\mathbf{f}$ 的第$i$个分量对$x$ 的偏导数。

常见梯度算法:

  1. 批量梯度下降(Batch Gradient Descent)

    批量梯度下降是最基本的梯度下降算法之一,它在每一次迭代中使用整个训练数据集来计算梯度,并更新模型参数。虽然计算梯度的效率较低,但是可以得到全局最优解。批量梯度下降的缺点是可能陷入局部最优解,同时对内存要求较高。

  2. 随机梯度下降(Stochastic Gradient Descent)

    随机梯度下降是批量梯度下降的一种改进方法,它在每一次迭代中随机选择一个样本来计算梯度,并更新模型参数。虽然计算梯度的效率较高,但是由于参数更新的方向波动较大,因此收敛过程不稳定。随机梯度下降通常用于大规模数据集和在线学习。

  3. 小批量梯度下降(Mini-batch Gradient Descent)

    小批量梯度下降是批量梯度下降和随机梯度下降的结合,每次迭代使用一个小批量的样本来计算梯度,并更新模型参数。这种方法在计算效率和收敛稳定性之间取得了平衡,是实际应用中最常用的梯度下降算法之一。

  4. Adam优化算法

    Adam(Adaptive Moment Estimation)是一种自适应学习率的优化算法,结合了动量梯度下降和自适应学习率的优点。它通过计算梯度的一阶矩估计和二阶矩估计来自适应地调整学习率,从而在不同维度上具有不同的学习率。Adam算法在实践中表现良好,被广泛应用于深度学习中。

  5. RMSProp优化算法

    RMSProp(Root Mean Square Propagation)是一种自适应学习率的优化算法,它在Adam算法之前提出,通过计算梯度的平方的移动平均来调整学习率,从而加速收敛过程。RMSProp算法通常用于优化神经网络的训练。

  6. Adagrad优化算法

    Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,它通过将学习率分别应用于每个参数的梯度的平方来调整学习率,从而使得稀疏梯度的参数得到更大的更新,稠密梯度的参数得到较小的更新。Adagrad算法通常用于处理稀疏数据集和非凸优化问题。

四、常见梯度算法实现 

1、批量梯度下降算法实现函数

def batch_gradient_descent(X, y, theta, alpha, num_iters):"""批量梯度下降算法实现函数参数:X:特征矩阵,每一行代表一个训练样本的特征,每一列代表一个特征y:目标值,向量,每个元素对应一个训练样本的目标值theta:模型参数,向量,初始值alpha:学习率,控制参数更新步长num_iters:迭代次数,控制优化的迭代次数返回:theta:优化后的模型参数J_history:损失函数值的历史记录"""m = len(y)J_history = []  # 记录损失函数值的历史记录for iter in range(num_iters):# 计算损失函数值h = np.dot(X, theta)loss = h - yJ = np.sum(loss ** 2) / (2 * m)J_history.append(J)# 计算梯度gradient = np.dot(X.T, loss) / m# 更新参数theta = theta - alpha * gradientreturn theta, J_history

2、随机梯度下降算法实现函数

def stochastic_gradient_descent(X, y, theta, alpha, num_iters):"""随机梯度下降算法实现函数参数:X:特征矩阵,每一行代表一个训练样本的特征,每一列代表一个特征y:目标值,向量,每个元素对应一个训练样本的目标值theta:模型参数,向量,初始值alpha:学习率,控制参数更新步长num_iters:迭代次数,控制优化的迭代次数返回:theta:优化后的模型参数J_history:损失函数值的历史记录"""m = len(y)J_history = []  # 记录损失函数值的历史记录for iter in range(num_iters):for i in range(m):# 随机选择一个样本random_index = np.random.randint(m)X_i = X[random_index:random_index+1]y_i = y[random_index:random_index+1]# 计算损失函数值h = np.dot(X_i, theta)loss = h - y_iJ = np.sum(loss ** 2) / 2J_history.append(J)# 计算梯度gradient = np.dot(X_i.T, loss)# 更新参数theta = theta - alpha * gradientreturn theta, J_history

 3、小批量梯度下降算法实现函数

def mini_batch_gradient_descent(X, y, theta, alpha, num_iters, batch_size):"""小批量梯度下降算法实现函数参数:X:特征矩阵,每一行代表一个训练样本的特征,每一列代表一个特征y:目标值,向量,每个元素对应一个训练样本的目标值theta:模型参数,向量,初始值alpha:学习率,控制参数更新步长num_iters:迭代次数,控制优化的迭代次数batch_size:小批量大小,控制每次迭代使用的样本数量返回:theta:优化后的模型参数J_history:损失函数值的历史记录"""m = len(y)J_history = []  # 记录损失函数值的历史记录for iter in range(num_iters):for i in range(0, m, batch_size):# 选择一个小批量样本X_batch = X[i:i+batch_size]y_batch = y[i:i+batch_size]# 计算损失函数值h = np.dot(X_batch, theta)loss = h - y_batchJ

 4、Adam优化算法实现函数

def adam(X, y, theta, alpha, beta1, beta2, epsilon, num_iters):"""Adam优化算法实现函数参数:X:特征矩阵,每一行代表一个训练样本的特征,每一列代表一个特征y:目标值,向量,每个元素对应一个训练样本的目标值theta:模型参数,向量,初始值alpha:学习率,控制参数更新步长beta1:动量参数,控制历史梯度的影响程度beta2:动量参数,控制历史梯度平方的影响程度epsilon:数值稳定性参数,防止除零错误num_iters:迭代次数,控制优化的迭代次数返回:theta:优化后的模型参数J_history:损失函数值的历史记录"""m = len(y)J_history = []  # 记录损失函数值的历史记录mt = np.zeros_like(theta)  # 一阶矩估计vt = np.zeros_like(theta)  # 二阶矩估计t = 0  # 迭代次数for iter in range(num_iters):t += 1# 计算梯度h = np.dot(X, theta)loss = h - ygradient = np.dot(X.T, loss) / m# 更新一阶矩估计mt = beta1 * mt + (1 - beta1) * gradient# 更新二阶矩估计vt = beta2 * vt + (1 - beta2) * (gradient ** 2)# 纠正偏差mt_hat = mt / (1 - beta1 ** t)vt_hat = vt / (1 - beta2 ** t)# 更新参数theta = theta - alpha * mt_hat / (np.sqrt(vt_hat) + epsilon)# 计算损失函数值J = np.sum((np.dot(X, theta) - y) ** 2) / (2 * m)J_history.append(J)return theta, J_history

5、简单应用案列demo

基于线性回归神经网络模型,并使用批量梯度下降算法进行训练。最后,使用matplotlib库将损失函数值随迭代次数的变化可视化输出。

import numpy as np
import matplotlib.pyplot as plt# 生成示例数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)# 在特征矩阵 X 中添加偏置列
X_b = np.c_[np.ones((100, 1)), X]# 定义激活函数(这里使用恒等函数)
def identity_activation(z):return z# 定义损失函数(均方误差)
def mse_loss(y_true, y_pred):return np.mean((y_true - y_pred) ** 2)# 定义批量梯度下降算法
def batch_gradient_descent(X, y, theta, alpha, num_iters):m = len(y)J_history = []  # 记录损失函数值的历史记录for iter in range(num_iters):# 计算模型预测值y_pred = identity_activation(np.dot(X, theta))# 计算损失函数值J = mse_loss(y, y_pred)J_history.append(J)# 计算梯度gradient = np.dot(X.T, (y_pred - y)) / m# 更新参数theta = theta - alpha * gradientreturn theta, J_history# 初始化模型参数
theta = np.random.randn(2, 1)# 设置超参数
alpha = 0.01  # 学习率
num_iters = 1000  # 迭代次数# 调用批量梯度下降算法训练模型
theta_bgd, J_history_bgd = batch_gradient_descent(X_b, y, theta, alpha, num_iters)# 输出优化后的模型参数
print("优化后的模型参数 theta:", theta_bgd)# 可视化损失函数值的变化
plt.plot(range(num_iters), J_history_bgd)
plt.xlabel('Iterations')
plt.ylabel('Cost Function (MSE)')
plt.title('Batch Gradient Descent')
plt.show()

执行结果:

 

 

五、总结 

通过今天的学习,我们对梯度下降算法及其在神经网络训练中的应用有了更深入的理解,也了解了一些常见的梯度优化算法的原理和特点。总之,我们深入探讨了梯度下降法,这是一种常用的优化算法。它的核心思想是根据目标函数的梯度方向,逐步向最陡峭的下降方向移动,以最小化目标函数。我们学习了批量梯度下降法、随机梯度下降法和小批量梯度下降法三种形式,并了解了它们各自的优缺点和应用场景。

最后,创作不易!非常感谢大家的关注、点赞、收藏、评论啦!谢谢四连哦!好人好运连连,学习进步!工作顺利哦! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OWASP API 安全风险,有哪些安全措施

随着互联网的快速发展,Web应用已成为人们日常生活和工作中不可或缺的一部分。然而,Web应用的安全问题也日益凸显,给企业和个人带来了极大的风险。 对于一些安全行业的用户来说,不少都听过关于OWASP这个词,很多用户想要…

ssm024家政服务网站设计+jsp

家政服务管理系统 摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 家政服务网站,主要的模块包括查看管理员;个人中心、用户管理、服务类型管理、家政类型管理、家政评…

学代码是理解就行,还是全部背?

在我没接触编程以前,看到程序,觉得这玩意到底怎么写出来的,写出这些代码的人,也太厉害了吧? 不会很多都要背下来吧? 我小学背课本都费劲,背不出来,中午不准回家吃饭,我就…

【零基础入门芯片课】半导体是什么?

大家好,我是砖一。 今天给大家分享一下半导体的基础知识,普及一下何为半导体,有从事IC,功率元器件,开关电源的朋友可以了解一下,希望对你有用~ 近几年,我们或多或少听过半导体,芯片…

02 Python进阶:CGI编程

什么是CGI CGI是通用网关接口(Common Gateway Interface)的缩写,它是一种标准协议,用于Web服务器执行外部程序或脚本与Web浏览器进行交互。通过CGI,Web服务器能够动态生成网页内容,处理用户提交的表单数据…

33-5 XXE漏洞 - xxe外部实体注入相关工具

1)xxe.sh || OOB XXE tool:一个方便的网站,可以输入您的域名并生成OOB XXE PoC。适用于盲注Out-of-band攻击。(主要) 2)staaldraad/xxeserv :简化FTP服务器的设置,以通过FTP接收OOB XXE攻击 以下是 ./xxeserv 命令的使用说明: Usage of ./xxeserv:-o string记录日志…

js的Proxy和Reflect

目录 Proxy对象的基本操作常见捕获器getset函数相关拦截器 ReflectReflect与基本语法的区别Reflect常见方法 Proxy和Reflect 在 ES6之前,如果我们对对象进行 新增或者删除属性时,仅靠原有的 Object.defineProperty是无法 监听的,基于此&a…

QT4-QT5-VS2019-编译无法打开文件 QtCore/qchar.h

1.系统环境变量 添加QTDIR 添加PATH 2.项目配置 2.1vc目录:包含目录库目录 2.2C/C 常规:附加包含目录QT5的头文件必须在附加包含目录里配置。 2.3链接器:附加库目录 2.4QTProject Settings

镜舟科技荣获第十三届中国智能制造高峰论坛两项大奖

2024年3月29日,由e-works数字化企业网和湖北省中小企业服务中心联合主办,中国中小企业发展促进中心指导的“第十三届中国智能制造高峰论坛暨第二十一届中国智能制造岁末盘点颁奖典礼”在北京圆满落幕。本次论坛汇聚了国内外智能制造领域的专家学者、企业…

有效的职场沟通及其重要性

欢迎来到职场沟通的世界,在这里,每一个词都至关重要,沉默则能传达出无尽的信息。一个有效沟通能力不仅仅是在线办公套件中的可选配件,而是一项绝对必需的能力。今天我们与您分享有效的职场沟通及其重要性。有效的职场沟通可以增强…

Redis高可用及持久化

文章目录 一、Redis高可用1、Redis高可用概述2、Redis高可用策略 二、Redis持久化1、Redis持久化的功能2、Redis持久化的两种方式2.1 RDB持久化2.2 AOF持久化(append only file) 3、RDB持久化3.1 触发条件3.1.1 手动触发3.1.2 自动触发3.1.2.1 配置方式3…

桶排序---

1、算法概念 桶排序:一种非比较的排序算法。桶排序采用了一些分类和分治的思想,把元素的值域分成若干段,每一段对应一个桶。在排序的时候,首先把每一个元素放到其对应的桶中,再对每一个桶中的元素分别排序&#xff0c…

EF数据持久化(三层架构,公司查,改)

效果图 Model设置具体流程在下面链接中 https://blog.csdn.net/Mr_wangzu/article/details/136805824?spm1001.2014.3001.5501 DAL using System; using System.Collections.Generic; using System.Linq; using System.Web; using WebApplication2.Models; namespace WebAppli…

结构体,联合体,枚举( 2 )

目录 2.联合体 2.1联合体类型的声明 2.2联合体的特点 2.3联合体的内存大小 3.枚举 3.1枚举类型的声明 3.2枚举类型的优点 3.3枚举类型的使用 2.联合体 联合体(Union)是另一种复合数据类型,它允许我们在同一内存位置存储不同的数据类型…

UE4_动画基础_ 瞄准偏移1D(Aim Offset Blend Space 1D)

瞄准偏移1D基本上可以完成角色的向左看向右看或者向上看向下看,像混合空间1D一样只有一个轴向可用。 操作步骤: 1、新建第三人称模板项目。 2、右键——动画——瞄准偏移1D 选取骨骼 双击打开 3、瞄准偏移混合的是姿势,我们需要创建姿势。 …

结合创新!多尺度特征融合+Transformer,参数和计算成本减半

通过多尺度特征融合,模型能够捕捉到不同层次的视觉细节,而Transformer的自注意力机制能够在这些不同层次的特征之间建立联系,有效地整合全局上下文信息,让模型能够应对多样化的视觉场景和变化。 这种结合策略充分利用了二者各自的…

库位电子标签可视化管理,让仓库更智能

一、工厂仓储的目前管理现状 目前工厂仓储管理存在诸多问题,如物料数量种类多,寻找困难且耗时;盘点人力成本高且速度慢;存储位置不清晰,常找不到物料,且多发、少发、错料现象时有发生;系统与库…

SSTI模板注入(jinja2)

前面学习了SSTI中的smarty类型,今天学习了Jinja2,两种类型都是flask框架的,但是在注入的语法上还是有不同 SSTI:服务器端模板注入,也属于一种注入类型。与sql注入类似,也是通过凭借进行命令的执行&#xff…

C++ 中的 vector 的模拟实现【代码纯享】

文章目录 C 中的 vector 模拟实现1. vector 的基本概念2. vector 的基本操作3. vector 的模拟实现4.代码纯享5. 总结 C 中的 vector 模拟实现 在 C 中,vector 是一个非常重要的容器,它提供了动态数组的功能。在本篇博客中,我们将尝试模拟实现…

函数参数缺省和内联函数【C++】

文章目录 函数参数缺省函数参数缺省的条件和要求 内联函数内联函数的工作原理内联函数的定义方法内联函数的要求解决方法:直接在.h中定义内联函数的函数体 内联函数再Debug模式下默认是不展开的 函数参数缺省 顾名思义:可以少传一个/多个参数给函数&…