如何使用pytorch优化离散值的分布?

问题描述

我们可以轻松地使用pytorch中的自动微分对许多优化问题进行梯度下降。但是,当我使用相同的策略来查找一组离散值的分布时,我会遇到麻烦。为了简化我的问题,假设我正在尝试估计数据流的分布,该数据流只有5个值:[0、1、2、3、4]。我决定使用张量估计其分布,而不是在本地获取和存储许多这些值。没有任何先验信息,我的张量对所有这5个数字的权重相等:

import torch
distribution = torch.ones(5,requires_grad=True)
distribution.data = distribution.data / torch.sum(distribution.data)
distribution  # tensor([0.2000,0.2000,0.2000],requires_grad=True)

然后,对于数据流中的每个传入号码,抓取并存储:

true_val = data_stream_input()

现在,使用电流分布从[0,4]中随机抽取一个数字100次,并查看它与数据流中的数字重合多少次,并对距离真实值较远的数字进行惩罚:

import numpy as np

loss = torch.tensor(0).double()
for _ in range(100):
    sampled_val = np.random.choice(5,size=1,p=distribution)
    loss += torch.square(sampled_val - true_val)

最后,使用梯度下降来更新分布:

loss.backward()
distribution.data = distribution.data - step_size * distribution.grad
distribution.grad.detach()
distribution.grad.zero_()

但是,在[loss.backward()]上,我得到一个错误:RuntimeError:张量的元素0不需要grad并且没有grad_fn。

任何人都可以建议解决方法吗?

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...