最容易理解的优化器的公式表示(BGD,SGD,SGDM,Adagrad,RMSProp,Adam)

在深度学习的训练中,我们依赖于权重系数来构建和调整模型。这些权重系数需要通过反向传播算法进行更新,以实现模型训练的目标。

权重的更新是基于梯度来计算的,而梯度的获取方式并非单一,它们由不同类型的优化器提供。这就是我们今天要深入探讨的优化器的角色。

首先为了后续符号的统一,我们先引入一个最为常见的损失函数: L = ∑ i = 1 m ( y i − f w , b ( x i ) ) 2 L= \sum_{i=1}^m(y_i - f_{w,b}(\bold{x}_i))^2 L=i=1m(yifw,b(xi))2这个损失函数是计算全体数据样本的损失函数,一般来说,只是随机采用一个样本 i i i 进行权重更新的话,则可以将损失函数写成: L ( i ) = ( y i − f w , b ( x i ) ) 2 L(i)= (y_i - f_{w,b}(\bold{x}_i))^2 L(i)=(yifw,b(xi))2如果要计算其基于 w j w_j wj 的偏导数,也就是梯度的话,我们可以得到 ∂ L ( i ) ∂ w j \frac{\partial{L(i)}}{\partial{w_j}} wjL(i),考虑上时间 t t t 来表示更新前( t − 1 t-1 t1)和更新后( t t t)的区别,可以写成: ∂ L ( i ) ∂ w t − 1 , j \frac{\partial{L(i)}}{\partial{w_{t-1,j}}} wt1,jL(i),因为梯度是根据前一个时刻的权重系数 w t − 1 , j w_{t-1,j} wt1,j 计算的。

后续为了简化,我会写成 ∇ L ( w t − 1 , j ) i \nabla L(w_{t-1,j})_i L(wt1,j)i,来表示损失函数在 t − 1 t-1 t1 时刻关于 w j w_j wj 的偏导数,也就是梯度。

按照我的理解,通过前一时刻( t − 1 t-1 t1)的权重系数计算出来的梯度,应该是算是前一时刻的梯度?

但是 Pytorch 官方实现各种优化器的时候,都是这么表示梯度的: g t ← ∇ θ f t ( θ t − 1 ) g_t \leftarrow \nabla_{\theta}f_t(\theta_{t-1}) gtθft(θt1),这就意味着,Pytorch 官方定义,通过 t − 1 t-1 t1 时刻的权重系数计算出来的事当前 t t t 时刻的梯度。

但是,我为了方便理解,将 t − 1 t-1 t1 时刻权重计算得到的梯度表示为 t − 1 t-1 t1 时刻的梯度,即 g t − 1 g_{t-1} gt1,这样对我来说更好理解一些,但是暂时还不知道坏处是啥?如果有大佬可以告诉我是否可行,我感觉梯度因为是实时计算的,不需要更新的,标不标准时刻感觉都可以。

接下来就来到正题,介绍各个优化器的公式:

BGD (Batch Gradient Descent)

其实这种方式和基于全体样本的梯度计算方式比较类似,或者说是一样的。

将一个 Batch 的数据( m m m 个样本)都考虑进来,我们要更新 w j w_j wj 权重,就对其求 w j w_j wj 的偏导,然后可以得到 ∇ L ( w t , j ) i \nabla L(w_{t,j})_i L(wt,j)i,但是因为这是 m m m 个样本的梯度求和,

所以我们需要求其平均梯度: g t − 1 , j = 1 m ⋅ ∑ i = 1 m ∇ L ( w t − 1 , j ) i g_{t-1, j} = \frac{1}{m}\cdot\sum_{i=1}^m\nabla L(w_{t-1,j})_i gt1,j=m1i=1mL(wt1,j)i权重更新公式可以写成: w t , j = w t − 1 , j − η ⋅ g t − 1 , j w_{t,j}= w_{t-1, j}-\eta \cdot g_{t-1,j} wt,j=wt1,jηgt1,j因为我们所有的权重都是和 w j w_j wj 相关的,所以为了让公式更简洁一点,我们就不必显式的将 j j j 的下标标注出来了,后面的公式都采用一样的操作。

