强化学习之连续动作

连续动作空间:
在离散动作场景下,有几个动作就输出几个动作的概率值,然后在随机抽取,是一个随机性策略。再连续动作场景下,我们直接输入某个动作的浮点数,我们输入的同样的state必然输出同样的action,是一个确定性策略
在这里插入图片描述在连续动作中,我们在输出层后面加一个tanh函数,作用是把输入限制在-1到1之间,然后我们拿到的输入根据实际动作的范围再做下缩放,然后再输出给环境。
在这里插入图片描述
DDPG:策略性网络是每一个epsilon才更新一次,DDPG是每一个state更新一次,是单步更新网络。
在这里插入图片描述
DDPG在DQN的基础上加一个策略网络用来直接输出动作值,所以DDPG需要一边学习Q网络一边学习策略网络
在这里插入图片描述
这样的网络结构成为Actor-Critic结构:策略网络负责对外展示输出,Q网络负责对策略网络每一个state输出的动作做一个评估,估计这个action未来有多少总收益,也就是去估计这个action的Q值大概是多少,策略性网络需要根据state来做出action,Q网络需要根据state和输出的action来对策略性网络进行打分Q,策略性网络就需要根据这个打分来调整自己的策略也就是更新自身的参数,而Q网络就需要根据环境的反馈reward来调整自己的打分策略也就是更新自身的参数,他的目标是最大化未来总收益。一开始这两个神经网络都是随机的,由于有reward的反馈,所以会做得越来越好。
在这里插入图片描述
DQN最佳的策略是学习出一个很好的Q网络,我们希望选取得动作对应的Q值是最大的。
DDPG用来优化我们策略网络的梯度就是要最大化这个Q值。所以构造loss函数loss= -Q,Q网络的优化方法跟DQN是一样的
在这里插入图片描述
由于Q网络的Q_target是不稳定的,所以我们分别给Q网络和策略性网络分别搭建target_Q和target_P,转是用来计算Q_target,在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

