加强学习-如何教神经网络避免发作期间已经选择的动作?

时间:2018-12-01 20:01:40

标签: keras reinforcement-learning openai-gym

我构建了一个自定义的Open AI Gym环境,其中有13种不同的动作和33种观察项目。在情节中,可以使用所有操作,但只能使用一次,否则情节结束。因此,一集的最大长度为13。

我为此尝试训练了几个神经网络,但是到目前为止,NN并没有很好地学习它,它在第13步之前就结束了。 NN的最后一层是一个具有13个神经元的softmax层。

您是否知道NN的外观,可以学会从13个动作中选择一项?

亲切的问候, 费伦茨

2 个答案:

答案 0 :(得分:0)

我在这个话题中发现了一些有趣的东西 https://ai.stackexchange.com/questions/7755/how-to-implement-a-constrained-action-space-in-reinforcement-learning

将检查“什么都不做”的想法是否有帮助...

答案 1 :(得分:0)

最后,我编写了这段代码:

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

它只是纠正了乙状结肠结果,以清除(设置为0)将输入张量设置为1(显示已使用的动作)的神经元。