Google Brain新提出的优化器“Lion”,效果要比Adam(W)更好

2023-11-21 10:59

本文主要是介绍Google Brain新提出的优化器“Lion”,效果要比Adam(W)更好,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Google Brain新提出的优化器“Lion”,效果要比Adam(W)更好

  • 论文地址:https://arxiv.org/abs/2302.06675
  • 代码地址:https://github.com/google/automl/blob/master/lion/lion_pytorch.py

1 简单、内存高效、运行速度更快

与 AdamW 和各种自适应优化器需要同时保存一阶和二阶矩相比,Lion 只需要动量,将额外的内存占用减半。 这在训练大型模型和大Batch size时很有用。 例如,AdamW 需要至少 16 个 TPU V4 芯片来训练图像大小为 224、批量大小为 4,096 的 ViT-B/16,而 Lion 只需要8个。

另一个显而易见的好处是,由于 Lion 的简单性,Lion 在我们的实验中具有更快的运行时间(step/s),通常比 AdamW 和 Adafactor 提速 2-15%,具体取决于任务、代码库和硬件。

2 在各种模型、任务和领域上的优越性能

2.1 图像分类

  • Lion 在 ImageNet 上从头开始训练或在 ImageNet-21K 上预训练的各种网络模型上优于 AdamW。

  • Lion 在 JFT-300M 上节省了高达 5 倍的预训练成本。

  • 使用更高分辨率和 Polyak 平均进行微调后的结果。
    Lion获得的 ViT-L/16 与之前由 AdamW 训练的 ViT-H/14 结果相匹配,同时缩小了 2 倍,同时对于 ViT-G/14 在 ImageNet 上进一步达到了 90.71% 的准确率。

2.2 视觉-语言对比训练

  • 在 LiT 上,Lion 在零样本图像分类和图像文本检索方面击败了 AdamW。

  • 在 BASIC-L 上,Lion 实现了 88.3% 的零样本和 91.1% 的微调 ImageNet 准确率,分别超过之前的最佳结果 2% 和 0.1%。

2.3 扩散模型

  • 在扩散模型上,Lion 在 FID 分数方面超过了 AdamW,节省了高达 2.3 倍的训练计算。 从左到右:在 ImageNet 上训练的 64x64、128x128、256x256 图像生成。

2.4 语言建模

  • Lion 在执行语言建模任务时在验证困惑度(perplexity)上节省了高达 2 倍的计算量(左:在 Wiki-40B 上,右:在 PG-19 上)。 Lion 在更大的transformer上获得更大的收益。

  • 与 Adafactor 相比,Lion 在训练 LLM 时获得更好的平均上下文学习能力。

  • 在 GLUE 上微调 T5 时 Lion 也更好。

在这里插入图片描述

3 超参数和批量大小选择

  • Lion 很简单,与 AdamW 和 Adafactor 相比,超参数更少,因为它不需要 ϵ \epsilon ϵ 和因式分解相关的参数。
    为了确保公平比较,我们使用对数标度为 AdamW (Adafactor) 和我们的 Lion 调整峰值学习率 l r lr lr 和解耦权重衰减 λ \lambda λ
    AdamW 中 β 1 \beta_1 β1 β 2 \beta_2 β2 的默认值分别设置为 0.9 和 0.999, ϵ \epsilon ϵ 1 e − 8 1e-8 1e8,而在 Lion 中, β 1 \beta_1 β1 β 1 \beta_1 β1 的默认值 β 2 \beta_2 β2 是通过程序搜索过程发现的,分别设置为 0.9 和 0.99。
    作者只调整语言任务中的那些超参数,其中 β 1 = 0.9 \beta_1=0.9 β1=0.9 β 2 = 0.99 \beta_2=0.99 β2=0.99 在 AdamW 中, β 1 = 0.95 \beta_1=0.95 β1=0.95 β 2 = 0.98 \beta_2=0.98 β2=0.98 在 Lion 中。 此外,AdamW 中的 ϵ \epsilon ϵ 设置为 1 e − 6 1e-6 1e6 而不是默认的 1 e − 8 1e-8 1e8,因为它提高了我们实验中的稳定性,类似于 RoBERTa 中的观察结果。

  • Lion 生成的更新是元素二进制 ± 1 \pm 1 ±1,作为符号操作的结果,因此它具有比其他优化器生成的更大的范数。
    根据作者的经验,Lion 的合适学习率通常比 AdamW 小 10 倍,尽管有时小 3 倍的学习率可能表现稍好。
    由于有效权重衰减为 l r ∗ λ lr * \lambda lrλ,因此用于 Lion 的 λ \lambda λ 值比 AdamW 大 10 倍,以保持相似的强度。
    例如,

    • l r = 1 e − 4 lr=1e-4 lr=1e4, λ = 10.0 \lambda=10.0 λ=10.0 在 Lion 和 l r = 1 e − 3 lr=1e-3 lr=1e3, λ = 1.0 \lambda=1.0 λ=1.0 在 ImageNet 上训练 ViT-B/16 时使用强增强。
    • Lion 中的 l r = 3 e − 5 lr=3e-5 lr=3e5, λ = 0.1 \lambda=0.1 λ=0.1 和 AdamW 中的 l r = 3 e − 4 lr=3e-4 lr=3e4, λ = 0.01 \lambda=0.01 λ=0.01 用于扩散模型。
    • Lion 中的 l r = 1 e − 4 lr=1e-4 lr=1e4 λ = 0.01 \lambda=0.01 λ=0.01 和 Adafactor 中的 l r = 1 e − 3 lr=1e-3 lr=1e3 λ = 0.001 \lambda=0.001 λ=0.001 用于 7.5B 语言建模。
  • 除了峰值性能外,对超参数的敏感性和调整它们的难度对于在实践中采用优化器也很关键。 在下图中,我们在 ImageNet 上从头开始训练 ViT-B/16 时同时更改 l r lr lr λ \lambda λ。 热图表明,与 AdamW 相比,Lion 对于不同的超参数选择更加稳健。

  • 有些人可能会质疑 Lion 是否需要大批量大小才能准确确定方向,因为标志操作会增加噪音。 为了解决这个问题,我们使用各种批量大小在 ImageNet 上训练 ViT-B/16 模型,同时将总训练时期保持为 300,并结合 RandAug 和 Mixup 技术。
    如下图所示,AdamW 的最佳批量大小为 256,而 Lion 为 4,096。
    这表明 Lion 确实更喜欢更大的批处理大小,但即使使用 64 的小批处理大小,其性能仍然保持稳健。
    此外,当批量大小扩大到 32K 时,只需要 11K 训练步骤,
    Lion 的准确率比 AdamW 高出 2.5%(77.9% 对 75.4%),证明了它在大批量训练环境中的有效性。

