强化学习(问题集)

什么是强化学习
强化学习是一种从行动中学习的计算方法。强化学习循环输出state,action和reward的序列,agent的目的是最大化预计累计奖励(expected cumulative reward)
为什么 Agent 的目标是最大化预期的累积奖励
实际上,强化学习是基于奖励假设的想法。所有目标都可以通过预期累积奖励的最大化来描述。
gamma的折扣率
它必须介于0和1之间。越大,折扣越小。这意味着学习,agent 更关心长期奖励。另一方面,gamma越小,折扣越大。这意味着我们的 agent 更关心短期奖励(最近的奶酪)。
累积的折扣预期奖励是:
在这里插入图片描述
情节性任务(episodic tasks)
这种情况下,强化学习任务会有一个起点和终点(一个最终状态)。
持续性任务
这些是永远持续的任务(没有终点状态)。在这种情况下,agent必须学习如何选择最佳操作并同时与环境交互。
蒙特卡洛方法
当剧集结束时(智能体达到“终端状态”),Agent 会查看总累积奖励,看看它的表现如何。在蒙特卡洛方法中,奖励仅在比赛结束时收到。
在这里插入图片描述
时序差分方法:每一步的学习
TD学习不会等到剧集结束时更新最大预期未来奖励估计:它将更新其在该经历中发生的非最终状态St的价值估计V。该方法称为TD(0) 或一步TD(在任何单个步骤之后更新值函数)。
在这里插入图片描述
探索/开发权衡
探索是寻找有关环境的更多信息。
开发是利用已知信息来最大化奖励。
基于数值方法
在基于数值的RL中,目标是优化价值函数 V(s)。价值函数是一个函数,表明agent在每个状态获得的最大预期未来奖励。
在这里插入图片描述
在给定一个状态下,我们选择有最高Q值(在所有状态下最大的期望奖励)的行动。因此,在基于价值的学习中,一个策略存在仅仅出于这些行动价值的评估。
当行动个数有限时,该方法很有效。
基于策略方法
不使用值函数的情况下直接优化策略函数 π(s)
有两种策略类型:
确定性:给定状态下的策略将始终返回相同的操作。
随机:输出行动上的分别概率。
当动作空间是连续的或随机时,这很有效。
在这里插入图片描述
基于模型方法
对环境进行建模。这意味着我们创建了一个环境行为的模型。问题是每个环境都需要不同的模型表示。
Q-Learning
一种基于数值的强化学习算法,用于使用q函数找到最优的动作选择策略。它根据动作值函数评估要采取的动作,该动作值函数确定处于某种状态的值并在该状态下采取某种动作。

创建一个表格,计算每种状态 state 下采取的每种行动 action的最大的未来预期奖励。

目标:最大化Q函数(给定状态和行动的预期未来奖励)。

Q表示来自特定状态下某个动作的质量。
Q学习算法:学习动作值函数
动作值函数(或“ Q 函数”)有两个输入:“状态”和“动作”。它返回该动作在该状态下的预期未来奖励。
在这里插入图片描述
epsilon贪心策略
指定一个探索率“epsilon”,开始时设置为1,即随机执行step的速度。刚开始学习时,这个速率必须是最高值,因为对Q表的取值一无所知。这意味着需要通过随机选择行动进行大量探索。

生成一个随机数。如果这个数字> epsilon,那么将进行“ 开发”(这意味着使用已知的方法来选择每一步的最佳动作)。否则,会进行探索。

在Q函数训练开始时必须有一个较大的epsilon。然后,随着Agent变得做得越来越好,逐渐减少它。
使用Bellman方程更新Q(s,a)
在这里插入图片描述

New Q value =  Current Q value + lr * [Reward + discount_rate * (highest Q value between possible actions from the new state s’ ) — Current Q value ]

Q-Learning缺陷
状态空间是大型环境时,生成和更新Q表可能会失效。
Deep Q神经网络
神经网络获取智能体的状态并为该状态的每个动作计算Q值。
什么是Deep Q-Learning(DQL)?
以四个图像帧的堆叠作为输入。它们通过其网络,并在给定状态下为每个可能的动作输出Q值向量。采用此向量的最大Q值来找到我们最好的行动。
使用DQL的最佳策略是什么?
如何处理时间限制问题
使用LSTM神经网络 来处理。
将图像帧堆叠在一起,因为它有助于我们处理时间限制(temporal limitation)的问题。
为什么我们使用经验回放
更有效地利用观察到的体验,避免被固定在状态空间的一个区域上。这可以防止反复强化相同的动作。

