深度学习——Optimizer算法学习笔记(AdamW)

2024-01-22 11:18

本文主要是介绍深度学习——Optimizer算法学习笔记(AdamW),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 致谢

感谢赵老师的讲授!

2 前言

今天在学习Pytorch~记得Johnson助教好像讲过有一个优化算法最好用的,不过忘了是哪一个了,然后就回顾了一下赵老师讲课的视频;

3 最常用的Optimizer算法是Adam方法

最常用的Optimization算法是Adam方法;
(我在Wider Face数据集上用过一次Adam方法,不过用了一下感觉效果不是很好;

后来赵老师在课上讲到这种自适应的方法总存在一些局限性:
“从最后训练的精度上来看,还是SGD方法好一些,虽然训练会慢一些;如果是80个Epoch,可以先用Adam训练30个Epoch.等到最难的地方差不多过去的时候,再用SGD继续进行训练;”

我看了一下这个比例:3/8 = 0.375 = 1 - 0.625,感觉跟黄金比例有点类似0.618,
以后可以再做实验来看看; )

4 优化器函数说明

CLASS torch.optim.Optimizer(params, defaults)
所有优化器算法的基类。
Parameters:

  • params (iterable) – torch.Tensor s或 dict s的迭代器。

5 常见的Optimizer算法

5.1 基本的符号表示

α \alpha α:学习率

5.1 SGD方法(Stochastic Gradient Descent)

就是最普通的随机梯度下降方法。

5.2 SGD with Momentum

带有动量的SGD优化方法。
其公式如下:
{ v t = γ v t − 1 − α ⋅ ∇ θ J ( θ t − 1 ) θ t = θ t − 1 + v t \left\{\begin{matrix} v_t = \gamma v_{t-1} - \alpha\cdot\nabla_\theta J\left ( \theta_{t-1}\right )\\ \theta_t = \theta_{t-1} + v_t \end{matrix}\right. {vt=γvt1αθJ(θt1)θt=θt1+vt

4.2 Nesterov方法

根据t时刻速度计算Momentum的方法,
其公式如下:
v t + 1 = μ ∗ v t + α ∗ g t p t + 1 = p t − l r ∗ ( v t + 1 + α ∗ g t ) v_{t+1} = \mu*v_{t} + \alpha*g_{t}\\ p_{t+1} = p_t - lr*(v_{t+1} + \alpha*g_{t}) vt+1=μvt+αgtpt+1=ptlr(vt+1+αgt)
(由于Nesterov方法有多种不同的实现方法,这里我们采用的是PyTorch的官方文档中给出的公式,此公式是我根据PyTorch中原始公式进行相应扩展得出的)
(单凭上面的公式难以直接看出Nesterov方法的含义,我们可以参考一下Nesterov方法的原始论文中的公式,
在这里插入图片描述
可以看到 t + 1 t+1 t+1时刻的速度是由他 t + 1 t+1 t+1时刻的梯度(即 ∇ f ( θ t + μ v t ) \nabla f\left ( \theta_t + \mu v_t\right ) f(θt+μvt))计算出来的)
(具体的推导可以参阅我的博文《深度学习——Nesterov方法的学习笔记》)

4.3 Adam方法

Adam方法的公式如下:
{ g t = ∇ θ f t ( θ t − 1 ) m t = β 1 ⋅ m t − 1 + ( 1 − β 1 ) ⋅ g t v t = β 2 ⋅ v t − 1 + ( 1 − β 2 ) ⋅ g t 2 m ^ t = m t 1 − β 1 t v ^ t = v t 1 − β 2 t θ t = θ t − 1 − α ⋅ m ^ t v ^ t + ϵ \left\{\begin{matrix} g_t = \nabla_\theta f_t\left ( \theta_{t-1}\right )\\ m_t = \beta_1\cdot m_{t-1}+\left ( 1 - \beta_1\right ) \cdot g_t\\ v_t = \beta_2\cdot v_{t-1} + \left ( 1 - \beta_2\right ) \cdot {g_t}^2\\ \hat{m}_t = \frac{m_t}{1 - {\beta_1}^t}\\ \hat{v}_t = \frac{v_t}{1 - {\beta_2}^t}\\ \theta_t = \theta_{t-1} - \frac{\alpha \cdot \hat{m}_t}{\sqrt{\hat{v}_t}+\epsilon} \end{matrix}\right. gt=θft(θt1)mt=β1mt1+(1β1)gtvt=β2vt1+(1β2)gt2m^t=1β1tmtv^t=1β2tvtθt=θt1v^t +ϵαm^t
在PyTorch中的函数形式为:
torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)
其中 β 1 \beta_1 β1 β 2 \beta_2 β2的默认值分别为 0.9 0.9 0.9 0.999 0.999 0.999

4.3.1 Adam算法形象化的解释

Adam算法最为优秀之处在于,解决了鞍点的问题,那么我们首先来看看什么是鞍点:
在这里插入图片描述
这个GIF的动图能很好地形象化地解释鞍点,以及各个优化器函数的表现;
在Adam算法中,分母v作为惩罚项,用来记录小球的能量;
则在鞍点附近,小球会有如下类似形象化的表现:
如果小球在x方向上震荡,则能量v会不断累计,而由于震荡,梯度一阶估计m则会出现有正有负的情况,从而被削弱,震荡变小;
同时,如果y方向是鞍点真正的落点,则由于小球在该方向上没有震荡,虽然能量也在累计,但是梯度的方向一直朝下,此时相对于x方向上的力而言,y方向上力占主导,从而引导小球向落点滑动,从而更加顺利的走出鞍点,滑向落点;

4.4 AdamW——Adam with decoupled weight decay

(请参见论文《Decoupled Weight Decay Regularization》)
AdamW也就是使用了“decoupled weight decay”的优化器算法,具体表现形式就是在后面加上了一个“衰减的正则项”,
在这里插入图片描述这里的“正则项”是我在网上看到的解释(虽然明明老师也是这样解释的),不过我觉得不是很形象;
在我看来这里的“decoupled weight decay”实际上就是一种滑动平均,(将 η t λ \eta_t\lambda ηtλ移出来,写成 ( 1 − η t λ ) θ t (1-\eta_t\lambda)\boldsymbol{\theta}_t (1ηtλ)θt),就可以发现这里的weight-decay实际上实现了一种滑动平均的效果;
(有三老师也说“weight-decay的参数都是为了移动平均”)

5 自适应Optimization算法

自适应最优解算法所解决的根本问题,就是如何解决不同参数朝向不同局部最优解前进时的分歧问题;

6 学习笔记

WeightDecay实际上就是L2-Regularization

这里我们需要记住的是:
WeightDecay实际上就是L2-Regularization。
关于相关的解释,请参考《动手学深度学习 2.0.0 | 4.5.1. 范数与权重衰减》;

一般来说,网络输出层的偏置项不需要正则化

这个观点也是在《动手学深度学习 2.0.0 | 4.5.1. 范数与权重衰减》看到的;

这篇关于深度学习——Optimizer算法学习笔记(AdamW)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析