策略梯度方法(Policy Gradient Methods)是一类强化学习方法,它通过更新策略参数来最大化预期累积奖励,从而找到最优策略。
策略梯度方法的主要思想是:
对于当前策略π,我们可以计算其对环境产生的预期累积奖励J(θ),其中θ表示策略参数。
通过链式法则,我们可以得到J(θ)对θ的梯度?θJ(θ)。
通过梯度上升法,我们可以更新策略参数θ,使J(θ)最大化,最终找到最优策略π*。
策略梯度方法不需要价值函数,直接对策略进行更新,所以比较适合连续或高维动作空间的学习任务。但它也面临一定困难,如样本效率低、调节学习率难度大等。
具体地,常用的策略梯度方法有:
- REINFORCE算法:使用蒙特卡罗方法对模式的累积奖励进行采样,然后拟合其梯度。简单但效率低。
- 改进的REINFORCE算法:引入Baseline减小方差,提高学习效率。
- 策略梯度定理(Policy Gradient Theorem):给出策略梯度的准确表示,但难以直接应用。
- 演员-评论员算法(Actor-Critic):引入Critic来估计状态值,辅助Actor更新策略参数。提高学习稳定性。
- 自然策略梯度(Natural Policy Gradient):通过Fisher信息矩阵调整策略梯度方向,加速收敛。
代码示例:
python
import numpy as np
import gym
# 构建策略网络,输出动作概率
class PolicyNet(nn.Module):
def __init__(self, obs_size, act_size):
super(PolicyNet, self).__init__()
self.fc1 = nn.Linear(obs_size, 128)
self.fc2 = nn.Linear(128, act_size)
def forward(self, obs):
obs = F.relu(self.fc1(obs))
probs = F.softmax(self.fc2(obs), dim=1)
return probs
# REINFORCE算法
def reinforce(env, agent, episodes):
total_rewards = []
optimizer = optim.Adam(agent.parameters(), lr=0.01)
for episode in range(episodes):
state = env.reset()
rewards = []
while True:
probs = agent(torch.FloatTensor(state))
action = np.random.choice(len(probs), p=probs.detach().numpy())
next_state, reward, done, _ = env.step(action)
rewards.append(reward)
if done:
break
state = next_state
# 计算回报和策略梯度
R = 0
policy_grads = []
for r in rewards[::-1]:
R = r + 0.99 * R
policy_grads.insert(0, R * (probs[action] - 0.5))
# 迭代优化
optimizer.zero_grad()
loss = torch.sum(torch.stack(policy_grads))
loss.backward()
optimizer.step()
total_rewards.append(np.sum(rewards))
return total_rewards
在这个示例中,我们实现了REINFORCE算法。定义了一个策略网络,在交互环境中采样和计算策略梯度,并通过反向传播更新网络参数,以找到最优策略。