【深度强化学习】6. Q-Learning技巧及其改进方案

【DataWhale打卡】第四次任务,主要是重新学习一下李宏毅的Q-learning部分的知识,推导很多。之前看的时候就是简单过了一遍,很多细节没有清楚。这篇笔记包括了李宏毅深度强化学习三个视频长度的内容。

1. 概念/解释

概念 解释
Critic 与Actor不同,Critic负责评论当前的行为,预测期望价值
V π ( s ) V^\pi(s) Vπ(s) 在遇到状态s以后,可以得到的累计奖励值(这个值和s、 π \pi π均有关系)
Q π ( s , a ) Q^\pi(s,a) Qπ(s,a) 使用 π \pi π作为actor的时候,在状态s下采取动作a的期望的累计奖励(cumulated reward)。
DQN Q-Learning+深度学习(采用了TargetNetwork和Experience Replay的方法训练)
Q-function 即在某一个 state 采取某一个action,使用 actor π \pi π ,得到的 accumulated reward 的期望值有多大

2. Value Function

MC估计V

Monte-Carlo 方法,通过采样来近似得到Value函数。

在遇到不同state的情况下,计算对应的accumulated reward G t G_t Gt。在训练的过程就是一个回归问题,将value function的值回归到 G t G_t Gt

TD 估计V
V π ( s t ) = V π ( s t + 1 ) + r t V^{\pi}\left(s_{t}\right)=V^{\pi}\left(s_{t+1}\right)+r_{t} Vπ(st)=Vπ(st+1)+rt
基于以上式子,只要有任意一个s,a,r,s的片段,就可以用来训练。训练过程如下图所示:

对比两种方法

  • MC存在很大的Variance,因为是累积的reward,这样会导致Larger Variance。

  • TD虽然有着smaller variance,但是 V π ( s t + 1 ) V^\pi(s_{t+1}) Vπ(st+1)有可能是不准确的。

TD由于其灵活性,数据可以重复利用,所以比较常见。

举个计算的例子:

3. State-Action Value Function

引入另外一种critic,Q-function(State-Action Value Function)。

Value Function仅仅通过看到的状态s就开始判断价值,这里引入动作a,意义是 Q π ( s , a ) Q^\pi(s,a) Qπ(s,a) 代表使用 π \pi π作为actor的时候,在状态s下采取动作a的期望的累计奖励(cumulated reward)。

思考: π \pi π本身会决定在遇到s的时候,应该采取哪个action,那么这里的Q怎么理解呢?

其实就是在state s的时候强制采取action a,然后得到的垒起奖励,才是 Q π ( s , a ) Q^\pi(s,a) Qπ(s,a)

第一篇文章中就有讲action space分为离散的(discrete)和连续的(continuous)

上图左侧代表输出的是一个数值。右侧代表在状态s下,采取不同的action所对应的Q函数。

Q-Learning一般流程

Q-Learning这种方式和policy gradient不同:

  • Policy gradient的目标就是学习策略 π \pi π, 给定一个s就可以输出选择的动作a。
  • Q-Learning则是以一种间接的方法实现了这个目的。在给定一个状态s后,如果有了Q函数,那就可以决定采取哪个function可以得到的期望值更高。

描述一下整个流程,初始的 π \pi π和环境进行交互(一开始随机初始化的策略肯定很差),然后会收集一系列episode带来的数据。然后去衡量这个actor在某一个s强制采取a以后的期望,计算Q Value。学习得到的Q函数得到的新策略 π ′ \pi ' π是一定要比原actor策略更好的。

这样迭代下去,可以保证policy是越来越好的。

那么新策略 π ′ \pi ' π是如何指定的?

  • 策略是通过最大化Q Function得到的,所以可以保证在同一个状态s下,新的策略不比旧的策略差。
  • 这里的策略和policy gradient不一样,并没有参数。是通过Q function来计算得到的。
  • 需要说明的是,由于采用了argmax的形式,那也就是默认action space是离散的,单纯的Q-Learning无法解决连续动作空间的问题,随后会提出新的算法解决这个问题。

推到步骤如下:

4. TIP: Target Network

具体怎么实现?

通过actor与环境交互,得到一系列轨迹,s,a,r,s,通过以下公式回归求解问题:
Q π ( s t , a t ) = r t + Q π ( s t + 1 , π ( s t + 1 ) ) \mathrm{Q}^{\pi}\left(s_{t}, a_{t}\right) =r_{t}+\mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right) Q

