首页 > 其他分享 >强化学习_截断情况下的GAE计算——truncation

强化学习_截断情况下的GAE计算——truncation

时间:2024-11-23 17:02:45浏览次数:5  
标签:mask 截断 vs values ti GAE truncation

GAE是强化学习中常用的一种advantage计算方法,被经常应用于A3C、A2C、TRPO、PPO中,但是在常见的GAE实现中都是不考虑截断情况下的,也就是truncation情况下,本文给出Google的一种truncation情况下的GAE计算方法的实现。


解释一下什么叫做truncation截断:

在强化学习中agent需要和环境进行一系列的交互从而形成一个连贯时序的episode,而这个episode的程度往往是被设定为有最大值的,即time_limit,当agent在一个时序连贯的交互中episode长度等于time_limit时就需要truncation截断,毕竟常见的就是cartpole问题中的200步长的限制,也就是episode长度最大不能超过200。


代码来源:

https://openi.pcl.ac.cn/devilmaycry812839668/google_brax_ppo_pytorch

  @torch.jit.export
  def compute_gae(self, truncation, termination, reward, values,
                  bootstrap_value):
    truncation_mask = 1 - truncation
    # Append bootstrapped value to get [v1, ..., v_t+1]
    values_t_plus_1 = torch.cat(
        [values[1:], torch.unsqueeze(bootstrap_value, 0)], dim=0)
    deltas = reward + self.discounting * (
        1 - termination) * values_t_plus_1 - values
    deltas *= truncation_mask

    acc = torch.zeros_like(bootstrap_value)
    vs_minus_v_xs = torch.zeros_like(truncation_mask)

    for ti in range(truncation_mask.shape[0]):
      ti = truncation_mask.shape[0] - ti - 1
      acc = deltas[ti] + self.discounting * (
          1 - termination[ti]) * truncation_mask[ti] * self.lambda_ * acc
      vs_minus_v_xs[ti] = acc

    # Add V(x_s) to get v_s.
    vs = vs_minus_v_xs + values
    vs_t_plus_1 = torch.cat([vs[1:], torch.unsqueeze(bootstrap_value, 0)], 0)
    advantages = (reward + self.discounting *
                  (1 - termination) * vs_t_plus_1 - values) * truncation_mask
    return vs, advantages

这个实现中的一个关键就是GAE计算中的delta,如果一个timestep的下一步是truncation截断,那么这一步的delta直接赋值为0,而通过delta计算出advantage之后也需要将下一步为truncation截断的哪个timestep对应的advantage赋值为0,具体如:(与truncation_mask相乘)

    advantages = (reward + self.discounting *
                  (1 - termination) * vs_t_plus_1 - values) * truncation_mask

不过需要注意的是,在大多数的情况下是可以不对截断情况作区分的,常见的方法就是直接将截断情况视作termination,也就是episode主动结束,即game over!!!因为大多数情况下,我们都是希望episode越长越好的,因此我们会设置一个比较大的time limit,比如这里的示例代码所在的例子中就是1000,而cartpole则为200,而除了time limit是一个较小数值以外的情况时这个截断都可以不用考虑的,因为并不会对整体算法性能有明显影响的。



个人github博客地址:
https://devilmaycry812839668.github.io/

标签:mask,截断,vs,values,ti,GAE,truncation
From: https://www.cnblogs.com/xyz/p/18564776

相关文章

  • Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with
    一、现象在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Datatruncation:CannotcreateaJSONvaluefromastringwithCHARACTERSET'binary'.​‍报错信息:Cause:com.mysql.cj.jdbc.exceptions.MysqlDataTruncation:......
  • 【C语言】分析整型提升|截断
    这里通过例子来帮助理解整型提升和截断的规则。问题:赋值过程是怎样的?什么情况会发生截断?整型提升的规则是什么?根据什么类型来提升?%d,%u对整型提升后的结果有什么影响?例一#include<stdio.h>intmain(){ chara=-128; printf("%d\n",a); printf("%u\n",a); r......
  • 在指定的 json 边界内绘制 hexbin 截断
    我正在绘制一个单独的hexbin图和json边界文件。不过,hexbin网格与边界文件重叠。我只想展示非洲大陆。我的目标是在非洲大陆内切断或分割六边形网格因此,边界文件之外不应显示任何网格方块。有没有办法使用Plotly来实现这一点?预期的输出是截断或剪切非洲大陆之外的......
  • curl发送get和post请求时遇到&截断的问题解决
    get的parameter里带&被截断处理第一种是双引号括住 第二种是加反斜杠转义 post请求的body里有参数的value带了&curl-XPOSThttp://qa-ci.fuxi.netease.com:36800/job/xxxxx/xxxx--userxxxx:xxxxx-d token=popo -d"msg=cd/ssd/deployment_bash&&bashkill.b......
  • 使用 python 截断 Databricks 中的增量表
    对于Python和SQL,这里给出了Delta表删除操作,并且给出了使用SQL的截断这里但我找不到Python截断表的文档。如何在Databricks中对增量表执行此操作?HowtodoitfordeltatableinDatabricks?虽然Databricks中没有直接使用PythonAPI截断De......
  • 编解码器无法解码位置 2-3 中的字节:截断的 \UXXXXXXXX 转义 (Python QREADER)
    我正在尝试pythonqreader模块,但每次我尝试运行它时,我都会收到SyntaxError:(unicodeerror)'unicodeescape'codeccan'tDecodebytesinposition2-3:truncated\UXXXXXXXXescapeerror.fromqreaderimportQReaderfromcv2importQRCodeDetector,imreadfrompyz......
  • TRL SFTTrainer 对截断的说明
    我目前正在使用Huggingface中的SFTTrainer微调LLama模型。但是,我提出了一个问题,我无法通过文档回答(至少,它有点模糊)。我的数据集包含从20个令牌到5k个令牌的样本。目前我正在使用|||和max_seq_length=512,.packing=True但是,我不清楚的是,具......
  • winform 动态截断或者补全文字宽度
    使用TabControl时,发现它的选项卡宽度会随文字长度变化,我自己做了一个浏览器,发现很难看,于是写了上算法,对文字长度进行填充或截断,效果很不错: 调用代码:using(varg=tabs.CreateGraphics()){tabPage.Text=""+PadAndEllipsis(g,tabs.Font,title,150)+""......
  • 使用AOP和注解对DTO中的字段进行截断——第一次使用AOP和自定义注解的心得
    是骚操作,但是为了应对特殊的需求,实现了通过在方法上应用@TruncateString注解,进入AOP,获得第一个参数中的DTO,然后获取DTO中加了@LimitStringLength注解,将字段修改之后返回。#AOP中要注意的点:AOP由Spring管理,所以要生效的话需要加上@Component注解可以把注解绑定到一个方法上,然后......
  • ffmpeg封装和解封装介绍-(9)根据输入时间参数和文件名调整截断时间
    头文件:xformat.h#pragmaonce///<summary>///封装和解封装基类///</summary>#include<mutex>structAVFormatContext;structAVCodecParameters;structAVPacket;structXRational{intnum;///<Numeratorintden;///<Denominator......