SciTech-BigDataAIML-Adam动量自适应的梯度快速收敛
http://faculty.bicmr.pku.edu.cn/~wenzw/optbook/pages/stograd/Adam.html
版权声明
此页面为《最优化:建模、算法与理论》、《最优化计算方法》配套代码。 代码作者:文再文、刘浩洋、户将,代码整理与页面制作:杨昊桐。
Adam 算法
考虑优化问题:
minx∈Rnf(x)=1N∑i=1Nfi(x).
Adam 算法本质上是在 RMSProp 的基础上增加了动量项,其利用梯度的一阶矩记录动量
Sk=ρ1Sk−1+(1−ρ)gk,
记录梯度的二阶矩(与 RMSProp 相同)
Mk=ρ2Mk−1+(1−ρ)gk⊙gk,
并进行修正: Sk^=Sk1−ρk1
, Mk^=Mk1−ρk2
。 利用修正的一阶矩作为下降方向,并且利用修正的二阶矩来逐分量调整步长,其迭代格式为
xk+1=xk−αMk+ϵ1n−−−−−−−−√⊙Sk.
目录
初始化和迭代准备
迭代主循环
参考页面
版权声明
初始化和迭代准备
输入信息:迭代初始值 x0 ,数据集大小 N ,样本梯度计算函数 pgfun,目标函数值与梯度计算函数 fun 以及提供算法参数的结构体 opts 。
输出信息:迭代得到的解 x 和包含迭代信息的结构体 out 。
out.fvec :迭代过程中的目标函数值信息
out.nrmG :迭代过程中的梯度范数信息
out.epoch :迭代过程中的时期 (epoch)信息
function [x,out] = Adam(x0,N,pgfun,fun,opts)
从输入的结构体 opts 中读取参数或采取默认参数。
opts.maxit :最大迭代次数
opts.alpha :步长
outs.thres :保证梯度分量累计严格为正的小量
opts.rho1 :一阶矩累计的权重值
opts.rho2 :二阶矩累计的权重值
opts.batchsize :随机算法的批量大小
opts.verbose :不小于 1 时输出每步迭代信息,否则不输出
if ~isfield(opts, 'maxit'); opts.maxit = 5000; end
if ~isfield(opts, 'alpha'); opts.alpha = 1e-3; end
if ~isfield(opts, 'thres'); opts.thres = 1e-7; end
if ~isfield(opts, 'rho1'); opts.rho1 = 0.9; end
if ~isfield(opts, 'rho2'); opts.rho2 = 0.999; end
if ~isfield(opts, 'batchsize'); opts.batchsize = 10; end
if ~isfield(opts, 'verbose'); opts.verbose = 1; end
以 x0 为迭代初始点。 计算初始点处的目标函数值和梯度,记初始时刻时期 (epoch) 为 0。
x = x0;
out = struct();
[f,g] = fun(x);
out.fvec = f;
out.nrmG = norm(g,2);
out.epoch = 0;
gsum 记录一阶矩,|ssum| 记录二阶矩。\(\rho_1\), ρ2
分别为一阶矩和二阶矩的衰减率。 count 用于计算时期(epoch)。
gsum = zeros(size(x));
ssum = gsum;
rho1 = opts.rho1;
rho2 = opts.rho2;
count = 1;
迭代主循环
Adam 的迭代循环,以 opts.maxit 为最大迭代次数。
for k = 1:opts.maxit
等概率地从 {1,2,…,N}
中选取批量 sk
记录在 idx 之中,批量大小为 opts.batchsize 。计算对应的样本的梯度。
idx = randi(N,opts.batchsize,1);
g = pgfun(x,idx);
更新一阶、二阶矩累计,并进行修正。 利用修正的一阶矩和二阶矩对 x
进行更新。
ssum = rho1*ssum + (1 - rho1)*g;
gsum = rho2*gsum + (1 - rho2)*(g.*g);
ssum_mod = ssum/(1 - rho1^k);
gsum_mod = gsum/(1 - rho2^k);
x = x - opts.alpha./sqrt(gsum_mod + opts.thres).*ssum_mod;
每当参与迭代的总样本次数超过数据集的总样本时,记为一个时期 (epoch)。每一个时期, 记录当前的目标函数值和梯度范数,并令时期计数加一。
if k*opts.batchsize/N >= count
[f,g] = fun(x);
out.fvec = [out.fvec; f];
out.nrmG = [out.nrmG; norm(g,2)];
out.epoch = [out.epoch; k*opts.batchsize/N];
count = count + 1;
end
end
end
数。
for k = 1:opts.maxit
等概率地从 {1,2,…,N}
中选取批量 sk
记录在 idx 之中,批量大小为 opts.batchsize 。计算对应的样本的梯度。
idx = randi(N,opts.batchsize,1);
g = pgfun(x,idx);
更新一阶、二阶矩累计,并进行修正。 利用修正的一阶矩和二阶矩对 x
进行更新。
ssum = rho1*ssum + (1 - rho1)*g;
gsum = rho2*gsum + (1 - rho2)*(g.*g);
ssum_mod = ssum/(1 - rho1^k);
gsum_mod = gsum/(1 - rho2^k);
x = x - opts.alpha./sqrt(gsum_mod + opts.thres).*ssum_mod;
每当参与迭代的总样本次数超过数据集的总样本时,记为一个时期 (epoch)。每一个时期, 记录当前的目标函数值和梯度范数,并令时期计数加一。
if k*opts.batchsize/N >= count
[f,g] = fun(x);
out.fvec = [out.fvec; f];
out.nrmG = [out.nrmG; norm(g,2)];
out.epoch = [out.epoch; k*opts.batchsize/N];
count = count + 1;
end
end
end
参考页面
在页面 实例:利用随机算法求解逻辑回归问题 中, 我们展示了该算法的一个应用,并且与其它随机算法进行比较。
其它随机算法参见: 随机梯度下降法、 AdaGrad、 RMSProp、 AdaDelta。
此页面的源代码请见: Adam.m。
版权声明
此页面为《最优化:建模、算法与理论》、《最优化计算方法》配套代码。 代码作者:文再文、刘浩洋、户将,代码整理与页面制作:杨昊桐。
著作权所有 (C) 2020 文再文、刘浩洋、户将
SciTech-BigDataAIML-Adam动量自适应的梯度快速收敛的更多相关文章
- K-Means算法的收敛性和如何快速收敛超大的KMeans?
不多说,直接上干货! 面试很容易被问的:K-Means算法的收敛性. 在网上查阅了很多资料,并没有看到很清晰的解释,所以希望可以从K-Means与EM算法的关系,以及EM算法本身的收敛性证明中找到蛛丝 ...
- px批量转vw方法,适用于用户临时突发自适应需求,快速搞出项目多屏幕适应方案postcss-px-to-viewport,postcss.config.js配置
方案一: 1. 下载依赖 npm install postcss-import postcss-loader postcss-px-to-viewport --save-dev npm install ...
- NLP之基于词嵌入(WordVec)的嵌入矩阵生成并可视化
词嵌入 @ 目录 词嵌入 1.理论 1.1 为什么使用词嵌入? 1.2 词嵌入的类比推理 1.3 学习词嵌入 1.4 Word2Vec & Skip-Gram(跳字模型) 1.5 分级& ...
- 各种梯度下降 bgd sgd mbgd adam
转载 https://blog.csdn.net/itchosen/article/details/77200322 各种神经网络优化算法:从梯度下降到Adam方法 在调整模型更新权重和偏差 ...
- 深度学习面试题03:改进版梯度下降法Adagrad、RMSprop、Momentum、Adam
目录 Adagrad法 RMSprop法 Momentum法 Adam法 参考资料 发展历史 标准梯度下降法的缺陷 如果学习率选的不恰当会出现以上情况 因此有一些自动调学习率的方法.一般来说,随着迭代 ...
- 梯度下降:SGD vs Momentum vs NAG vs Adagrad vs Adadelta vs RMSprop vs Adam
原文地址:https://www.jianshu.com/p/7a049ae73f56 梯度下降优化基本公式:\({\theta\leftarrow\theta-\eta\cdot\nabla_\th ...
- 神经网络优化算法:梯度下降法、Momentum、RMSprop和Adam
最近回顾神经网络的知识,简单做一些整理,归档一下神经网络优化算法的知识.关于神经网络的优化,吴恩达的深度学习课程讲解得非常通俗易懂,有需要的可以去学习一下,本人只是对课程知识点做一个总结.吴恩达的深度 ...
- SGD vs Momentum vs NAG vs Adagrad vs Adadelta vs RMSprop vs Adam
梯度下降优化基本公式:\({\theta\leftarrow\theta-\eta\cdot\nabla_\theta{J(\theta)}}\) 三种梯度下降优化框架 这三种梯度下降优化框架的区别在 ...
- 最优化方法系列:Adam+SGD—>AMSGrad
自动调参的Adam方法已经非常给力了,不过这主要流行于工程界,在大多数科学实验室中,模型调参依然使用了传统的SGD方法,在SGD基础上增加各类学习率的主动控制,以达到对复杂模型的精细调参,以达到刷出最 ...
- 深度学习必备:随机梯度下降(SGD)优化算法及可视化
补充在前:实际上在我使用LSTM为流量基线建模时候,发现有效的激活函数是elu.relu.linear.prelu.leaky_relu.softplus,对应的梯度算法是adam.mom.rmspr ...
随机推荐
- MCP SSE交互完整过程
有关MCP的介绍文章很多,本文不细说,做一个时序图将完整过程说清楚.MCP协议主要通过两种技术实现:标准输入输出(stdio)和服务器发送事件(SSE),stdio(标准输入输出)是MCP协议在本地或 ...
- @FeignClient注解自定义接口超时时间
问题描述 每个微服务都有统一的接口超时时间设定,但也存在一些特殊的业务场景,其接口需要较长的超时时间,比如:导出excel报表.上传文件.拉取业务报表数据等等.此时,默认的超时设置就不能满足需求, ...
- 洛谷 P5066 [Ynoi2014] 人人本着正义之名debug-log
序言 此日志分为四部分. 00:00是开始打代码的时间. 最开始打完代码(没有debug)大约用了两小时. part1-20210323 02:30 生成新节点时,没有给随机权值. 02:41 upd ...
- buck参数工具分享
工具链接:https://cnblogs-img.oss-cn-hangzhou.aliyuncs.com/docs/buck.xls
- 玩转AI新声态 | 玩转TTS/ASR/YuanQI 打造自己的AI助手
前言 halo, 各位佬友这是我24年写的整理一下发出来, 可能有点老了, ai发展这么快...... 本次带来的是腾讯云玩转AI新声态语音产品应用实践,利用 TTS / ASR / 元器智能体 打造 ...
- k8s在线修改alertmanager.yaml
简单说明 有些情况下,我们可以进入集群查看某些secret的配置,这里如果想修改secret的配置时,没有secrets的源文件,可以采取如下的方案. 例如我们需要修改alertmanager.yam ...
- k8s servicemonitor 采集超时配置
背景说明 我们有时候在编写exporter时,其中某个采集的metrics接口获取数据很慢,可能需要达到10-20S,基于此种情况,如果我们按照ServiceMonitor默认的配置进行,这里默认sc ...
- 深入浅出了解生成模型-3:Diffusion模型原理以及代码
更加好的排版:https://www.big-yellow-j.top/posts/2025/05/19/DiffusionModel.html 前文已经介绍了VAE以及GAN这里介绍另外一个模型:D ...
- 基于.net6的一款开源的低代码、权限、工作流、动态接口平台
一款开源的低代码.权限.工作流.动态接口平台. 主要功能模块:工作流.权限管理.低代码.动态表单.动态接口.动态数据源 功能展示 因为个人时间非常有限,框架目前很多细节可能没完善.且前端有些代码写的不 ...
- hot100之回溯上
全排列(046) class Solution { List<List<Integer>> res = new ArrayList<>(); public List ...