python - 具有不同缩放参数的 Torch 优化器
问题描述
我正在尝试使用火炬优化器优化参数值,但参数的规模大不相同。即,一个参数的值以千为单位,而其他参数的值介于 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))
解决方案
torch.optim.Optimizer
类接受参数中的字典列表params
作为参数组。在每个字典中,您需要定义params
用于此参数组的其他参数。如果您未在字典中提供特定参数,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。
推荐阅读
- c++ - 引用绑定到“int”类型的空指针 (stl_iterator.h)
- typescript - 如何从同一个文件中导入两个同名的导出
- javascript - jszip 可以解压文件但不能解压文件夹
- java - 提供所需输出的消息格式
- javascript - 为什么 XMLHttpRequest PUT 请求不起作用?
- c# - 通过 MassTransit 将应用程序连接到 RabbitMQ 集群。AuthenticationFailureException:ACCESS_REFUSED
- javascript - vue.js 和 axios 使用但无法在 response.headers 中接收 set-cookie
- spring-cloud-dataflow - Spring Cloud Data Flow 流部署卡在 DEPLOYING 状态
- mysql - 将所有触发器从一个数据库移动到另一个数据库
- function - 不能在另一个函数中使用函数中的变量