强化学习中的Actor-Critic算法与倒立摆控制
2026/7/26 5:24:57 网站建设 项目流程

1. 从倒立摆问题理解强化学习控制

在控制理论中,倒立摆问题一直被视为经典的控制难题。想象一下,你要用手指平衡一根直立的木棍——这需要根据木棍的倾斜角度和速度,实时调整手指的移动方向和力度。Acrobot问题可以看作是这个经典问题的"升级版",系统由两个相连的连杆组成,我们需要通过控制两个连杆之间的关节扭矩,让自由端摆动到目标高度。

这个看似简单的机械系统实际上包含了强化学习中的几个核心挑战:

  • 状态空间连续:两个连杆的角度和角速度都是连续值
  • 动作空间离散但影响连续:虽然只有三个离散动作(-1,0,+1扭矩),但每个动作都会对连续状态产生复杂影响
  • 延迟奖励:只有在自由端达到目标高度时才会获得正奖励,之前的每一步都是负奖励

2. Acrobot系统详解

2.1 系统动力学建模

Acrobot系统可以用拉格朗日力学来描述。设:

  • m₁,m₂:两个连杆的质量
  • l₁,l₂:连杆长度
  • θ₁,θ₂:绝对角度和相对角度
  • τ:施加的扭矩(我们的控制输入)

系统的动力学方程可以表示为:

M(θ)θ̈ + C(θ,θ̇)θ̇ + G(θ) = [0; τ]

其中M是惯性矩阵,C包含科里奥利力项,G是重力项。这个非线性方程表明,即使简单的双连杆系统,其动力学已经相当复杂。

2.2 观测空间解析

观测空间包含6个维度:

  1. cos(θ₁)和sin(θ₁):第一连杆角度的三角函数表示
  2. cos(θ₂)和sin(θ₂):相对角度的三角函数表示
  3. θ₁̇和θ₂̇:两个连杆的角速度

使用三角函数而非直接角度值有两个好处:

  1. 角度周期性:cos(θ+2π)=cosθ,避免了角度跳变问题
  2. 数值稳定性:保持在[-1,1]范围内,有利于神经网络训练

2.3 奖励函数设计

奖励函数看似简单(未达目标每步-1,达到目标0),但设计精妙:

  • 稀疏奖励:只有终止状态有非负奖励
  • 时间惩罚:鼓励尽快完成任务
  • 阈值设计:-cosθ₁-cos(θ₁+θ₂)>1.0的终止条件对应自由端达到水平线以上

3. Actor-Critic算法原理

3.1 策略梯度与值函数的结合

传统策略梯度方法(如REINFORCE)有三个主要问题:

  1. 高方差:基于蒙特卡洛的回报估计方差大
  2. 低效:需要完整回合后才能更新
  3. 无基准:没有比较基准来判断动作好坏

Actor-Critic通过引入Critic网络解决了这些问题:

  • Actor(策略网络):学习策略π(a|s),负责生成动作
  • Critic(值函数网络):估计V(s)或Q(s,a),提供基准

3.2 优势函数与TD误差

关键创新是使用优势函数A(s,a)=Q(s,a)-V(s)来评估动作好坏。在实践中,我们常用TD误差δ作为优势函数的估计:

