两天前Facebook将其开源的无梯度优化框架又给更新了,之前发布的时候没有做测评,这次来介绍一下,顺便看看好用不好用。
无梯度优化
什么叫无梯度优化呢?在梯度优化中,我们通过求目标函数的梯度,来求下降方向。但是现在如果不求梯度,我们怎么来求下降方向呢?想想人是怎么做的。如果把赚钱想成是目标函数,我们想让这个目标函数最大,难道我们建立整个世界的模型之后求梯度吗?不是吧,我们一般的操作都是看看别人怎么赚钱的,然后模仿,或者说朝着他的那个方向走就可以了。
同样,计算机基本上也是这么干的,大概的实现就是随机扔一把数字到目标函数中,看看哪个使得目标函数最优,然后其他的点朝着那个最优的方向试试,慢慢就找到了相对来说会比之前的方法好的取值了。
安装
nevergrad
是一个Python 3.6+版本以上的库,可使用pip
安装即可:
pip install nevergrad
在终端操作如下图所示:
也可以不安装最新版本:
pip install git+https://github.com/facebookresearch/nevergrad@master#egg=nevergrad
如果你对benchmarking部分感兴趣的话,你可以只安装[benchmark]部分(如:pip install 'nevergrad[benchmark]'
)
开源的目的和项目结构
依据其官网介绍,此次开源的目的主要是以下四项:
- 实现一些无梯度优化算法:对于一些噪声,也能很好地处理。
- 一个代码工具:当你在做连续、离散、或者混合优化的时候,它能够优化你的参数/超参数。
- 函数:它能够作为一个函数来测试一下你的算法。
- 作为一个基准:它能够作为一个baseline测试你的算法好坏。
库的大体项目结构如下所示:
optimization
: 实现各种优化算法;instrumentation
: 将代码转化为定义好的优化器的函数;functions
: 比较各种算法的实验例子;common
: 整个包通用的工具。
举个例子如下所示,先定义一个优化器,最后最小化优化目标:
import nevergrad as ng def square(x): return sum((x - .5)**2) optimizer = ng.optimizers.OnePlusOne(instrumentation=2, budget=100) recommendation = optimizer.minimize(square) print(recommendation) # optimal args and kwargs
返回结果:
>>>Candidate(args=(array([0.49922768, 0.49968671]),), kwargs={})
这里recommendation
是优化器的返回值,这里返回的是args
和kwargs
。优化值在recommendation.args[0]
中这里是二维的np.ndarray
。具体的参数参考:https://github.com/facebookresearch/nevergrad/blob/master/docs/instrumentation.md
以下方法可以查看所有优化器:
import nevergrad as ng print(list(sorted(ng.optimizers.registry.keys())))
文档说明
Facebook官方也给了说明文档,具体的细节如下所示:
- how to perform optimization using
nevergrad
, including using parallelization and a few recommendation on which algorithm should be used depending on the settings - how to instrument functions with any kind of parameters in order to convert them into a function defined on a continuous vectorial space where optimization can be performed. It also provides a tool to instantiate a script or non-python code in order into a Python function and be able to tune some of its parameters.
- how to benchmark all optimizers on various test functions.
- benchmark results of some standard optimizers an simple test cases.
- examples of optimization for machine learning.
上述文档说明包括了整个的库的使用例程,如果之后我会用到这个库再进行学习的话,会再写一篇文章对其解释。如果有粉丝对其使用方法比较熟悉的话欢迎投稿吖。个人感觉还是挺好的一个库。
参考:
官方Github :
https://github.com/facebookresearch/nevergrad
我的微信公众号名称:深度学习与先进智能决策
微信公众号ID:MultiAgent1024
公众号介绍:主要研究分享深度学习、机器博弈、强化学习等相关内容!期待您的关注,欢迎一起学习交流进步!