我正在使用 Keras-rl DDPG 代理来解决一个问题,其中我有连续状态和连续动作空间作为 3 个元素的数组。
我的动作空间值对每个元素都有限制,因此没有使用传统的 tanh 函数。我在演员 NN 最后一层实现了自定义 sigmoid 函数:
from keras import backend as K
from keras.utils.generic_utils import get_custom_objects
def sigscale(x):
return 500* K.sigmoid(x)
get_custom_objects().update({'sigscale': Activation(sigscale)})
演员和评论家层看起来像这样:
actor = Sequential()
actor.add(Flatten(input_shape=(1,) + env.observation_space.shape))
HIDDEN_LAYERS = 5
for _ in range(HIDDEN_LAYERS):
actor.add(Dense(128))
actor.add(Activation('relu'))
actor.add(Dense(nb_actions)) #nb_actions is dim of action space
actor.add(Activation(sigscale))
#critic network
action_input = Input(shape=(nb_actions,), name='action_input')
observation_input = Input(shape=(1,) + env.observation_space.shape, name='observation_input')
flattened_observation = Flatten()(observation_input)
x = Concatenate()([action_input, flattened_observation])
for _ in range(HIDDEN_LAYERS):
x = Dense(128)(x)
x = Activation('relu')(x)
x = Dense(1)(x)
x = Activation('linear')(x)
critic = Model(inputs=[action_input, observation_input], outputs=x)
来自 keras-rl 的 DDPG 代理
agent = DDPGAgent(nb_actions=nb_actions, actor=actor, critic=critic, critic_action_input=action_input,
memory=memory, nb_steps_warmup_critic=100, nb_steps_warmup_actor=100,
random_process=random_process, gamma=.99, target_model_update=1e-3)
agent.compile(Adam(lr=.001, clipnorm=1.), metrics=['mae'])
agent.fit(env, nb_steps=10000, verbose=1, nb_max_episode_steps=None)
现在,Agent 不再获取 0 到 500 之间的操作输出值,而是显示如下值:
agent.recent_action
>> array([-111.5, -165.9, 222.1], dtype=float32)
我不明白当我使用 sigmoid 作为激活层时代理如何产生负面行为?是代理是问题的根源吗?