2022秋招算法岗面经题:训练模型时loss除以10和学习率除以10真的等价吗(SGD等价,Adam不等价)

news2024/9/25 19:24:39

问题描述:训练深度学习模型时loss除以10和学习率除以10等价吗?

先说结论

这个问题的答案与优化器有关

  1. 使用Adam、Adagrad、RMSprop等带有二阶动量 v t v_t vt的优化器训练时,当我们将loss除以10,对训练几乎没有影响。
  2. 使用SGD、Momentum SGD等,将loss除以10,会对训练有影响,并且这个影响和学习率除以10是等价的。

具体分析

在这里插入图片描述

Adam
当使用Adam优化器时,若将loss扩大 s s s倍,则梯度 g t g_t gt扩大 s s s倍,由于 m t m_t mt g t g_t gt的累加, v t v_t vt g t 2 g_t^2 gt2的累加,且 m ^ t \hat m_t m^t m t m_t mt是线性关系, v ^ t \hat v_t v^t v t v_t vt的线性关系,所以Adam的更新公式变成如下形式:
θ t = θ t − 1 − α s ∗ m ^ t s 2 ∗ v ^ t + ϵ = θ t − 1 − α m ^ t v ^ t + ϵ / s ≈ θ t − 1 − α m ^ t v ^ t + ϵ \theta_t=\theta_{t-1}-\alpha \frac{s * \hat{m}_t}{\sqrt{s^2 * \hat{v}_t}+\epsilon}=\theta_{t-1}-\alpha \frac{\hat{m}_t}{\sqrt{\hat{v}_t}+\epsilon / s}\approx \theta_{t-1}-\alpha \frac{\hat{m}_t}{\sqrt{\hat{v}_t}+\epsilon} θt=θt1αs2v^t +ϵsm^t=θt1αv^t +ϵ/sm^tθt1αv^t +ϵm^t
ϵ / s \epsilon/s ϵ/s相对于 v ^ t \sqrt{\hat{v}_t} v^t 是一个很小的量时,上面的约等于就相当于等号了。


现在我们可以尝试回答下面的问题了

问题:“在使用adam的情况下,如果人为把loss 扩大10倍,对adam来讲,会有什么影响?可以通过调整学习率来缓解这个影响吗?”

  • 对于Adam而言,如果人为把loss扩大10倍,对参数梯度更新没有什么影响;
  • Adam学习率乘上10000,对于参数更新影响巨大。

你如果不相信这个结果,那我们可以写个代码来验证下:

import torch
import torch.nn as nn
torch.manual_seed(20)

class FCModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Sequential(
            nn.Linear(6, 6),
            nn.ReLU(),
            nn.Linear(6, 1),
            nn.Sigmoid())
    
    def forward(self, x):
        return self.linear(x ** 2).exp()

# reload: ensure same initialization
fc = FCModel()
torch.save(fc, 'fc.pth.tar')
fc1 = torch.load('fc.pth.tar')
fc2 = torch.load('fc.pth.tar')

# optimizer1 = torch.optim.SGD(fc1.parameters(), lr=0.01 * 10000)
# optimizer2 = torch.optim.SGD(fc2.parameters(), lr=0.01)

optimizer1 = torch.optim.Adam(fc1.parameters(), lr=0.01)
optimizer2 = torch.optim.Adam(fc2.parameters(), lr=0.01)
# optimizer2 = torch.optim.Adam(fc2.parameters(), lr=0.01 * 10000)

for i in range(20):
    input1 = torch.rand(1, 6)
    label1 = torch.rand(1,)
    output1 = fc1(input1)
    loss1 = label1 - output1
    optimizer1.zero_grad()
    loss1.backward()
    optimizer1.step()

    input2 = input1.clone()
    label2 = label1.clone()
    output2 = fc2(input2)
    loss2 = (label2 - output2) * 10000
    optimizer2.zero_grad()
    loss2.backward()
    optimizer2.step()

    print("fc1: {}".format(i), fc1.linear[0].weight)
    print("fc2: {}".format(i), fc2.linear[0].weight)
    print()

在这里插入图片描述

思考题:多任务学习为什么可以 a*loss1 + b*loss2来平衡不同任务?

说到这里我有个疑问:既然对于Adam优化器,我loss除以10对训练情况几乎没有影响,那为什么在多任务学习中常用a*loss1 + b*loss2这种方式来平衡不同任务的学习呢?

后来我想了想,a*loss1确实可以让梯度g1扩大a倍,b*loss2也确实可以让梯度g2扩大b倍,这没有错,但是在Adam里面把这两个梯度加在一起进行平方的,当a和b不相同时,就没有办法提取出相同的倍数,然后分子分母消掉了,因此a*loss1 + b*loss2这种方式确实可以权衡不同任务训练时的重要性。

