梯度下降算法

梯度下降(Gradient Descent)算法是一种用于优化可微分函数的迭代方法,特别是在机器学习和深度学习中用于最小化损失函数。其基本原理是沿着函数在当前点的梯度(即函数值增长最快的方向)的反方向进行搜索,从而逐步逼近函数的最小值。

在梯度下降算法中,我们首先选择一个初始的权重向量(或参数向量)( w_0 ),然后按照以下步骤进行迭代:

  1. 计算梯度:对于当前权重向量 ( w_t ),计算损失函数 ( J(w) ) 关于 ( w ) 的梯度 ( \nabla J(w_t) )。在简单线性回归的情况下,梯度可以表示为 ( \frac{1}{n} \sum_{i=1}^{n} (w \cdot x_i - y_i) \cdot x_i ),其中 ( n ) 是样本数量,( x_i ) 是第 ( i ) 个样本的特征值,( y_i ) 是第 ( i ) 个样本的标签值。

  2. 更新权重:使用学习率(或步长)( \eta ) 来更新权重向量。新的权重向量 ( w_{t+1} ) 是通过从当前权重向量中减去学习率与梯度的乘积得到的,即 ( w_{t+1} = w_t - \eta \cdot \nabla J(w_t) )。学习率是一个超参数,用于控制权重更新的步长。较大的学习率可能导致算法收敛更快,但也可能导致算法在最小值附近震荡而无法收敛;较小的学习率则可能导致算法收敛较慢。

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

梯度下降算法有多种变体,包括批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent, SGD)和小批量梯度下降(Mini-batch Gradient Descent)。

  • 批量梯度下降:在每次迭代中,使用所有数据样本来计算梯度并更新权重。这种方法在数据量较小时效果较好,但在大数据集上可能会导致计算量过大和内存不足的问题。
  • 随机梯度下降:在每次迭代中,随机选择一个样本来计算梯度并更新权重。这种方法可以大大减少计算量,但由于梯度的随机性,可能会导致算法收敛速度较慢且不稳定。
  • 小批量梯度下降:在每次迭代中,使用一小批样本来计算梯度并更新权重。这种方法结合了批量梯度下降和随机梯度下降的优点,既减少了计算量,又提高了算法的稳定性。

在深度学习中,通常使用小批量梯度下降或其变体(如带有动量的梯度下降、Adam等)来训练模型。

下面是一段简单的代码,用于对该算法的理解:

import torch
import numpy as np

# 数据集,因为x和y的值相同,我们可以很明确地知道权重w的值会趋于1,但是这样也有一些隐患,最好还是
# 使x和y的值不相同
x = np.array([0.18, 0.1, 0.16, 0.08, 0.09, 0.11, 0.12, 0.17, 0.15, 0.14, 0.13])
y = np.array([0.18, 0.1, 0.16, 0.08, 0.09, 0.11, 0.12, 0.17, 0.15, 0.14, 0.13])

# lr为学习率
lr = 1
# w为权值
w = 10
# epoches为循环进行的次数
epoches = 200
# grad为维度
grad = 0

# 进行梯度的更新
def grad_new(x, y, w):
    return np.mean((x * w - y) * x)
#mean是求取平均值


# 进行损失值的更新
def loss_new(x, y, w):
    return 0.5 * np.sum((w * x - y) ** 2)
#乘以0.5是为了和后面的平方求导后相互抵消

for i in range(epoches):
    grad = grad_new(x, y, w)
    w = w - lr * grad
    loss = loss_new(x, y, w)
    print(f"第{i + 1}次迭代的梯度为{grad},权值为{w},损失值为{loss}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值