### 深度强化学习算法概述 深度强化学习(Deep Reinforcement Learning, DRL)是一种结合了深度学习和强化学习的方法,其核心目标是使智能体能够通过与环境的交互来学习最优行为策略。这种方法已经在许多复杂任务中表现出卓越性能,例如游戏、机器人控制等领域。 #### 一、深度强化学习的基础概念 深度强化学习基于马尔可夫决策过程(Markov Decision Process, MDP),其中涉及以下几个关键要素: - **状态(State)**:描述当前环境的信息集合。 - **动作(Action)**:智能体在某一状态下可以选择的操作。 - **奖励(Reward)**:衡量某个动作的好坏程度。 - **策略(Policy)**:定义智能体如何根据状态选择动作的概率分布或映射关系[^1]。 这些基本组件构成了强化学习的核心理论基础,并进一步扩展至深度神经网络的应用场景。 --- #### 二、典型深度强化学习算法及其原理 以下是几种主流的深度强化学习算法以及它们的工作机制分析: ##### 1. 近端策略优化(PPO) PPO 是一种策略优化方法,旨在解决传统策略梯度算法训练不稳定的问题。它的主要特点包括引入截断重要性采样权重以限制更新步幅过大带来的负面影响,从而提高收敛速度和平稳性。具体而言,PPO 使用了一个代理目标函数,在每次迭代过程中仅允许新旧策略之间的差异保持在一个较小范围内[^1]。 ```python import torch.nn as nn class ActorCritic(nn.Module): def __init__(self, state_dim, action_dim): super(ActorCritic, self).__init__() # 定义策略网络结构 self.actor = nn.Sequential( nn.Linear(state_dim, 64), nn.Tanh(), nn.Linear(64, action_dim), nn.Softmax(dim=-1) ) # 定义价值函数网络结构 self.critic = nn.Sequential( nn.Linear(state_dim, 64), nn.Tanh(), nn.Linear(64, 1) ) def forward(self, state): value = self.critic(state) probs = self.actor(state) dist = Categorical(probs) return dist, value ``` --- ##### 2. 双延迟深度确定性策略梯度(TD3) TD3 是为了缓解 DDPG 中存在的高估偏差而提出的改进版本。该算法采用了双 Q 函数评估体系,并加入了一种延迟参数更新机制,有效降低了模型对噪声数据敏感的可能性。此外,还增加了行动扰动技巧以增强探索能力[^2]。 ```python def td3_update(actor, critic_1, critic_2, target_actor, target_critic_1, target_critic_2, replay_buffer, batch_size=64, gamma=0.99, tau=0.005): states, actions, rewards, next_states, dones = replay_buffer.sample(batch_size) with torch.no_grad(): noise = (torch.randn_like(actions) * policy_noise).clamp(-noise_clip, noise_clip) next_actions = (target_actor(next_states) + noise).clamp(-action_high, action_low) q_next = torch.min(target_critic_1(next_states, next_actions), target_critic_2(next_states, next_actions)) targets = rewards + gamma * (1 - dones) * q_next loss_q1 = F.mse_loss(critic_1(states, actions), targets) loss_q2 = F.mse_loss(critic_2(states, actions), targets) optimizer_critic.zero_grad() (loss_q1 + loss_q2).backward() optimizer_critic.step() if update_counter % delay_step == 0: actor_loss = -critic_1(states, actor(states)).mean() optimizer_actor.zero_grad() actor_loss.backward() optimizer_actor.step() soft_update_target_networks(tau) ``` --- ##### 3. Double DQN 和过估计现象 Double DQN 的提出是为了应对原始 DQN 存在的动作值过高估计问题。通过对分离的目标网络进行重新设计,使得最终计算得出的价值更加接近真实情况。这种调整显著提升了算法稳定性及泛化效果[^3]。 ```python class DoubleDQNAgent(DQNAgent): def compute_targets(self, next_states, rewards, dones): best_action_indices = self.q_network(next_states).argmax(axis=1) max_qs = self.target_network(next_states)[range(len(best_action_indices)), best_action_indices] return rewards + (~dones.astype(int)) * discount_factor * max_qs ``` --- ### 总结 以上介绍了三种常见的深度强化学习算法——PPO、TD3 和 Double DQN 的工作机理及相关代码片段展示。每种方法都有各自适用范围和技术优势,开发者需依据实际需求合理选用相应方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*pprp*

如果有帮助可以打赏一杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值