目录
快速上手
import nevergrad as ng
def square(x):
return sum((x - 0.5) ** 2)
# optimization on x as an array of shape (2,)
optimizer = ng.optimizers.NGOpt(parametrization=2, budget=100)
recommendation = optimizer.minimize(square) # best value
print(recommendation.value)
混合参数:
入门:
浮点、整形、字符串
def fake_training(learning_rate: float, batch_size: int, architecture: str) -> float:
# optimal for learning_rate=0.2, batch_size=4, architecture="conv"
return (learning_rate - 0.2) ** 2 + (batch_size - 4) ** 2 + (0 if architecture == "conv" else 10)
#参数设定
parametrization = ng.p.Instrumentation(
# a log-distributed scalar between 0.001 and 1.0
learning_rate=ng.p.Log(lower=0.001, upper=1.0),
# an integer from 1 to 12
batch_size=ng.p.Scalar(lower=1, upper=12).set_integer_casting(),
# either "conv" or "fc"
architecture=ng.p.Choice(["conv", "fc"]),
)
optimizer = ng.optimizers.NGOpt(parametrization=parametrization, budget=100)
recommendation = optimizer.minimize(fake_training)
print(recommendation.kwargs) # shows the recommended keyword arguments of the function
# >>> {'learning_rate': 0.1998, 'batch_size': 4, 'architecture': 'conv'}
优化器变更:
针对下述NGOpt
ng.optimizers.NGOpt(parametrization=instrum, budget=100, num_workers=1)
可以有更多选择:
NGOpt:是一个“元”优化器,可以适应所提供的设置(budget、num_workers、parametrization),因此应该是一个良好的默认值。
TwoPointsDE:在许多情况下都非常优秀,包括非常高的num_workers。
PortfolioDiscreteOnePlusOne :在混合设置的离散设置中非常优秀,当参数的高精度不相关时; 它可能是超参数选择的一个很好的选择。
OnePlusOne:是num_workers<8的连续参数的简单稳健方法。
CMA:当环境不是很嘈杂(人数约为50人)且预算较大(如1000 x尺寸)时,非常适合控制(如神经控制)。
TBPSA:非常适用于噪声污染问题,尤其是超参数(神经)问题;非常高的num_workers正常)。
PSO:在健壮性方面非常出色,高数量num_workers也可以。
ScrHammersleySearchPlusMiddlePoint:对于超级并行情况(完全一次性,即num_workers=包含预算)或非常多模式的情况(例如我们的一些MLDA问题)非常适用;不要对这个优化器使用softmax。
RandomSearch:是经典的随机搜索基线;不要对这个优化器使用softmax。
不同优化器测评:
给定随机初值参数,优化参数
time(s) | mse | ||
NGOpt | 62.20606 | 29.70877 | |
TwoPointsDE | 69.12614 | 3.711941 | |
PortfolioDiscreteOnePlusOne | 126.9553 | 5.00E+20 | |
OnePlusOne | 84.01445 | 90.30202 | 随机性很强,要再看看 |
CMA | 118.3687 | inf | |
TBPSA | 110.6541 | inf | |
PSO | 113.6601 | 122.3555 | 直接摆烂 |
ScrHammersleySearchPlusMiddlePoint | 156.0037 | 56.16642 | 与NGOpt很像 |
RandomSearch | 155.3289 | 39.86806 | 与NGOpt很像 |
多目标问题
多目标最小化是一项正在进行的工作nevergrad
。这是:
不稳定:API 可能会随时更新,希望能使其更简单、更直观。
不稳健:可能存在我们尚未调查的极端情况。
不可扩展:目前尚不清楚当前版本将如何处理大量损失或大量预算。目前,这些功能的实现没有考虑时间复杂度。
不是最优的:这目前将多目标函数转换为单目标函数,因此失去了一些结构并使函数动态化,一些优化器并不设计用于工作。
换句话说,使用它需要您自担风险;)并提供反馈(正面和负面)(如果有的话)!
要执行多目标优化,您只需将tell
结果作为数组或浮点数列表提供:
import nevergrad as ng
import numpy as np
def multiobjective(x):
return [np.sum(x**2), np.sum((x - 1) ** 2)]
print("Example: ", multiobjective(np.array([1.0, 2.0, 0])))
# >>> Example: [5.0, 2.0]
optimizer = ng.optimizers.CMA(parametrization=3, budget=100)
# for all but DE optimizers, deriving a volume out of the losses,
# it's not strictly necessary but highly advised to provide an
# upper bound reference for the losses (if not provided, such upper
# bound is automatically inferred with the first few "tell")
optimizer.tell(ng.p.MultiobjectiveReference(), [5, 5])
# note that you can provide a Parameter to MultiobjectiveReference,
# which will be passed to the optimizer
optimizer.minimize(multiobjective, verbosity=2)
# The function embeds its Pareto-front:
print("Pareto front:")
for param in sorted(optimizer.pareto_front(), key=lambda p: p.losses[0]):
print(f"{param} with losses {param.losses}")
# >>> Array{(3,)}:[0. 0. 0.] with loss [0. 3.]
# Array{(3,)}:[0.39480968 0.98105712 0.55785803] with loss [1.42955333 0.56210368]
# Array{(3,)}:[1.09901515 0.97673712 0.97153943] with loss [3.10573857 0.01115516]
# It can also provide subsets:
print("Random subset:", optimizer.pareto_front(2, subset="random"))
print("Loss-covering subset:", optimizer.pareto_front(2, subset="loss-covering"))
print("Domain-covering subset:", optimizer.pareto_front(2, subset="domain-covering"))
print("EPS subset:", optimizer.pareto_front(2, subset="EPS"))
目前,大多数优化器仅从多目标损失中得出体积浮动损失并将其最小化。 DE
然而,它的变体已经更新以利用完整的多目标损失 [#789]( Add a multiobjective adaptation for DE by jrapin · Pull Request #789 · facebookresearch/nevergrad · GitHub ),这使它们成为多目标最小化的良好候选者 (NGOpt
在多目标函数的情况下将委托给 DE)。
优化器具体原理
NGopt / NGoBase
方法源于:the Dagstuhl’s 2019 seminars
在 Nevergrad 中,NGOptBase 函数“Nevergrad optimizer competence map”指的是个优化器使用一种能力图”(ence map)来选择合适的优化法。这种能力是一个内部机,它根据问题特征(如维度连续/离散量、噪声水等)来确定哪种算法最有可能成功地解决给定的优化问题。
这个过程可以被看作是一个决策树,其中每个节点代表一个决策点,如问题类型或问题特性,而每个分支代表一个可能的算法选择。当一个新的优化问题被提出时,NGOptBase
会通过这个能力图来导航,选择一个预计会表现最佳的算法。
这种方法的优点是它可以自动适应不同类型的问题,而无需用户指定具体的算法。这样,即使用户不熟悉所有可用的优化算法,也能够有效地使用 Nevergrad 进行优化。总的来说,这是一种基于问题特性智能选择最佳算法的策略。
EXM1:
def square(k):
return np.mean(np.abs(np.array([2,1])-k*np.array([4,3])))
instrum =ng.p.Array(init=np.array([0,0])).set_bounds(lower=np.array([-1,-1]), upper=np.array([0.5,0.2]))
# y=ng.p.Scalar()
optimizer = ng.optimizers.NGOpt(parametrization=instrum, budget=100)
recommendation = optimizer.minimize(square)
print(recommendation.value)