我试图使用政策渐变来编写强化学习算法,受到Karpathy's blog article的启发。 Karpathy的例子只有两个动作UP或DOWN,所以单个输出神经元就足够了(高激活= UP,低激活= DOWN)。我想将其扩展到多个动作,所以我相信我需要在输出层上使用softmax激活功能。但是,我不确定输出层的梯度应该是什么。
如果我在监督学习环境中使用softmax激活的交叉熵损失函数,神经元的梯度就是:
g[i] = a[i] - target[i]
其中target[i] = 1
表示所需的操作,0
表示所有其他操作。
要将其用于强化学习,我会在反向传播之前将g[i]
乘以折扣奖励。
然而,似乎强化学习使用负对数似然作为损失而不是交叉熵。 这如何改变渐变?
答案 0 :(得分:2)
注意:我认为可以让你走上正轨:
负对数似然也被称为多类交叉熵(模式识别和机器学习)。
编辑:误读了这个问题。我认为这是在谈论深层确定性政策渐变这将取决于您的域,但使用softmax,您将获得所有输出节点的概率。对你来说,当你想到DDPG时,在大多数领域都没有意义。例如,如果您正在控制机器人手臂和腿部的伸展,那么如果您想要延长所有肢体,将肢体伸展测量为[.25,.25,.25,.25]是没有意义的。在这种情况下,.25可能意味着完全扩展,但如果输出的矢量是[.75,.25,0,0]会发生什么?因此,通过这种方式,您可以为所有动作节点设置一个单独的sigmoid函数,从0到1,然后您可以将其表示为[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函数。