也就是我们的 BGD 的公式可以写成: g t − 1 = 1 m ⋅ ∑ i = 1 m ∇ L ( w t − 1 , j ) i g_{t-1} = \frac{1}{m}\cdot\sum_{i=1}^m\nabla L(w_{t-1,j})_i gt1=m1i=1mL(wt1,j)i w t = w t − 1 − η ⋅ g t − 1 w_{t}= w_{t-1}-\eta \cdot g_{t-1} wt=wt1ηgt1

MBGD (Mini-Batch Gradient Descent)

这种方式是 BGD 和 SGD 的一种折中处理方式,采用一个 mini batch.

简单举个例子,采用一个 batchsize 为 k k k 的小样本集,权重系数的更新公式可以写成下面的形式:

梯度和权重更新公式可以表示为: g t − 1 = 1 k ⋅ ∑ i i + k − 1 ∇ L ( w t − 1 , j ) i g_{t-1} = \frac{1}{k}\cdot\sum_{i}^{i+k-1} \nabla L(w_{t-1, j})_i gt1=k1ii+k1L(wt1,j)i w t = w t − 1 − η ⋅ g t − 1 w_{t} = w_{t-1} - \eta \cdot g_{t-1} wt=wt1ηgt1除了梯度计算的样本数变少了,其他是完全一样的。

SGD (Stochastic Gradient Descent)

随机梯度下降,这个就不需要考虑全体样本了,因为全体样本毕竟还是耗时耗力,只要随机抽取一个样本 i i i 来计算梯度就可以了: g t − 1 = ∇ L ( w t − 1 , j ) i g_{t-1} = \nabla L(w_{t-1, j})_i gt1=L(wt1,j)i w t = w t − 1 − η ⋅ g t − 1 w_{t} = w_{t-1} - \eta \cdot g_{t-1} wt=wt1ηgt1只这种情况是最简单的了。

SGDM (Stochastic Gradient Descent with Momentum)

在随机梯度下降的基础上,加上一阶动量。

梯度: g t − 1 = ∇ L ( w t − 1 , j ) i g_{t-1}=\nabla L(w_{t-1, j})_i gt1=L(wt1,j)i一阶动量系数更新: v t = λ ⋅ v t − 1 + ( 1 − λ ) ⋅ g t − 1 v_{t}= \lambda \cdot v_{t-1} + (1-\lambda)\cdot g_{t-1} vt=λvt1+(1λ)gt1权重系数更新: w t = w t − 1 − η ⋅ v t w_{t}= w_{t-1} - \eta \cdot v_{t} wt=wt1ηvt

Adagrad

这里的梯度可以写成 g t − 1 = ∇ L ( w t − 1 , j ) i g_{t-1}=\nabla L(w_{t-1, j})_i gt1=L(wt1,j)i权重系数更新: w t = w t − 1 − η ⋅ 1 ∑ i = 0 t − 1 g i 2 + ϵ ⋅ g t − 1 w_{t} = w_{t-1} - \eta \cdot \frac{1}{\sqrt{\sum_{i=0}^{t-1}g_i^2} +\epsilon} \cdot g_{t-1} wt=wt1ηi=0t1gi2 +ϵ1gt1注意:这里面求和的 i i i 并不是指样本 i i i,只是对之前所有时间 t − 1 t-1 t1 求和的一个表示。

RMSProp

和 Adagrad 基本类似,只是加入了迭代衰减(二阶动量)

