1. 从倒立摆问题理解强化学习控制
在控制理论中,倒立摆问题一直被视为经典的控制难题。想象一下,你要用手指平衡一根直立的木棍——这需要根据木棍的倾斜角度和速度,实时调整手指的移动方向和力度。Acrobot问题可以看作是这个经典问题的"升级版",系统由两个相连的连杆组成,我们需要通过控制两个连杆之间的关节扭矩,让自由端摆动到目标高度。
这个看似简单的机械系统实际上包含了强化学习中的几个核心挑战:
- 状态空间连续:两个连杆的角度和角速度都是连续值
- 动作空间离散但影响连续:虽然只有三个离散动作(-1,0,+1扭矩),但每个动作都会对连续状态产生复杂影响
- 延迟奖励:只有在自由端达到目标高度时才会获得正奖励,之前的每一步都是负奖励
2. Acrobot系统详解
2.1 系统动力学建模
Acrobot系统可以用拉格朗日力学来描述。设:
- m₁,m₂:两个连杆的质量
- l₁,l₂:连杆长度
- θ₁,θ₂:绝对角度和相对角度
- τ:施加的扭矩(我们的控制输入)
系统的动力学方程可以表示为:
M(θ)θ̈ + C(θ,θ̇)θ̇ + G(θ) = [0; τ]其中M是惯性矩阵,C包含科里奥利力项,G是重力项。这个非线性方程表明,即使简单的双连杆系统,其动力学已经相当复杂。
2.2 观测空间解析
观测空间包含6个维度:
- cos(θ₁)和sin(θ₁):第一连杆角度的三角函数表示
- cos(θ₂)和sin(θ₂):相对角度的三角函数表示
- θ₁̇和θ₂̇:两个连杆的角速度
使用三角函数而非直接角度值有两个好处:
- 角度周期性:cos(θ+2π)=cosθ,避免了角度跳变问题
- 数值稳定性:保持在[-1,1]范围内,有利于神经网络训练
2.3 奖励函数设计
奖励函数看似简单(未达目标每步-1,达到目标0),但设计精妙:
- 稀疏奖励:只有终止状态有非负奖励
- 时间惩罚:鼓励尽快完成任务
- 阈值设计:-cosθ₁-cos(θ₁+θ₂)>1.0的终止条件对应自由端达到水平线以上
3. Actor-Critic算法原理
3.1 策略梯度与值函数的结合
传统策略梯度方法(如REINFORCE)有三个主要问题:
- 高方差:基于蒙特卡洛的回报估计方差大
- 低效:需要完整回合后才能更新
- 无基准:没有比较基准来判断动作好坏
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误差同时用于:
- 更新Critic:最小化δ²
- 更新Actor:∇J ≈ E[∇logπ(a|s) * δ]
3.3 算法流程详解
交互采样:
- 用当前策略π与环境交互,收集(s,a,r,s')样本
- 存储到经验回放缓冲区(可选)
Critic更新:
- 计算TD目标:y = r + γV(s')
- 最小化(V(s)-y)²
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) # 值函数头这种设计有三个优点:
- 参数效率:共享低层特征
- 训练稳定性:策略和价值函数共享特征表示
- 收敛速度:特征表示同时受两个目标监督
4.2 动作选择机制
动作选择包含两个关键步骤:
- 策略网络输出动作概率分布:
action_prob = F.softmax(self.actor(x), dim=1) - 按概率采样动作:
c = torch.distributions.Categorical(action_prob) action = c.sample()
这种设计既保持了探索性(通过采样),又能逐渐收敛到确定性策略(随着训练,概率分布会趋于尖锐)。
4.3 损失函数设计
总损失包含两部分:
- 策略损失(Actor):
log_prob = torch.log(action_prob.gather(1, actions)) actor_loss = -(log_prob * td_delta.detach()).mean() - 值函数损失(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 在线更新
原始实现使用在线更新(每回合更新):
- 优点:简单直接
- 缺点:样本效率低,序列相关性强
改进方案可以引入:
- 经验回放缓冲区
- 多步TD目标
- 并行环境采样
6. 实际训练观察
6.1 典型训练曲线
在300回合训练中,我们通常会观察到三个阶段:
- 探索期(0-50回合):奖励维持在-500左右,智能体随机探索
- 学习期(50-200回合):奖励快速提升,策略开始形成
- 收敛期(200+回合):奖励趋于稳定,策略微调
6.2 常见问题与解决
策略停滞:
- 现象:奖励长时间不提升
- 解决:增加探索率或调整学习率
训练不稳定:
- 现象:奖励剧烈波动
- 解决:减小学习率,增大批次大小
过早收敛:
- 现象:策略陷入局部最优
- 解决:增加熵正则项鼓励探索
7. 算法扩展与改进
7.1 优势Actor-Critic (A2C)
在基础AC上引入n步回报:
δ = rₜ + γrₜ₊₁ + ... + γⁿV(sₜ₊ₙ) - V(sₜ)平衡了MC和TD的优点。
7.2 异步优势Actor-Critic (A3C)
通过并行多个环境:
- 增加样本多样性
- 加速训练过程
- 提高探索效率
7.3 信任域方法 (TRPO/PPO)
解决AC训练不稳定的问题:
- 限制策略更新幅度
- 保证单调改进
- 更稳定的超参数敏感性
8. 应用场景延伸
虽然我们以Acrobot为例,但Actor-Critic适用于许多控制问题:
- 机器人控制:连续动作空间
- 游戏AI:星际争霸、DOTA等
- 自动驾驶:转向、油门控制
- 金融交易:投资组合管理
在实际工业应用中,通常需要考虑:
- 部分可观测性
- 延迟奖励
- 安全约束
- 实时性要求
9. 实操建议
对于初学者实现第一个Actor-Critic模型,建议:
- 从小环境开始(如CartPole)
- 使用简单网络结构(2-3层MLP)
- 监控训练过程(奖励曲线、策略变化)
- 逐步增加复杂度(如Acrobot)
- 善用可视化工具(渲染环境、参数直方图)
调试时可以关注:
- 梯度大小(避免消失/爆炸)
- 策略熵(保持适度探索)
- 值函数估计误差