【如果笔记对你有帮助,欢迎关注&点赞&收藏,收到正反馈会加快更新!谢谢支持!】
一、强化学习基础
1.4 强化学习分类
- 根据数据来源划分
- Online:智能体与环境实时交互,如Q-Learning、SARSA、Actor-Critic
- Offline:智能体使用预先收集的数据集进行学习
- 根据策略更新划分
- On-Policy:学习和行为策略是相同的,数据是按照当前策略生成的,如SARSA
- Off-Policy:学习策略和行为策略可以不同,数据可以来自不同的策略,如Q-Learning、DQN
- 根据学习方式划分
- Model-based:假设环境的动态特性是已知的或可以通过某种方式学习到,如动态规划(DP)、基于模型的强化学习
- Model-free:直接从与环境的交互中学习策略或价值函数,如
- 根据策略优化方式划分:
- Value-based:学习状态价值函数 V(s) 或状态-动作价值函数 Q(s,a) 来优化策略,如动态规划(DP)、时序差分法(TD)、蒙特卡洛方法(MC)
- Policy-based: 直接优化策略参数,如Actor-Critic、DDPG
二、强化学习算法
2.1 DQN
- 归属分类:model-free,off-policy,value-based
- 结合了深度学习和 Q-Learning,使用神经网络来近似 Q(s,a) 函数
- 优化点:
- 经验回放(Experience Replay):将每次交互的经验(状态 s、动作 a、奖励 r、下一个状态 s′)存储在一个回放缓存(replay buffer)中,训练时从中随机抽取一批经验进行更新
- 目标网络(Target Network):目标网络是主网络的一个副本,但更新频率较低。在计算目标值时,用来评估 Q(s′,a′)。这有助于减少目标值的波动,提高学习的稳定性。
- 流程:
- 初始化:主网络Q(s,a)和复制一个目标网络Q^(s,a) ,经验回放缓存D for 序列 - 初始化状态s for 每个时间步: - 用ϵ-greedy根据Q选择状态s下的动作a - 观察到奖励r和下一个状态s‘ - (s, a, s‘, a‘)作为经验放到缓存D中 - 从缓存D随机抽一批经验 - 目标值计算:y = r + γ*maxQ(s‘,a‘) # 类比sft中的ground truth - 损失函数计算 L(Q(s,a), y) - 更新主网络参数 - 定期更新目标网络参数更新
2.2 REINFORCE算法
- 一种经典策略梯度方法(Policy Gradient Method),model-free,online
- 通过蒙特卡洛采样估计Q值,计算策略的梯度来更新策略
- 基线改进:
- 为什么要引进基线:
- 直接使用 Gt 作为更新信号会导致策略梯度估计的方差很高,从而使得算法的更新不稳定,收敛速度缓慢,甚至可能无法收敛到最优策略
- 减去基线相当于除掉环境随机性波动,让动作之间的好坏关系更加明确 → 减小方差
- 为什么要引进基线:
- 流程:
- 初始化策略参数 θ, 学习率 α for 序列 in 训练序列集合: - 初始化:状态s,轨迹 = [] #【与环境交互,生成轨迹】 for 每个时间步 t until 终止条件: a = 根据策略 π(a|s; θ) 选择动作 # 根据当前策略选择动作 s’, r = 环境.step(a) # 执行动作,观察奖励和下一个状态 轨迹.append((s, a, r)) # 保存轨迹 s = s‘ # 更新状态 #【计算累积奖励】 G = 0 for t in reversed(range(len(轨迹))): s, a, r = 轨迹[t] G = r + γ * G # 累积奖励 梯度 = ∇θ log π(a|s; θ) * G # 计算策略梯度 θ = θ + α * 梯度 # 更新策略参数
2.3 Actor-Critic算法
- 特点:结合策略梯度方法(Actor)和价值函数估计(Critic)
- Actor:和环境交互采样轨迹【负责根据当前策略 π(a∣s;θ) 选择动作】
- Critic:评判Actor动作和状态的好坏【负责估计状态价值函数 V(s;ϕ),帮助Actor更新策略参数】
- 时序差分作为优势函数
- 流程:
# 初始化 初始化策略网络参数 θ 初始化价值网络参数 ω 设置学习率 α_θ 和 α_ω 设置折扣因子 γ for 对于每个训练序列: s = 初始状态 s_0 轨迹 = [] # 存储轨迹 # 与环境交互,生成轨迹 for 每个时间步 t until 终止条件: a = 根据策略 π(a|s; θ) 选择动作 # Actor: 根据当前策略选择动作 s’, r = 环境.step(a) # 执行动作,观察奖励和下一个状态 轨迹.append((s, a, r)) # 保存轨迹 s = s’ # 更新状态 # 计算TD误差 G = 0 for t in reversed(range(len(轨迹))): s, a, r = 轨迹[t] G = r + γ * G # 累积奖励 δ_t = r + γ * V_ω(s’; ω) - V_ω(s; ω) # TD误差【优势函数】 # 更新价值网络参数(Critic) ω = ω + α_ω * δ_t * ∇_ω V_ω(s; ω) # 更新策略网络参数(Actor) θ = θ + α_θ * δ_t * ∇_θ log π(a|s; θ)
2.4 PPO算法
- TRPO(Trust Region Policy Optimization,信赖域策略优化)
- PPO前身算法
- 约束策略更新的幅度来保证策略优化过程的稳定性和高效性
- 使用KL散度衡量新旧策略之间的差异,并约束KL散度不超过一个预设的阈值
- PPO(Proximal Policy Optimization,近端策略优化)
- 策略截断:简化TRPO的优化过程,对新旧策略比进行了截断,使其在 [1−ϵ,1+ϵ] 范围内
- 优势函数:GAE估计
- GAE(Generalized Advantage Estimation,广义优势估计)是一种用于估计优势函数的方法,它结合了TD(Temporal Difference)和蒙特卡洛估计的优点,能够在减少方差的同时保持较低的偏差
- 将不同的步数的优势估计进行指数加权平均
- 引入 λ 参数,GAE能够在TD误差和蒙特卡洛估计之间取得平衡。较大的 λ 值更接近蒙特卡洛估计,方差较小但偏差较大;较小的 λ 值更接近TD误差,偏差较小但方差较大
- 伪代码:
# 初始化 初始化策略网络参数 θ 初始化价值网络参数 ω 设置学习率 α_θ 和 α_ω 设置折扣因子 γ 设置GAE参数 λ 设置截断参数 ε for 对于每个训练序列: s = 初始状态 s_0 轨迹 = [] # 存储轨迹 动作概率 = [] # 存储旧策略下的动作概率 优势 = [] # 存储优势估计 # 与环境交互,生成轨迹 for 每个时间步 t until 终止条件: π_θ(a|s) = 策略网络输出动作概率 a = 根据策略 π(a|s; θ) 选择动作 # Actor: 根据当前策略选择动作 s’, r = 环境.step(a) # 执行动作,观察奖励和下一个状态 轨迹.append((s, a, r, s’)) # 保存轨迹 动作概率.append(π_θ(a|s)) # 保存旧策略下的动作概率 s = s’ # 更新状态 # 计算GAE优势估计 优势 = [] G = 0 gae = 0 for t in reversed(range(len(轨迹))): s, a, r, s’ = 轨迹[t] V_ω(s) = 价值网络输出状态价值 V_ω(s’) = 价值网络输出下一个状态价值 δ_t = r + γ * V_ω(s’) - V_ω(s) # TD误差 gae = δ_t + γ * λ * gae # GAE递归计算 = TD误差 + 折扣*GAE参数*gae 优势.append(gae) 优势.reverse() # 将优势列表反转,使其与轨迹对应 # 更新价值网络参数 (Critic) for t in range(len(轨迹)): s, a, r, s’ = 轨迹[t] V_ω(s) = 价值网络输出状态价值 G = r + γ * 价值网络输出下一个状态价值 ω = ω + α_ω * (G - V_ω(s)) * ∇_ω V_ω(s) # 使用TD误差更新价值网络 # 更新策略网络参数 (Actor) for t in range(len(轨迹)): s, a, r, s’ = 轨迹[t] π_θ(a|s) = 策略网络输出动作概率 π_θ_old(a|s) = 动作概率[t] # 旧策略下的动作概率 比值 = π_θ(a|s) / π_θ_old(a|s) 剪切比值 = clip(比值, 1 - ε, 1 + ε) L_clip = min(比值 * 优势[t], 剪切比值 * 优势[t]) θ = θ + α_θ * ∇_θ L_clip # 使用截断的概率比更新策略网络