微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用缩放 sigmoid 激活函数时的负输出

如何解决使用缩放 sigmoid 激活函数时的负输出

我正在使用 Keras-rl DDPG 代理解决一个问题,其中我有连续状态和连续动作空间作为 3 个元素的数组。

我的动作空间值对每个元素都有界限,因此不使用传统的 tanh 函数。我在 actor 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)

现在代理显示的值不是 0 到 500 之间的值,而是如下所示:

agent.recent_action
>> array([-111.5,-165.9,222.1],dtype=float32)

当我使用 sigmoid 作为激活层时,我不明白代理如何产生负面动作?问题的根源是代理吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。