导读

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

因为无论是缩放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梯度的更新过程如下所示:
θ=θ−vtvt=γ∗vt−1+η∗ΔθJ(θ)\begin{aligned} \theta &= \theta - v_t \\ v_t &= \gamma * v_{t-1} + \eta * \Delta_{\theta}J(\theta) \end{aligned} θvt​​=θ−vt​=γ∗vt−1​+η∗Δθ​J(θ)​

  • γ\gammaγ:动量参数,一般取0.5、0.9和0.99
  • vtv_tvt​ :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能够自适应的调整不同参数的学习率,根据参数的历史所有梯度平方值总和的平方根来调整学习率的缩放比例,使得稀疏的特征得到大的学习率更新,对于非稀疏的特征得到较小的学习更新,所以该算法适合处理稀疏特征的数据。参数的更新公式如下:
gt,i=ΔθJ(θi)θt+1,i=θt,i−ηGt,ii+ϵ∗gt,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,i​−Gt,ii​+ϵ​η​∗gt,i​​

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

接下来我们来讨论,对loss和learning rate乘以s对参数θ\thetaθ的更新会有什么影响,先讨论对loss乘以s
θt+1,i=θt,i−ηGt,ii∗s2+ϵ∗gt,i∗s=θt,i−ηGt,ii+ϵ/s∗gt,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,i​−Gt,ii​∗s2​+ϵη​∗gt,i​∗s=θt,i​−Gt,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[g2]tE[g^2]_tE[g2]t​取决于当前时刻以及上一时刻的平均值,计算公式如下
E[g2]t=γ∗E[g2]t−1+(1−γ)∗gt2θt+1=θt−ηE[g2]t+δ∗gt,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]t−1​+(1−γ)∗gt2​=θt​−E[g2]t​​+δη​∗gt,i​​
不难看出RMSProp其实和Adagrad的计算公式差不多,所以对于RMSProp而言loss乘以s不等价于learning rate乘以s

Adam

