【强化学习】Q-learning,DQN,SARSA算法介绍
- 强化学习算法分类
- 基于价值的方法
- 基于策略的方法
- Actor-Critic方法
- Q-learning算法
- DQN算法
- 强化学习训练数据存在的问题
- 经验回放机制
- 备份网络机制
- Sarsa算法
- 总结
强化学习算法分类
按学习目标进行分类 可分为基于价值、基于策略、以及Actor-Critic方法
基于价值的方法
- 基于价值的方法:输出动作的价值,选择价值最高的动作
- Q-learning,DQN, SARSA均是基于价值的方法
基于策略的方法
- 基于策略的方法: 学习策略,直接输出下一步动作的概率,根据概率来选取动作(不一定概率最高就会选择该动作,会从整体进行考虑,需要探索其他动作,以便更好地了解环境并找到更优的策略)
REINFORCE算法是基于策略的方法
Actor-Critic方法
- Actor根据概率做出动作,Critic根据动作给出价值,是一类结合了策略评估(Critic)和策略改进(Actor)的强化学习算法。它们通过同时学习一个策略函数(Actor)和一个值函数(Critic),从而可以更有效地学习到优秀的策略。
A2C (Advantage Actor-Critic)、A3C (Asynchronous Advantage Actor-Critic)、DDPG (Deep Deterministic Policy Gradient)、TD3 (Twin Delayed Deep Deterministic Policy Gradient)、PPO (Proximal Policy Optimization)等算法均是Actor-Critic方法
- 强化学习的问题定义:给定马尔科夫决策过程𝑀𝐷𝑃 = {𝑆, 𝐴, 𝑃, 𝑅},寻找一个最优策略 π ∗ \pi^* π∗对任意𝒔 ∈ 𝑺使得𝑽𝝅∗(𝒔)值最大
- 强化学习求解:在策略优化(策略提升)和策略评估的交替迭代中优化参数
时序差分(Temporal Difference,TD)方法可以基于策略或价值进行学习,具体取决于所使用的算法和问题设置。
基于策略的时序差分方法: 基于策略的时序差分方法主要关注于学习和优化当前执行的策略。
SARSA(State-Action-Reward-State-Action)是一个经典的基于策略的时序差分学习算法,它通过估计和更新Q值函数来学习一个策略,并在策略改变时进行更新。
SARSA算法根据当前策略选择的动作来更新Q值,从而使得Q值逐步逼近最优Q值(最优策略对应的Q值)。
基于价值的时序差分方法:基于价值的时序差分方法主要关注于学习和估计状态值或动作值函数(价值函数),而不是直接关注策略。
Q-learning是一个经典的基于价值的时序差分学习算法,它通过估计和更新状态-动作值函数Q来学习最优策略,而不需要显式地估计和更新策略。
Q-learning算法根据当前策略选择的最优动作来更新Q值,从而使得Q值逐步逼近最优Q值(最优策略对应的Q值)。
Q-learning算法
- 强调一下:Q-learning算法 是model-free方法 ,是基于价值的方法
- Q-learning算法的过程是学习Q表,各个状态和各个动作对应的Q(s,a),一旦矩阵Q足够接近于收敛状态,智能体便学习到了转移至目标状态的最佳路径
【注】:表格式的Q-learning算法通常适用于离散状态空间和离散动作空间的情况
- 假如拥有了完美的𝑄(𝑠, 𝑎)表,那么在时刻𝑡时,就可以查出表中𝑄(𝑠𝑡,⋅)值所对应的最优动作,进而得出单个轨迹下最优的动作序列
- 在实际应用中,Q表随着智能体与环境的交互不断更新和优化,直到达到收敛或者训练结束。训练完成后,智能体可以根据学习到的Q表来选择最优的动作序列,从而执行最优策略以获得最大的长期累积奖励。
- 需要注意的是,Q表在状态和动作空间均较小且均离散的情况下(表格式Q学习算法)适用,对于大规模、连续状态空间的问题,通常需要借助函数逼近方法来近似Q值函数(DQN)。
DQN算法
- 以f函数拟合𝑄(𝑠,a)即 𝑄(𝑠,a) ≈ f(𝑠,a, ω),ω是该函数的参数
- DQN可处理状态连续,动作离散的情况,输入是状态
- 通过函数表示,无论𝒔的维度有多大,最后都可以通过矩阵运算(神经网络)降维输出为单值的𝑸值
- DQN算法需要预先收集transition数据 ( s t , a t , r t , s t + 1 ) (s_t, a_t, r_t, s_{t+1}) (st,at,rt,st+1)来进行训练,是off-policy方法
对于许多状态连续,动作离散的问题,输入的状态基本都是高维度的,而动作输出可以是低维度的
疑问:为什么DQN的输入仅需要状态而不需要动作?
答:
1)Q值函数的学习目标:DQN的目标是学习状态-动作对的价值函数Q(s, a),即在给定状态s下采取动作a的价值。因此,DQN的网络结构被设计为接收状态作为输入,并输出每个动作的Q值,而不需要直接输入动作。
2)动作空间的离散性:
在很多强化学习问题中,动作空间是离散的,可能包含大量的动作选项。将动作作为网络输入会使网络的复杂度急剧增加,不利于训练和收敛。相反,通过仅输入状态,网络可以更专注地学习状态与价值之间的关系,而不必考虑如何直接处理动作空间的复杂性。
DQN算法的框架
- 目标值 r + γ max a ′ ∈ A Q ( s ′ , a ′ ) r + \gamma \max_{a' \in A}Q(s',a') r+γmaxa′∈AQ(s′,a′),以其作为真实值 y y y
- 估计值 y ^ \hat{y} y^,这是DQN主网络对当前状态和所采取动作的Q值的预测
计算参数w关于损失函数的梯度
在DQN(Deep Q-Network)算法的损失函数中使用期望值的主要原因是因为训练数据是从经验回放缓冲区中随机采样得到的,这些采样的transition数据是从Agent与环境交互过程中收集得到的,是一种随机采样的过程。因此,我们需要使用期望值来表示损失函数,以期望损失函数能够代表整体的训练数据。
强化学习训练数据存在的问题
- 经常需要从稀疏、嘈杂和延迟的奖励信号中学习
- 通常会遇到高度相关的状态序列
- 数据分布不断随算法学习到的新行为而变化
经验回放机制
DQN解决数据高度相关和数据分布非平稳的问题的两个重要机制:①经验回放机制 + ②随机采样
- 经验回放可以避免数据之间的相关性影响到模型的训练
备份网络机制
- DQN算法最终更新的目标是让 Q ω ( s , a ) Q_\omega(s,a) Qω(s,a)逼近 r + γ max a ′ ∈ A Q ( s ′ , a ′ ) r + \gamma \max_{a' \in A}Q(s',a') r+γmaxa′∈AQ(s′,a′)
- 由于 TD 误差 = r + γ max a ′ ∈ A Q ω ( s ′ , a ′ ) − Q ω ( s , a ) = r + \gamma \max_{a' \in A}Q_\omega(s',a') -Q_\omega(s,a) =r+γmaxa′∈AQω(s′,a′)−Qω(s,a),该目标本身就包含神经网络的输出 Q ω ( s ′ , a ′ ) , Q ω ( s , a ) Q_\omega(s',a'),Q_\omega(s,a) Qω(s′,a′),Qω(s,a),因此在更新网络参数的同时目标也在不断地改变,目标Q网络动态变化,这非常容易造成神经网络训练的不稳定性
-
固定目标Q网络(Fixed Target Q-Network): DQN引入了两个神经网络,一个是主要的Q网络用于产生当前状态下的Q值估计,另一个是目标Q网络用于生成目标Q值。
-
目标Q网络的参数是由主要Q网络的参数定期拷贝得来,但这些参数不会在训练中被更新,而是固定一段时间后再进行更新。这个机制的作用是减少训练中的价值估计偏差,有利于提高训练的稳定性和收敛速度。通过固定目标Q网络,可以减少因为目标Q值的变化而引起的训练不稳定性,从而更好地学习到最优的Q值函数。
DQN算法具体流程:
Sarsa算法
- Sarsa算法相较于Q-learning,使用实际采取的动作来更新Q值,而不是使用最佳动作
- 在学习的过程中只存在一种策略(on-policy), Sarsa算法用这种策略去选取动作,也用这种策略去优化动作
- 更新公式如下所示:
Q ( S t , A t ) ← Q ( S t , A t ) + α [ R t + 1 + γ Q ( S t + 1 , A t + 1 ) − Q ( S t , A t ) ] \begin{aligned}Q(S_{t},A_{t})\leftarrow Q(S_{t},A_{t})+\alpha[R_{t+1}+\gamma Q(S_{t+1},A_{t+1})-Q(S_{t},A_{t})]\end{aligned} Q(St,At)←Q(St,At)+α[Rt+1+γQ(St+1,At+1)−Q(St,At)] - Sarsa属于单步更新算法,也就是说每执行一个动作,就会更新一次价值和策略。如果不进行单步更新,而是采取n步更新或者回合更新,即在执行n步之后再来更新价值和策略,这样就得到了n步Sarsa(n-step Sarsa)。
- Sarsa与Q-learning均为model-free方法,且均为时序差分的方法
- Sarsa 是典型的在线策略算法,而 Q-learning 是典型的离线策略算法
- 判断二者类别的一个重要手段是看计算时序差分的价值目标的数据是否来自当前的策略
总结
- Q-learning更新方式: Q ( s t , a t ) ← Q ( s t , a t ) + α [ r t + γ max a Q ( s t + 1 , a ) − Q ( s t , a t ) ] Q(s_t,a_t) \larr Q(s_t,a_t) + \alpha[r_t + \gamma \max_{a} Q(s_{t+1},a) - Q(s_t,a_t)] Q(st,at)←Q(st,at)+α[rt+γmaxaQ(st+1,a)−Q(st,at)]
- 单步Sarsa更新方式: Q ( s t , a t ) ← Q ( s t , a t ) + α [ r t + γ Q ( s t + 1 , a t + 1 ) − Q ( s t , a t ) ] Q(s_t,a_t) \larr Q(s_t,a_t) + \alpha[r_t + \gamma Q(s_{t+1},a_{t+1}) - Q(s_t,a_t)] Q(st,at)←Q(st,at)+α[rt+γQ(st+1,at+1)−Q(st,at)]
- 多步Sarsa更新方式: Q ( s t , a t ) ← Q ( s t , a t ) + α [ r t + γ r t + 1 + … + γ n Q ( s t + n , a t + n ) − Q ( s t , a t ) ] Q(s_t,a_t) \larr Q(s_t,a_t) + \alpha[r_t +\gamma r_{t+1}+\ldots + \gamma^n Q(s_{t+n},a_{t+n}) - Q(s_t,a_t)] Q(st,at)←Q(st,at)+α[rt+γrt+1+…+γnQ(st+n,at+n)−Q(st,at)]
- DQN的Loss计算方式: L ( w ) = E s [ ( r + γ m a x a ′ Q ( s ′ , a ′ , w ) − Q ( s , a , w ) ) 2 ] L(w)=\mathbb{E}_{s}\left[(\mathrm{r}+\gamma max_{a'}Q(s^{\prime},a^{\prime},w)-Q(s,a,w))^{2}\right] L(w)=Es[(r+γmaxa′Q(s′,a′,w)−Q(s,a,w))2]