强化学习 之 Policy Gradient

参考

1、关于Policy Gradient的理解(对于PG的理解比较完整和全面)
2、【强化学习】Policy Gradient算法详解(详细的推导过程)
3、Policy Gradient算法推导(包含详细的计算过程)
4、策略梯度 Policy Gradient(除推导外,还有其他一些计算知识,包含Actor Critic部分)
5.PARL源码走读——使用策略梯度算法求解迷宫寻宝问题(提及连续的分布输出)

简介

强化学习是一个通过奖惩来学习正确行为的机制。

其中,Q learning、Sarsa、Deep Q Network等通过学习奖惩值, 根据自己认为的高价值选行为;
Policy Gradients则不通过分析奖励值,直接输出行为,即接受环境信息 (observation)后,他要输出不是 action 的 value,而是具体的那一个 action,这样 policy gradient 就跳过了 value 这个阶段。

对比起以值为基础的方法,Policy Gradients 直接输出动作的最大好处是 能在一个连续区间内挑选动作,而基于值的, 比如 Q-learning, 它如果在无穷多的动作中计算价值, 从而选择行为, 这它可吃不消。

反向传递与更新参数

Policy Gradient中,反向传递的目的是 让这次被选中的行为更有可能在下次发生 而在提升该行为下次被选中概率的过程中,由奖惩 reward 来控制变化幅度的大小

举个例子
在这里插入图片描述
观测的信息通过神经网络分析, 选出了左边的行为,我们直接进行反向传递,使之下次被选的可能性增加。但是奖惩信息却告诉我们,这次的行为是不好的,那我们的动作可能性增加的幅度 随之被减低(即可能性增加的小一些)。

又比如这次的观测信息让神经网络选择了右边的行为,右边的行为随之想要进行反向传递,使右边的行为下次被多选一点。这时奖惩信息也来了,告诉我们这是好行为,那我们就在这次反向传递的时候加大力度(即可能性增加的多一些)。

这样就能靠奖励来左右我们的神经网络反向传递。

算法思想

此处介绍的是 一种基于 整条回合数据 的更新, 也叫 REINFORCE 方法,是policy gradients的基础算法,描述如下:

### 强化学习 Policy Gradient 算法原理 Policy Gradient 方法属于直接策略搜索的方法之一,在这类方法中,目标是找到最优的行为策略π*使得累积奖励最大化。该类算法不依赖于环境模型的学习,而是通过参数θ定义的概率分布π(a|s; θ),即给定状态下采取行动a的概率。 在 Vanilla Policy Gradient 中,采用的是 Monte Carlo 采样方式来估计回报,并利用这些样本更新策略参数[^2]。具体来说,对于每一个episode中的每一步(t时刻),计算其折扣累计奖赏Gt=R_t+γR_{t+1}+...,并以此作为此次决策带来的长期收益评价指标;随后基于此构建损失函数L(θ)=−E[Gtlogπ(at|st;θ)],最后借助随机梯度下降(SGD)调整权重向量θ以最小化上述期望值。 #### 核心概念解析 - **策略表示**:用神经网络或其他可微分形式表达的条件概率分布p(a|s;θ)[^3]。 - **性能衡量**:引入价值函数J(π)=∑_s d^(π)(s)V^(π)(s)评估当前策略的好坏程度,其中d^(π)(s)代表按照π行为模式下达到各个状态的比例平衡密度,而V^(π)(s)则是从特定起点出发所能获取的最大平均总报酬[^4]。 - **改进机制**:依据链式法则推导得到∇_θ J(π)=E_[∇_θ log π(a|s;θ)*Q^(π)(s,a)],这便是著名的策略梯度定理[^3]。据此公式迭代修正参数直至收敛至局部极值点附近为止。 ### 实现案例展示 下面给出一段Python代码片段用于说明如何简单实现一个基于PyTorch框架下的连续控制任务上的REINFORCE算法(无基线版本),这是一种典型的policy gradient方法: ```python import torch from torch import nn, optim import gymnasium as gym class PolicyNetwork(nn.Module): def __init__(self, input_dim, output_dim): super().__init__() self.network = nn.Sequential( nn.Linear(input_dim, 128), nn.ReLU(), nn.Linear(128, output_dim), nn.Softmax(dim=-1)) def forward(self, state): action_probs = self.network(state) dist = torch.distributions.Categorical(action_probs) return dist def reinforce(env_name='CartPole-v1', num_episodes=500, gamma=.99): env = gym.make(env_name) policy_net = PolicyNetwork(env.observation_space.shape[0], env.action_space.n).float() optimizer = optim.Adam(policy_net.parameters(), lr=1e-2) all_rewards = [] for episode in range(num_episodes): done = False states, actions, rewards = [], [], [] s, _ = env.reset() while not done: with torch.no_grad(): probs_dist = policy_net(torch.tensor(s).float()) a = probs_dist.sample().item() next_s, r, terminated, truncated, info = env.step(a) done = terminated or truncated states.append(s); actions.append(a); rewards.append(r) s = next_s R = 0. returns = [] for r in reversed(rewards): R = r + gamma * R returns.insert(0,R) loss = sum(-torch.log(probs_dist.log_prob(torch.tensor(actions[i])) * torch.tensor(returns[i]).float()) for i in range(len(states))) optimizer.zero_grad() loss.backward() optimizer.step() avg_reward = sum(rewards)/len(rewards) print(f'Episode {episode}: Average reward={avg_reward:.2f}') all_rewards.append(avg_reward) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值