【强化学习】关于PPO收敛问题

文章目录


前言

写了好几个版本的PPO,很容易出现的问题。


1.注意两处维度须一致

  • 1.注意两处维度须一致

    markdown 复制代码
    1.surr1 = ratio * adv
    2.returns = adv + value
    又由于ratio = torch.exp(new_log_probs - old_log_probs)得到
    所以须保证log_prob 与 adv的维度一致;adv与value的维度一致
    即:log_prob与adv与value的维度一致
    
    而elegentRL 有此代码,推荐其代码库
    即: assert logprobs.shape == advantages.shape == reward_sums.shape == (buffer_size,)
     
     不然会出现 bx1 + b = bxb 的结构 ,这样就不对了 

2.梯度问题

  • 2.梯度问题

    即:其实就是求导问题:一般来说,目标值不需要梯度 例子,目标值为5, x-5求导为1 ,否则 对x - y 求导 就会报错。

    这里就是old_log,adv, return 不需要梯度。

    与adv 计算相关的value值 也可以有梯度,只要最终adv没有梯度就行。

    特别的torch.tensor(advantage_list, dtype=torch.float) (--- hand-on RL) 这种也是去掉梯度的方式,所以一般buffer里的数据都是无梯度的。

3.提高收敛因素

  • 3.提高收敛因素

    1.horizon 即每次更新的步数设置为2048时极大提高收敛效率

    2.state 归一到 -1~1

    3.action只有在环境需要限制大小的值时才要clip,在训练时的action 不要clip 保证与训练时计算的分布相同

其他

  • 其他

    torch.cat([values, last_value.unsqueeze(0)]) 不会起移除梯度,加梯度作用

    主要作用是 with torch.no_grad():

    markdown 复制代码
    with torch.no_grad():
         values = self.value(batch_states).squeeze(-1)
    
    print(values.requires_grad,1)
    values = torch.cat([values, last_value.unsqueeze(0)]) 
    print(values.requires_grad)
    
    False 1
    True
    markdown 复制代码
    with torch.no_grad():
         values = self.value(batch_states).squeeze(-1)
    
         print(values.requires_grad,1)
         values = torch.cat([values, last_value.unsqueeze(0)]) 
         print(values.requires_grad)
    
    False 1
    False
相关推荐
wh_xia_jun2 小时前
MODNet 本地抠图项目指南
python
老歌老听老掉牙2 小时前
Python星号参数深度解析
python·参数·星号
2401_884563243 小时前
Python Lambda(匿名函数):简洁之道
jvm·数据库·python
智算菩萨3 小时前
【How Far Are We From AGI】6 AGI的进化论——从胚胎到终极的三级跃迁与发展路线图
论文阅读·人工智能·深度学习·ai·agi
梦醒过后说珍重3 小时前
【超分实战】拒绝灾难性遗忘!记一次原生4K医疗影像(SurgiSR4K)的模型微调踩坑实录
深度学习
梦醒过后说珍重3 小时前
拒绝显存溢出!手把手教你写原生 4K 超分辨率数据集 (SurgiSR4K) 的 PyTorch DataLoader
深度学习
kishu_iOS&AI4 小时前
Python - 链表浅析
开发语言·python·链表
大连好光景4 小时前
conda管理包还是pip管理包
python·conda·pip
m0_730115114 小时前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python