进化算法 - Nevergrad调参用

目录

快速上手

混合参数:

入门:

优化器变更:

不同优化器测评:

多目标问题

优化器具体原理

NGopt / NGoBase

EXM1:


快速上手

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
NGOpt62.2060629.70877
TwoPointsDE69.126143.711941
PortfolioDiscreteOnePlusOne 126.95535.00E+20
OnePlusOne84.0144590.30202随机性很强,要再看看
CMA118.3687inf
TBPSA110.6541inf
PSO113.6601122.3555直接摆烂
ScrHammersleySearchPlusMiddlePoint156.003756.16642与NGOpt很像
RandomSearch155.328939.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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值