loss乘以100等价于learning rate乘以100?

2023-12-22 15:48

本文主要是介绍loss乘以100等价于learning rate乘以100?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导读

看到这个问题的时候,可能你会很直观的认为是等价的,其实等不等价这个应该取决于在更新参数时所选择的优化算法

因为无论是缩放loss还是learning rate最终的影响都是对更新参数时偏移量( Δ \Delta Δ)的影响,而不同的优化算法会导致这个偏移量存在差别,下面我们来讨论一下不同优化算法之间的差别。
在这里插入图片描述

SGD

梯度下降优化算法,也是最常见的一种优化算法,公式如下:
θ = θ − η ∗ Δ θ J ( θ ) \theta = \theta - \eta * \Delta_{\theta}J(\theta) θ=θηΔθJ(θ)

  • η \eta η:学习率
  • Δ θ J ( θ ) \Delta_{\theta}J(\theta) ΔθJ(θ):loss对参数的一阶偏导,所以当我们对loss的尺度进行缩放的时候实际最终都会反应到梯度上面

结论:通过上面的公式不难看出,当loss乘以s时其实就等价于偏导 Δ θ J ( θ ) \Delta_{\theta}J(\theta) ΔθJ(θ)数乘以s,也就等价与学习率 η \eta η乘以s。所以对于SGD而言,loss乘以s等价于learning rate乘以s。下面我们可以用代码来证明一下

import torch
from torch import nn#保证每次产生的随机数(输入和输出都相同)
torch.manual_seed(28)class ExampleModel(nn.Module):"""定义一个简单的神经网络"""def __init__(self):super(ExampleModel, self).__init__()self.linear_model = nn.Sequential(nn.Linear(10,10),nn.ReLU(),nn.Linear(10,1),nn.Sigmoid())def forward(self,x):return self.linear_model(x**3+x**2+x)def print_weight_info(input,label,model,opt,loss_scale):"""输出网络的参数信息:param input: 输入:param label: 输出:param model: 模型:param opt: 优化器:param loss_scale: loss变化的尺度:return:"""output = model(input)loss = (label - output) * loss_scaleopt.zero_grad()loss.backward()opt.step()print(model.linear_model[0].weight)model = ExampleModel()input1 = torch.rand(1,10)
label1 = torch.rand(1,)
lr = 0.01lr_sgd_opt = torch.optim.SGD(model.parameters(),lr=lr)
#lr设置为0.01,loss的尺度扩大10倍
print_weight_info(input1,label1,model,lr_sgd_opt,10)
#lr设置为0.01*10扩大10倍,loss的尺度不做处理
#lr_scale_sgd_opt = torch.optim.SGD(model.parameters(),lr=lr*10)
#print_weight_info(input1,label1,model,lr_scale_sgd_opt,1)

Momentum SGD

Momentum SGD是基于SGD的基础上做了修改,为了解决海森矩阵的不良条件数随机梯度的方差问题导致训练模型时进入到局部极小值问题而改进的。Momentum SGD梯度的更新过程如下所示:
θ = θ − v t v t = γ ∗ v t − 1 + η ∗ Δ θ J ( θ ) \begin{aligned} \theta &= \theta - v_t \\ v_t &= \gamma * v_{t-1} + \eta * \Delta_{\theta}J(\theta) \end{aligned} θvt=θvt=γvt1+ηΔθJ(θ)

  • γ \gamma γ:动量参数,一般取0.5、0.9和0.99
  • v t v_t vt :t时刻的梯度

结论:通过上面的公式不难看出,对于Momentum SGD来说和SGD一样,loss乘以s等价于learning rate乘以s。证明代码如下:

import torch
from torch import nn#保证每次产生的随机数(输入和输出都相同)
torch.manual_seed(28)class ExampleModel(nn.Module):"""定义一个简单的神经网络"""def __init__(self):super(ExampleModel, self).__init__()self.linear_model = nn.Sequential(nn.Linear(10,10),nn.ReLU(),nn.Linear(10,1),nn.Sigmoid())def forward(self,x):return self.linear_model(x**3+x**2+x)def print_weight_info(input,label,model,opt,loss_scale):"""输出网络的参数信息:param input: 输入:param label: 输出:param model: 模型:param opt: 优化器:param loss_scale: loss变化的尺度:return:"""output = model(input)loss = (label - output) * loss_scaleopt.zero_grad()loss.backward()opt.step()print(model.linear_model[0].weight)model = ExampleModel()input1 = torch.rand(1,10)
label1 = torch.rand(1,)
lr = 0.01
#设置momentum SGD的动量为0.9
momentum = 0.9lr_mom_sgd_opt = torch.optim.SGD(model.parameters(),lr=lr,momentum=momentum)
#lr设置为0.01,loss的尺度扩大10倍
print_weight_info(input1,label1,model,lr_mom_sgd_opt,10)
#lr设置为0.01*10扩大10倍,loss的尺度不做处理
# lr_mom_sgd_opt = torch.optim.SGD(model.parameters(),lr=lr*10,momentum=momentum)
# print_weight_info(input1,label1,model,lr_mom_sgd_opt,1)