Adam:Adaptive Momnet Estimation,与AdagradRMSProp的区别在于计算历史梯度衰减的方法不同。Adam没有使用梯度的平方衰减,而是采用了类似于动量的梯度衰减,计算公式如下:
vt=β1vt−1+(1−β1)gtut=β2ut−1+(1−β2)gt2vt~=vt1−β1tut~=ut1−β2tθt+1=θt−ηut~+ϵvt~\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} vt​ut​vt​​ut​​θt+1​​=β1​vt−1​+(1−β1​)gt​=β2​ut−1​+(1−β2​)gt2​=1−β1t​vt​​=1−β2t​ut​​=θt​−ut​​​+ϵη​vt​​​
vtv_tvt​:梯度的一阶估计
utu_tut​:梯度的二阶估计
vt~\widetilde{v_t}vt​​:梯度一阶估计的偏差修正
ut~\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?相关推荐

  1. 《深度学习笔记》——“损失函数loss乘以正数因子a是否等价于学习率lr乘以a呢?”

    致谢 感谢知乎回答"loss的尺度的影响的本质上取决于优化器"给予我的启发! 1 问题描述 最近我在调参时,想到一个问题:"损失函数loss乘以正数因子a是否等价于学习率 ...

  2. 【学习率调整】学习率衰减之周期余弦退火 (cyclic cosine annealing learning rate schedule)

    1. 概述 在论文<SGDR: Stochastic Gradient Descent with Warm Restarts>中主要介绍了带重启的随机梯度下降算法(SGDR),其中就引入了 ...

  3. 深度学习:权重衰减(weight decay)与学习率衰减(learning rate decay)

    正则化方法:防止过拟合,提高泛化能力 避免过拟合的方法有很多:early stopping.数据集扩增(Data augmentation).正则化(Regularization)包括L1.L2(L2 ...

  4. 如何理解深度学习分布式训练中的large batch size与learning rate的关系?

    问题详情: 在深度学习进行分布式训练时,常常采用同步数据并行的方式,也就是采用大的batch size进行训练,但large batch一般较于小的baseline的batch size性能更差,请问 ...

  5. Paper:论文解读《Adaptive Gradient Methods With Dynamic Bound Of Learning Rate》中国本科生提出AdaBound的神经网络优化算法

    Paper:论文解读-<Adaptive Gradient Methods With Dynamic Bound Of Learning Rate>中国本科生(学霸)提出AdaBound的 ...

  6. 学习速率 learning rate

    学习速率的选取策略 运用梯度下降算法进行优化时,权重的更新规则中,在梯度项前会乘以一个系数,这个系数就叫学习速率 ααα : 如果学习速率太小,则会使收敛过慢. 如果学习速率太大,则会导致代价函数振荡 ...

  7. Adam和学习率衰减(learning rate decay)

    1.梯度下降法更新参数 梯度下降法参数更新公式: 其中,η 是学习率,θt是第 t 轮的参数,J(θt) 是损失函数,∇J(θt) 是梯度. 在最简单的梯度下降法中,学习率 ηη 是常数,是一个需要实 ...

  8. 3.1 学习率(learning rate)的选择

    文章目录 1. 什么是学习率 2. 学习率指数衰减机制 3. 实例解析 4. 总结 1. 什么是学习率 调参的第一步是知道这个参数是什么,它的变化对模型有什么影响. (1)要理解学习率是什么,首先得弄 ...

  9. 深度学习中的 Batch_Size,以及learning rate参数理解(跑pytorch代码时遇到的问题)

    在训练和测试的时候遇到的问题, _error_if_any_worker_fails() RuntimeError: DataLoader worker (pid 25637) is killed b ...

最新文章

  1. 【RPA干货来袭】 UiBot关于如何使用浏览器调用JS命令的说明
  2. float python_Python中float('INF')的使用
  3. docker常用参数详解,docker run常用参数详解(精)
  4. Netty工作笔记0075---handler链调用机制实例1
  5. 我的小快排(两种分割方法)
  6. 2017-2018-1 20155229 实验五 《通讯协议设计》
  7. 2020研究生数学建模获奖名单_赞!浙商大研究生在全国研究生数学建模竞赛中喜获41个奖项...
  8. Laravel 速记表
  9. LA 4794 - Sharing Chocolate dp
  10. 基于树莓派的智能门禁及3D外壳打印设计
  11. c语言思维导图(学习笔记)
  12. Android WiFi Direct文件传输
  13. 微信小程序的推广思路与方法,详细思路解析
  14. 淘宝店铺宝贝批量复制工具
  15. PAUL:Patch-based Discriminative Feature Learning for Unsupervised Person Re-identification阅读总结
  16. 域名防封之长城防封系统都能做什么?
  17. 学而后思,方能发展;思而立行,终将卓越
  18. 城市交通拥堵问题matlab,城市交通拥堵问题的分析与治理
  19. 论文对图片与什么要求呢?
  20. linux unix 可视化界面,Linux/UNIX远程调用图形化界面的一种方法

热门文章

  1. 大厂晋升指北1——职级体系
  2. C++ 线程里面延时1秒的技巧
  3. 三星s5刷机android+l,三星s5刷机教程与方法(卡刷第三方包)
  4. 海信电视linux安装软件,海信电视无法安装软件怎么办,两种最新方法完美解决!...
  5. 机械/仪表领域北大核心期刊(摘自第九版)
  6. flutter 微信语言选择_Flutter 模仿微信读书效果!
  7. [大数据技术与应用省赛学习记录一]——软件准备
  8. 防勒索病毒的核心——主机加固
  9. 笑话:​我是个程序员,一天我坐在路边一边喝水一边苦苦检查程序。这时一个乞丐在我边上坐下了,开始要饭,我觉得可怜,就给了他1块钱...
  10. 苹果高调入局中低端市场,国产手机如何“坚守”与“转身”?