:批量大小影响的消融实验。 Lion 比 AdamW 更喜欢更大的批次。
当我们为 AdamW(中间)和 Lion()改变 l r lr lr λ \lambda λ 时,从头开始训练的 ViT-B/16 的 ImageNet 精度。 Lion 对于不同的超参数选择更加稳健。

4 代码实现

"""PyTorch implementation of the Lion optimizer."""
import torch
from torch.optim.optimizer import Optimizerclass Lion(Optimizer):r"""Implements Lion algorithm."""def __init__(self, params, lr=1e-4, betas=(0.9, 0.99), weight_decay=0.0):"""Initialize the hyperparameters.Args:params (iterable): iterable of parameters to optimize or dicts definingparameter groupslr (float, optional): learning rate (default: 1e-4)betas (Tuple[float, float], optional): coefficients used for computingrunning averages of gradient and its square (default: (0.9, 0.99))weight_decay (float, optional): weight decay coefficient (default: 0)"""if not 0.0 <= lr:raise ValueError('Invalid learning rate: {}'.format(lr))if not 0.0 <= betas[0] < 1.0:raise ValueError('Invalid beta parameter at index 0: {}'.format(betas[0]))if not 0.0 <= betas[1] < 1.0:raise ValueError('Invalid beta parameter at index 1: {}'.format(betas[1]))defaults = dict(lr=lr, betas=betas, weight_decay=weight_decay)super().__init__(params, defaults)@torch.no_grad()def step(self, closure=None):"""Performs a single optimization step.Args:closure (callable, optional): A closure that reevaluates the modeland returns the loss.Returns:the loss."""loss = Noneif closure is not None:with torch.enable_grad():loss = closure()for group in self.param_groups:for p in group['params']:if p.grad is None:continue# Perform stepweight decayp.data.mul_(1 - group['lr'] * group['weight_decay'])grad = p.gradstate = self.state[p]# State initializationif len(state) == 0:# Exponential moving average of gradient valuesstate['exp_avg'] = torch.zeros_like(p)exp_avg = state['exp_avg']beta1, beta2 = group['betas']# Weight updateupdate = exp_avg * beta1 + grad * (1 - beta1)p.add_(torch.sign(update), alpha=-group['lr'])# Decay the momentum running average coefficientexp_avg.mul_(beta2).add_(grad, alpha=1 - beta2)return loss

5 参考资料

  • https://github.com/google/automl/blob/master/lion/README.md

这篇关于Google Brain新提出的优化器“Lion”,效果要比Adam(W)更好的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

MySQL中优化CPU使用的详细指南

《MySQL中优化CPU使用的详细指南》优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择... 目录一、优化查询和索引1.1 优化查询语句1.2 创建和优化索引1.3 避免全表扫描二、调整mysql配置参数2.1 调整线程数2.