什么是策略梯度方法?

策略梯度方法(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算法。定义了一个策略网络,在交互环境中采样和计算策略梯度,并通过反向传播更新网络参数,以找到最优策略。