(1)避免忘记以前的经历。
问题:权重的可变性,因为行动和状态之间存在高度相关性。在每个时间步,得到一个元组(state, action, reward, new_state)。从(这个元组)中学习,然后扔掉这个经验。问题是将智能体与环境相互作用的得到序列样本输入到神经网络进行训练过程中。 神经网络往往会忘记以前的经历,因为它的参数会被新的经验覆盖。

解决方案:创建一个“replay buffer”存盘。在智能体与环境交互时存储经验元组,然后我们用小批量元组数据a small batch of tuple来训练神经网络。防止网络只学习智能体当前的经验。

(2)减少经验之间的相关性。
问题 :每个行动都会影响下一个状态。行动过程得到了一个序列的经验元组,这些元组可能会高度相关。如果按序列顺序训练网络,这种相关性会影响我们的智能体。

解决方案:通过在replay buffer随机抽取,我们可以打破这种相关性。可以防止动作值发生振荡或发散。

优先级经验回放:这让我们可以更频繁地向神经网络呈现罕见或“重要”的元组。
DQL背后的数学是什么?
使用Bellman方程更新给定状态和动作的Q值
在这里插入图片描述
时序差分误差(或TD误差)是通过Q_target(来自下一个状态的最大可能值)和Q_value(我们当前预测的Q值)之间的差来计算的。
在这里插入图片描述

