问题遇到的现象和发生背景
发生背景:我在研究关于PPO的掩蔽动作问题和实现
在写代码过程中,我根据《A Closer Look at Invalid Action Masking in Policy Gradient Algorithms》这篇文章在PPO上加个掩蔽无效动作功能。主要是通过负无穷值,经过softmax后使得无效动作概率为0,最重要的是把这掩蔽行为写入神经网络模型中。actor网络搭建,有两个输入层,Input1是输入状态state二维数组,Input2是输入当前动作掩蔽二维数组,Input1经过两层后得到与Input2维度相同的张量,然后将该张量与Input2元素相加,最后经过softmax输出各动作概率。网络模型输出的结果大相径庭。比如说:当前只有第一个动作为有效动作,经模型训练后,输出的最终动作概率确是其他动作概率为1,而不是第一个动作概率为1。
先是输出相加结果
# 建立Actor网络
def _build_anet(self, trainable=True):
tfs_a = Input(shape=(S_DIM))
l1 = Dense(68, 'relu', trainable=trainable)(tfs_a)
l2 = Dense(A_DIM, 'softmax', trainable=trainable)(l1)
mask_a = Input(shape=(A_DIM))
l4 = Add()([l2, mask_a])
# a_prob = Dense(A_DIM, 'softmax', trainable=trainable)(l4)
model_a = keras.models.Model(inputs=[tfs_a, mask_a], outputs=l4)
model_a.summary()
return model_a
结果如下图:
def _build_anet(self, trainable=True):
tfs_a = Input(shape=(S_DIM))
l1 = Dense(68, 'relu', trainable=trainable)(tfs_a)
l2 = Dense(A_DIM, 'softmax', trainable=trainable)(l1)
mask_a = Input(shape=(A_DIM))
l4 = Add()([l2, mask_a])
a_prob = Dense(A_DIM, 'softmax', trainable=trainable)(l4)
model_a = keras.models.Model(inputs=[tfs_a, mask_a], outputs=a_prob)
model_a.summary()
return model_a
结果如下图:
很显然, 这前后不对啊。 目前不很懂啥子原因,有没有哪位资深学者能指导指导呀~