Adam-mini Use Fewer Learning Rates To Gain More

news/2024/10/10 2:18:16

目录
  • Adam-mini
  • 代码

Zhang Y., Chen C., Li Z., Ding T., Wu C., Ye Y., Luo Z. and Sun R. Adam-mini: Use fewer learning rates to gain more. arXiv preprint, 2024.

作者提出一种简化的 optimizer, 在取得和 Adam 相媲美的性能的同时, 只需要一半的内存开销.

Adam-mini

  • 我们知道, Adam 有两个动量:

    \[m \leftarrow (1 - \beta_1) \cdot g + \beta_1 \cdot m \in \mathbb{R}^d, \\ v \leftarrow (1 - \beta_2) \cdot g^2 + \beta_2 \cdot v \in \mathbb{R}^d. \]

    其中 \(m\) 指定了下降的方向, 而 \(1 / \sqrt{v}\) 则为每个元素的下降制定了特别的学习率.

  • 虽然这么做使得训练更加平稳和快速, 但是为了训练我们需要缓存 2x 模型大小的量, 这个在当下特别是大模型盛行的现在可能不是那么好使的. 因此, 本文希望设计一个更加轻量化的优化器.

  • 和之前的一些策略类似, 本文的出发点是能不能让一些元素共享一个学习率, 而不是单独设置, 假设我们有 block 从 \(b=1, \ldots, B\), 则 Adam-mini 给每个 block 设置

    \[v_b \leftarrow (1 - \beta)_2 \cdot \text{mean}(g_b^2) + \beta_2 \cdot v \in \mathbb{R}. \]

  • 这个思路其实一些之前的方法也尝试过, 但是效果并不好, 会有比较大的性能的损耗. 本文的方案启发自 here, 这里面发现, 像 Transformer 这类模型, 每个 block (Query/Key/Value/Embedding) 的 Hessian 矩阵的谱很不相同, 这意味着, 为如果我们在圈定 block 的时候把这些打包在一起, 就会产生一个较差的结果.

  • 所以, 作者认为, 理想情况是 (作者做了很多实验来验证这一点), 神经网络中模块一直分解到所对应的 hessian 矩阵不再出现如上图所示的分块的时候为止.

  • 当然了这么搞是比较麻烦的. 粗略一点的, 作者有如下的建议:

    1. transformer 中的 query/key 的每个 head 单独成一个 block;
    2. transformer 中的 value 单独成一个 block, 因为作者发现 value 对应的 hessian 矩阵以及不能分解了 (即使是多头的);
    3. embedding 依旧按照原本 adam 进行训练 (因为 embedding 层不是每个都在训练中得到训练的);
    4. 其它的 block 可以按照 PyTorch 的默认划分

代码

[official]

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

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

相关文章

AP5151线性降压LED恒流芯片 2.7-5.5V 照明手电筒、台灯、矿灯方案

概述 AP5151 是一种低压差、线性降压、 固定输出电流的 LED 恒流驱动器。 除 LED 外,AP5151 无需外接其它元 器件即可构成一个恒流输出的 LED 驱动 电路。 AP5151 内置过热保护功能,可有效 保护芯片,避免结温超过120C时因过热而造成损坏。 AP5151 还集成了 LED 短路 保护、电…

真香,powershell 7,pwsh / powershell打印中文乱码

背景 今天又测试了一个脚本,发现存在很多问题,首先就是打印中文出现乱码。 这个问题我早期遇到过,当初的解决办法就是直接把脚本改成gbk格式。 如今再碰到一次这个问题,又去查了一遍,发现powershell的新版已经解决了这个问题。于是找办法更新powershell。 更新 https://gi…

mmcv2.0中build loop、loop.run()、从Dataloader中取数据、run_iter()函数

本篇博客中,我们以推理为例。 首先进入Runer类中的test函数:然后进入Runer类中的build_test_loop函数:然后经过Registry中的build_from_cfg等函数,进入TestLoop类的__init__进行初始化。初始化的时候,会进入父类BaseLoop,在BaseLoop中,会对Dataloader进行build,关于mmc…

【Linux网络编程】网络编程常见概念

【Linux网络编程】网络编程常见概念 阻塞与非阻塞 阻塞 IO:执行的系统调用可能因为无法立即完成而被操作系统挂起,直到等待的事件发生为止。如服务端的 accept(),在客户端未 connect() 时,其一直处于阻塞状态直至发生为止,但我们可以对监听的文件描述符通过 fcntl() 设置 …

【一】开始篇

概述 之前在暑假有空学习了一下mprpc项目,这是一个基于陈硕大佬写的muduo库、protobuf的分布式rpc框架,现在想整理一下内容(众所周知,学了不整理等于白学) 技术栈集群和分布式概念以及原理 RPC远程过程调用原理以及实现 Protobuf数据序列化和反序列化协议 Protobuf数据序列…

.net MAUI 发布时报错,无法识别指定的 RuntimeIdentifier“win10-x64”的原因

是因为MAUI项目引用了普通的C#类库导致的。MAUI只能引用MAUI类库,不能引用普通的类库。虽然能运行但用vs发布时会报错。可以使用命令行打包。dotnet publish -f net8.0-windows10.0.19041.0 -c Release -p:RuntimeIdentifierOverride=win10-x64 参考https://learn.microsoft.c…

【Linux网络编程】字节序

【Linux网络编程】字节序 字节序 字节序就是字节在内存中存储的顺序,如32位整数0x01234567,在内存中存储时,有如下两种顺序:大端序将数值的高位存储在低位地址中,小端序则相反。 网络字节序 网络中传输数据均采用大端序。 Linux字节序转换函数 在 #include <netinet/in…

简化登录流程,助力应用建立用户体系

随着智能手机和移动应用的普及,用户需要在不同的应用中注册和登录账号,传统的账号注册和登录流程需要用户输入用户名和密码,这不仅繁琐而且容易造成用户流失。 华为账号服务(Account Kit)提供简单、快速、安全的登录功能,让用户快捷地使用华为账号登录应用。用户授权后,…