δ = r + γV(s') - V(s)

这个TD误差同时用于:

  1. 更新Critic:最小化δ²
  2. 更新Actor:∇J ≈ E[∇logπ(a|s) * δ]

3.3 算法流程详解

  1. 交互采样:

    • 用当前策略π与环境交互,收集(s,a,r,s')样本
    • 存储到经验回放缓冲区(可选)
  2. Critic更新:

    • 计算TD目标:y = r + γV(s')
    • 最小化(V(s)-y)²
  3. Actor更新:

    • 计算策略梯度:∇J = ∇logπ(a|s) * δ
    • 沿梯度方向更新策略参数

4. 网络架构与实现细节

4.1 共享特征提取器

我们的实现使用共享的前馈层:

self.fc1 = nn.Linear(input_dim, 128) self.fc2 = nn.Linear(128, 128)

然后分支出两个头:

self.actor = nn.Linear(128, output_dim) # 策略头 self.critic = nn.Linear(128, 1) # 值函数头

这种设计有三个优点:

  1. 参数效率:共享低层特征
  2. 训练稳定性:策略和价值函数共享特征表示
  3. 收敛速度:特征表示同时受两个目标监督

4.2 动作选择机制

动作选择包含两个关键步骤:

  1. 策略网络输出动作概率分布:
    action_prob = F.softmax(self.actor(x), dim=1)
  2. 按概率采样动作:
    c = torch.distributions.Categorical(action_prob) action = c.sample()

这种设计既保持了探索性(通过采样),又能逐渐收敛到确定性策略(随着训练,概率分布会趋于尖锐)。

4.3 损失函数设计

总损失包含两部分:

  1. 策略损失(Actor):
    log_prob = torch.log(action_prob.gather(1, actions)) actor_loss = -(log_prob * td_delta.detach()).mean()
  2. 值函数损失(Critic):
    critic_loss = F.mse_loss(state_value, td_target).mean()

最终损失是加权和:

loss = actor_loss + critic_loss * 0.5

这个0.5的权重是超参数,用于平衡两个损失的量级。

5. 训练技巧与调优

5.1 学习率设置

Actor和Critic通常需要不同的学习率:

  • Critic学习率可以稍大(如1e-3),因为值函数学习通常更容易
  • Actor学习率应该较小(如5e-4),避免策略变化过快

在实践中,可以使用Adam优化器自动调整。

5.2 折扣因子γ的选择

γ控制未来奖励的重要性:

  • γ接近1:考虑长期回报,但可能导致训练不稳定
  • γ较小:注重即时奖励,训练稳定但可能短视

对于Acrobot,γ=0.99是一个合理的起点。

5.3 经验回放 vs 在线更新

原始实现使用在线更新(每回合更新):

  • 优点:简单直接
  • 缺点:样本效率低,序列相关性强

改进方案可以引入:

  1. 经验回放缓冲区
  2. 多步TD目标
  3. 并行环境采样

6. 实际训练观察

6.1 典型训练曲线

在300回合训练中,我们通常会观察到三个阶段:

  1. 探索期(0-50回合):奖励维持在-500左右,智能体随机探索
  2. 学习期(50-200回合):奖励快速提升,策略开始形成
  3. 收敛期(200+回合):奖励趋于稳定,策略微调

6.2 常见问题与解决

  1. 策略停滞:

    • 现象:奖励长时间不提升
    • 解决:增加探索率或调整学习率
  2. 训练不稳定:

    • 现象:奖励剧烈波动
    • 解决:减小学习率,增大批次大小
  3. 过早收敛:

    • 现象:策略陷入局部最优
    • 解决:增加熵正则项鼓励探索

7. 算法扩展与改进

7.1 优势Actor-Critic (A2C)

在基础AC上引入n步回报:

δ = rₜ + γrₜ₊₁ + ... + γⁿV(sₜ₊ₙ) - V(sₜ)

平衡了MC和TD的优点。

7.2 异步优势Actor-Critic (A3C)

通过并行多个环境:

  1. 增加样本多样性
  2. 加速训练过程
  3. 提高探索效率

7.3 信任域方法 (TRPO/PPO)

解决AC训练不稳定的问题:

  • 限制策略更新幅度
  • 保证单调改进
  • 更稳定的超参数敏感性

8. 应用场景延伸

虽然我们以Acrobot为例,但Actor-Critic适用于许多控制问题:

  1. 机器人控制:连续动作空间
  2. 游戏AI:星际争霸、DOTA等
  3. 自动驾驶:转向、油门控制
  4. 金融交易:投资组合管理

在实际工业应用中,通常需要考虑:

  • 部分可观测性
  • 延迟奖励
  • 安全约束
  • 实时性要求

9. 实操建议

对于初学者实现第一个Actor-Critic模型,建议:

  1. 从小环境开始(如CartPole)
  2. 使用简单网络结构(2-3层MLP)
  3. 监控训练过程(奖励曲线、策略变化)
  4. 逐步增加复杂度(如Acrobot)
  5. 善用可视化工具(渲染环境、参数直方图)

调试时可以关注:

  • 梯度大小(避免消失/爆炸)
  • 策略熵(保持适度探索)
  • 值函数估计误差

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询