强化学习——如何教神经元网络避免在情节中已经选择的动作?
Reinforce learning - how to teach a neuronal network avoid actions already chosen during the episode?
我构建了一个自定义的 Open AI Gym 环境,其中有 13 个不同的动作和 33 个观察项目。在情节中可以使用每个动作,但只能使用一次,否则情节结束。因此,一集的最大长度为 13。
我试图为此训练几个神经元网络,但到目前为止,NN 并没有很好地学习它,它在第 13 步之前就结束了。 NN 的最后一层是具有 13 个神经元的 softmax 层。
你知道神经网络会是什么样子,它可以学会从 13 个动作中一个接一个地进行选择吗?
亲切的问候,
费伦茨
我在这个话题中发现了一些有趣的东西
https://ai.stackexchange.com/questions/7755/how-to-implement-a-constrained-action-space-in-reinforcement-learning
将检查 'do-nothing' 想法是否有帮助...
最后我写了这段代码:
from keras import backend as K
import tensorflow as tf
def mask_output2(x):
inp, soft_out = x
# add a very small value in order to avoid having 0 everywhere
c = K.constant(0.0000001, dtype='float32', shape=(32, 13))
y = soft_out + c
y = Lambda(lambda x: K.switch(K.equal(x[0],0), x[1], K.zeros_like(x[1])))([inp, soft_out])
y_sum = K.sum(y, axis=-1)
y_sum_corrected = Lambda(lambda x: K.switch(K.equal(x[0],0), K.ones_like(x[0]), x[0] ))([y_sum])
y_sum_corrected = tf.divide(1,y_sum_corrected)
y = tf.einsum('ij,i->ij', y, y_sum_corrected)
return y
它只是简单地修正了 sigmoid 结果,以便清除(设置为 0)那些 inp 张量设置为 1(显示已使用的动作)的神经元。
我构建了一个自定义的 Open AI Gym 环境,其中有 13 个不同的动作和 33 个观察项目。在情节中可以使用每个动作,但只能使用一次,否则情节结束。因此,一集的最大长度为 13。
我试图为此训练几个神经元网络,但到目前为止,NN 并没有很好地学习它,它在第 13 步之前就结束了。 NN 的最后一层是具有 13 个神经元的 softmax 层。
你知道神经网络会是什么样子,它可以学会从 13 个动作中一个接一个地进行选择吗?
亲切的问候, 费伦茨
我在这个话题中发现了一些有趣的东西 https://ai.stackexchange.com/questions/7755/how-to-implement-a-constrained-action-space-in-reinforcement-learning
将检查 'do-nothing' 想法是否有帮助...
最后我写了这段代码:
from keras import backend as K
import tensorflow as tf
def mask_output2(x):
inp, soft_out = x
# add a very small value in order to avoid having 0 everywhere
c = K.constant(0.0000001, dtype='float32', shape=(32, 13))
y = soft_out + c
y = Lambda(lambda x: K.switch(K.equal(x[0],0), x[1], K.zeros_like(x[1])))([inp, soft_out])
y_sum = K.sum(y, axis=-1)
y_sum_corrected = Lambda(lambda x: K.switch(K.equal(x[0],0), K.ones_like(x[0]), x[0] ))([y_sum])
y_sum_corrected = tf.divide(1,y_sum_corrected)
y = tf.einsum('ij,i->ij', y, y_sum_corrected)
return y
它只是简单地修正了 sigmoid 结果,以便清除(设置为 0)那些 inp 张量设置为 1(显示已使用的动作)的神经元。