1. 从监督学习到强化学习的思维跃迁
最近在重温《神经网络与深度学习》这本经典教材时,我产生了一个有趣的实践想法:如何将传统的监督学习模型改造成强化学习系统。这个灵感来源于吴恩达教授课程中提到的月球着陆车案例,让我意识到神经网络的应用场景远比想象中广泛。
1.1 基础模型的选择与改造
我决定从最基础的MNIST手写数字识别项目开始。这个经典的监督学习案例使用28×28像素的灰度图像作为输入,输出是0-9十个数字的概率分布。在PyTorch中,一个简单的实现可能长这样:
python复制class MNISTNet(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(28*28, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = x.view(-1, 28*28)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return F.log_softmax(x, dim=1)
这个模型的改造思路非常清晰:输入层需要从784(28×28)个节点调整为8个(对应月球车的8个状态参数),输出层从10个节点减少到4个(对应4种可能的动作)。更关键的是损失函数的变化——从交叉熵损失变为能够反映动作价值的奖励函数。
1.2 状态空间与动作空间的设计
月球着陆车的8个状态参数通常包括:
- x轴位置
- y轴高度
- x轴速度
- y轴速度
- 倾斜角度
- 角速度
- 左腿触地状态
- 右腿触地状态
而4个基本动作可以是:
- 不操作
- 向左喷射
- 主引擎喷射
- 向右喷射
提示:在设计状态空间时,要确保各参数的数值范围相近,必要时进行归一化处理。比如位置坐标和速度值可能相差几个数量级,这会导致训练困难。
2. 强化学习框架的搭建
2.1 从监督到强化的关键转变
监督学习和强化学习最本质的区别在于反馈信号的类型。在MNIST案例中,我们使用明确的标签(这张图片是数字几)作为监督信号;而在强化学习中,我们获得的是环境反馈的奖励信号,这个信号通常是稀疏的、延迟的,且不一定与每个动作直接相关。
实现这个转变需要以下几个组件:
- 环境模拟器(模拟月球着陆场景)
- 经验回放缓冲区(存储状态-动作-奖励序列)
- 策略网络(决定在给定状态下采取什么动作)
- 目标网络(用于稳定训练)
2.2 DQN算法的实现要点
深度Q网络(DQN)是入门强化学习的不错选择。与监督学习相比,有几个关键区别:
- 损失函数计算:
python复制# 监督学习
loss = F.cross_entropy(output, target)
# DQN
current_q = net(state).gather(1, action)
max_next_q = target_net(next_state).max(1)[0].detach()
expected_q = reward + gamma * max_next_q
loss = F.mse_loss(current_q, expected_q)
- 训练循环差异:
- 监督学习:固定数据集,多次epoch
- 强化学习:与环境持续交互,在线学习
- 探索机制:
必须引入ε-greedy等策略平衡探索与利用
3. 实战中的挑战与解决方案
3.1 奖励函数的设计艺术
月球着陆车的奖励函数设计是个精细活。太简单的奖励(如成功着陆+1,坠毁-1)会导致学习信号过于稀疏;太复杂的奖励又可能引导出非预期的行为。我尝试过的几种方案:
- 基础版本:
python复制reward = 0
if crashed:
reward = -100
elif landed:
reward = +100
else:
reward = -0.1 # 鼓励尽快着陆
- 改进版本:
python复制# 鼓励平稳下降
reward = -abs(vertical_speed) * 0.1
# 鼓励保持直立
reward -= abs(angle) * 0.05
# 成功奖励
if landed_safely:
reward += 100
3.2 超参数调优经验
经过多次实验,我发现这些参数组合效果较好:
- 学习率:3e-4(比监督学习通常要小)
- 批大小:128
- γ折扣因子:0.99
- ε衰减:从1.0到0.01线性衰减10000步
- 目标网络更新频率:每100步同步一次
注意:强化学习对超参数比监督学习敏感得多。建议先用小规模实验快速验证参数效果,再扩大训练规模。
4. 训练技巧与性能优化
4.1 训练不稳定的应对策略
在早期训练中,我遇到了几个典型问题:
-
Q值爆炸:
解决方案:梯度裁剪(torch.nn.utils.clip_grad_norm_(net.parameters(), 10)) -
策略震荡:
解决方案:增大经验回放缓冲区(从1万增加到10万) -
学习停滞:
解决方案:实现Double DQN,减少过高估计
4.2 可视化监控方案
为了实时了解训练状态,我设置了几个关键指标的可视化:
- 每回合总奖励(滑动平均)
- 平均Q值
- ε值变化
- 关键状态分布
使用TensorBoard可以方便地监控这些指标:
python复制from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
writer.add_scalar('train/reward', episode_reward, global_step)
5. 从理论到实践的思考
在完成这个项目后,我对强化学习有了更深刻的认识:
-
样本效率问题:同样"学会"一个任务,强化学习需要的样本量往往是监督学习的数百倍。这要求我们更智能地设计探索策略。
-
奖励塑形的重要性:好的奖励函数应该像教小孩走路一样,将最终目标分解为多个可渐进达成的小目标。
-
工程实现的挑战:强化学习系统涉及更多移动部件(环境模拟、经验回放、多网络交互等),调试起来更复杂。
这个项目最让我惊喜的是,通过改造一个简单的全连接网络,就能实现从静态图像分类到动态决策控制的跨越。虽然现在的智能体还不够完美,但看到它从完全随机动作到能够勉强着陆的进步过程,确实令人振奋。
