RL调参侠之BipedalWalker PPO

最近做图像算法做得胃疼,就打算找点强化学习的东西来看。之前看openAI做的dota2机器人感觉很牛掰,很感兴趣是怎么做的,所以从spinningUp开始看,感觉深度强化学习只是用了一下深度学习开发出来的工具,具体地说就是梯度计算,其他的东西都是自己的一套理论,深度学习里面各种亮瞎眼的网络结构设计,训练方法等等基本跟这边没什么关系。

最开始用CartPole和Pendulum这种简单的任务跑PPO,TD3,SAC这种高级一点的东西,都特别简单,但是如果是难一点的任务,比如BipedalWalker就不能随便跑了,尤其是对参数特别敏感。

SpinningUp原版PPO

如果直接用SpinningUp在Git上的PPO代码跑BipedalWalker,里面hyperparameter的设定会发现基本跑不出来,跑10次只有1-2次可以顺利训练出来,特别容易陷入local optima,我跑的情况就是经常人仰马翻,或者双腿劈叉趴在地上不动了。比如这样(大概50个epoch的时候):
RL调参侠之BipedalWalker PPO_第1张图片

因为On-Policy算法本身的特点,算法陷入局部极值点后是出不来的,所以需要增加exploration的手段,比如像SAC那样加入熵。但是这里我希望能够用原始的PPO算法调一个模型出来,仅仅调一些参数,看可不可行。
后来看到这个链接:
On-Policy算法调参指南
里面提了一句:
第一张Slide
算法在第一个epoch用均值为0,方差尽量小的action去做探索,也就是起初不带有任何的倾向性,那么就可以发挥出on-policy算法本身的特点,从所有可能的动作里面挑一些好的动作出来。但是为啥是方差尽量小,而不是尽量大?如果方差大的话才可以探索更广泛的动作空间啊?

调参侠时间

首先是很多地方都提到的更改reward的trick。除了跌倒reward是-100以外,其他的state reward大概绝对值都在1以下,所以算法特别怕跌倒,一般会直接选一个劈叉的动作停在那里不动了。
调整一下reward:

// 调整reward
if rew == -100:
	rew = -1

然后为了增加第一个epoch算法探索的空间,将policy的初始化std从-0.5增加到到-0.01或者更大:

// 调整初始std
log_std = -0.01*np.ones(act_dim, dtype=np.float32)

调整后的效果

调整了log_std后再跑一次,每个epoch有10000个step,大概50个epoch后就可以看到一个智障机器人了:


当然可以调的地方很多,这种做法的好处是基本每次都可以跑出可以稳定跑完全程的agent,虽然最后的return可能达不到官方认为成功的300+,这主要还是跟初始化的时候动作的倾向有关。

一点感想

虽然PPO的理论很精彩,而且也做出了OPEN AI FIVE这样的东西,但是似乎对算法运用的要求比较高,相对来说SAC就更亲民一点,后面用SAC来做做看。

你可能感兴趣的:(强化学习,算法,深度学习)