梯度下降优化实战:如何通过特征缩放和学习率调整提升模型性能

1次阅读
没有评论

共计 1624 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

痛点分析:为什么梯度下降会失效

在实际训练中,我们经常会遇到两个典型问题:

梯度下降优化实战:如何通过特征缩放和学习率调整提升模型性能

  • 特征尺度差异大:比如房屋价格预测中,房间数量(1-10)和房屋面积(50-200 平米)的数值范围相差 20 倍。这会导致损失函数的等高线呈狭窄的椭圆形,梯度下降需要反复震荡才能找到最小值。

  • 固定学习率的局限性:学习率太小会导致收敛缓慢(如下图左),太大又容易在最优解附近震荡甚至发散(如下图右)。更糟的是,随着训练进行,最优学习率其实会动态变化。

技术方案:双管齐下的优化策略

特征缩放:让梯度下降走直线

两种常用方法对比:

  1. Z-score 标准化

    def z_score_normalize(X):
        mu = np.mean(X, axis=0)
        sigma = np.std(X, axis=0)
        return (X - mu) / sigma

    适用场景:特征分布近似高斯分布时

  2. Min-Max 归一化

    def minmax_scale(X):
        return (X - np.min(X)) / (np.max(X) - np.min(X))

    适用场景 :需要严格限定到[0,1] 区间时(如像素值)

动态学习率:训练过程中的 ” 智能油门 ”

余弦衰减策略 效果显著:

def cosine_decay(initial_lr, global_step, decay_steps):
    return initial_lr * 0.5 * (1 + np.cos(np.pi * global_step / decay_steps))

实际使用时配合 warmup 效果更好:

  1. 前 1000 步线性增加学习率
  2. 后续步数按余弦衰减

代码实战:带特征缩放的批量梯度下降

import numpy as np
import matplotlib.pyplot as plt

# 生成模拟数据
np.random.seed(42)
X = np.random.rand(1000, 2) * [10, 0.1]  # 故意制造尺度差异
y = X @ np.array([1.5, 3]) + np.random.normal(0, 0.5, 1000)

# 特征标准化
X_normalized = z_score_normalize(X)

# 梯度下降实现
def batch_gradient_descent(X, y, lr=0.1, epochs=100):
    theta = np.zeros(X.shape[1])
    losses = []

    for epoch in range(epochs):
        # 动态调整学习率
        current_lr = cosine_decay(lr, epoch, epochs)

        # 向量化计算梯度
        gradient = X.T @ (X @ theta - y) / len(y)
        theta -= current_lr * gradient

        # 记录损失
        loss = np.mean((X @ theta - y)**2)
        losses.append(loss)

    return theta, losses

# 训练并可视化
theta, losses = batch_gradient_descent(X_normalized, y)
plt.plot(losses)
plt.title('Loss Curve with Feature Scaling')
plt.show()

避坑指南:工程师的经验之谈

  • 特征缩放与正则化:一定要先缩放再添加 L2 正则项,否则正则化会对不同尺度特征施加不公平的惩罚

  • 学习率与批量大小:当增大 batch size 时,可以近似线性增大学习率(但建议不超过原始学习率的 4 倍)

  • 梯度问题识别:如果发现损失值出现 NaN,可以打印梯度范式:

    print(np.linalg.norm(gradient))

    正常情况下应在 1e3 以内

延伸思考:更高维度的挑战

当特征维度超过 1 万时:

  1. 改用 增量式计算:分块计算梯度,避免全矩阵运算
  2. 采用 稀疏矩阵存储:对 one-hot 编码等稀疏特征特别有效
  3. 自适应优化器:Adam 等算法对特征尺度差异的鲁棒性更强

通过合理使用这些技巧,我们在实际项目中将训练时间从 3 小时缩短到 15 分钟,同时准确率提升了 2%。关键在于理解每个优化手段背后的数学原理,而不是盲目套用。

正文完
 0
评论(没有评论)