【论文】goal-conditioned框架

在学习基于goal的分层强化学习算法之前,先了解一下在goal-conditioned问题下的算法。虽然不属于分层强化学习,但这个框架能讲清楚什么是goal。

Universal Value Function Approximators

将强化学习中的值函数同时定义在状态s和目标g上,提出一种监督学习的方法将值函数分解成状态和目标的嵌入向量,从而学习到s和g到它们各自嵌入向量之间的映射问题。 

Background

对于任意目标,定义伪奖励函数和伪折扣函数。伪折扣函数有着决定每一时刻与s相关的折扣因子和决定状态是否终止的作用。

对于任意策略和每一个目标g,状态价值函数和动作价值函数分别扩展为:

 每个目标g均对应着一个最优策略,以及最优值函数

UVFA网络结构

主要思想是 用单一的、统一的函数逼近器来表示一组最优值函数,它可以概括所有的状态和目标。具体来说,就是在状态空间和目标空间上用,其中

Left:Concatenated Architecture

最直接的一种方式,,将状态s和目标g连接在一起作为一个联合输入,输入到非线性函数近似器例如MLP中。

Center:Two-Stream Architecture

首先分别将状态s和目标g输入到两个不同的子模块中,,得到状态s和目标g对应的n维嵌入向量,然后将嵌入向量同时输入到输出函数中,得到一个标量输出。文中关注的是映射函数都是一般函数逼近器(例如MLP),h是简单函数(例如点乘)。

Two-Stream Architecture可以很好地学习到state和goal之间的共同结构。

  • 在很多情况下,goal都可以定义成state的形式/state的组合,\mathcal{G} \subseteq S。因而Φ和φ之间应该有一些可以共享的feature。
  • 在有些情况下,UVFA可能是对称的 \forall s,g, \quad V^*_g(s)=V^*_s(g)

Right:Decomposed View of Two-Stream Architecture

分两个阶段训练 

基于监督学习的UVFA

有两种学习的方法,一种是端对端(end-to-end),一种是基于矩阵分解(matrix factorization)的两阶段(two-stage)训练。

端对端(end-to-end):通过一个合适的loss function(比如MSE E[(v^*_g(s)-v(s,g;\theta))^2])+梯度下降实现

两阶段(two-stage):

  • stage1:将V*(g)放到一个矩阵中,行表示state,列表示goal。进行矩阵分解,得到\hat{\phi_s}\hat{\varphi_g}
  • stage2:将\hat{\phi_s}\hat{\varphi_g}作为ground-truth,学习Φs和φg

