自适应学习速率调整和常用的梯度下降算法

本文探讨了几种关键的优化算法,包括mini-batch gradient descent、RMSProp及其动量版本、以及Adam等,这些算法能够帮助神经网络克服局部最小值问题,并有效应对因网络深度增加导致的非凸误差曲面挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

chapter 4 Beyond Gradient Desent

英语词汇

intracttable 棘手的,难以解决的

hundle 障碍

内容

主要讲述几种优化算法。
接下来探索局部最小值以及由此在训练网络中可能引起的问题。接着探索由于网络模型过深而引起的误差非凸面化,在这种情况下,小批量梯度下降算法失效。接着将探索非凸优化方法是如何克服这种问题的。

1. 误差曲面的非凸性

有很多的局部最小值,而神经网络需要找到全局最小值
这里写图片描述

这个是题外话,了解一下阿偶:
* 模型唯一性
这里写图片描述
对于一个l层,每层有n个神经元的网络,有n!ln!l中安排参数的方法,最终网络的输出相同。

解决局部最小值的方法:
  • mini-batch gradient descent

  • 蒙特卡洛方法

    使用随机数(或更常见的伪随机数)来解决很多计算问题的方法,很经典的一个问题:利用投针实验求解圆周率ππ

  • 二阶方法(second-order methods)

2. 学习比率的问题

学习速率调整(learning rate adaptation)

选择正确的学习速率很重要,学习速率过小,收敛速度过慢
学习速率太大, 直接忽略某些局部最小值

学习速率自适应调整(learning rate adaption):在训练过程中适当的修改学习速率来达到更好的收敛性

三个最流行的学习速率自调整算法
  • AdaGrad
    利用每次迭代历史的梯度平方根的和来修改学习速率

    是矩阵的点乘,ϵϵ是初始学习速率

    r0=0r0=0

    ri=ri1+gigiri=ri−1+gi⨀gi

    θi=θi1ϵδrigθi=θi−1−ϵδ⨁ri⨀g

    δ107δ≈10−7避免除以0
    python tensorflow调用代码:

    tf.train.AdagradOptimizer(
      learning_rate,
      initial_accumulator_valuer=0.1,
      use_locking=False,
      name='Adagrad'
    )

    在tensorflow中,δδ和initial_accumulator_valuer在一起.

    • RMSProp
      ri=ρri1+(1ρ)gigiri=ρri−1+(1−ρ)gi⨀gi

      衰退因子(decayfactor)(decayfactor) ρρ决定对历史梯度的保留程度

    python tensorflow调用代码:

    tf.train.RMSPropOptimizer(
    learning_rate,
    decay=0.9,
    momentum=0.0,
    epsilon=1e-10,
    use_locking=False,
    name='RMSProp'
    )

通过调整momentum来确定是否使用蒙特卡洛方法

RMSProp是一个非常高效的算法,对于很多的资深从业者而言是默认的选择

  • Adam 将蒙特卡洛和RMSProp结合起来

    tf.train.AdamOptimizer(
    learning_rate=0.001,
    beta1=0.9,
    beta2=0.999,
    epsilon=1e-8,
    use_locking=False,
    name='Adam'
    )

    很先进高效
    默认参数下已经表现的很好了,只需要修改参数learning_rate就好了。

    总结

    最流行的算法:

  • 误差曲面非凸
    1. mini-batch gradient descent
    2. mini-batch gradient with momentum
    • 学习速率
      1. RMSProp
      2. RMSProp with momentum
      3. Adam

主要是好的网络结构可以比训练算法有更好的效果,所有好的网络结构更值得花时间构建

### 自适应梯度下降算法在 MATLAB 中的实现 自适应梯度下降算法(Adaptive Gradient Descent Algorithm),通常被称为 AdaGrad 或其变体,是一种改进版的随机梯度下降方法。它通过动态调整学习率来加速收敛并提高模型性能[^1]。 AdaGrad 的核心思想是在每次迭代过程中根据历史梯度信息自动调节每个参数的学习率。具体而言,在标准梯度下降中,所有维度共享相同的学习率;而在 AdaGrad 中,不同维度可以拥有不同的学习率,从而更好地处理稀疏数据非均匀特征分布的情况[^2]。 以下是基于 AdaGrad 方法的一个简单 MATLAB 实现: ```matlab function [theta, lossHistory] = adagrad(X, y, theta_init, alpha, num_iters, lambda) % X: 输入矩阵 (m x n),其中 m 是样本数,n 是特征数 % y: 输出向量 (m x 1) % theta_init: 初始参数向量 (n x 1) % alpha: 学习速率 % num_iters: 迭代次数 % lambda: 正则化系数 % 初始化变量 m = size(X, 1); % 样本数量 n = size(X, 2); % 特征数量 theta = theta_init; % 参数初始化 G = zeros(n, 1); % 积累的历史梯度平方 epsilon = 1e-8; % 平滑项防止除零错误 % 记录损失函数的变化过程 lossHistory = zeros(num_iters, 1); for iter = 1:num_iters % 计算预测值 h_theta = X * theta; % 计算误差 error = h_theta - y; % 计算梯度 grad = (X' * error) / m + lambda * theta; % 更新积累的历史梯度平方 G = G + grad.^2; % 动态调整学习率 adaptive_rate = alpha ./ (sqrt(G) + epsilon); % 更新参数 theta = theta - bsxfun(@times, adaptive_rate, grad); % 计算当前损失函数值 J = sum((h_theta - y).^2) / (2*m) + (lambda/2)*sum(theta.^2); lossHistory(iter) = J; end end ``` #### 关键点解释 1. **累积梯度平方**:`G` 变量用于存储过去所有梯度的平方,这一步骤决定了每一轮更新时各维度的学习率大小。 2. **平滑项 `epsilon`**:为了避免分母为零而导致数值不稳定,引入了一个非常小的常数作为平滑因子[^3]。 3. **正则化**:为了防止过拟合,加入了 L2 正则化的惩罚项 `(lambda/2)*sum(theta.^2)`。 此代码适用于线性回归问题或其他类似的优化场景。如果目标是最小化其他形式的成本函数,则需相应修改梯度计算部分以及成本函数定义。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值