连续动作输入的是state,输出的是action,下次输入相同的state时,则网络会输出相同的action,是确定性策略。
离散动作输入的是state,输出的是每个action的概率,经过sample之后,才输出agent所要采取的action
连续动作输入的state经过网络输出后,经过tanh激活函数将输出缩放到[-1,1],在经过实际范围进行缩放,在输出给环境。比如:小车方向的范围是[-2,2],将tanh输出的x2,再输出给环境。
DDPG:每个state都更新一次网络,是单步更新网络。一边更新Q网络,一边更新策略网络。Q网络根据策略网络输出的action来评估未来有多少种收益,也就是评估策略网络输出的action的Q值是多少。策略网络根据state,输出动作action,Q网络根据state和action,对action打一个分数Q,策略网络根据Q网络的打分也就是Q值,来调整网络模型的参数,争取下次可以做的更好。Q网络根据environment反馈的reward来调整网络模型的参数,最大化未来的收益。刚开始策略网络随机输出动作,Q网络随机打分,通过reward的反馈,以后这两个模型做的更好。策略网络只关注Q网络的打分。更新网络的参数需要计算梯度,因为策略网络只关注Q网络的打分,所以更新网络的参数就是最大化Q值loss。Q网络更新是根据reward的,我们用Q_target = r(真实的reward)+gamma*Q’(下一步的Q),让Q网络的输出Q估计,来拟合Q_target,所以loss=MSE(Q估计,Q_target),由于Q’(一堆值)是不稳的,为了稳定Q_target,DDPG分别给Q网络和策略网络都搭建target network。为了计算Q_target中的Q’中的next action,是通过target_P网络来去输出。所以四个网络需要的s,r,a,s’用经验池存起来。
代码:
model主要是Q网络的和策略网络的搭建,algorithm主要是优化函数,agent主要是和环境的交互。target
model主要是复制一下model即可。

  • 19
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
对于强化学习中的连续动作问题,常用的方法是使用深度强化学习算法和确定性策略梯度算法。以下是一个示例代码,演示如何使用Proximal Policy Optimization (PPO)算法来处理连续动作空间。 ```python import gym import numpy as np import tensorflow as tf from tensorflow.keras import layers # 定义Actor模型,输出均值和标准差 class Actor(tf.keras.Model): def __init__(self, num_actions): super(Actor, self).__init__() self.hidden1 = layers.Dense(64, activation='relu') self.hidden2 = layers.Dense(64, activation='relu') self.mu = layers.Dense(num_actions, activation='tanh') self.sigma = layers.Dense(num_actions, activation='softplus') def call(self, inputs): x = self.hidden1(inputs) x = self.hidden2(x) mu = self.mu(x) sigma = self.sigma(x) return mu, sigma # 定义Critic模型,评估状态值函数 class Critic(tf.keras.Model): def __init__(self): super(Critic, self).__init__() self.hidden1 = layers.Dense(64, activation='relu') self.hidden2 = layers.Dense(64, activation='relu') self.value = layers.Dense(1) def call(self, inputs): x = self.hidden1(inputs) x = self.hidden2(x) value = self.value(x) return value # 定义PPO算法的Agent class PPOAgent: def __init__(self, num_actions): self.num_actions = num_actions self.actor = Actor(num_actions) self.critic = Critic() self.optimizer = tf.keras.optimizers.Adam(learning_rate=0.001) def get_action(self, state): state = tf.convert_to_tensor([state], dtype=tf.float32) mu, sigma = self.actor(state) action_prob = tfp.distributions.Normal(mu, sigma) action = action_prob.sample(1)[0] return np.clip(action, -1, 1) def update(self, states, actions, rewards, log_probs, advantage): states = tf.convert_to_tensor(states, dtype=tf.float32) actions = tf.convert_to_tensor(actions, dtype=tf.float32) rewards = tf.convert_to_tensor(rewards, dtype=tf.float32) log_probs = tf.convert_to_tensor(log_probs, dtype=tf.float32) advantage = tf.convert_to_tensor(advantage, dtype=tf.float32) with tf.GradientTape() as tape: mu, sigma = self.actor(states) new_action_prob = tfp.distributions.Normal(mu, sigma) new_log_probs = new_action_prob.log_prob(actions) ratio = tf.exp(new_log_probs - log_probs) surrogate1 = ratio * advantage surrogate2 = tf.clip_by_value(ratio, 1.0 - 0.2, 1.0 + 0.2) * advantage actor_loss = -tf.reduce_mean(tf.minimum(surrogate1, surrogate2)) target_values = rewards + 0.99 * self.critic(states) critic_loss = tf.reduce_mean(tf.square(target_values - self.critic(states))) total_loss = actor_loss + 0.5 * critic_loss actor_gradients = tape.gradient(total_loss, self.actor.trainable_variables) self.optimizer.apply_gradients(zip(actor_gradients, self.actor.trainable_variables)) critic_gradients = tape.gradient(critic_loss, self.critic.trainable_variables) self.optimizer.apply_gradients(zip(critic_gradients, self.critic.trainable_variables)) # 创建环境和Agent env = gym.make('Pendulum-v0') agent = PPOAgent(num_actions=env.action_space.shape[0]) # 进行PPO算法的训练 for episode in range(1000): state = env.reset() episode_reward = 0 states, actions, rewards, log_probs, = [], [], [], [] done = False while not done: action = agent.get_action(state) next_state, reward, done, _ = env.step(action) log_prob = tfp.distributions.Normal(agent.actor(state)[0], agent.actor(state)[1]).log_prob(action) states.append(state) actions.append(action) rewards.append(reward) log_probs.append(log_prob) state = next_state episode_reward += reward advantage = np.zeros_like(rewards) target_value = 0 for i in reversed(range(len(rewards))): delta = rewards[i] + 0.99 * target_value - agent.critic(np.array([states[i]], dtype=np.float32)) target_value = agent.critic(np.array([states[i]], dtype=np.float32)) advantage[i] = delta + 0.99 * 0.95 * advantage[i + 1] advantage = (advantage - np.mean(advantage)) / np.std(advantage) agent.update(states, actions, rewards, log_probs, advantage) print('Episode: {}, Reward: {:.2f}'.format(episode+1, episode_reward)) ``` 这段代码使用了TensorFlow和gym库,首先定义了一个Actor模型和一个Critic模型,分别用于输出动作的均值和标准差以及评估状态值函数。然后,定义了PPOAgent类作为PPO算法的实现。在训练过程中,通过调用get_action方法获取动作,并使用update方法更新模型参数。最后,通过循环执行训练过程,并输出每个episode的奖励。 请注意,这只是一个示例代码,具体问题的实施需要根据任务和环境进行适当的调整和修改。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值