我正在尝试使用 pytorch 解决以下问题:给定一个六面骰子,其平均滚动已知为 4.5,面的最大熵分布是多少?
(注意:我知道一堆用于解决此类问题的非 pytorch 技术——我的目标实际上是更好地理解如何使用 pytorch 解决一般的约束优化问题。在现实生活中,我正在努力工作涉及在 pytorch 中实现的神经模型的约束优化问题,我希望如果我能解决这个问题,那么它将有助于解决更难的问题。)
原则上应该可以通过寻找拉格朗日的临界点来处理这个问题:
这是我尝试使用 pytorch 执行此操作:
class MaxEntropyDice(torch.nn.Module):
def __init__(self, num_faces=6, mean_constraint=3.5):
super().__init__()
self.num_faces = num_faces
self.mean_constraint = mean_constraint
self.p = torch.nn.Parameter(F.normalize(torch.rand(num_faces), p=1, dim=0))
self.probability_multiplier = torch.nn.Parameter(torch.rand(1))
self.mean_multiplier = torch.nn.Parameter(torch.rand(1))
def forward(self):
entropy = -torch.sum(self.p * torch.log(self.p))
probability_term = self.probability_multiplier * (torch.sum(self.p) - 1)
mean_term = self.mean_multiplier * (
torch.sum(torch.tensor(range(1, self.num_faces + 1)) * self.p) - self.mean_constraint
)
lagrangian = entropy + probability_term + mean_term
return lagrangian
model = MaxEntropyDice(num_faces=6, mean_constraint=4.5)
optimizer = torch.optim.SGD(model.parameters(), lr=1e-6)
for i in range(2000):
loss = model()
optimizer.zero_grad()
loss.backward()
optimizer.step()
这导致概率分布[0.1759, 0.0827, 0.0457, 0.1483, 0.2648, 0.2583]不正确——真正的答案是[0.05435, 0.07877, 0.1142, 0.1654, 0.2398, 0.3475]。(另外,如果我设置了,mean_constraint=3.5那么我不会得到均匀分布,所以这是一个不好的迹象。)
关于如何完成这项工作的任何想法?