PPO学习记录

2020.4.23更新

1、ppo是一种on-policy,先利用old_pi进行一轮互动得到N个experience,用这些经验对策略进行多次训练更新得到new_pi,在此过程中限制new_pi的更新幅度(kl_pen和clip两种方法)

问题:限制了每次的更新幅度进行多次更新,和一次进行大幅度更新 有区别吗?

回答:OpenAI 提出的一种解决 Policy Gradient 不好确定 Learning rate (或者 Step size) 的问题. 因为如果 step size 过大, 学出来的 Policy 会一直乱动, 不会收敛, 但如果 Step Size 太小, 对于完成训练, 我们会等到绝望. PPO 利用 New Policy 和 Old Policy 的比例, 限制了 New Policy 的更新幅度, 让 Policy Gradient 对稍微大点的 Step size 不那么敏感.

2、REINFORCE算法

3、tf.distributions.Normal().prob()函数得到的数是均值为loc,方差为scale的正态分布中,在数5处的概率密度,所以会大于一

import tensorflow as tf

sess=tf.Session()
list=tf.distributions.Normal(loc=5.0,scale=0.1)

p=list.prob(5.0)
sess.run(tf.global_variables_initializer())

print(sess.run(p))

2020.4.20更新

tf.squeeze()函数,删除维度为1的维

squeeze(
    input,
    axis=None,
    name=None,
    squeeze_dims=None
)

该函数返回一个张量,这个张量是将原始input中所有维度为1的那些维都删掉的结果。axis可以用来指定要删掉的为1的维度,此处要注意指定的维度必须确保其是1,否则会报错

#  't' 是一个维度是[1, 2, 1, 3, 1, 1]的张量
tf.shape(tf.squeeze(t))   # [2, 3], 默认删除所有为1的维度

# 't' 是一个维度[1, 2, 1, 3, 1, 1]的张量
tf.shape(tf.squeeze(t, [2, 4]))  # [1, 2, 3, 1],标号从零开始,只删掉了2和4维的1

论文阅读

问题:

怎么表示策略pi的概率分布?

怎么表示新旧策略的KL散度?

莫烦代码中,ppo采用的是on-policy?只用前一个batch(32)次的互动数据,对actor进行M次更新。

1、初始化环境得到状态S

2、用策略pi选择action,

 

2020.4.22 代码下载阅读

openai 代码解读:https://blog.csdn.net/jinzhuojun/article/details/80417179

莫烦代码理解:

https://blog.csdn.net/zhisuihen6347/article/details/88380637

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PPO(Proximal Policy Optimization)是一种强化学习算法,可以用于离散和连续动作空间。PPO的主要思想是在更新策略时,限制新策略与旧策略之间的差异,以确保更新后的策略不会太远离旧策略,从而保证学习的稳定性。PPO有两种形式:PPO-Penalty和PPO-Clip。 对于离散动作空间,PPO-Penalty使用KL散度来限制新策略与旧策略之间的差异,而PPO-Clip使用一个截断函数来限制差异。在PPO-Clip中,新策略与旧策略之间的差异被限制在一个固定的范围内,这个范围由一个超参数ε控制。 对于连续动作空间,PPO使用一个正态分布来表示策略,其中均值和方差是策略的参数。在训练过程中,PPO使用一个神经网络来拟合均值和方差,并使用拟合的正态分布进行抽样。PPO-Clip同样适用于连续动作空间,只需要将截断函数应用于均值的更新上即可。 下面是一个使用PPO算法解决倒立摆问题的示例代码: ```python import gym import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from torch.distributions import Normal # 定义神经网络 class ActorCritic(nn.Module): def __init__(self): super(ActorCritic, self).__init__() self.fc1 = nn.Linear(3, 64) self.fc2 = nn.Linear(64, 64) self.actor = nn.Linear(64, 1) self.critic = nn.Linear(64, 1) def forward(self, x): x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) actor = torch.tanh(self.actor(x)) * 2 # 将输出映射到[-2, 2]范围内 critic = self.critic(x) return actor, critic # 定义PPO算法 class PPO: def __init__(self): self.gamma = 0.99 self.lmbda = 0.95 self.eps_clip = 0.2 self.K = 10 self.actor_critic = ActorCritic() self.optimizer = optim.Adam(self.actor_critic.parameters(), lr=0.001) def select_action(self, state): state = torch.FloatTensor(state.reshape(1, -1)) actor, _ = self.actor_critic(state) dist = Normal(actor, torch.ones(1, 1)) action = dist.sample() return action.item() def update(self, memory): states = torch.FloatTensor(memory.states) actions = torch.FloatTensor(memory.actions) old_log_probs = torch.FloatTensor(memory.log_probs) returns = torch.FloatTensor(memory.returns) advantages = torch.FloatTensor(memory.advantages) for _ in range(self.K): actor, critic = self.actor_critic(states) dist = Normal(actor, torch.ones(actor.size())) log_probs = dist.log_prob(actions) ratios = torch.exp(log_probs - old_log_probs) surr1 = ratios * advantages surr2 = torch.clamp(ratios, 1 - self.eps_clip, 1 + self.eps_clip) * advantages actor_loss = -torch.min(surr1, surr2).mean() critic_loss = F.mse_loss(critic, returns) loss = actor_loss + 0.5 * critic_loss self.optimizer.zero_grad() loss.backward() self.optimizer.step() # 训练PPO算法 env = gym.make('Pendulum-v0') ppo = PPO() memory = Memory() for i in range(1000): state = env.reset() done = False while not done: action = ppo.select_action(state) next_state, reward, done, _ = env.step([action]) memory.add(state, action, reward, next_state, done) state = next_state if i % 10 == 0: memory.calculate_returns(ppo.actor_critic, ppo.gamma, ppo.lmbda) ppo.update(memory) memory.clear() # 测试PPO算法 state = env.reset() done = False while not done: action = ppo.select_action(state) next_state, reward, done, _ = env.step([action]) env.render() state = next_state env.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值