Policy Gradients

这篇博客只是为了自己记录,思路比较跳跃。

Policy Gradients

不估计局面的价值,转而预测选取每个动作的概率。因为某些游戏中我们可能会需要在相同的状态下做出随机行为,比如说某些资源有限的游戏,我们不可能一直在某一个地方一直获取资源。

更新函数是\(\theta_{t+1}=\theta_t + \alpha \cfrac{\partial J}{\partial \theta}\),其中\(J(\theta)\)是对当前参数产生的策略的评价,越高越好。

\(J(\theta)\)中,\(\theta\)的影响来自于两方面,一是在特定状态下的行为选择,二是这个策略到每个状态的概率。行为选择的偏导比较好考虑,然而行为造成的“某些高价值的状态没有到达”这件事情的偏导就没有那么形象了。

725727-20190316231247187-1402340354.png

725727-20190316231302940-612650820.png

我们把策略对可能到达状态的影响浓缩在了一个\(\mu (x)\)里,表示在该策略下到达\(x\)的概率。

最后关于这个梯度的计算,我自己有一些想法:

  • 一是通过蒙特卡洛估计,即使状态量巨大或者无限,状态的密度分布依然会把我们带到密度大的状态,我们的\(q\)值也是策略下的\(q\)值,没有统计到的密度小的状态价值再高也会被密度冲淡,影响不大。
  • 二是通过Q-learning or DQN来估计\(q\)值,两个算法相互迭代。

转载于:https://www.cnblogs.com/LincHpins/p/10545122.html

好的,我来给你提供一个简单的例子,使用PyTorch和Gym环境编写Policy Gradients神经网络,并可视化其损失函数和奖励。 首先,我们需要安装必要的库,包括gym、numpy和pytorch: ``` pip install gym numpy torch ``` 接下来,我们可以定义我们的策略网络和损失函数。在这个例子中,我们将使用一个简单的神经网络作为我们的策略,并采用交叉熵损失函数。这里的策略网络将接受环境状态作为输入,并输出每个动作的概率分布。 ```python import torch import torch.nn as nn import torch.optim as optim class Policy(nn.Module): def __init__(self, input_size, output_size): super(Policy, self).__init__() self.fc1 = nn.Linear(input_size, 128) self.fc2 = nn.Linear(128, output_size) def forward(self, x): x = torch.relu(self.fc1(x)) x = torch.softmax(self.fc2(x), dim=1) return x policy = Policy(input_size, output_size) optimizer = optim.Adam(policy.parameters(), lr=learning_rate) criterion = nn.CrossEntropyLoss() ``` 接下来,我们可以开始训练我们的策略网络。在这个例子中,我们将使用CartPole-v0环境,它的目标是让杆子保持平衡。我们将在每个时步中执行一个动作,并通过策略网络选择一个动作。接着,我们将观察环境的反馈,并计算奖励和损失。最后,我们将更新我们的策略网络,以便它可以更好地预测动作。 ```python import gym env = gym.make('CartPole-v0') for i_episode in range(num_episodes): state = env.reset() rewards = [] log_probs = [] actions = [] for t in range(max_steps): action_probs = policy(torch.FloatTensor(state)) action = torch.multinomial(action_probs, 1).item() log_prob = torch.log(action_probs[action]) actions.append(action) log_probs.append(log_prob) state, reward, done, _ = env.step(action) rewards.append(reward) if done: break discounts = [gamma**i for i in range(len(rewards))] discounted_rewards = [a*b for a,b in zip(rewards, discounts)] cumulative_rewards = [sum(discounted_rewards[i:]) for i in range(len(discounted_rewards))] loss = 0 for log_prob, cumulative_reward in zip(log_probs, cumulative_rewards): loss -= log_prob * cumulative_reward optimizer.zero_grad() loss.backward() optimizer.step() episode_rewards.append(sum(rewards)) episode_losses.append(loss.item()) if i_episode % print_every == 0: print("Episode: {}, Total Reward: {}, Loss: {}".format(i_episode, sum(rewards), loss.item())) ``` 最后,我们可以可视化我们的损失函数和奖励,以便更好地理解我们的策略网络是如何训练的。 ```python import matplotlib.pyplot as plt plt.plot(episode_losses) plt.title("Policy Gradients Loss") plt.xlabel("Episode") plt.ylabel("Loss") plt.show() plt.plot(episode_rewards) plt.title("Policy Gradients Reward") plt.xlabel("Episode") plt.ylabel("Reward") plt.show() ``` 这就是一个简单的Policy Gradients神经网络的实现和可视化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值