Adagrad

Adagrad能够自适应的调整不同参数的学习率,根据参数的历史所有梯度平方值总和的平方根来调整学习率的缩放比例,使得稀疏的特征得到大的学习率更新,对于非稀疏的特征得到较小的学习更新,所以该算法适合处理稀疏特征的数据。参数的更新公式如下:
g t , i = Δ θ J ( θ i ) θ t + 1 , i = θ t , i − η G t , i i + ϵ ∗ g t , i \begin{aligned} g_{t,i} &= \Delta_{\theta}J(\theta_i) \\ \theta_{t+1,i} &= \theta_{t,i} - \frac{\eta}{\sqrt{G_{t,ii} + \epsilon}} * g_{t,i} \end{aligned} gt,iθt+1,i=ΔθJ(θi)=θt,iGt,ii+ϵ ηgt,i

  • g t , i g_{t,i} gt,i t t t时刻参数 θ i \theta_{i} θi的梯度
  • θ t \theta_{t} θt t t t时刻参数 θ \theta θ的值
  • G t , i i G_{t,ii} Gt,ii G t G_{t} Gt是一个对角矩阵,第 i i i行元素 e i i e_{ii} eii表示的是过去到现在第 i i i个参数 θ i \theta_i θi的梯度的平方和
  • ϵ \epsilon ϵ:通常取 e − 8 e^{-8} e8,用来避免分母为零的情况

接下来我们来讨论,对loss和learning rate乘以s对参数 θ \theta θ的更新会有什么影响,先讨论对loss乘以s
θ t + 1 , i = θ t , i − η G t , i i ∗ s 2 + ϵ ∗ g t , i ∗ s = θ t , i − η G t , i i + ϵ / s ∗ g t , i \theta_{t+1,i} = \theta_{t,i} - \frac{\eta}{\sqrt{G_{t,ii} * s^2} + \epsilon} * g_{t,i} * s = \theta_{t,i} - \frac{\eta}{\sqrt{G_{t,ii}} + \epsilon / s} * g_{t,i} θt+1,i=θt,iGt,iis2 +ϵηgt,is=θt,iGt,ii +ϵ/sηgt,i
因为 ϵ \epsilon ϵ是极小值,所以我们可以忽略它的影响。通过上式就能够说明,当使用Adagrad优化算法时,乘以s对于参数的更新没有影响。而对于learning rate而言,它会使得参数更新的更快(s大于1)或更慢(s小于1),所以使用Adagrad优化算法的时候,loss乘以s不等价于learning rate乘以s
证明的代码如下:

input1 = torch.rand(1,10)
label1 = torch.rand(1,)
lr = 0.01
# lr_opt = torch.optim.Adagrad(model.parameters(),lr=lr)
#lr设置为0.01,loss的尺度不变
# print_weight_info(input1,label1,model,lr_opt,1)
#loss的尺度扩大10倍
# print_weight_info(input1,label1,model,lr_opt,10)
#lr设置为0.01*10扩大10倍,loss的尺度不做处理
lr_opt = torch.optim.Adagrad(model.parameters(),lr=lr*10)
print_weight_info(input1,label1,model,lr_opt,1)

RMSProp

RMSProp针对梯度平方和累积的越来越大的问题,而采用了历史梯度平方衰减平均值来代替梯度的平方和。动态的梯度平均值 E [ g 2 ] t E[g^2]_t E[g2]t取决于当前时刻以及上一时刻的平均值,计算公式如下
E [ g 2 ] t = γ ∗ E [ g 2 ] t − 1 + ( 1 − γ ) ∗ g t 2 θ t + 1 = θ t − η E [ g 2 ] t + δ ∗ g t , i \begin{aligned} E[g^2]_t &= \gamma * E[g^2]_{t-1} + (1-\gamma) * g_t^2 \\ \theta_{t+1} &= \theta_t - \frac{\eta}{\sqrt{E[g^2]_t}+\delta} * g_{t,i} \end{aligned} E[g2]tθt+1=γE[g2]t1+(1γ)gt2=θtE[g2]t +δηgt,i
不难看出RMSProp其实和Adagrad的计算公式差不多,所以对于RMSProp而言loss乘以s不等价于learning rate乘以s

Adam

