Actor-Critic 是一种结合了策略优化(Policy Gradient)和价值函数近似的强化学习算法。它通过同时训练一个 Actor(策略网络) 和一个 Critic(价值网络) 来改进学习效率和稳定性。
核心思想
-
Actor:
- 负责生成动作,直接表示策略 ,即在给定状态 s 下选择动作 a 的概率分布。
- Actor 的目标是通过策略梯度法最大化累计回报。
-
Critic:
- 负责评估 Actor 的动作质量,使用状态值函数 或动作-状态值函数 。
- Critic 提供 Actor 的优化方向。
-
协作:
- Actor 使用 Critic 提供的值函数或优势函数(Advantage Function)来改进策略。
- Critic 通过 Actor 的采样结果更新值函数。
算法流程
1. 初始化
- 初始化 Actor 的策略参数 。
- 初始化 Critic 的价值参数
2. 交替更新
-
采样:
- 使用 Actor 的策略 在环境中采样得到轨迹 。
-
Critic 更新:
-
计算目标值 :
-
最小化 Critic 的损失:
-
-
Actor 更新:
-
计算 Advantage Function(优势函数):
-
使用策略梯度法更新 Actor 的参数:
-
-
重复以上步骤,直至收敛。
优势与改进
优点
- 结合策略优化与值函数近似 :
- 提高了策略更新的稳定性。
- 连续动作空间 :
- 适用于离散和连续动作空间。
缺点
- 高方差问题 :
- 策略梯度方法固有的方差问题可能影响收敛。
- 价值函数的估计偏差 :
- Critic 的值函数估计误差可能影响策略优化。
改进方法
- A3C(Asynchronous Advantage Actor-Critic) :
- 多线程并行更新,提升学习效率。
- PPO(Proximal Policy Optimization) :
- 引入限制更新步幅的机制,改进稳定性。
- SAC(Soft Actor-Critic) :
- 最大化策略熵,提升探索能力。
Python 示例
以下是一个简单的 Actor-Critic 框架示例(伪代码):
python
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
# 定义 Actor 网络
class Actor(nn.Module):
def __init__(self, state_dim, action_dim):
super(Actor, self).__init__()
self.fc = nn.Sequential(
nn.Linear(state_dim, 128),
nn.ReLU(),
nn.Linear(128, action_dim),
nn.Softmax(dim=-1)
)
def forward(self, state):
return self.fc(state)
# 定义 Critic 网络
class Critic(nn.Module):
def __init__(self, state_dim):
super(Critic, self).__init__()
self.fc = nn.Sequential(
nn.Linear(state_dim, 128),
nn.ReLU(),
nn.Linear(128, 1)
)
def forward(self, state):
return self.fc(state)
# 初始化环境和参数
state_dim = 4
action_dim = 2
actor = Actor(state_dim, action_dim)
critic = Critic(state_dim)
actor_optimizer = optim.Adam(actor.parameters(), lr=1e-3)
critic_optimizer = optim.Adam(critic.parameters(), lr=1e-3)
# 训练循环
for episode in range(1000):
state = env.reset()
while not done:
# Actor 选择动作
state_tensor = torch.tensor(state, dtype=torch.float32)
action_probs = actor(state_tensor)
action = np.random.choice(action_dim, p=action_probs.detach().numpy())
# 交互环境
next_state, reward, done, _ = env.step(action)
# 计算 Advantage
state_value = critic(state_tensor)
next_state_tensor = torch.tensor(next_state, dtype=torch.float32)
next_state_value = critic(next_state_tensor)
advantage = reward + gamma * next_state_value - state_value
# 更新 Critic
critic_loss = advantage.pow(2).mean()
critic_optimizer.zero_grad()
critic_loss.backward()
critic_optimizer.step()
# 更新 Actor
log_prob = torch.log(action_probs[action])
actor_loss = -(log_prob * advantage.detach())
actor_optimizer.zero_grad()
actor_loss.backward()
actor_optimizer.step()
state = next_state
应用场景
- 机器人控制 :
- 用于机械臂、移动机器人等连续控制任务。
- 游戏 AI :
- 复杂决策场景,如棋牌或模拟游戏。
- 自动驾驶 :
- 强化学习中的路径规划或驾驶决策模块。
Actor-Critic 是强化学习中的一个重要框架,通过组合策略优化与价值函数评估,实现了高效的策略学习。针对实际问题的具体需求,可以进一步结合改进算法来提高性能和适用性。