Оптимизаторы горелки с различными масштабированными параметрами - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь оптимизировать значения параметров с помощью оптимизатора горелки, но параметры находятся в совершенно разных масштабах. т. е. один параметр имеет значения в тысячах, в то время как другие находятся в диапазоне от 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))

1 Ответ

1 голос
/ 19 апреля 2020
Класс

torch.optim.Optimizer принимает список словарей с аргументом params в качестве группы параметров. В каждом словаре необходимо определить params и другие аргументы, используемые для этой группы параметров. Если в словаре не указан указанный аргумент c, вместо него будут использованы исходные аргументы, переданные в Optimizer. Обратитесь к официальной документации для получения дополнительной информации.

Вот обновленный код:

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.

...