深度解析actor-critic网络的参数更新与损失函数设计

1次阅读
没有评论

共计 2141 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景介绍

Actor-Critic(AC)网络是强化学习中结合了策略梯度(Policy Gradient)和价值函数(Value Function)的混合架构。它通过两个核心组件协同工作:

深度解析 actor-critic 网络的参数更新与损失函数设计

  • Actor:负责根据当前状态选择动作(策略函数 π(a|s))
  • Critic:评估状态或状态 - 动作对的价值(价值函数 V(s) 或 Q(s,a))

相比纯策略梯度方法,AC 框架的显著优势在于:
1. 通过 Critic 的即时反馈降低策略更新的方差
2. 允许单步更新而非等待完整 episode 结束
3. 天然支持连续动作空间问题

核心概念与参数更新

1. TD 误差的核心作用

时间差分误差(Temporal Difference Error)是连接 Actor 和 Critic 的桥梁:

δ_t = r_t + γV(s_{t+1}) - V(s_t)

其中 γ 为折扣因子。这个误差信号同时用于:

  • Critic 更新 :最小化 TD 误差的平方(MSE)
  • Actor 更新 :作为策略梯度的权重系数

2. 双网络更新流程

典型 AC 算法的参数更新分为两个并行分支:

  1. Critic 更新 (价值函数逼近)
  2. 目标:使 V(s) 准确预测回报的期望值
  3. 更新公式:

    θ_v ← θ_v + α_v δ_t ∇_{θ_v}V(s_t)

  4. Actor 更新 (策略优化)

  5. 目标:最大化预期回报
  6. 更新公式:
    θ_π ← θ_π + α_π δ_t ∇_{θ_π}log π(a_t|s_t)

损失函数设计对比

不同损失函数对训练稳定性的影响显著:

损失函数 公式 适用场景
MSE (δ_t)^2 低噪声环境
Huber {0.5δ^2 if |δ|<1, |δ|-0.5 otherwise} 异常值较多的环境
LogCosh log(cosh(δ_t)) 需要平滑梯度的场景

代码实现(PyTorch 版)

import torch
import torch.optim as optim
import torch.nn.functional as F

class ActorCritic(torch.nn.Module):
    def __init__(self, state_dim, action_dim):
        super().__init__()
        # Shared feature extractor
        self.fc1 = nn.Linear(state_dim, 64)

        # Actor head
        self.actor = nn.Linear(64, action_dim)

        # Critic head
        self.critic = nn.Linear(64, 1)

    def forward(self, x):
        x = F.relu(self.fc1(x))
        return F.softmax(self.actor(x), dim=-1), self.critic(x)

# 训练循环关键片段
def update(batch):
    states, actions, rewards, next_states, dones = batch

    # 计算 TD 误差
    with torch.no_grad():
        _, next_values = model(next_states)
        targets = rewards + gamma * next_values * (1 - dones)

    # Critic 损失
    _, values = model(states)
    critic_loss = F.huber_loss(values, targets)

    # Actor 更新
    probs, _ = model(states)
    log_probs = torch.log(probs.gather(1, actions))
    actor_loss = -(log_probs * (targets - values).detach()).mean()

    # 联合优化
    optimizer.zero_grad()
    (critic_loss + actor_loss).backward()
    torch.nn.utils.clip_grad_norm_(model.parameters(), 0.5)
    optimizer.step()

实用训练技巧

  1. 参数初始化
  2. Actor 最后一层用较小标准差的正态初始化(如 0.01)
  3. Critic 最后一层初始化为接近 0 的值

  4. 学习率设置

  5. 典型比例:α_actor ≈ α_critic/10
  6. 建议使用 Adam 优化器默认参数

  7. 梯度处理

  8. 对 Actor 梯度进行裁剪(norm=0.5~1.0)
  9. Critic 梯度可适当放宽限制

常见问题与解决方案

  1. 训练不稳定
  2. 现象:回报曲线剧烈波动
  3. 对策:降低学习率、增大 batch size、改用 Huber 损失

  4. 策略过早收敛

  5. 现象:Agent 重复相同动作
  6. 对策:增加熵正则项、尝试不同的探索策略

  7. 价值函数过估计

  8. 现象:Critic 预测值持续高于实际回报
  9. 对策:实现 Target Network、使用 Double Q-learning 技巧

性能优化考量

  • Batch Size 选择
  • 小 batch(32-64):适合简单环境
  • 大 batch(256+):需要配合学习率热身

  • 网络结构设计

  • 共享底层特征提取层可提升样本效率
  • 对视觉输入建议使用 CNN 作为共享底层

开放性问题

  1. 如何设计适用于高维动作空间的 Actor 输出层结构?
  2. 在多智能体场景下,AC 框架需要做哪些关键修改?
  3. 当遭遇稀疏奖励问题时,哪些改进策略可能有效?

通过系统性地调整这些组件,开发者可以构建出适应不同场景的高效 AC 算法。实际应用中建议从简单环境开始验证,逐步增加复杂度观察训练行为的变化规律。

正文完
 0
评论(没有评论)