具体分析如下:在这里插入图片描述

我们继续写个代码来验证下结论:

import torch
import torch.nn as nn

torch.manual_seed(20)


class FCModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Sequential(
            nn.Linear(6, 6),
            nn.ReLU(),
            nn.Linear(6, 1),
            nn.Sigmoid())

    def forward(self, x):
        return self.linear(x ** 2).exp()


# reload: ensure same initialization
fc = FCModel()
torch.save(fc, 'fc.pth.tar')
fc1 = torch.load('fc.pth.tar')
fc2 = torch.load('fc.pth.tar')

# optimizer1 = torch.optim.SGD(fc1.parameters(), lr=0.01 * 10000)
# optimizer2 = torch.optim.SGD(fc2.parameters(), lr=0.01)

optimizer1 = torch.optim.Adam(fc1.parameters(), lr=0.01)
optimizer2 = torch.optim.Adam(fc2.parameters(), lr=0.01)
# optimizer2 = torch.optim.Adam(fc2.parameters(), lr=0.01 * 10000)

for i in range(20):
    input1 = torch.rand(1, 6)
    label1 = torch.rand(1, )
    output1 = fc1(input1)
    loss11 = label1 - output1
    loss12 = label1 + output1
    loss13 = loss11 + loss12
    optimizer1.zero_grad()
    loss13.backward()
    optimizer1.step()

    input2 = input1.clone()
    label2 = label1.clone()
    output2 = fc2(input2)
    loss21 = label2 - output2
    loss22 = label2 + output2
    loss23 = loss21 + 100 * loss22
    optimizer2.zero_grad()
    loss23.backward()
    optimizer2.step()

    print("fc1: {}".format(i), fc1.linear[0].weight)
    print("fc2: {}".format(i), fc2.linear[0].weight)
    print()

可以看到两者的参数更新情况是不一样的
在这里插入图片描述

相关资料

  • 知乎:https://www.zhihu.com/question/320377013
  • 面试题:2022年互联网秋招算法岗,被虐经历

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Streamlit自定义组件开发教程

在这篇文章中,我们将学习如何构建Streamlit组件以及如何发布streamlit组件供其他人使用。 使用 3D场景编辑器快速搭建三维数字孪生场景 1、什么是Streamlit组件? Streamlit 组件是一个可共享的 Streamlit 插件,可让你为应用程序添加新的视觉…

Java——子集

题目链接 leetcode在线oj题——子集 题目描述 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 题目示例 输入:nums [1,2,3] …

MySQL管理

1:MySQL管理1.1:系统数据库Mysql数据库安装完成后,自带了一下四个数据库,具体作用如下: 数据库 含义 mysql 存储MySQL服务器正常运行所需要的各种信息 (时区、主从、用 户、权限等) information…

性能测试/实战演示 H5 性能分析

W3C标准是浏览器标准,一般浏览器都支持W3C标准,它规定使用者可以通过api查询性能信息,可借用W3C协议完成自动化H5性能测试。 W3C官网:Navigation Timing 使用chrome浏览器对webview进行手工查看,伴随着业务增多&#x…

mysql:索引的数据结构,B树,B+树浅聊

mysql:索引的数据结构 什么是索引? 索引(Index)是帮助MySQL高效获取数据的数据结构 为什么学索引? 之前应该有概念说,把索引理解为目录,比如通过s就可以查询到s开头的汉子从哪也开始&#xff…

[网鼎杯 2020 青龙组]AreUSerialz

目录 信息收集 代码审计 前提知识 思路分析 绕过检测 方法一 poc payload 方法二 poc payload 信息收集 进入页面给出了源代码如下&#xff0c;是一道PHP的反序列化题目 <?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {pro…

Linux多线程 线程概念 | 线程VS进程 | 线程控制【万字精讲】

线程 一、线程概念 1. 知识支持及回顾 在我们一开始学习进程的时候。我们总说进程在内部执行时&#xff0c;是OS操作系统调度的基本单位。其实并不严谨&#xff0c;今天&#xff0c;我们要重新完善这个说法——线程在进程内部运行&#xff0c;线程是OS操作系统调度的基本单位…

WorkPlus移动办公平台,助力企业随时随地“指尖办公”

近年来&#xff0c;随着移动互联网的发展&#xff0c;越来越多的人习惯于随时随地通过移动设备完成工作、购物、游戏等。移动办公应用就是基于移动终端的信息化办公应用&#xff0c;利用企微、钉钉、WorkPlus等移动办公平台&#xff0c;实现企业与员工间的随时随地工作、沟通&a…

技术分享 | ClickHouse StarRocks 使用经验分享

