人工智能【第33篇】强化学习入门:让AI学会做决策
作者的话在之前的文章中我们学习了监督学习有标签数据和无监督学习无标签数据。但还有一种更强大的学习方式——强化学习Reinforcement Learning。AlphaGo击败李世石、OpenAI Five战胜DOTA2职业选手、ChatGPT的训练都离不开强化学习。本文将带你从零开始理解强化学习的核心概念、经典算法并实现一个让AI自动玩CartPole的智能体。让我们一起探索这个让AI真正学会思考的领域一、什么是强化学习1.1 强化学习的定义强化学习Reinforcement Learning, RL是一种通过与环境交互来学习最优行为策略的机器学习方法。核心思想智能体Agent在环境Environment中执行动作Action环境返回奖励Reward和新的状态State智能体的目标最大化累积奖励与监督学习的区别特性监督学习强化学习数据有标签的数据集无标签通过与环境交互获得反馈即时、正确延迟、稀疏、可能不准确目标拟合输入-输出映射最大化长期累积奖励决策单步预测多步序列决策1.2 强化学习的应用场景应用领域典型案例说明游戏AIAlphaGo、OpenAI Five在复杂游戏中超越人类机器人控制波士顿动力Atlas行走、跳跃、后空翻自动驾驶Waymo、Tesla路径规划、决策控制推荐系统抖音、淘宝推荐优化用户长期留存大语言模型ChatGPT的RLHF人类反馈强化学习1.3 强化学习的核心要素关键概念概念符号说明状态s环境在某一时刻的完整描述动作a智能体可以采取的行为奖励r环境对动作的即时反馈策略π从状态到动作的映射函数价值函数V(s)从状态s开始的期望累积奖励Q函数Q(s,a)在状态s采取动作a的期望累积奖励1.4 强化学习的数学基础马尔可夫决策过程MDP强化学习问题通常建模为马尔可夫决策过程MDP (S, A, P, R, γ) 其中 S状态空间 A动作空间 P(s|s,a)状态转移概率 R(s,a)奖励函数 γ折扣因子0 ≤ γ 1累积奖励ReturnG_t r_{t1} γ * r_{t2} γ² * r_{t3} ...贝尔曼方程状态价值函数V^π(s) E[r_{t1} γ * V^π(s_{t1}) | s_t s]动作价值函数Q函数Q^π(s,a) E[r_{t1} γ * Q^π(s_{t1}, a_{t1}) | s_ts, a_ta]二、经典强化学习算法2.1 算法分类强化学习算法 ├── 基于价值Value-Based │ ├── Q-Learning │ └── DQN ├── 基于策略Policy-Based │ ├── REINFORCE │ └── PPO └── 基于模型Model-Based2.2 Q-Learning价值学习的基石核心思想学习一个动作价值函数Q(s,a)表示在状态s下采取动作a的好坏。Q-Learning更新规则Q(s,a) ← Q(s,a) α * [r γ * max(Q(s, a)) - Q(s,a)] 其中 α学习率 γ折扣因子 max(Q(s, a))下一状态的最大Q值ε-贪心策略def epsilon_greedy_action(Q, state, epsilon, n_actions): ε-贪心策略 - 以ε的概率随机选择动作探索 - 以1-ε的概率选择Q值最大的动作利用 if np.random.random() epsilon: return np.random.randint(n_actions) # 探索 else: return np.argmax(Q[state]) # 利用2.3 DQN深度Q网络问题传统Q-Learning使用表格存储Q值无法处理连续或大规模状态空间。解决方案使用神经网络近似Q函数。DQN的创新经验回放Experience Replay打破数据相关性目标网络Target Network稳定训练目标DQN网络结构import torch import torch.nn as nn import torch.nn.functional as F class DQN(nn.Module): 深度Q网络 输入: 状态向量 输出: 每个动作的Q值 def __init__(self, state_dim, action_dim, hidden_dim128): super(DQN, self).__init__() self.fc1 nn.Linear(state_dim, hidden_dim) self.fc2 nn.Linear(hidden_dim, hidden_dim) self.fc3 nn.Linear(hidden_dim, action_dim) def forward(self, x): x F.relu(self.fc1(x)) x F.relu(self.fc2(x)) return self.fc3(x) # 输出每个动作的Q值经验回放缓冲区from collections import deque import random class ReplayBuffer: 经验回放缓冲区 def __init__(self, capacity100000): self.buffer deque(maxlencapacity) 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) states, actions, rewards, next_states, dones zip(*batch) return ( torch.FloatTensor(states), torch.LongTensor(actions), torch.FloatTensor(rewards), torch.FloatTensor(next_states), torch.FloatTensor(dones) ) def __len__(self): return len(self.buffer)DQN智能体class DQNAgent: DQN智能体 def __init__(self, state_dim, action_dim, lr1e-3, gamma0.99, epsilon1.0, epsilon_decay0.995, epsilon_min0.01): self.state_dim state_dim self.action_dim action_dim self.gamma gamma self.epsilon epsilon self.epsilon_decay epsilon_decay self.epsilon_min epsilon_min # 策略网络和目标网络 self.policy_net DQN(state_dim, action_dim) self.target_net DQN(state_dim, action_dim) self.target_net.load_state_dict(self.policy_net.state_dict()) self.optimizer torch.optim.Adam(self.policy_net.parameters(), lrlr) self.memory ReplayBuffer(capacity100000) def select_action(self, state): ε-贪心策略选择动作 if np.random.random() self.epsilon: return np.random.randint(self.action_dim) with torch.no_grad(): state torch.FloatTensor(state).unsqueeze(0) q_values self.policy_net(state) return q_values.argmax().item() def learn(self, batch_size64): 学习更新网络 if len(self.memory) batch_size: return # 采样 states, actions, rewards, next_states, dones self.memory.sample(batch_size) # 当前Q值 current_q self.policy_net(states).gather(1, actions.unsqueeze(1)).squeeze(1) # 目标Q值Double DQN with torch.no_grad(): next_actions self.policy_net(next_states).argmax(1) next_q self.target_net(next_states).gather(1, next_actions.unsqueeze(1)).squeeze(1) target_q rewards self.gamma * next_q * (1 - dones) # 计算损失 loss F.mse_loss(current_q, target_q) # 反向传播 self.optimizer.zero_grad() loss.backward() self.optimizer.step() return loss.item()2.4 Policy Gradient直接优化策略核心思想直接参数化策略π(a|s)通过梯度上升优化策略。class PolicyNetwork(nn.Module): 策略网络输出动作的概率分布 def __init__(self, state_dim, action_dim, hidden_dim128): super(PolicyNetwork, self).__init__() self.fc1 nn.Linear(state_dim, hidden_dim) self.fc2 nn.Linear(hidden_dim, hidden_dim) self.fc3 nn.Linear(hidden_dim, action_dim) def forward(self, x): x F.relu(self.fc1(x)) x F.relu(self.fc2(x)) x self.fc3(x) return F.softmax(x, dim-1) def select_action(self, state): with torch.no_grad(): state torch.FloatTensor(state).unsqueeze(0) probs self.forward(state) dist torch.distributions.Categorical(probs) action dist.sample() return action.item(), dist.log_prob(action)三、实战项目训练CartPole智能体3.1 CartPole环境介绍目标通过左右移动小车保持杆子直立。状态空间4维连续值小车位置小车速度杆子角度杆子角速度动作空间2维离散0向左推1向右推3.2 完整训练代码import gym import numpy as np import torch import matplotlib.pyplot as plt from collections import deque class CartPoleDQN: CartPole DQN训练器 def __init__(self): self.env gym.make(CartPole-v1) self.state_dim self.env.observation_space.shape[0] self.action_dim self.env.action_space.n self.agent DQNAgent(self.state_dim, self.action_dim) def train(self, num_episodes1000, batch_size64, target_update10): scores [] scores_window deque(maxlen100) for episode in range(num_episodes): state self.env.reset() if isinstance(state, tuple): state state[0] score 0 done False while not done: action self.agent.select_action(state) result self.env.step(action) if len(result) 5: next_state, reward, terminated, truncated, _ result done terminated or truncated else: next_state, reward, done, _ result self.agent.store_transition(state, action, reward, next_state, done) self.agent.learn(batch_size) state next_state score reward if episode % target_update 0: self.agent.update_target_network() self.agent.decay_epsilon() scores_window.append(score) scores.append(score) if episode % 100 0: avg_score np.mean(scores_window) print(fEpisode {episode}, Average Score: {avg_score:.2f}) if avg_score 195.0: print(fEnvironment solved in {episode} episodes!) break return scores # 运行训练 if __name__ __main__: trainer CartPoleDQN() scores trainer.train(num_episodes1000) # 绘制学习曲线 plt.figure(figsize(10, 6)) plt.plot(scores) plt.title(DQN Training on CartPole-v1) plt.xlabel(Episode) plt.ylabel(Score) plt.grid(True) plt.show()3.3 训练结果与分析典型训练曲线Episode 0, Average Score: 12.00, Epsilon: 1.000 Episode 100, Average Score: 45.23, Epsilon: 0.605 Episode 200, Average Score: 89.45, Epsilon: 0.366 Episode 300, Average Score: 156.78, Epsilon: 0.221 Episode 400, Average Score: 195.34, Epsilon: 0.134 Environment solved in 400 episodes!四、强化学习的进阶方向4.1 算法演进路线Q-Learning (1989) ↓ DQN (2015) ↓ Policy Gradient ↓ Actor-Critic ↓ A3C (2016) → PPO (2017) ★ 最常用 DDPG (2015) → TD3 → SAC (2018)4.2 RLHF人类反馈强化学习训练流程1. 预训练Pre-training ↓ 在大规模文本上训练基础模型 2. 监督微调SFT ↓ 在人类标注的高质量对话数据上微调 3. 奖励模型训练Reward Model ↓ 训练一个模型来预测人类偏好 4. RLHFPPO优化 ↓ 使用PPO算法优化策略最大化奖励模型评分五、常见问题与解决方案5.1 训练不稳定问题原因解决方案Q值爆炸自举更新导致估计过高使用Double DQN策略坍塌策略过度自信熵正则化、KL惩罚奖励尺度问题奖励过大或过小奖励归一化、裁剪5.2 探索与利用的平衡策略方法适用场景ε-贪心以ε概率随机选择离散动作空间Boltzmann探索根据Q值softmax采样需要更平滑的探索噪声网络参数空间加噪连续动作空间六、总结与展望6.1 强化学习的核心要点三大要素状态、动作、奖励两大目标最大化累积奖励、学习最优策略两类方法价值方法Q-Learning、DQN、策略方法REINFORCE、PPO关键挑战探索与利用、样本效率、训练稳定性6.2 学习路径建议阶段1理论基础 ├── 理解MDP和贝尔曼方程 ├── 掌握蒙特卡洛和时序差分方法 └── 实现简单的Q-Learning 阶段2深度强化学习 ├── 学习DQN及其改进版本 ├── 实现Policy Gradient方法 └── 掌握Actor-Critic框架 阶段3进阶算法 ├── 学习PPO最实用 └── 了解SAC连续控制下一篇预告【第34篇】Actor-Critic算法详解A2C与A3C实战我们将深入讲解Actor-Critic框架学习如何结合价值函数和策略梯度的优势实现更高效的强化学习本文为系列第33篇详细讲解了强化学习的基础概念、经典算法和实战项目。有任何问题欢迎在评论区交流标签强化学习、DQN、Q-Learning、深度强化学习、CartPole、Policy Gradient、AI决策