Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pytorch 我可以只在特定的输出神经元上应用softmax吗?_Pytorch_Reinforcement Learning_Softmax - Fatal编程技术网

Pytorch 我可以只在特定的输出神经元上应用softmax吗?

Pytorch 我可以只在特定的输出神经元上应用softmax吗?,pytorch,reinforcement-learning,softmax,Pytorch,Reinforcement Learning,Softmax,我正在pytorch中建立一个演员-评论家神经网络模型,以便训练一个代理玩Quoridor游戏(希望如此)。出于这个原因,我有一个有两个头的神经网络,一个用于演员输出,它对所有可能的动作进行softmax,另一个用于批评家输出,它只是一个神经元(用于回归输入状态的值) 现在,在quoridor,大多数情况下,并非所有动作都是合法的,因此我想知道是否可以排除演员头部上与输入状态的非法动作相对应的输出神经元,例如,通过传递与合法动作相对应的所有神经元的索引列表。因此,我不想以softmax的分母对这

我正在pytorch中建立一个演员-评论家神经网络模型,以便训练一个代理玩Quoridor游戏(希望如此)。出于这个原因,我有一个有两个头的神经网络,一个用于演员输出,它对所有可能的动作进行softmax,另一个用于批评家输出,它只是一个神经元(用于回归输入状态的值)

现在,在quoridor,大多数情况下,并非所有动作都是合法的,因此我想知道是否可以排除演员头部上与输入状态的非法动作相对应的输出神经元,例如,通过传递与合法动作相对应的所有神经元的索引列表。因此,我不想以softmax的分母对这些输出求和

pytorch上有这样的功能吗(因为我找不到)?我应该自己尝试实现这样一个Softmax吗(有点害怕,pytorch可能最清楚,我也被建议使用LogSoftmax)

此外,你认为这种处理非法行为的方法好吗?或者我应该让他猜到非法的动作,然后惩罚他(负奖励),希望他最终不会选择非法的动作


或者我应该让softmax覆盖所有输出,然后将非法输出设置为零?其余的加起来不会等于1,但也许我可以通过简单的标准化(即除以L2范数)来解决这个问题。

一个简单的解决方案是用一个较大的负值来掩盖非法移动,这实际上会强制使用非常低的(log)softmax值(如下示例)


我建议只惩罚他使用非法奖励。我认为这是人们通常会做的事情,这似乎是帮助他们完全了解游戏的最佳策略。这不是正确的方法,您应该始终将搜索空间限制为有效的解决方案。因此,在应用LogSoftmax之前(我想我现在将使用forward()中的函数API执行此操作),我手动将一个较大的负值设置为非法移动,并覆盖我从网络上获得的实际移动?这几乎是我的错。我现在有一些其他的错误,但我不明白为什么那不起作用!非常感谢。
# 3 dummy actions for a batch size of 2
>>> actions = torch.rand(2, 3)     
>>> actions
tensor([[0.9357, 0.2386, 0.3264],
        [0.0179, 0.8989, 0.9156]])
# dummy mask assigning 0 to valid actions and 1 to invalid ones
>>> mask = torch.randint(low=0, high=2, size=(2, 3))
>>> mask
tensor([[1, 0, 0],
        [0, 0, 0]])
# set actions marked as invalid to very large negative value
>>> actions = actions.masked_fill_(mask.eq(1), value=-1e10)
>>> actions
tensor([[-1.0000e+10,  2.3862e-01,  3.2636e-01],
        [ 1.7921e-02,  8.9890e-01,  9.1564e-01]])
# softmax assigns no probability mass to illegal actions
>>> actions.softmax(dim=-1)
tensor([[0.0000, 0.4781, 0.5219],
        [0.1704, 0.4113, 0.4183]])