Neural network 当可能采取多种行动时,政策梯度是多少?

Neural network 当可能采取多种行动时,政策梯度是多少?,neural-network,reinforcement-learning,Neural Network,Reinforcement Learning,我正试图编程一个强化学习算法使用政策梯度,灵感来自。Karpath的例子只有两个动作向上或向下,所以一个输出神经元就足够了(高激活=向上,低激活=向下)。我想将其扩展到多个操作,因此我相信我需要在输出层上使用softmax激活功能。然而,我不确定输出层的梯度应该是什么 如果我在有监督的学习环境中使用交叉熵损失函数和softmax激活,神经元的梯度很简单: g[i] = a[i] - target[i] 其中所需操作的target[i]=1,所有其他操作的0 为了将其用于强化学习,我将在反向传播

我正试图编程一个强化学习算法使用政策梯度,灵感来自。Karpath的例子只有两个动作向上或向下,所以一个输出神经元就足够了(高激活=向上,低激活=向下)。我想将其扩展到多个操作,因此我相信我需要在输出层上使用softmax激活功能。然而,我不确定输出层的梯度应该是什么

如果我在有监督的学习环境中使用交叉熵损失函数和softmax激活,神经元的梯度很简单:

g[i] = a[i] - target[i]
其中所需操作的
target[i]=1
,所有其他操作的
0

为了将其用于强化学习,我将在反向传播之前将折扣奖励乘以
g[I]


然而,强化学习似乎使用负对数似然作为损失,而不是交叉熵这是如何改变梯度的?

注意:我认为有些东西会让你走上正确的轨道:

负对数似然也被称为多类交叉熵(模式识别和机器学习)

编辑:误读了问题。我以为这是在谈论深层的决定性政策梯度

这将取决于您的域,但使用softmax,您将获得跨越所有输出节点的概率。对我来说,当你想到DDPG时,这在大多数领域都没有意义。例如,如果要控制机器人手臂和腿部的伸展,如果要伸展所有肢体,则将肢体伸展测量为[.25、.25、.25、.25]是没有意义的。在这种情况下,.25可能意味着完全扩展,但如果输出向量为[.75,.25,0,0],会发生什么情况?因此,通过这种方式,您可以为所有动作节点提供一个从0到1的单独的sigmoid函数,然后您可以将其表示为[1,1,1,1],用于扩展所有手臂。我希望这是有道理的

由于参与者网络决定了DDPG中的动作,因此我们可以这样表示我们的机器人网络(粗略的keras示例):

然后,你的评论家网络将不得不考虑行动维度

state = Input(shape=[your_state_shape])
action = Input(shape=[4])
state_hidden = Dense(30, activation='relu')(state)
state_hidden_2 = Dense(30, activation='linear')(state_hidden)
action_hidden = Dense(30, activation='linear')(action)
combined = merge([state_hidden_2, action_hidden], mode='sum')
squasher = Dense(30, activation='relu')(combined)
output = Dense(4, activation='linear')(squasher) #number of actions
然后您可以从那里使用目标函数。注意,我不知道这段代码是否正常工作,因为我还没有测试过它,但希望您能理解

资料来源: 关于Torc的精彩博客(不是我创建的):


在上面的博客中,他们还展示了如何使用不同的输出函数,例如一个TAHN和两个sigmoid函数进行操作。

非常感谢您的帮助。如果您的输出控制一组连续参数(例如关节角度或扭矩),我完全理解您关于不使用softmax的说法。你与持续控制工作的链接真的很有趣,我希望在将来尝试这些技术。现在我刚刚开始学习RL。我的申请是又一个迷宫中的老鼠。状态只是老鼠周围细胞中的网格内容。我的动作空间小而离散,由8个指南针方向的动作组成。我从softmax返回的概率中随机选择一个方向,然后根据移动是否延长了行驶距离(在过去5步中测量),或者是否撞到墙上,进行正强化或负强化。我对损失函数的形式(交叉熵或-ve对数似然)有疑问。阅读熵和交叉熵,现在我觉得当输出为1-hot时,交叉熵损失与对数似然损失相同(即,训练示例总是指定一个正确的输出神经元)。我仍然怀疑是否允许反向传播负数以进行负强化,但我认为这应该放在一个单独的问题中。更新了顶部的答案,以及可能回答您的问题的内容?如果这是你的意思,重读它我有点困惑。是的。当使用softmax的交叉熵时,我理解了输出层梯度的推导,但是当使用负对数似然时,我不知道梯度应该是什么(就像Karpath在他的博客中所做的那样)。我最终意识到,让我困惑的只是术语。本质上是一样的。
state = Input(shape=[your_state_shape])
action = Input(shape=[4])
state_hidden = Dense(30, activation='relu')(state)
state_hidden_2 = Dense(30, activation='linear')(state_hidden)
action_hidden = Dense(30, activation='linear')(action)
combined = merge([state_hidden_2, action_hidden], mode='sum')
squasher = Dense(30, activation='relu')(combined)
output = Dense(4, activation='linear')(squasher) #number of actions