0

我正在使用 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 作为激活层时代理如何产生负面行为?是代理是问题的根源吗?

4

0 回答 0