Yes. This would be the same approach used in the Python API (docs for per-parameter options 2):
optimizer = torch.optim.SGD([
    {'params': [nn.Parameter(torch.zeros(1))]},
    {'params': [nn.Parameter(torch.ones(1))], 'lr': 1e-3}
], lr=1e-2, momentum=0.9)

for param_group in optimizer.param_groups:
    print(param_group)

> {'params': [Parameter containing:
  tensor([0.], requires_grad=True)], 'lr': 0.01, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}
  {'params': [Parameter containing:
  tensor([1.], requires_grad=True)], 'lr': 0.001, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}