1. 强化学习基础与决策智能范式
强化学习作为机器学习三大范式之一,其核心思想源于心理学中的行为主义理论。想象一下训练一只小狗:当它完成指定动作时给予零食奖励,做错时则不予奖励。经过多次尝试,小狗就能学会哪些行为能带来好处。强化学习算法正是基于这种"试错-反馈"机制,让AI系统通过与环境互动来自主学习最优决策策略。
1.1 强化学习的五大核心要素
每个强化学习系统都包含五个基本组成部分:
- 智能体(Agent):决策主体,相当于训练中的小狗
- 环境(Environment):智能体交互的外部世界,好比小狗生活的房间
- 状态(State):环境在特定时刻的描述,如"球在左边1米处"
- 动作(Action):智能体可以执行的行为,如"向左移动"
- 奖励(Reward):环境对动作的即时反馈,类似给小狗的零食
数学上,我们用以下符号表示这些要素:
- 智能体:A
- 环境:E
- 状态:sₜ ∈ S
- 动作:aₜ ∈ A
- 奖励:rₜ = R(sₜ, aₜ)
1.2 马尔可夫决策过程(MDP)
马尔可夫决策过程为强化学习提供了严格的数学框架。一个标准的MDP由五元组定义:(S, A, P, R, γ),其中:
- S:所有可能状态的集合(状态空间)
- A:所有可能动作的集合(动作空间)
- P(sₜ₊₁|sₜ, aₜ):状态转移概率,表示在状态sₜ执行动作aₜ后转移到状态sₜ₊₁的概率
- R(sₜ, aₜ):奖励函数,给出在状态sₜ执行动作aₜ的即时奖励
- γ ∈ [0,1]:折扣因子,决定未来奖励的现值
关键理解:折扣因子γ就像金融中的折现率,0.9的γ意味着1步后的1单位奖励现在只值0.9单位。这解决了无限时间序列的收敛问题。
1.3 贝尔曼方程与价值函数
贝尔曼方程是强化学习的核心数学工具,它描述了最优决策的递归性质。智能体寻求最大化期望回报Gₜ = Σγᵏrₜ₊ₖ₊₁,其中k从0到∞。
我们定义两个关键价值函数:
- 状态价值函数V^π(s):在策略π下从状态s开始的期望回报
- 动作价值函数Q^π(s,a):在策略π下从状态s执行动作a后的期望回报
贝尔曼方程告诉我们,当前状态的价值等于即时奖励加上折扣后的下一状态价值:
V^π(s) = Σπ(a|s)[R(s,a) + γΣP(s'|s,a)V^π(s')]
最优价值函数V*(s) = max_π V^π(s)满足贝尔曼最优方程:
V*(s) = max_a[R(s,a) + γΣP(s'|s,a)V*(s')]
2. 深度Q学习:价值学习的深度学习革命
2.1 从Q-learning到深度Q网络(DQN)
传统Q-learning使用表格存储每个状态-动作对的Q值,但在复杂环境中会遇到"维度灾难"——状态空间太大导致表格无法存储。2015年DeepMind的突破性工作将卷积神经网络与Q-learning结合,诞生了深度Q网络(DQN)。
DQN三大核心技术:
- 经验回放(Experience Replay):
python复制class ReplayBuffer:
def __init__(self, capacity):
self.buffer = deque(maxlen=capacity)
def push(self, state, action, reward, next_state, done):
self.buffer.append((state, action, reward, next_state, done))
def sample(self, batch_size):
batch = random.sample(self.buffer, batch_size)
return map(torch.stack, zip(*batch))
作用:打破序列相关性,提高数据效率,实现离线学习
- 目标网络(Target Network):
python复制# 主网络参数θ,目标网络参数θ_target
target_q_values = target_network(next_states).max(1)[0]
expected_q_values = rewards + gamma * target_q_values * (1 - dones)
# 每C步更新目标网络
if step_count % TARGET_UPDATE == 0:
target_network.load_state_dict(online_network.state_dict())
作用:稳定训练过程,解决非平稳目标问题
- 端到端像素输入:
- 原始Atari游戏图像(210×160×3)
- 预处理为(84×84×4)的灰度堆叠帧
- 4帧堆叠提供时间动态信息
2.2 DQN算法家族演进
2.2.1 Double DQN
解决传统DQN的过估计问题:
Y_t^DoubleDQN = r_t + γQ(s_{t+1}, argmax_a Q(s_{t+1},a;θ_t); θ_t^-)
2.2.2 Dueling DQN
网络架构创新,将Q值分解为:
Q(s,a) = V(s) + (A(s,a) - mean_a'A(s,a'))
2.2.3 Rainbow DQN
整合六项改进:
- Double DQN
- Dueling架构
- 优先级经验回放
- 多步学习
- 分布式RL
- 噪声网络探索
DQN变体性能对比:
| 算法 | Breakout | Pong | Space Invaders | Seaquest | 相对性能 |
|---|---|---|---|---|---|
| DQN原始 | 100% | 100% | 100% | 100% | 1.00× |
| Double DQN | 312% | 109% | 152% | 180% | 1.38× |
| Dueling DQN | 288% | 118% | 187% | 249% | 1.47× |
| Rainbow DQN | 401% | 131% | 208% | 431% | 2.01× |
2.3 DQN的局限性
- 连续动作空间处理困难:离散化导致维度灾难
- 间接策略优化:先学价值函数再推导策略
- 样本效率低:Atari游戏需数千万帧经验
3. 策略梯度方法:直接策略搜索
3.1 策略梯度定理
直接参数化策略π_θ(a|s),通过梯度上升优化期望回报J(θ)=E_τ∼π_θ[R(τ)]。
策略梯度定理:
∇_θ J(θ) = E[Σ∇_θ log π_θ(a_t|s_t)Φ_t]
其中Φ_t可以是:
- 轨迹总回报:Σγ^{k-t}r_k
- 动作价值函数:Q^π(s_t,a_t)
- 优势函数:A^π(s_t,a_t)=Q^π(s_t,a_t)-V^π(s_t)
3.2 REINFORCE算法
最基本的策略梯度算法:
python复制class REINFORCE:
def update(self, trajectories):
losses = []
for states, actions, returns in trajectories:
action_dist = self.policy(states)
log_probs = action_dist.log_prob(actions)
loss = -(log_probs * returns).mean()
losses.append(loss)
total_loss = torch.stack(losses).mean()
self.optimizer.zero_grad()
total_loss.backward()
self.optimizer.step()
问题:高方差、样本效率低、收敛慢
3.3 减少方差的技术
- 基线方法:从回报中减去基线b(s_t)
- 因果性:未来动作不影响过去奖励
- 广义优势估计(GAE):
Â_t^GAE = Σ(γλ)^l δ_{t+l}
其中δ_t = r_t + γV(s_{t+1}) - V(s_t)
4. Actor-Critic家族
4.1 基本架构
结合价值函数和策略梯度:
- Actor:策略网络π_θ(a|s),负责选择动作
- Critic:价值网络V_ϕ(s)或Q_ϕ(s,a),评估状态/动作价值
python复制class ActorCritic(nn.Module):
def __init__(self, state_dim, action_dim):
super().__init__()
self.actor = nn.Sequential(
nn.Linear(state_dim, 256),
nn.ReLU(),
nn.Linear(256, action_dim * 2) # 均值和标准差
)
self.critic = nn.Sequential(
nn.Linear(state_dim, 256),
nn.ReLU(),
nn.Linear(256, 1)
)
4.2 A2C与A3C
A2C更新:
python复制def a2c_update(states, actions, rewards, next_states, dones):
values = critic(states)
next_values = critic(next_states)
targets = rewards + gamma * next_values * (1 - dones)
critic_loss = F.mse_loss(values, targets.detach())
advantages = targets - values.detach()
actor_loss = -(log_probs * advantages).mean()
return actor_loss + 0.5 * critic_loss
A3C特点:多个并行工作者异步更新全局网络
4.3 TRPO与PPO
PPO-Clip算法:
python复制def ppo_clip_loss(old_log_probs, new_log_probs, advantages, epsilon=0.2):
ratio = torch.exp(new_log_probs - old_log_probs)
surr1 = ratio * advantages
surr2 = torch.clamp(ratio, 1-epsilon, 1+epsilon) * advantages
return -torch.min(surr1, surr2).mean()
PPO算法流程:
- 收集轨迹数据
- 计算优势估计(GAE)
- 多轮小批量更新
- 更新价值函数
- 重复直到收敛
4.4 SAC与TD3
SAC关键特点:
- 最大熵框架:J(π)=E[Σ(r_t + αH(π(·|s_t)))]
- 自动调节温度系数α
- 两个Q网络减少过估计
TD3三大改进:
- 两个Critic网络取最小值
- 延迟策略更新
- 目标策略平滑
5. 算法比较与应用
5.1 性能对比
Mujoco连续控制基准:
| 算法 | HalfCheetah | Walker2d | Ant | Humanoid | 样本效率 |
|---|---|---|---|---|---|
| DDPG | 1,115 | 1,200 | 687 | 312 | 中等 |
| PPO | 1,210 | 1,385 | 745 | 425 | 高 |
| SAC | 1,450 | 1,520 | 1,125 | 658 | 高 |
5.2 实战:PPO训练CartPole
python复制class PPOCartPoleAgent:
def __init__(self):
self.env = gym.make("CartPole-v1")
self.policy_net = nn.Sequential(
nn.Linear(4, 64), nn.Tanh(),
nn.Linear(64, 2), nn.Softmax(dim=-1)
)
self.value_net = nn.Sequential(
nn.Linear(4, 64), nn.Tanh(),
nn.Linear(64, 1)
)
def update(self, batch, epsilon=0.2):
states, actions, returns = batch
returns = (returns - returns.mean()) / (returns.std() + 1e-8)
with torch.no_grad():
old_probs = self.policy_net(states)
old_log_probs = Categorical(old_probs).log_prob(actions)
values = self.value_net(states).squeeze()
advantages = returns - values
for _ in range(10): # 多轮更新
current_probs = self.policy_net(states)
current_log_probs = Categorical(current_probs).log_prob(actions)
ratio = torch.exp(current_log_probs - old_log_probs)
surr1 = ratio * advantages
surr2 = torch.clamp(ratio, 1-epsilon, 1+epsilon) * advantages
policy_loss = -torch.min(surr1, surr2).mean()
value_loss = F.mse_loss(self.value_net(states).squeeze(), returns)
loss = policy_loss + 0.5 * value_loss
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
5.3 应用领域
- 游戏AI:AlphaGo、OpenAI Five
- 机器人控制:波士顿动力机器人
- 自动驾驶:CARLA仿真环境
- 资源管理:数据中心能耗优化
6. 前沿挑战与未来方向
6.1 当前挑战
- 样本效率:现实世界交互成本高
- 探索利用权衡:稀疏奖励环境
- 安全鲁棒性:分布外泛化能力
6.2 新兴方向
- 元强化学习:学习如何学习
- 多智能体RL:合作与竞争
- 分层RL:时间抽象与技能重用
- 与LLM融合:语言指导的RL
在实际项目中,选择算法需要考虑任务特性:
- 离散动作空间:DQN系列
- 连续控制:PPO、SAC
- 样本效率关键:结合模仿学习
- 安全敏感:约束RL方法
强化学习正从游戏走向现实应用,虽然挑战仍存,但其让AI自主学习的核心思想将继续推动人工智能前沿发展。