Parameter objects are considered graph leaves, so backward in this case wont propagate further to model.gamma because where its used is “below” a leaf node (i.e. model.alpha).
import torch

from collections import OrderedDict

class TestFunc(torch.nn.Module):
    def __init__(self):
        super(TestFunc, self).__init__()
        self.alpha = torch.nn.Parameter(torch.tensor([100.0]), requires_grad=True)
    def forward(self, input: torch.Tensor):
        x_1 = torch.roll(input, +1)
        return torch.sum(self.alpha * (x_1 - input ** 2) ** 2 + (1 - input) ** 2, 0)


input = torch.rand(2, requires_grad=True) * 5

model = TestFunc()

model.register_parameter("gamma", torch.nn.Parameter(torch.tensor([0.1], requires_grad=True)))

params = OrderedDict(model.named_parameters())
params['alpha'] = torch.exp(params['gamma'])
output2 = model(input)

output2.backward()
params['alpha'].backward()


print(model.alpha)
print(model.alpha.grad)
print(model.gamma)
print(model.gamma.grad)

outputs
tensor([100.], requires_grad=True)
tensor([1.9056])
Parameter containing:
tensor([0.1000], requires_grad=True)
tensor([1.1052])

so what I changed was calling params['alpha'].backward() directly, that way it seems to able to reach model.gamma.
I also changed how you compute alpha, since your original code: model.alpha = torch.nn.Parameter(torch.exp(model.gamma), requires_grad=True) only created a new parameter object and therefore didn’t add to the computation graph.
Hope it helps!