(也就是这个

强化学习UVFA

目标的选取 

没有具体说目标从哪里来以及如何表示目标,而是直接说目标是状态的子集,当状态达到目标时获得奖励。

其中,是原本的折扣函数

 Hindsight Experience Replay

这一篇文章是建立在UVFA基础之上的,hindsight是事后聪明的意思,点明了本文算法的核心思想。经验回放技术HER以UVFA中所提出的同时基于状态和目标的值函数为基础,其背后的思想是:在回放每个episode时,用一个新的目标替代原本智能体需要完成的目标,这个新的目标是本episode中实现过的目标。

在off-policy算法中,目标只会影响transition的动作,而不会影响状态之间的动态转移,因此我们可以把经验回放池中transition的原始goal替代成对应episode已经实现过的状态,奖励也就变成了完成目标所能得到的奖励,这样就能够保证回放池中总是有足够数量的正奖励样本。

本文针对的是一种特殊场景,环境中只存在稀疏的二元奖励,奖励是用来表示任务是否完成的,只有在任务完成的时候智能体才会得到奖励。稀疏奖励下模型很难得到有效的学习。为了解决稀疏奖励的问题,一种常用的做法是 reward shaping,即根据对环境的先验信息人为设计奖励,但这种方法需要我们具备对特定场景的知识,并根据这些知识精心设计奖励,另外,这些reward所表示的含义有可能与原本我们的目标是相悖的,因此并不适用于某些我们不知道合理行为是何种行为的场景中,因此研究如何从 unshaped reward 中学习策略 具有十分重要的意义,例如反映任务是否成功完成的二元奖励,这就是本文的出发点。

Multi-goal RL 

本文考虑的是训练智能体实现多个不同的目标。经过实验证实,训练智能体实现多个目标比只实现一个目标要学得更快,因此HER同样适用于只有一个目标需要实现的场景。

 假设每个目标对应一个预测:,智能体的目标就是找到某个状态使。当我们明确知道我们希望达到什么样的目标时,此时有。当目标是状态的某些属性时(只需要达到某些特征的状态),假设,目标是达到任意给定x坐标的状态,此时有

总结一下,就是,假设给定任意状态s,均可以找到该状态所能够实现的目标g。比如第一个例子里,m就是一个常数g,第二个例子里,

一个通用策略是使用任意off-policy算法求解,通过从某些分布中采样目标和初始状态,运行一些时间步,并在目标没有实现时在每个时间步给它一个负奖励,比如。但实践效果不好,因为奖励函数稀疏并且没有提供有效的信息,所以HER才被提出。

HER

HER的思想比较简单, 经过了一个episode 之后,我们将每个transition存储起来,每个experience里的目标不仅包含初始设定的目标,还包含一些重新设定的目标。之所以可以这么做的原因是目标只会影响智能体的动作,但是并不会影响环境的动态变化规律,因此当我们采用off-policy算法时(所学习的策略与正在执行的策略不一致),我们可以将trajectory里的目标更改为任意其他目标。

我们主要有4种新目标的获取方式:

  1. final — goal corresponding to the final state in each episode:把相应序列的最后时刻的状态作为新的目标goal
  2. future — replay with k random states which come from the same episode as the transition being replayed and were observed after it:从该时刻起往后的同一序列中的状态,随机采样k个作为新的目标goal
  3. episode — replay with k random states coming from the same episode as the transition being replayed:对于同一序列中的状态,随机采样k个作为新的目标goal
  4. random — replay with k random states encountered so far in the whole training procedure:从全局出现过的state中,随机选择k个作为新的目标goal。

对于第一种方式,每一条原始经验可以得到一条新的经验,而对于后三种方式,每一条原始经验可以得到k条新的经验。

 图中的重点是经验池Replay Buffer的构建,而模型本身可以选择任意off-policy的强化学习模型,如DQN、DDPG等。

经验池的构造过程我们可以进行如下拆解:

(1)基于实际目标g采样完整序列
我们首先要采样M个完整的序列。对于任意一个序列,我们首先采样它的初始状态和目标状态,因为此时每个序列的目标是不同的,我们要根据不同的目标来选择动作,所以动作的采样同时基于当前的状态s和目标g。同时,基于状态s、动作a以及目标g来计算奖励r。因此保存的每一条经验可以由五部分组成:当前状态s,采取的动作a,即时奖励r,下一个状态s',当前的目标g。我们把这部分基于实际目标g采样得到的经验存放入经验池中。可以看到,这部分经验中的反馈大多都是负反馈。每一个完整的序列最多只有一条正反馈。

(2)通过变换目标得到新的经验
对于每一个序列,我们可以得到一些额外的经验,我们通过一些方法来得到一个新的目标g' 。并将(st,at,r',st+1,g')存入我们的经验池中。

有代码可以模拟:https://github.com/princewen/tensorflow_practice/tree/master/RL/Basic-HER-Demo

调试可参考博客:强化学习反馈稀疏问题-HindSight Experience Replay原理及实现!-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: calib_check_cond - ill-conditioned matrix for input array 0是一个计算机程序中的错误信息。这个错误信息通常出现在进行矩阵运算时,输入矩阵存在不良条件(ill-conditioned)的情况下。 矩阵的条件数(condition number)是矩阵的一个数值特征,用于描述矩阵在数值计算中的稳定性。当矩阵的条件数很大时,说明矩阵很不稳定,即很容易出现数值误差,这样的矩阵被称作不良条件的矩阵。 在程序运行中,如果输入的矩阵是不良条件的矩阵,就会出现上述的错误信息。这意味着程序无法进行矩阵运算,因为输入矩阵的条件数过大,导致程序不稳定,进而出错。 如果遇到这样的错误信息,我们应该首先检查输入矩阵是否正确。如果输入矩阵本身就存在问题,例如存在无穷或未定义的元素等,就需要修正输入矩阵,再重新运行程序。如果输入矩阵本身没有问题,那么可能需要使用更高精度的算法或者调整算法参数来改善程序的数值稳定性,同时提高程序的精度和效率。 ### 回答2: calib_check_cond是用于检查矩阵条件数的函数,通常被用于计算机视觉和机器学习领域。在使用calib_check_cond时,如果发现输入数组中的矩阵条件数过差,就会出现这种错误信息。 所谓条件数,是用于描述矩阵变形的一个指标。矩阵的条件数越大,就说明在矩阵变形时数据的精度越容易受到影响。因此,在使用calib_check_cond之前,需要先对数据集进行预处理,以确保输入矩阵在变形时不会出现过多的误差。 如果出现了calib_check_cond - ill-conditioned matrix for input array 0的错误信息,通常会有两种解决方案。第一种是通过重新选择、清洗或规范化数据集来降低矩阵的条件数。第二种则是通过增加算法的鲁棒性,让算法能在低条件数的矩阵中正常运行。 总之,在使用calib_check_cond时,需要注意输入矩阵的条件数,避免出现过大的误差。同时,也需要根据具体的情况选择合适的解决方案,以确保算法的稳定性和准确性。 ### 回答3: calib_check_cond - ill-conditioned matrix for input array 0 in function 'cal',这个错误提示是,在计算过程中使用了病态矩阵,导致计算的精度出现了问题,从而得到了不合理的结果。病态矩阵是指条件数非常大的矩阵,即矩阵中部分数值非常小或非常大,导致计算误差非常大。当一个矩阵的条件数很大时,意味着微小的误差会被放大,从而导致数值计算的不准确。 要解决这个问题,可以尝试使用数值稳定的算法或者重新设计算法,以克服矩阵条件数大的问题。另外,检查输入数据的有效性也是必要的。可以分析出错的数据,看看是不是存在错误的输入,或者数据本身就不合理。若是因为输入数据不合理导致的问题,需要调整输入数据以保证矩阵的条件数在一个合理的范围内。同时,也可以尝试使用数值精度更高的数据类型,例如Double precision浮点数,从而提高计算精度。 总之,遇到calib_check_cond - ill-conditioned matrix for input array 0 in function 'cal'这个错误提示,需要注意输入数据的有效性和矩阵的条件数,并采用合理的算法和数据类型进行优化,以获得更精确的计算结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值