随机梯度下降法 (SGD)

随机梯度下降(Stochastic Gradient Descent, SGD)是一种常用的优化算法,主要用于训练机器学习模型,尤其是神经网络。是训练优化神经网络的常用方法。

它的基本思想是基于单个样本或小批量样本来更新模型参数,从而加速优化过程。

简介

SGD的基本思想是通过逐个样本或小批量样本来更新模型参数,而不是使用整个数据集。这种方法大大提高了计算效率,特别是在处理大规模数据集时。

原理

SGD 的原理可以分为以下几个步骤:

这是一般的梯度下降算法的原理示意图:其中L函数是基于最小二乘描述拟合状态的损失函数,然后对于该函数对角度θ求偏导,再求平均。学习率是用来人为控制学习效率的。
在这里插入图片描述

在现实过程中,如果数据点足够多,那么再一一计算损失函数就会变得不现实,那么在每次计算时就会随机选取其中的某些点来计算损失函数,这样虽然难免会受到某些噪音的影响,但是通过多次计算,总朝着正确的方向收敛,这种影响是可以忽视的。

在这里插入图片描述

以上是简单的来源过程,下面会分布介绍:

  1. 初始化模型参数:随机选择初始参数值。

  2. 随机选择样本:从训练数据集中随机选择一个样本或一个小批量样本。

  3. 计算梯度:计算目标函数(例如损失函数)关于模型参数的梯度。

  4. 更新参数:根据梯度和学习率更新参数。公式如下:

    θ = θ − η ∇ θ J ( θ ; x i , y i ) 其中, ( θ ) 是模型参数, ( η ) 是学习率, ( ∇ θ J ( θ ; x i , y i ) ) 是损失函数关于参数的梯度。 \theta = \theta - \eta \nabla_{\theta} J(\theta; x_i, y_i) \\其中,(\theta) 是模型参数,(\eta) 是学习率,(\nabla_{\theta} J(\theta; x_i, y_i)) 是损失函数关于参数的梯度。 θ=θηθJ(θ;xi,yi)其中,(θ)是模型参数,(η)是学习率,(θJ(θ;xi,yi))是损失函数关于参数的梯度。

  5. 重复:重复步骤2-4,直到达到停止条件(例如达到最大迭代次数或损失小于某个阈值)。

优劣分析

优点:

  1. 计算效率高:每次更新只使用一个样本或一个小批量样本,计算速度快,适合大规模数据集。
  2. 在线学习:SGD可以很容易地应用于在线学习,即通过连续获取数据流实时更新模型。
  3. 更好的模型泛化性:由于参数更新有一定的随机性,SGD有助于避免陷入局部最优解,从而获得更好的模型泛化性。

缺点:

  1. 收敛不稳定:由于每次只使用一个样本计算梯度,参数更新路径非常不稳定,可能导致优化过程中的振荡。
  2. 需要调整学习率:学习率的选择非常关键且敏感,通常需要仔细调整以获得最佳效果。
  3. 局部解问题:尽管随机性有助于避免陷入局部解,但它不总是能够找到全局最优解。

使用步骤

  1. 导入数据和库: 开始时,需要导入必要的库和数据集。例如,如果使用Python进行实现,可以使用如下代码:

    import numpy as np
    import matplotlib.pyplot as plt
    
  2. 初始化模型参数: 为模型参数赋初始值。假设我们要训练一个简单的线性回归模型 ( y = w x + b ) ,初始参数可以设为0或随机值。

    w = np.random.randn()
    b = np.random.randn()
    
  3. 设置学习率和超参数: 设定学习率和其他超参数。例如:

    learning_rate = 0.01
    num_epochs = 1000
    
  4. 定义损失函数: 定义我们要最小化的损失函数,比如均方误差(MSE)。

    def compute_loss(y_true, y_pred):
        return np.mean((y_true - y_pred) ** 2)
    
  5. 定义梯度计算: 根据损失函数定义梯度的计算方法。

    def compute_gradients(x, y, w, b):
        y_pred = w * x + b
        dw = -2 * np.mean(x * (y - y_pred))
        db = -2 * np.mean(y - y_pred)
        return dw, db
    
  6. SGD更新步骤: 根据随机选择的样本计算梯度并更新模型参数。以下是循环内的实现方式:

    for epoch in range(num_epochs):
        # 随机选择一个样本
        idx = np.random.randint(len(x_train))
        x_sample = x_train[idx]
        y_sample = y_train[idx]
    
        # 计算梯度
        dw, db = compute_gradients(x_sample, y_sample, w, b)
        
        # 更新参数
        w = w - learning_rate * dw
        b = b - learning_rate * db
    
        # 打印损失信息
        if epoch % 100 == 0:
            y_pred = w * x_train + b
            loss = compute_loss(y_train, y_pred)
            print(f'Epoch {epoch}, Loss: {loss}')
    
  7. 模型验证和评估: 在训练完成后,可以使用验证集或测试集来评估模型的性能。例如:

    y_test_pred = w * x_test + b
    test_loss = compute_loss(y_test, y_test_pred)
    print(f'Test Loss: {test_loss}')
    

示例代码

以下是一个完整的示例代码,用于训练一个简单的线性回归模型,相信初学者可以对随机梯度下降法(SGD)有一个全面而深入的理解:

import numpy as np
import matplotlib.pyplot as plt

# 生成一些随机数据
np.random.seed(42)
x_train = 2 * np.random.rand(100, 1)
y_train = 4 + 3 * x_train + np.random.randn(100, 1)

# 初始化参数
w = np.random.randn()
b = np.random.randn()

# 超参数设置
learning_rate = 0.01
num_epochs = 1000

# 定义损失函数
def compute_loss(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)

# 定义梯度计算
def compute_gradients(x, y, w, b):
    y_pred = w * x + b
    dw = -2 * np.mean(x * (y - y_pred))
    db = -2 * np.mean(y - y_pred)
    return dw, db

# 训练过程
for epoch in range(num_epochs):
    # 随机选择一个样本
    idx = np.random.randint(len(x_train))
    x_sample = x_train[idx]
    y_sample = y_train[idx]

    # 计算梯度
    dw, db = compute_gradients(x_sample, y_sample, w, b)
   
    # 更新参数
    w = w - learning_rate * dw
    b = b - learning_rate * db

    # 打印损失信息
    if epoch % 100 == 0:
        y_pred = w * x_train + b
        loss = compute_loss(y_train, y_pred)
        print(f'Epoch {epoch}, Loss: {loss}')

# 模型验证和评估
x_test = np.array([[1], [2]])
y_test = 4 + 3 * x_test
y_test_pred = w * x_test + b
test_loss = compute_loss(y_test, y_test_pred)
print(f'Test Loss: {test_loss}')

# 绘制拟合结果
plt.scatter(x_train, y_train, color='blue', label='Training data')
plt.plot(x_test, y_test_pred, color='red', label='Fitted line')
plt.legend()
plt.show()

改进:动量随机梯度下降

在这里插入图片描述

改进:学习率的自动调整

adagrad算法

在这里插入图片描述

RMSPROP算法

在这里插入图片描述

Adam算法

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值