推特工程师推荐的通过深度学习框架的二阶优化器
你是否曾想在TensorFlow或PyTorch编写的代码中使用二阶优化器?使用SciPy最小化来优化一个张量字典呢?如果是这样,可能需要很多麻烦的代码。对于另一种方法,请看dict-minimize包,它兼顾一切,让用户轻松优化在TensorFlow、PyTorch或JAX中实现的目标。
背景
现代深度学习框架及其内置的优化工具,都是围绕着用户想要使用随机梯度下降(SGD)或其变体(如ADAM)进行优化的假设而设计的。许多深度学习从业者甚至可能不知道在优化界有大量关于更普遍的方法的文献,这些方法在深度学习兴起之前是占主导地位的。
特别是,像L-BFGS和共轭梯度(CG)这样的方法是前深度学习时代的常用方法(有些人可能还记得使用 minim.m)。那么,是什么改变了呢?在深度学习中,我们要处理巨大的数据集。因此,为训练网络获得准确的梯度需要整个时代的数据,这在计算上是不可行的。因此,我们改用做数据子采样来获得训练损失梯度的随机(无偏)估计,并使用SGD。深度学习的奇迹是,对于训练深度神经网络的权重,使用随机梯度实际上比批量优化效果更好。这是因为隐性正则化和其他原因。
然而,优化不仅仅是训练深度神经网络的权重。对于许多问题来说,准确的梯度是廉价的,像L-BFGS这样的传统优化方法效果更好。它们在默认的超参数下也能很好地工作。相比之下,在SGD的大多数应用中,必须对超参数进行一些调整以获得良好的性能。在适用的情况下,将L-BFGS这样的方法作为优化的一个选项是非常有用的。
传统的精确梯度优化方法已经在scipy-minimize中使用多年了。然而,这些SciPy优化例程对现代用户来说是不方便的。首先,这些例程的SciPy API假定用户已经在NumPy中编码了一个目标函数,并手动编码了它的梯度。现代用户在TensorFlow、PyTorch或JAX等框架中实现他们的目标,这样他们就可以通过自动微分获得梯度,而我们的软件包允许这样做。第二,SciPy API假设用户想要优化一个一维NumPy向量。现代用户希望同时优化几个张量参数的集合。这就是为什么我们实现了我们的包,dict-minimize,作为一个张量的字典。
在Twitter,我们用dict-minimize来训练样本外分类校准器的参数,这些校准器的训练集较小。因为众所周知,深度网络在预测中给出的校准概率很差,所以可以使用少量的保留数据,例如1%,来训练β校准阶段。在这种情况下,精确梯度很便宜,因为用于训练校准器的数据集大小要小得多。较小的校准网络也使反向传播的速度更快。在这种情况下,我们可以对收敛性更有信心,而不需要进行超参数调整,这比我们对SGD更有信心。
使用实例
我们在dict-minimize包中支持TensorFlow、PyTorch、JAX和NumPy,可以互换。无论你对深度学习框架的偏好如何,你都可以使用dict-minimize进行优化。我们也支持NumPy,因为想要优化NumPy数组的字典的用户也不能简单地直接使用SciPy。
在这个例子中,我们展示了如何从PyTorch的实现中优化一个Rosenbrock函数。出于演示的目的,数值被分割成两个参数。
import torch from dict_minimize.torch_api import minimize def rosen_obj(params, shift): """Based on augmented Rosenbrock from botorch.""" X, Y = params["x_half_a"], params["x_half_b"] X = X - shift Y = Y - shift obj = 100 * (X[1] - X[0] ** 2) ** 2 + 100 * (Y[1] - Y[0] ** 2) ** 2 return obj def d_rosen_obj(params, shift): obj = rosen_obj(params, shift=shift) da, db = torch.autograd.grad(obj, [params["x_half_a"], params["x_half_b"]]) d_obj = OrderedDict([("x_half_a", da), ("x_half_b", db)]) return obj, d_obj torch.manual_seed(123) n_a = 2 n_b = 2 shift = -1.0 params = OrderedDict([("x_half_a", torch.randn((n_a,))), ("x_half_b", torch.randn((n_b,)))]) params = minimize(d_rosen_obj, params, args=(shift,), method="L-BFGS-B", options={"disp": True}) 复制代码
在上面的代码块中,我们简单地导入
from dict_minimize.torch_api import minimize 复制代码
而不是
This Tweet is unavailable
from scipy.optimize import minimize 复制代码
这个接口与原来的scipy-minimize本质上是一样的。然而,在这里我们使用了一个张量的字典,而不是简单的NumPy向量。同样地,目标函数程序是梯度张量的字典,而不是简单的NumPy向量。对于大多数现代的实际问题来说,这是一个更自然的框架,在这些问题中,有许多不同的参数需要同时进行优化。
在深度梦境中应用Dict-Minimize
即使在深度学习中,也有许多优化的例子,其中准确的梯度不需要在大规模的训练集上评估损失。这些都是可以使用dict-minimize的情况。也许最知名的例子是对抗性例子。在对抗性例子中,梯度是一个在单一训练例子上训练的深度网络的输出。在这些情况下,从业者应用SGD是出于习惯而不是严格的需要。
在这篇博文中,我们看一下另一个可以精确梯度的例子:深度梦境。深度梦想背后的想法是将视觉的深度神经网络的输入可视化,例如InceptionV3,它能使神经网络中的内部层的神经元的反应最大化。它可以作为一个可解释的工具,甚至只是用于艺术。关于深度梦境的工作表明,神经网络的第一层的反应是如何被纹理等低层次的概念最大化的;而深层的反应则是被更高层次的概念最大化的。
深度梦想变得如此流行,以至于它成为了一个标准的TensorFlow演示。由于是在TensorFlow中实现的,作者简单地使用了SGD(可能是由于缺乏可供尝试的替代品)。在这里,我们展示了L-BFGS,在没有任何超参数调整的情况下,如何获得比演示中的SGD更快的收敛。
在这里,我们用L-BFGS优化一幅图像。我们将原始演示中的SGD优化的主循环替换为。
from dict_minimize.tensorflow_api import minimize lb = OrderedDict({"img": -tf.ones_like(img)}) ub = OrderedDict({"img": tf.ones_like(img)}) params0 = OrderedDict({"img": img}) params = minimize( deepdream.obj_and_grad_dict, params0, lb_dict=lb, ub_dict=ub, method="L-BFGS-B", options={"disp": True, "maxfun": 100}, ) 复制代码
请注意,我们可以更自然地表达约束条件,比如图像在白色和黑色之间有界限,使用界限参数。在SGD中,必须周期性地剪辑张量,以确保它保持在界限之内。
在这个例子中,我们优化了InceptionV3中 "mixed5 "层的神经元1,它是在ImageNet数据集上训练的。这个神经元对类似于鳄鱼皮的纹理有反应。
下面我们看到,默认的L-BFGS在收敛性方面优于调整后的演示中的SGD,是梯度评价的一个函数。
结论
dict-minimize包提供了方便的选项,可以与现代深度学习框架对接,其中有自动区分功能。更高级的扩展选项有很多。例如,在较小的搜索空间中,当与具有Hessian能力的JAX相结合时,完全的二阶方法如牛顿优化也是可能的。dict-minimize软件包提供了一个简单而方便的接口。当用户有一个新的优化问题时,他们应该考虑它,因为精确的梯度是可以得到的。
如果以上文章对您有帮助,请给我们的开源项目点点star: http://github.crmeb.net/u/defu 不胜感激!
来自 “开源世界 ” ,链接:https://ym.baisou.ltd/post/724.html,如需转载,请注明出处,否则将追究法律责任。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
苹果 macOS 12 推出原生密码管理器,可以手动输入网址及账户
IT之家6 月 12 日消息苹果 macOS 12 Monterey 于 WWDC 2021 正式发布,带来了多种新功能,以及全新的 Safari 浏览器。根据 MacRumors 消息,新版系统还添加了一个原生密码管理器功能。这个工具在设置中可以找到,便于用户管理第三方网站的账户,无需记住复杂的密码。此前的第三方管理工具 Lastpass、1Password 等可以使用这一功能替代。 Password 工具打开时需要使用 Touch ID 或密码登录苹果账号,进入该工具后,用户可以导入或导出密码,支持手动输入网址、用户名、密码。 这个密码管理器还支持身份验证器功能,适用于 iOS 15 以及 iPadOS 15。用户在访问第三方网站时,可以使用双重验证方式登陆。这些密码存储在 iCloud 钥匙串中,支持跨设备同步。 IT之家了解到,苹果也为微软的 Edge 浏览器提供了一个 iCloud 密码扩展程序,支持在 Edge 浏览器上同步 iCloud 密码。目前,macOS 12 Monterey 的密码管理器已经在开发版系统生效,预计正式版将于今年秋天到来。
- 下一篇
一篇文章通俗易懂的让你彻底理解 Java 注解
很多Java程序员,对Java的注解一知半解,更有甚者,有的人可能连注解是什么都不知道 本文我们用最简单的 demo , 最通俗最短的语言,带你了解注解到底是什么? 先来简单回顾一下基础,我们知道,Java 的源文件编辑后,生成 .class 文件, .Java源文件,这个是源文件时期 源文件经过编译生成 .class 字节码文件,这个也是编译时期 .class 加载到内存中,就可以用了,这个是运行期间 如下图 记住以上知识点,下面和注解有关,我们正式来讲注解 本文将从以下 2 个方面来讲解注解 1 注解是什么 2 如何定义一个注解 3 如何使用注解 尤其是第3条,很多人不理解注解,就是因为不知道如何使用注解 第3条本文会用最简单的语言来揭示如何使用 一 注解是什么? 一句话,注解就和生活中的标签一样,比如一个人,这个人可能有 学生标签,月光族标签,爱抬杠标签 二 如何定义一个注解 语法: public @interface 注解名 { } 对的, @interface 是个关键字,记住就行了,没有为什么 定义注解就是用@interface ,后面跟上注解名 比如定义一个名字叫 inf...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker使用Oracle官方镜像安装(12C,18C,19C)