强化学习基础知识
记录一些强化学习基础名词解释,理解的不深
基本概念
强化学习(Reinforcement Learning,RL)是一种机器学习方法,旨在通过与环境的交互来学习如何采取行动以最大化累积奖励。与监督学习不同,强化学习没有预先标注的输入输出对,而是通过试错和从反馈中学习
Agent
:做出动作的角色,即智能体
state(状态)
:智能体当前所处的环境,包含环境当前的全部或部分信息,在玩游戏时,state就是当前的游戏画面,如果状态,动作,奖励等变量被观测到了,用s表示;没观测到就表示随机变量,用S表示
action(动作)
:智能体在每个时间步可以采取的操作
policy(决策)
:agent在当前做出的动作
policy function(策略函数)
:在某种state下,agent采取某种action的概率$\pi(s.a)$,函数值范围为[0,1]
Reward(奖励)
:是指采取动作后,环境给agent的奖励,它可能为正、负、0
state transition(状态转移)
:agent在某个状态采取某个动作后,可能发生的状态变化
强化学习是agent与环境互动的过程。我们观测到状态$s_t$,然后根据策略$\pi(a|s)$选择一个动作$a_t$并执行它,环境会给出一个新的状态$s_{t+1}$和奖励r
Return(回报)
:也叫做未来累计奖励,即$U_t=R_t+R_{t+1}+R_{t+2}+…+R_n$
由于现在的奖励可能比未来的奖励更重要,所以定义Discounted Return(折扣回报)
:$U_t=R_t+\gamma R_{t+1}+\gamma^2 R_{t+2}+…+\gamma^n R_n$,$\gamma$意为折扣因子,是我们设定的超参数
Action-Value Function(动作值函数)
:用Q(s,a)表示,用于评估在给定状态s下采取某个动作a所能获得的累积奖励的期望值
State-Value Function(状态值函数)
:用V(s)表示,用于评估智能体在给定状态s下,从该状态开始到未来所能获得的累积奖励的期望值
Q值
:表示在状态s下采取动作a的return
model-based
:基于模型的方法涉及构建环境的模型,即尝试估计或学习环境的动态(状态转移概率和奖励函数)。这些方法可以在模型上进行规划,从而选择最佳行动。
model-free
:不直接构建环境的模型,而是通过与环境的交互来学习最优策略或价值函数,直接从经验中学习如何行动
policy-based
:利用策略梯度优化策略函数,来选择最优行动,直接学习映射状态到行动的策略函数。可以更自然地应用于连续动作空间问题。
value-based
:基于价值的方法对价值函数进行建模和优化。通过估计每个状态或状态-动作对的价值来选择最优行动。主要特点包括:
- 优化价值函数:学习状态价值函数或动作价值函数。
- 间接确定策略:通过选择具有最大价值的动作来确定策略。
- 例子:Q-learning,SARSA,DQN
Value-Based Reinforcement Learning
定义Optimal action-value function$Q^*(s_t,a_t)=maxQ_\pi(s_t,a_t)$,$Q^*(s_t,a_t)$就是最优情况下的$U_t$
在价值学习中我们要训练的函数就是$Q(s_t,a_t)$,训练的目标是$Q^*(s_t,a_t)$,采取的最佳动作就是$a^*=argmaxQ^*(s_t,a_t)$
Temporal Difference Learning算法
时序差分算法的思想为用局部基于真实观测的数据来更新全局预测的数据,因为它的可信度大于完全基于预测的数据
TD target:相比于当前估计来说更准确的估计,使用$V(s)←V(s)+α[r+γV(s^′)−V(s)]$更新
TD error:之前的估计与当前估计的损失值
Deep Q Network
DQN是使用一个神经网络$Q(s,a;w)$来估计action-value function$Q(s,a)$,我们基于TD算法来训练这个神经网络,从而得到Optimal action-value function$Q^*(s_t,a_t)$的估计
由于$U_t=R_t+\gamma R_{t+1}+\gamma^2 R_{t+2}+…+\gamma^n R_n=R_t+\gamma U_{t+1}$
基于这种思想,做一下蒙特卡洛近似,得出DQN的更新公式为$Q(s_t,a_t;w)=r_t+\gamma Q(s_{t+1},a_{t+1};w)$
Loss也与TD算法相似:$L_t=\frac{1}{2}[Q(s_t,a_t;w)-y_t]^2 $
流程总结:
- 从当前状态s中选择一个动作a
- 执行动作a,获得奖励r并转移到新状态s′
- 将经历(s,a,r,s′)存储到回放缓冲区
- 从回放缓冲区中随机抽取一个小批量样本
- 对每个样本,计算目标Q值(TD target)并更新Q网络参数
- 每隔一定步数,更新目标网络参数
Policy-Based Reinforcement Learning
Policy Function
策略函数$π(a|s)$是一个概率密度函数,其输入是某个状态s,输出是在该状态下可能产生的动作a的概率值。假设在状态$s_t$下,Agent可能做出的动作$a_t$可能有n个,那么$π(a_t|s_t)$即输出一个n维向量,其元素对应每个可能做出动作at的概率值。有了这n个概率值,Agent就会在这个向量中做一次随机抽样并做出所得到的动作$a_i$
Policy Gradient
定义状态值函数近似函数$V(s;\theta)=\Sigma_a\pi(a|s;\theta)Q_\pi(s,a)$,其中$\theta$是神经网络中的参数。V可以评价状态s和策略网络$π(a|s_t;θ)$的好坏。若给定状态s,策略网络越好,那么V的值越大。因此,我们采用V关于$θ$的随机梯度上升的方法更新参数θ,即策略梯度就是函数V对$\theta$的导数
大致流程:
- 观测状态s
- 根据策略函数$\pi$随机采样一个a
- 根据$Q(s_tr,a_t)$近似$q_t$
- 对策略网络求导
- 近似策略梯度$g(a_t,\theta_t)=q_t*d_{\theta,t}$
- 更新策略网络参数
那么我们如何估计动作价值函数Q?
这里有两种方法:
REINFORCE算法
:必须获取到一个完整的采样trajectory才能进行一次模型参数的更新,也就是蒙特卡罗方法(MC Method)来估计Q
Actor-Critic(AC)
:使用另一个神经网络来近似Qπ
Actor-Critic Method
Actor-Critic方法,是策略学习和价值学习结合的一种方法
Actor是策略网络,用来控制Agent运动,可以看做“演员”
Critic是价值网络,用来给演员打分,可以看做“评论家”
Actor
Actor网络的输入为状态s
价值网络中包含:卷积层,将画面变成特征向量;全连接层,将特征向量转变为相对于动作空间(Action Space)中元素个数对应的向量;再采用Softmax激活函数将其转换为一策略的概率密度
Critic
Critic网络的输入为状态s和动作a
对于两个不同的输入,处理方法如下:
针对于状态s,从输入中提取特征,获得一个状态特征向量
针对于动作a,采用全连接层提取特征,获得一个动作特征向量
然后将两个特征向量进行concat,得到一个更高维的特征向量,再通过一个全连接层输出一个实数$q(s,a;w)$,即Critic对于Agent处于状态s下做出动作a的评价
训练神经网络
- 观测状态s
- 根据策略函数$\pi$随机采样一个a
- 执行动作a,获取下一个状态$s_{t+1}$和奖励r
- 使用TD算法更新Critic网络的参数
- 使用策略梯度更新Actor的参数
总结
- 观测旧状态$s_t$,用策略网络$\pi$计算概率分布,随机采样动作$a_t$
- 执行$a_t$,得到新状态$s_{t+1}$和奖励$r_t$
- 根据新状态,随机采样动作$a_{t+1}$(假想的动作,并不会真的做)
- 计算价值网络$q_t=q(s_t,a_t;w_t)$和$q_{t+1}=q(s_{t+1},a_{t+1};w_t)$
- 计算TD error:$\delta_t=q_t-(r_t+\gamma q_{t+1})$
- 对Critic参数求导,更新其参数$w_{t+1}=w_t-\alpha \delta_t d_{w,t}$
- 对Actor参数求导,更新其参数$\theta_{t+1}=\theta_t-\beta q_t d_{\theta,t}$
Monte Carlo方法
蒙特卡洛是一类通过随机采样和统计分析来估计问题解的方法,在强化学习中用于评估策略和估计价值函数
基本概念
随机采样:通过从可能的结果中随机采样,来估计某个数量的期望值或概率分布。
经验回报:在每个episode中,通过累积获得的实际回报来估计状态或状态-动作对的价值。
主要步骤
生成轨迹:根据当前策略,从起始状态开始,生成多条轨迹,每条轨迹包含一系列状态、动作和奖励,直到达到终止状态
计算回报:对每条轨迹,计算每个时间步Return
更新价值估计:根据每个状态或状态-动作对的回报,更新价值函数或Q值函数
Sarsa算法
SARSA(State-Action-Reward-State-Action)是一种基于TD方法的强化学习算法,用于学习状态-动作价值函数。SARSA是一个on-policy算法,直接使用当前策略选择的动作来更新Q值
表格形式的Sarsa
如果agent的状态和动作是有限的,那么可以画一个表格,一行对应一个状态$s_i$,一列对应一个动作$a_j$,那么表中的每个元素则对应着在该状态和该动作下的动作价值$Q_π(s_i,a_j)$。我们要做的就是用Sarsa算法去更新表格,每次更新一个元素。
当我们观测到一个四元组$(s_t,a_t,r_t,s_{t+1})$,这样的一个四元组被称为transition。然后采用策略函数$π$去采样一个$a_{t+1}$,接着计算TD target $y_t=r_t+\gamma Q(s_{t+1},a_{t+1})$,Q值可以直接通过查表获得。同时我们也能计算出TD error $δ_t$,然后利用$δ_t$更新$Q_π(st,at)$,其中α是学习率
神经网络形式的Sarsa
采用价值网络来近似$Q_π(s,a)$,记为$q(s,a;w)$。动作价值函数Qπ和价值网络q都与策略π有关,策略π的好坏会影响这两个函数
神经网络$q(s,a;w)$被称为价值网络,它的输入是一个状态s,输出是状态s下对应动作的价值。如果有n个动作,那么价值网络q就会输出一个n维向量,向量元素对应在状态s下,各动作a的价值
TD target就变成了$y_t=r_t+\gamma q(s_{t+1},a_{t+1};w)$,TD error变成$δ_t=q(s_t,a_t;w)-y_t$
然后计算Loss,求梯度,更新网络参数w即可
总结
Sarsa算法主要是用于学习动作价值函数$Q_π(s,a)$
- 表格形式(直接学习Qπ)
适合有限个状态和动作且数量不大的情况。通过一张表格记录每种状态和动作对应的$Q_π(s,a)$的值,通过采用TD算法更新表中Q值。
- 神经网络形式(采用函数近似)
这种形式并不是直接获取Q,而是通过价值网络q(s,a;w)来近似动作价值函数Q
Q-Learning算法
Q-Learning是用于学习最优动作价值函数$Q^*(s,a)$
TD target的更新函数为$y_t=r_t+\gamma maxQ^*(s_{t+1},a)$,对Q*求最大化
其他部分与Sarsa相同,只是Sarsa算法是学习动作价值函数Qπ;而Q-Learning是学习最优动作价值函数Q*
Experience Replay
我们通常使用TD算法来训练DQN,回顾一下TD算法的步骤:
- Agent在t时刻观测到一个状态st并做出动作at
- Agent与环境交互获得了一个新的状态st+1并且获得了一个奖励rt
- 得到TD Target yt
- 计算TD error δt
我们的目标是让qt接近yt,即TD error δt尽量的小,因此TD算法就是寻找一个神经网络参数w使损失函数(Loss Function)L(w)尽可能的小
- 采用梯度下降来使$w_t$不断逼近w*
$(s_t,a_t,r_t,s_{t+1})$是一个transition,可以认为是一条训练数据,传统算法在使用完该训练数据后就把它丢掉,不再使用,这种对于DQN的训练效果并不好
Replay Buffer
我们在使用完一个transition时,会把一个transition放入一个队列里,这个队列被称之为回放缓冲区(Replay Buffer),它的容量是一个超参数n,Replay Buffer可以存储n条transitions。如果Replay Buffer满了,那么新来的transition会替代老的transition
TD算法中经验回放
我们通过找到神经网络参数w来最小化损失函数Loss Function。
使用随机梯度下降(Stochastic Gradient Descent SGD)来最小化Loss Function:从buffer中随机抽取一批transition,计算TD error δi,再算出随机梯度gi,调整神经网络参数w
小技巧
Prioritized Experience Replay
对于Agent而言,并不是所有的transition都同等重要,有些state较难遇见,统一抽样的话难以抽到,训练出的DQN对于数量较少的场景不熟悉,所以预测就会偏离TD Target,因此产生的TD error就比较大,即|δt|就大。正因为DQN不熟悉数量较少的场景,所以要让DQN给这些场景更高的优先级,让它更好的应对这样的场景。
优先经验回放的核心在于:使用非均匀抽样代替均匀抽样
这里有两种抽样方式:
- 抽样概率pt正比于|δt|+ε:即TD error越大,被抽到的概率就越大
- 对|δt|排序:|δt|越大越靠前,容易被抽到
学习率调整
TD算法采用SGD来更新神经网络参数w,α是学习率,如果做均匀抽样,所有的transitions的学习率α都相同;如果做非均匀抽样,那么就要根据每个transition的重要性来调整学习率。
如果一个transition有一个较大的抽样概率pt,那么对这个transition的学习率就应该调小,可以采用如下圈出的方法来自适应调整学习率的因子:如果pt很大,那么学习率就会变小,学习率减小可以减小训练过程中的波动,提高收敛速度和精度,设置学习率为$\alpha(np_t)^{-\beta}$
更新TD Error
为了做优先经验回放,我们要对每一个transition标记上TD error δt。δt决定了这条transition的重要性,决定了它被抽样的概率。
如果一个transition刚刚被收集到,我们并不知道它的δt,那么我们就直接把它的δt设置为最大值,让它有最高的优先级。
每次从buffer中抽取一个transition,都要对它的δt进行一次更新
缓解高估问题
由于DQN选择的是$maxQ^*(s_{t+1},a)$,而且原始的DQN使用Bootstrapping方式更新自己的参数,会导致严重的非均匀高估问题。
这里有两种方法用于缓解高估问题:
使用目标网络(Target Network)
Double DQN
Target Network
相比于DQN,Target Network是独立于DQN的。它与DQN有着相同的神经网络结构,但有不同的参数,记作w-。
我们使用Q(s,a;w)来控制Agent并且收集transition
使用Q(s,q;w-)来选择动作和计算TD target。
以前使用DQN来计算yt,用yt来更新DQN的参数。这会产生自举。现在我们使用Target Network,用Target Network来计算yt。这样就可以缓解高估问题。
Double DQN
DDQN在选择动作时使用的是DQN原始的网络,在计算TD target时使用的是target network,这样相比原始DQN和target network可以更加缓解高估问题
离散动作空间与连续动作空间
离散动作空间是一个集合,其中包含有限个动作。比如在玩2D横版过关游戏时,agent的动作空间只能是上下左右四种动作。对于动作空间是离散的agent可以使用传统的SARSA、DQN算法进行训练
连续动作空间就像是gym的摆杆子环境,或者机械臂控制,由于可以[0,360]度旋转,所以有无穷多种动作空间。对于连续的动作空间,可以使用离散化将连续动作空间变成离散的,但是对于自由度很高的agent,离散化的点就会很多,这会导致维度灾难,离散化只适合较小的连续动作空间
Deterministic Policy Gradient
DPG是策略梯度的变体,专门用于处理确定性策略。与传统的基于随机策略的策略梯度方法不同,DPG直接优化确定性策略,可以处理连续动作空间的问题。
在DPG中,策略$\mu(s; \theta)$是确定性的,即给定一个状态s,策略直接输出一个具体的动作a:$a = \mu(s; \theta))$
DPG是属于AC方法,有一个策略网络,有一个价值网络
策略网络是一个确定性的网络,它的输入是状态s,它的输出不是概率分布,而是一个确定性的动作。只要给定状态s,那么对应的动作a就是一个具体的动作
价值网络有两个输入,一个是状态s一个是动作a,基于状态s,Critic对a进行打分。
DPG的更新策略
训练策略网络需要价值网络的帮忙,改善策略网络的参数θ以至于动作a可以依靠策略网络变得更好,而更新参数θ是要根据价值网络q(s,a;w)=q(s,π(s;θ);w)的增加而决定的。
因而我们训练策略网络的目标是让价值网络q的输出变的更大。价值网络的输入是状态s,a,对于确定的状态,确定性策略网络会输出对应的动作a。
如果输入的状态s是固定的,Critic也是固定的,那么唯一会影响q(Critic的打分)的因素,就是Actor的参数θ。我们想要更新θ,让q变大,那么就可以求取q对θ的梯度,然后使用梯度上升来更新参数θ,这样就可以让价值q变大。这个梯度就叫做确定策略梯度DPG,它是价值q关于Actor参数θ的梯度