具有不同比例参数的火炬优化装置

2024-06-11 07:48:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图使用火炬优化器优化参数值,但参数的尺度大不相同。i、 例如,一个参数的值为千,而其他参数的值介于0和1之间。例如,在这种组合的情况下,有两个参数-一个参数的最佳值为0.1,另一个参数的最佳值为20。如何修改此代码,使其对每个参数(如1e-3和0.1)应用合理的学习率

import torch as pt
# Objective function
def f(x, y):
    return (10 - 100 * x) ** 2 + (y - 20) ** 2 
# Optimal parameters
print("Optimal value:", f(0.1, 20))
# Initial parameters
hp = pt.Tensor([1, 10])
print("Initial value", f(*hp))
# Optimiser
hp.requires_grad = True
optimizer = pt.optim.Adam([hp])
n = 5
for i in range(n):
    optimizer.zero_grad()
    loss = f(*hp)
    loss.backward()
    optimizer.step()
hp.requires_grad = False
print("Final parameters:", hp)
print("Final value:", f(*hp))

Tags: pt参数valueoptimalinitialoptimizerfinalhp
1条回答
网友
1楼 · 发布于 2024-06-11 07:48:12

torch.optim.Optimizer类接受params参数中的字典列表作为参数组。在每个字典中,您需要定义params和用于此参数组的其他参数。如果未在字典中提供特定参数,则将使用传递给Optimizer的原始参数。有关更多信息,请参阅official documentation

以下是更新的代码:

import torch as pt


# Objective function
def f(x, y):
    return (10 - 100 * x) ** 2 + (y - 20) ** 2


# Optimal parameters
print("Optimal value:", f(0.1, 20))
# Initial parameters
hp = pt.Tensor([1]), pt.Tensor([10])
print("Initial value", f(*hp))
# Optimiser
for param in hp:
    param.requires_grad = True
# eps and betas are shared between the two groups

optimizer = pt.optim.Adam([{"params": [hp[0]], "lr": 1e-3}, {"params": [hp[1]], "lr": 0.1}])
# optimizer = pt.optim.Adam([{"params": [hp[0]], "lr": 1}, {"params": [hp[1]], "lr": 2.2}])

n = 5
for i in range(n):
    optimizer.zero_grad()
    loss = f(*hp)
    loss.backward()
    optimizer.step()
for param in hp:
    param.requires_grad = False
print("Final parameters:", hp)
print("Final value:", f(*hp))

尝试分别对第一个和第二个参数使用{"lr": 1}{"lr": 2.2}。最终值为19.9713

相关问题 更多 >