ADAM : A METHOD FOR STOCHASTIC OPTIMIZATION
文章目录
- 概
- 主要内容
- 算法
- 选择合适的参数
- 一些别的优化算法
- AdaMax
- 理论
- 代码
Kingma D P, Ba J. Adam: A Method for Stochastic Optimization[J]. arXiv: Learning, 2014.
@article{kingma2014adam:,
title={Adam: A Method for Stochastic Optimization},
author={Kingma, Diederik P and Ba, Jimmy},
journal={arXiv: Learning},
year={2014}}
概
鼎鼎大名.
主要内容
用f(θ)f(\theta)f(θ)表示目标函数, 随机最优通常需要最小化E(f(θ))\mathbb{E}(f(\theta))E(f(θ)), 但是因为每一次我们都取的是一个小批次, 故实际上我们处理的是f1(θ),…,fT(θ)f_1(\theta),\ldots, f_T(\theta)f1(θ),…,fT(θ). 用gt=∇θft(θ)g_t=\nabla_{\theta}f_t(\theta)gt=∇θft(θ)表示第ttt步对应的梯度.
Adam 方法分别估计梯度E(gt)\mathbb{E}(g_t)E(gt)的一阶矩和二阶矩(Adam: adaptive moment estimation 名字的由来).
算法
注意: 下面的算法中关于向量的运算都是逐项(element-wise)的运算.
选择合适的参数
首先, 分析为什么会有
m^t←mt/(1−β2t),v^t←vt/(1−β2t).(A.1)\tag{A.1} \hat{m}_t \leftarrow m_t / (1-\beta_2^t), \\ \hat{v}_t \leftarrow v_t / (1-\beta_2^t). m^t←mt/(1−β2t),v^t←vt/(1−β2t).(A.1)
可以用归纳法证明
mt=(1−β1)∑i=1tβ1t−i⋅givt=(1−β2)∑i=1tβ2t−i⋅gi2.(A.2)\tag{A.2} m_t = (1-\beta_1) \sum_{i=1}^t \beta_1^{t-i} \cdot g_i \\ v_t = (1-\beta_2) \sum_{i=1}^t \beta_2^{t-i} \cdot g_i^2. mt=(1−β1)i=1∑tβ1t−i⋅givt=(1−β2)i=1∑tβ2t−i⋅gi2.(A.2)
倘若分布稳定: E[gt]=E[g],E[gt2]=E[g2]\mathbb{E}[g_t]=\mathbb{E}[g],\mathbb{E}[g_t^2]=\mathbb{E}[g^2]E[gt]=E[g],E[gt2]=E[g2], 则
E[mt]=E[g]⋅(1−β1t)E[vt]=E[g2]⋅(1−β2t).(A.3)\tag{A.3} \mathbb{E}[m_t]=\mathbb{E}[g] \cdot(1-\beta_1^t) \\ \mathbb{E}[v_t]= \mathbb{E}[g^2] \cdot (1- \beta_2^t). E[mt]=E[g]⋅(1−β1t)E[vt]=E[g2]⋅(1−β2t).(A.3)
这就是为什么会有(A.1)这一步.
Adam提出时的一个很大的应用场景就是dropout(正对梯度是稀疏的情况), 这是往往需要我们取较大的β2\beta_2β2(可理解为抵消随机因素).
既然E[g]/E[g2]≤1\mathbb{E}[g]/\sqrt{\mathbb{E}[g^2]}\le 1E[g]/E[g2]≤1, 我们可以把步长α\alphaα理解为一个信赖域(既然∣Δt∣<≈a|\Delta_t| \frac{<}{\approx} a∣Δt∣≈<a).
另外一个很重要的性质是, 比如函数扩大(或缩小)ccc倍cfcfcf, 此时梯度相应为cgcgcg, 我们所对应的
c⋅m^tc2⋅v^t=m^tv^t,\frac{c \cdot \hat{m}_t}{\sqrt{c^2 \cdot \hat{v}_t}}= \frac{\hat{m}_t}{\sqrt{\hat{v}_t}}, c2⋅v^tc⋅m^t=v^tm^t,
并无变化.
一些别的优化算法
AdaGrad:
θt+1=θt−α⋅1∑i=1tgt2+ϵgt.\theta_{t+1} = \theta_t -\alpha \cdot \frac{1}{\sqrt{\sum_{i=1}^tg_t^2}+\epsilon} g_t. θt+1=θt−α⋅∑i=1tgt2+ϵ1gt.
RMSprop:
vt=β2vt−1+(1−β2)gt2θt+1=θt−α⋅1vt+ϵgt.v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2 \\ \theta_{t+1} = \theta_t -\alpha \cdot \frac{1}{\sqrt{v_t+\epsilon}}g_t. vt=β2vt−1+(1−β2)gt2θt+1=θt−α⋅vt+ϵ1gt.
AdaDelta:
vt=β2vt−1+(1−β2)gt2θt+1=θt−α⋅mt−1+ϵvt+ϵgtmt=β1mt−1+(1−β1)[θt+1−θt]2.v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2 \\ \theta_{t+1} = \theta_t -\alpha \cdot \frac{\sqrt{m_{t-1}+\epsilon}}{\sqrt{v_t+\epsilon}}g_t \\ m_t = \beta_1 m_{t-1}+(1-\beta_1)[\theta_{t+1}-\theta_t]^2. vt=β2vt−1+(1−β2)gt2θt+1=θt−α⋅vt+ϵmt−1+ϵgtmt=β1mt−1+(1−β1)[θt+1−θt]2.
注: 均为逐项
AdaMax
本文还提出了另外一种算法
理论
不想谈了, 感觉证明有好多错误.
代码
import numpy as npclass Adam:def __init__(self, instance, alpha=0.001, beta1=0.9, beta2=0.999,epsilon=1e-8, beta_decay=1., alpha_decay=False):""" the Adam using numpy:param instance: the theta in paper, should have the grad method to call the gradsand the zero_grad method for clearing the grads:param alpha: the same as the paper default:0.001:param beta1: the same as the paper default:0.9:param beta2: the same as the paper default:0.999:param epsilon: the same as the paper default:1e-8:param beta_decay::param alpha_decay: default False, if True, we will set alpha = alpha / sqrt(t)"""self.instance = instanceself.alpha = alphaself.beta1 = beta1self.beta2 = beta2self.epsilon = epsilonself.beta_decay = beta_decayself.alpha_decay = alpha_decayself.initialize_paras()def initialize_paras(self):self.m = 0.self.v = 0.self.timestep = 0def update_paras(self):grads = self.instance.gradself.beta1 *= self.beta_decayself.beta2 *= self.beta_decayself.m = self.beta1 * self.m + (1 - self.beta1) * gradsself.v = self.beta2 * self.v + (1 - self.beta2) * grads ** 2self.timestep += 1if self.alpha_decay:return self.alpha / np.sqrt(self.timestep)return self.alphadef zero_grad(self):self.instance.zero_grad()def step(self):alpha = self.update_paras()betat1 = 1 - self.beta1 ** self.timestepbetat2 = 1 - self.beta2 ** self.timesteptemp = alpha * np.sqrt(betat2) / betat1self.instance.parameters -= temp * self.m / (np.sqrt(self.v) + self.epsilon)class PPP:def __init__(self, parameters, grad_func):self.parameters = parametersself.zero_grad()self.grad_func = grad_funcdef zero_grad(self):self.grad = np.zeros_like(self.parameters)def calc_grad(self):self.grad += self.grad_func(self.parameters)def f(x):return x[0] ** 2 + 5 * x[1] ** 2def grad(x):return np.array([2 * x[0], 100 * x[1]])if __name__ == "__main__":x = np.array([10., 10.])x = PPP(x, grad)xs = []ys = []optim = Adam(x, alpha=0.4)for i in range(100):xs.append(x.parameters.copy())y = f(x.parameters)ys.append(y)optim.zero_grad()x.calc_grad()optim.step()xs = np.array(xs)ys = np.array(ys)import matplotlib.pyplot as pltfig, (ax0, ax1)= plt.subplots(1, 2)ax0.plot(xs[:, 0], xs[:, 1])ax0.scatter(xs[:, 0], xs[:, 1])ax0.set(title="trajectory", xlabel="x", ylabel="y")ax1.plot(np.arange(len(ys)), ys)ax1.set(title="loss-iterations", xlabel="iterations", ylabel="loss")plt.show()
ADAM : A METHOD FOR STOCHASTIC OPTIMIZATION相关推荐
- Paper:《Adam: A Method for Stochastic Optimization》的翻译与解读
Paper:<Adam: A Method for Stochastic Optimization>的翻译与解读 目录 Adam: A Method for Stochastic Opti ...
- ADAM A METHOD FOR STOCHASTIC OPTIMIZATION
ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION 1 INTRODUCTION 基于随机梯度的优化方法在许多科学和工程领域都具有重要的实际意义.这些领域中的许多问题 ...
- Adam算法_Tensorflow实现——论文解析:ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION
目录 Adam优化器 论文解析:ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION 摘要 背景 算法介绍 偏差修正 收敛性理论证明 相关算法 实验 ADAMAX 结论 ...
- ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION
Adam: a method for stochastic optimization_一种随机优化的方法[Paper] 目录 核心 介绍 Algorithm Initialization bias c ...
- 论文解读1——Adam: A Method For Stochastic Optimization
目录 1.优化算法到底是个啥 2.几种经典的优化算法 2.1 梯度下降(GD) 2.1.1 批量梯度下降(BGD) 2.1.2 随机梯度下降(SGD) 2.1.3 小批量梯度下降(SBGD) 2.2 ...
- #Paper Reading# Stochastic Optimization of Sorting Networks via Continuous Relaxations
论文题目: Stochastic Optimization of Sorting Networks via Continuous Relaxations 论文地址: https://openrevie ...
- 鲁棒随机优化(Robust Stochastic Optimization)和RSOME
鲁棒随机优化(Robust Stochastic Optimization)和RSOME 前言 1. RSO 2. 简单示例 2.1 单产品的报童问题(one-product newsvendor p ...
- 《A diagonal quasi-Newton updating method for unconstrained optimization》文献算法实现
本次写的是<A diagonal quasi-Newton updating method for unconstrained optimization>文献算法实现----最优化实验,使 ...
- Problem complexity and method efficiency in optimization
Problem complexity and method efficiency in optimization,1983, 链接:http://pan.baidu.com/s/1kTn4so3 密码 ...
最新文章
- 最全综述 | 图像目标检测
- 通过反射创建动态代理对象(二)
- I2C总线学习(四)--读写过程
- 忘记目标 潜心做事([日] 端河光二)
- MongoDB语法学习
- Linq简单语句记录
- (译)iOS Code Signing: 解惑
- 如何将Blocs v2项目迁移到Blocs v3?
- 大文件下载插件webupload插件
- STM32F072RB 实作笔记(七)- LCD 1602 的使用
- excel 连接 mysql_Excel 数据库连接
- 安卓逆向学习 之 KGB Messenger的writeup(1)
- jQuery实现跑马灯
- Mac关闭某个软件的所有窗口
- 用命令备份与还原网络设置
- Win11字体怎么调大?Win11调整字体大小的方法
- Ajax的异步和同步
- 推荐一款超级好用的AI模型训练平台——Tesra超算网络!
- Armbian挂载硬盘(以及自动挂载)
- Chrome欲撼IE浏览器 Opera参战扩大中国投资
热门文章
- unity的RectTransform
- 4AT已经衰老 6AT正值壮年
- 图片缩放库 Photoview 和 Gif 控件 GifView 的使用
- 二分查找与时间复杂度计算分析
- [内附完整源码和文档] 基于JSP的网上订餐管理系统的设计与实现
- 黑客狂野利用零日漏洞:小米三星也中招,安卓手机最易受此漏洞的攻击?
- There is no getter for property named ‘pCode‘ in ‘classXXX‘
- 服务器操作系统本备份,服务器操作系统本备份
- 开源监控Prometheus介绍,安装,配置,使用详解
- 机器学习在基于 URL 的客户端监控分析中的优化和实践