梯度: g t − 1 = ∇ L ( w t − 1 , j ) i g_{t-1} = \nabla L(w_{t-1,j})_i gt1=L(wt1,j)i二阶动量参数(其中 q 0 = g 0 2 q_0 = g_0^2 q0=g02 ): q t = α ⋅ q t − 1 + ( 1 − α ) ⋅   g t − 1 2 q_{t} = \alpha \cdot q_{t-1} + (1-\alpha)\cdot\ g_{t-1}^2 qt=αqt1+(1α) gt12权重系数: w t = w t − 1 − η ⋅ 1 q t + ϵ ⋅ g t − 1 w_{t} = w_{t-1} - \eta \cdot \frac{1}{\sqrt{q_t}+\epsilon} \cdot g_{t-1} wt=wt1ηqt +ϵ1gt1

Adam

这里我为 Adam 选择计算梯度的方式是随机小批量,也就是类似 MBGD 的方式,但是实际上,Adam 可以根据数据集的特点自己选择全量样本,随机样本或者随机小批量来进行梯度计算:
g t − 1 = 1 k ∑ i i + k − 1 ∇ L ( w t − 1 , j ) i g_{t-1} = \frac{1}{k}\sum_i^{i+k-1}\nabla L(w_{t-1,j})_i gt1=k1ii+k1L(wt1,j)i累计平方梯度(二阶动量,和 RMSProp 类似):
q t = α ⋅ q t − 1 + ( 1 − α ) ⋅ g t − 1 2 q_{t} = \alpha \cdot q_{t-1} + (1-\alpha)\cdot g_{t-1}^2 qt=αqt1+(1α)gt12累计梯度(一阶动量,和 SGDM 类似): v t = λ ⋅ v t − 1 + ( 1 − λ ) ⋅ g t − 1 v_{t} = \lambda \cdot v_{t-1} + (1-\lambda)\cdot g_{t-1} vt=λvt1+(1λ)gt1修正偏差: v ~ t = v t 1 − λ t ,        q ~ t = q t 1 − α t \tilde{v}_{t} = \frac{v_{t}}{1-\lambda^{t}}, \space\space\space\space\space\space \tilde{q}_t=\frac{q_{t}}{1-\alpha^{t}} v~t=1λtvt,      q~t=1αtqt这里的 λ \lambda λ α \alpha α 都是初始设定的固定参数,这里的上标 t t t 是求时间 t t t 次方。

权重系数更新的公式为: w t = w t − 1 − η ⋅ 1 q ~ t + ϵ ⋅ v ~ t w_{t} = w_{t-1} - \eta \cdot \frac{1}{\sqrt{\tilde{q}_{t}}+\epsilon}\cdot \tilde{v}_{t} wt=wt1ηq~t +ϵ1v~t这里的 ϵ \epsilon ϵ 是一个非常小的值,为了是防止分母为 0。

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
神经网络最好的优化器并没有一个固定的答案,选择最适合的优化器取决于许多因素,例如网络的结构,数据集的大小,训练目标等等。然而,有几种常见的优化器被广泛用于神经网络训练中。 一种常见的优化器梯度下降算法(Gradient Descent,GD)。它是通过计算网络参数的梯度来更新参数,使得损失函数逐渐减小。梯度下降算法有多种变体,包括批量梯度下降(Batch Gradient Descent,BGD),随机梯度下降(Stochastic Gradient Descent,SGD)和动量梯度下降(Momentum Gradient Descent)等。BGD使用全部样本进行参数更新,SGD每次只使用一个样本,而Momentum Gradient Descent则结合了之前梯度的信息,以加速训练过程。 另一种常见的优化器是自适应优化器,如AdaGradRMSProp、Adam等。这些优化器可以根据参数的历史梯度信息来调整学习率,并且对于不同的参数可以使用不同的学习率。AdaGrad根据参数的梯度大小来自适应地调整学习率,RMSProp则结合了梯度的平方和动量信息,Adam则同时结合了动量和梯度的一阶矩和二阶矩估计。 选择最适合的优化器需要综合考虑训练速度和结果质量。在实际应用中,可以尝试不同的优化器并通过验证集来评估它们的性能,选择最佳的优化器。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [神经网络中的优化器](https://blog.csdn.net/weixin_62848630/article/details/128823949)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [深度学习之神经网络的优化器篇](https://blog.csdn.net/To_be_little/article/details/129267632)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值