Adam:Adaptive Momnet Estimation,与AdagradRMSProp的区别在于计算历史梯度衰减的方法不同。Adam没有使用梯度的平方衰减,而是采用了类似于动量的梯度衰减,计算公式如下:
v t = β 1 v t − 1 + ( 1 − β 1 ) g t u t = β 2 u t − 1 + ( 1 − β 2 ) g t 2 v t ~ = v t 1 − β 1 t u t ~ = u t 1 − β 2 t θ t + 1 = θ t − η u t ~ + ϵ v t ~ \begin{aligned} v_t &= \beta_{1}v_{t-1} + (1-\beta_1)g_t \\ u_t &= \beta_{2}u_{t-1} + (1 - \beta_2)g_t^2\\ \widetilde{v_t} &= \frac{v_t}{1-\beta_1^t}\\ \widetilde{u_t} &= \frac{u_t}{1- \beta_2^t} \\ \theta_{t+1} &= \theta_t - \frac{\eta}{\sqrt{\widetilde{u_t}}+\epsilon}\widetilde{v_t} \end{aligned} vtutvt ut θt+1=β1vt1+(1β1)gt=β2ut1+(1β2)gt2=1β1tvt=1β2tut=θtut +ϵηvt
v t v_t vt:梯度的一阶估计
u t u_t ut:梯度的二阶估计
v t ~ \widetilde{v_t} vt :梯度一阶估计的偏差修正
u t ~ \widetilde{u_t} ut :梯度二阶估计的偏差修正
β 1 \beta_1 β1通常取0.9, β 2 \beta_2 β2通常取0.999

转换一下公式可以发现,对于Adam来说,loss乘以s不等价于learning rate乘以s

总结

我们通过理论公式的推导以及实践的代码证明,最终发现对loss或learning rate乘以缩放尺度参数s是否等价,主要取决于优化器的选择。对于SGDMoment SGD来说,loss乘以s等价于learning rate乘以s,而对于AdagradRMSPropAdam来说loss乘以s不等价于learning rate乘以s

注意:上面在讨论loss与learning rate乘以s之间的关系时,我们并不考虑weight decay的影响。

这篇关于loss乘以100等价于learning rate乘以100?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/524544

相关文章

【LeetCode热题100】前缀和

这篇博客共记录了8道前缀和算法相关的题目,分别是:【模版】前缀和、【模版】二维前缀和、寻找数组的中心下标、除自身以外数组的乘积、和为K的子数组、和可被K整除的子数组、连续数组、矩阵区域和。 #include <iostream>#include <vector>using namespace std;int main() {//1. 读取数据int n = 0, q = 0;ci

简单的Q-learning|小明的一维世界(3)

简单的Q-learning|小明的一维世界(1) 简单的Q-learning|小明的一维世界(2) 一维的加速度世界 这个世界,小明只能控制自己的加速度,并且只能对加速度进行如下三种操作:增加1、减少1、或者不变。所以行动空间为: { u 1 = − 1 , u 2 = 0 , u 3 = 1 } \{u_1=-1, u_2=0, u_3=1\} {u1​=−1,u2​=0,u3​=1}

简单的Q-learning|小明的一维世界(2)

上篇介绍了小明的一维世界模型 、Q-learning的状态空间、行动空间、奖励函数、Q-table、Q table更新公式、以及从Q值导出策略的公式等。最后给出最简单的一维位置世界的Q-learning例子,从给出其状态空间、行动空间、以及稠密与稀疏两种奖励函数的设置方式。下面将继续深入,GO! 一维的速度世界 这个世界,小明只能控制自己的速度,并且只能对速度进行如下三种操作:增加1、减

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

牛客小白月赛100(A,B,C,D,E,F三元环计数)

比赛链接 官方讲解 这场比较简单,ABC都很签到,D是个不太裸需要预处理的 B F S BFS BFS 搜索,E是调和级数暴力枚举,F是三元环计数。三元环考的比较少,没见过可能会偏难。 A ACM中的A题 思路: 就是枚举每个边变成原来的两倍,然后看看两短边之和是否大于第三边即可。 不能只给最短边乘 2 2 2,比如 1 4 8 这组数据,也不能只给第二短边乘 2 2 2,比

诺瓦星云校招嵌入式面试题及参考答案(100+面试题、10万字长文)

SPI 通信有哪些内核接口? 在嵌入式系统中,SPI(Serial Peripheral Interface,串行外设接口)通信通常涉及以下内核接口: 时钟控制接口:用于控制 SPI 时钟的频率和相位。通过设置时钟寄存器,可以调整 SPI 通信的速度以适应不同的外设需求。数据发送和接收接口:负责将数据从主机发送到从机以及从从机接收数据到主机。这些接口通常包括数据寄存器,用于存储待发

多个线程如何轮流输出1到100

多个线程如何轮流输出1到100的值 这个面试问题主要考察如何让线程同步,首先线程同步必会用到的就是互斥锁,互斥锁保证多个线程对数据的同时操作不会出错。但是线程同步还会用到条件变量condition_variable,condition_variable(条件变量)是 C++11 中提供的一种多线程同步机制,它允许一个或多个线程等待另一个线程发出通知,以便能够有效地进行线程同步。 conditi

【最新华为OD机试E卷-支持在线评测】机器人活动区域(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线评测,专栏文章质量平均 94 分 最新华为OD机试目录: https://blog.

华为OD机试 - 最大利润(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。 一、题目描述

Python精选200Tips:91-100

To do a good job, one must first sharpen their tools. 091 sys092 os093 json094 re邮箱地址手机号身份证号数字(整数和浮点数)匹配科学计数法汉字大、小写字母年月日 095 itertools096 datetime097 math098 random099 collectionsCounterdequedefa