Initialize Doom Environment E
Initialize replay Memory M with capacity N (= finite capacity)
Initialize the DQN weights w
for episode in max_episode:
    s = Environment state
    for steps in max_steps:
         Choose action a from state s using epsilon greedy.
         Take action a, get r (reward) and s' (next state)
         Store experience tuple <s, a, r, s'> in M
         s = s' (state = new_state)
         
        Get random minibatch of exp tuples from M
         Set Q_target = reward(s,a) +  γmaxQ(s')
         Update w =  α(Q_target - Q_value) *  ∇w Q_value

DQN四种改进策略
fixed Q-targets
double DQNs
duelingDQN(又名 DDQN)
Prioritized Experience Replay(又名PER)
固定Q目标
计算TD目标值(Q_target)和当前Q值(Q的估计)之差 得到TD误差(又称损失)。
在这里插入图片描述
但真实的TD目标值我们并不知道。我们需要估计它。使用Bellman方程,我们看到TD目标只是在该状态下采取该行动的奖励加上下一个状态的折扣率下的最高Q值。
在这里插入图片描述
问题:使用相同的参数(权重)来估计目标和Q值。结果是,TD目标与正在改变的参数(w)之间存在很大的相关性。这意味着在训练的每一步,Q值都会发生变化,但目标值也会发生变化。导致训练的大振荡。

解决方案:使用具有固定参数的单独网络(让我们称之为w-)来估计TD目标。在每个Tau步骤,我们从DQN网络复制参数以更新目标网络。因为目标函数保持固定一段时间,将有更稳定的学习过程。
在这里插入图片描述
创建两个网络(DQNetwork, TargetNetwork)。创建一个函数,它将获取 DQNetwork 参数并将它们复制到TargetNetwork。在训练期间,使用目标网络计算TD目标。用DQNetwork 每一步 tau更新目标网络 (tau 是定义的超参数)。
Double DQNs
解决了Q值估计过高的问题。
在这里插入图片描述
计算TD目标,面临一个问题:如何确定下一个状态的最佳动作是具有最高Q值的动作?
q值的准确性取决于智能体尝试了多少行动以及我们探索的邻近状态。在训练开始时,智能体没有足够的信息来了解最佳行动。因此,将(有噪声的)最大q值作为最佳动作可能会导致false positives(FP,假正)。如果未优化的动作经常给出比所求得的最优化动作更高的Q值,则学习将变得困难。

解决方案:当我们计算Q目标时,我们使用两个网络将动作选择与目标Q值生成分离。
使用DQN 网络选择对下一个状态采取的最佳动作(具有最高Q值)。
使用目标网络计算在下一个状态下执行该操作的目标Q值。
在这里插入图片描述
在这里插入图片描述
DuelingDQN(DDQN)
基于竞争构架Q网络
将Q(s,a)分解为:
V(s):处于该状态s的值,状态值 V(s)的估计。
A(s,a):在该状态s下采取该行动a的优势(该状态的采取此行动与所有其他可能行动相比有多好)。每个动作的优势的估计 A(s,a)。
在这里插入图片描述
在这里插入图片描述
为什么我们需要分别计算V(s)和A(s,a)这两个参数呢?
通过解耦估计,DDQN可以直观地了解哪些状态是(或不是)有价值的,而不必了解每个状态下每个动作的效果(因此,还是需要计算V(s)的)。使用原版的 DQN,需要计算某个状态state下每个动作的值。但如果该状态state不好,这样就做有什么意义呢?通过解耦计算 V(s),找出对于那些任何行为都不会被影响的状态尤其有用。在这种情况下,不必计算每个动作的值。
整合层aggregation layer
在这里插入图片描述
其中 θ 是卷积层参数,β 和 α 是两支路全连接层参数。
问题:将陷入可识别性问题,即 - 给定Q(s,a)我们无法找到A(s,a)和 V(s)。

解决方案:强制我们的优势函数在选中的行动上具有0优势。(保证该状态下各种动作的优势函数大小排序关系不变的前提下,缩小Q值范围,去均值的过程)减去了该状态下可能采取的所有行动优势的平均值。
在这里插入图片描述
有助于加速训练网络。只计算状态的值,而不用计算该状态下所有动作的值。它可以帮助我们通过解耦两个流之间的估计来为每个动作找到更可靠的Q值。
优先经验回放 Prioritized Experience Replay
问题:对于训练,某些经验可能比其他经验更重要,但不那么频繁出现。因为统一对批次进行抽样(随机选择经验),所以这类经验丰富的样本几乎没有机会被选中。

解决方案:利用PER,通过使用一个标准来定义每个经验元组的优先级来改变采样分布。当预测值和TD目标存在很大差异的时,设置优先获得该经验,TD误差幅度的绝对值:在这里插入图片描述
将优先级放在每个回放缓冲区的经验中。在这里插入图片描述
但是不能只做贪婪的优先次序,因为这会导致总是训练相同的经验(具有很高的优先级),从而过度拟合。因此,引入随机优先级的概念,产生被选择中用于回放的概率。在这里插入图片描述
在每个时间步骤中,获得具有此概率分布的一批样本并在其上训练网络模型。
重要度采样(IS)
通过正常的体验重放,使用随机更新规则。因此,对体验进行抽样的方式必须与它们的原始分布相匹配。当有正常的经验时,选择正常分布的经验 - 简单地说,随机选择经验。无偏采用,每个经验都有相同的机会,所以优化器可以正常更新的学习模型的权重。
问题:这种放弃了随机采样使用优先级采样的方式,会向高优先级样本引入偏差(更多机会被选中)。更新模型权重会有过拟合的风险。与低优先级经验(=偏差)相比,具有高优先级的经验样本可能多次用于训练。因此,模型只会使用一小部分经验更新权重。

解决方案:使用重要度采样(IS),通过减少常见样本的权重来调整更新模型。在这里插入图片描述
对高优先级的样本的权重几乎不进行调整(需要网络将多次看到这些经验),而对低优先级样本的权重进行彻底的更新。
b的作用是控制这些重要性采样权重对学习的影响程度。在实践中,b参数在训练期间逐步上升至1,因为当q值开始收敛时,这些权重在学习的后期更为重要。如文所述,无偏性的更新对误差收敛是至关重要的。
SumTree 二叉树
问题:不能只根据优先级对所有经验回放样本(Experience Replay Buffers)进行排序来实现优先经验回放PER。
解决方案:SumTree 是二叉树(一种树形结构),每个节点最多只有两个子节点。 每片树叶存储每个样本的优先级p, 每个树枝节点只有两个分叉, 节点的值是两个分叉的合。
更新树(更新优先级参数)和采样将非常有效率
在这里插入图片描述
1.创建一个包含sumtree和data的内存对象。
2.采样得到大小为k的小批量样本,将范围[0,total_priority]划分为k个范围。
3.从每个范围均匀地采样。
4.从sumtree中检索对应于这些采样值中的每一个的转换(体验)。
基于策略的方法
不同于学习能告诉我们给定状态和行动下奖励总和的价值函数,我们直接学习能使得状态映射到行为的策略函数(不通过价值函数选择行动)。不通过价值函数试错而直接尝试优化策略函数π,直接参数化π(不通过价值函数选择行动)。可以通过价值函数来优化策略参数。但是价值函数将不再用来选择行动。
为何要使用策略函数
1.策略函数有更好的收敛特性。
价值函数在训练时有大的震荡。策略梯度循着梯度寻找最佳值,确保收敛于局部最大值(最坏的情况)或是全局最大值(最好情况)。
2.策略梯度在高维空间或是连续行动时更有效。
深度Q学习的一个问题是它在每一步的预测中对给定当前状态的每一个可能行为分配一个分值(最大化预测将来的奖励)。如果是无限可能的行动呢?可能会有近乎无限行为的选择。在策略函数中,要直接调整参数(你将要理解什么是最大值),而不是在每一步估算最大值。
3.策略梯度能学习随机策略,而价值函数不能。
不需要应用探索和开发的权衡。随机策略允许智能体在状态空间探索,因为它输出一个行为集上的概率分布。去除感知混淆的问题,它是说我们在两个看起来(或实际上)相同的状态,却需要不同的行为。
策略类型
1.确定的策略
一个确定的策略能将状态映射到行为上。输入一个状态,函数将反馈一个要执行的行为。确定的策略用在确定的环境,行动执行的环境决定了结果,不存在不确定性。
2.随机的策略
一个随机的策略输出一个行为集可能的指派。不是确定地选择行为a,而是我们有可能能选择不同的。随机策略用在环境不确定的情况下。这一个过程也叫部分可测马尔科夫决策过程(POMDP)。
策略梯度的劣势
在绝大多数情况下,它将在收敛于局部最大值而不是全局最大值。
收敛非常慢。
策略选择
规避策略梯度的劣势。
带参数θ的策略π输出行动集的概率分布。
在这里插入图片描述
给定状态S,采取带参θ行动a的概率
怎样才能知道我们的策略是好的呢?
策略可被看做是优化问题。必须寻找到最佳参数(θ)来最大化得分函数J(θ)。在这里插入图片描述
1.利用策略评分函数J(θ)来测量π(策略)的质量。使用目标函数(或策略评分函数)来计算期望的策略奖励。
2.使用策略梯度上升来找寻最佳参数θ来改进π。
策略评分函数J(θ)
1.在一个情景的环境中,我们取一个开始值,并计算从第一步(G1)开始反馈的均值。
在这里插入图片描述
2.在一个连续的环境中,因为我们不能依赖特定的开始状态,所以我们可以使用平均值。每个状态值通过对应状态发生的概率来加权(因为有些更可能发生)。
在这里插入图片描述
3.使用每步的平均奖励以使我们每步都要获得最高的奖励。
在这里插入图片描述
策略梯度上升
梯度上升是梯度下降的反转。
找到相应梯度,以使当前策略π在迭代中最大增量方向上更新参数。
在这里插入图片描述
策略梯度
在这里插入图片描述
R(T)像是个标量值:如果R(T)高了,就意味着采取行动平均情况下会导致高奖励。如果R(T)低了,要降低可见行为的概率。
梯度的策略导致参数在有最高回报的最支持的行动的方向上移动。
为何是梯度上升而不是梯度下降?
因为要在错误函数中使用梯度下降来求最小值。但是得分函数不是错误函数,它要求最大值的,所以使用梯度上升。
蒙特卡洛策略梯度

Initialize θ for each episode τ = S0, A0, R1, S1, …, ST:
    for t <-- 1 to T-1:
            Δθ = α ∇theta(log π(St, At, θ)) Gt
                    θ = θ + Δθ
For each episode:
     At each time step within that episode: 
            Compute the log probabilities produced by our policy function. Multiply it by the score function.         
            Update the weights

需要大量的采样,这将导致很慢的学习。
策略梯度方法之REINFORCE 算法
该方法的主要问题是找到一个好的评分函数来计算策略的好坏程度。使用episode的总奖赏作为评分函数(每个Episode中获得的奖励之和)。
策略梯度存在的问题
当使用蒙特卡洛策略梯度方法时,会等到整个情景episode结束后计算奖励。据此可以得出结论,若结果回报值很高R(t),整个情景中所做的行动都被是指定为是有利的(行动),即使有些行动非常糟糕。
总回报(total reward)的重要评分使得所有被执行过的行动的策略参数被平均。因此,学习模型要获得最优策略,就需要大量样本。因此导致训练过程耗时,因为这需要花费大量的时间来收敛loss函数。
Actor Critic(AC)
表演者-评论家模型是一个更好的得分函数。在每个步骤进行更新(即时序差分学习,TD学习)。
在这里插入图片描述
总回报R(t)。
需要训练一个与值函数近似的评论家模型(记得,值函数是通过给定状态和动作计算的最大未来回报的期望值)。这个值函数被用来代替使用策略梯度时的奖励函数。

将用到两个神经网络:
衡量所采取的行动的好坏的评价器(critic)(基于值函数)
控制智能体行为方式的行动者(actor)(基于策略)
**ACTOR:**一个控制智能体行为的策略函数
在这里插入图片描述
**CRITIC:**一个衡量这些行为好坏程度的值函数
在这里插入图片描述
有两个模型(Actor和Critic)需要被训练,所以需要分别优化两组权重(用于行动的)
在这里插入图片描述
Actor Critic过程
在每个时间步,从环境中获取当前状态(St),并将其作为输入传到Actor表演者和Critic评论家两模型中。
在这里插入图片描述
策略获得状态,输出一行动(At),并再接收一个新状态(St+1)和奖励(Rt+1)。
在这里插入图片描述
评论家模型计算当前状态下采用某行动的得分q
表演者模型使用这个q值更新自身的策略权重
在这里插入图片描述
参数更新后,使得在新状态St+1到来时,Actor可以获取到对应的行动At+1
在这里插入图片描述
随后,Critic更新他的参数值。
在这里插入图片描述
优势函数Advantage function
问题:基于值函数的方法具有大的训练波动。
优势函数
在这里插入图片描述
该函数给出相比在当前状态下采用平均行动(动作值函数)的优势值。换句话说,如果采取这个行动,该函数计算我这个行动得到的奖励。(注:优势函数的目的是,使用动作值函数减去了对应状态拥有的基准值,使之变为动作带来的增益,从而降低因状态基准值的变化引起的方差)
如果 A(s,a) > 0: 梯度将朝梯度的那个方向更进一步。
如果 A(s,a) < 0:(我们的行为比该状态的平均值更差),梯度将朝相反的方向进一步。
使用 差分时间序列误差TD Error作为该优势函数的(无偏)估计。
在这里插入图片描述
(Q(s,a)是动作值函数,V(s)也就是在状态s下所有动作值函数动作概率的期望)
Advantage Actor Critic(优势行动者评论家算法)
A2C(又名优势演员评论家)
A3C(又名异步优势演员评论家)
A3C中,不使用经验回放,因为这需要大量内存。而是使用并行的在多个环境实例上异步执行不同的智能体。(可多核CPU跑)每个work(网络模型的副本)将异步地更新全局网络。
A2C与A3C的唯一区别
A2C是同步更新全局网络。等到所有works完成训练后,计算他们的梯度的均值,以更新全局网络参数。
选择A2C还是A3C?
A3C存在的问题 :由于A3C的异步特性,一些works(智能体的副本)使用较旧版本的参数。因此,这样几个work聚合地更新参数不是最好的。

A2C在更新全局参数之前会等待每个actor模型完成他们网络的各自部分的经验训练。然后,重新开始一个使用各自部分经验的新训练,并且所有并行模型具有相同的新参数。训练更快速。
A2C中的每个work都具有相同的权重集,与A3C不同的是,A2C同时更新所有work(的参数)。
近端策略优化(Proximal Policy Optimization,PPO)

猜你喜欢

转载自blog.csdn.net/weixin_44356285/article/details/87449781