当可能有多个动作时,策略梯度是多少?
What is the policy gradient when multiple actions are possible?
我正在尝试使用策略梯度编写强化学习算法,受到 Karpathy's blog article 的启发。 Karpathy 的示例只有向上或向下两个动作,因此单个输出神经元就足够了(高激活=向上,低激活=向下)。我想将其扩展到多个动作,所以我相信我需要在输出层上使用 softmax 激活函数。但是,我不确定输出层的梯度应该是多少。
如果我在监督学习环境中使用带有 softmax 激活的交叉熵损失函数,神经元的梯度很简单:
g[i] = a[i] - target[i]
其中 target[i] = 1
用于所需操作,0
用于所有其他操作。
要将其用于强化学习,我会在反向传播之前将 g[i]
乘以折扣奖励。
但是,强化学习似乎使用负对数似然作为损失而不是交叉熵。 这如何改变梯度?
注意:我认为可以让您走上正轨:
负对数似然也称为多类交叉熵(模式识别和机器学习)。
编辑:误读了问题。我以为这是在谈论 Deep Deterministic Policy Gradients
这取决于您的领域,但是使用 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])
hidden_layer = Dense(30, activation='relu')(state)
all_limbs = Dense(4, activation='sigmoid')(hidden_layer)
model = Model(input=state, output=all_limbs)
然后,您的评论网络将不得不考虑行动维度。
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
然后您可以从那里使用您的目标函数。请注意,我不知道这段代码是否有效,因为我还没有测试过它,但希望你能理解。
来源:https://arxiv.org/pdf/1509.02971.pdf
关于 Torc 的很棒的博客(不是我创建的):https://yanpanlau.github.io/2016/10/11/Torcs-Keras.html
在上面的博客中,他们还展示了如何使用不同的输出函数,例如一个 TAHN 和两个用于操作的 sigmoid 函数。
我正在尝试使用策略梯度编写强化学习算法,受到 Karpathy's blog article 的启发。 Karpathy 的示例只有向上或向下两个动作,因此单个输出神经元就足够了(高激活=向上,低激活=向下)。我想将其扩展到多个动作,所以我相信我需要在输出层上使用 softmax 激活函数。但是,我不确定输出层的梯度应该是多少。
如果我在监督学习环境中使用带有 softmax 激活的交叉熵损失函数,神经元的梯度很简单:
g[i] = a[i] - target[i]
其中 target[i] = 1
用于所需操作,0
用于所有其他操作。
要将其用于强化学习,我会在反向传播之前将 g[i]
乘以折扣奖励。
但是,强化学习似乎使用负对数似然作为损失而不是交叉熵。 这如何改变梯度?
注意:我认为可以让您走上正轨:
负对数似然也称为多类交叉熵(模式识别和机器学习)。
编辑:误读了问题。我以为这是在谈论 Deep Deterministic Policy Gradients
这取决于您的领域,但是使用 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])
hidden_layer = Dense(30, activation='relu')(state)
all_limbs = Dense(4, activation='sigmoid')(hidden_layer)
model = Model(input=state, output=all_limbs)
然后,您的评论网络将不得不考虑行动维度。
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
然后您可以从那里使用您的目标函数。请注意,我不知道这段代码是否有效,因为我还没有测试过它,但希望你能理解。
来源:https://arxiv.org/pdf/1509.02971.pdf 关于 Torc 的很棒的博客(不是我创建的):https://yanpanlau.github.io/2016/10/11/Torcs-Keras.html
在上面的博客中,他们还展示了如何使用不同的输出函数,例如一个 TAHN 和两个用于操作的 sigmoid 函数。