作者&#xff1a;许天云 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 一. 大纲 本篇分享下个人在实时数仓方向的一些使用经验&#xff0c;主要包含了ClickHouse 和 StarRocks 这两款目…

ASP.NET MVC解决方案的搭建(.NET Framework)——C#系列(一)

一、新建项目 1、控制器新建 2、Service层新建 3、Business数据层新建 4、Commons公共层新建 5、Models实体层新建 二、调用接口 1、接口建立 Web API 2 控制器新建 2、调用 三、Swagger接口调试配置 1、添加NuGet包 在启动项中添加Swashbuckle NuGet包 2、访问 htt…

Vivado2018.3安装及注册指南-安装包获取

一、vivado 介绍 vivado设计套件 是FPGA 厂商赛灵思&#xff08;Xilinx&#xff09;公司最新的为其产品定制的集成开发环境&#xff0c;支持Block Design、Verilog、VHDL等多种设计输入方式&#xff0c;内嵌综合器以及仿真器&#xff0c;可以完成从设计输入、综合适配、仿真到…

mysql存储过程的基础知识

本文来简单说下存储过程的基础知识 文章目录概述什么是存储过程存储过程的优缺点概述 mysql官网提供的储存过程&#xff1a;https://www.mysqlzh.com/doc/225/499.html 什么是存储过程 简单的说&#xff0c;存储过程是一条或者多条SQL语句的集合&#xff0c;可视为批文件&…

SAP采购中不基于收货的发票校验的价差计算过程实例

年前最后一天上班了&#xff0c;我还在帮财务分析一个价差问题。源于财务用户头天的一个请求&#xff0c;在不基于收货的发票校验中&#xff0c;计算倒不难&#xff0c;难的是梳理数量的逻辑关系。不过总算时间也没白花&#xff0c;记录下来。下次就不算了&#xff0c;能解释清…

理解使用并查集

目录 一.并查集原理 1.概念&#xff1a; 2.性质 3.形式 4. 合并方式 二.并查集实现 1.成员变量 2.构造函数 3.查找根 4.合并集合 5.判断是否在一个集合 6.查看集合数量 三.并查集总代码 前言&#xff1a;理解并查集是为了接下来学习图要用&#xff0c;而会使用并查…

Linux:系统性能监控工具-tsar安装和使用

在上家公司做性能压力测试时就用过tsar&#xff0c;但总结文档留在了内部&#xff0c;正好借着最近工作内容又用上了tsar&#xff0c;总结起来 目录前言tsar介绍总体架构安装tasrtsar配置介绍配置文件定时任务配置日志文件tsar使用tsar实际使用参考查看可用的监控模块列表查看C…

本松新材创业板IPO终止:业绩下滑,客户较集中,周永松为实控人

撰稿|汤汤 来源|贝多财经 近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;杭州本松新材料技术股份有限公司&#xff08;下称“本松新材”&#xff09;提交了撤回上市申请文件的申请&#xff0c;保荐人财通证券也撤回对该公司的保荐。因此&#xff0c;深交所终止了…

目标检测:YOLOV3技术详解

目标检测&#xff1a;YOLOV3技术详解前言主要改进DarkNet53新的分类器正负样本的匹配损失函数前言 YOLOV3是V2的升级版&#xff0c;也是原作者的绝笔&#xff0c;V3主要还是把当时一些有用的思想融入了进来&#xff0c;没有什么创新型的突破&#xff0c;具体细节我们下面介绍。…

【安卓逆向】Frida入门与常用备忘

【安卓逆向】Frida入门与常用备忘前置知识什么是hook&#xff1f;hook的作用常见的逆向工具Frida使用入门简介与资料参考备忘前置环境配置执行hook常用hook脚本/API前置知识 什么是hook&#xff1f; hook&#xff0c;译为“钩子”&#xff0c;是指将方法/函数勾住&#xff0c;…

2022-CSDN的一年

前言 马上要到兔年的春节&#xff0c;年前最后一个版本顺利上线&#xff0c;闲下来两天&#xff0c;可以对过往一年进行一下总结&#xff0c;说起来这是入职CSDN之后第一次自己将自己所思所想以以博客的形式发布在CSDN网站上&#xff0c;也是比较奇特的体验。语言表达能力不强&…

利用华为路由器配置单臂路由功能,实现多个vlan间通信

单臂路由&#xff0c;是通过一台路由器使不同VLAN之间互通的数据通过路由器进行三层转发。 如果在路由器上为每个 VLAN分配一个单独的路由器物理接口&#xff0c;那么随着VLAN数量的增口&#xff0c;必然需要更多的接口&#xff0c;而路由器能提供的接口数量有限&#xff0c;所…