这是“百度飞桨世界冠军带你从零实践强化学习”最后的大作业,同样是在baidu ai studio环境中完成。目标要求是回报值达到14000分以上。
Ai studio环境下提供了notebook环境,提供了大部分的基础代码,作业需要填写有关模型和训练部分的内容,在Github中也有PARL DDPG参考的实现
作业采用DDPG 算法,需要构建 actor 和 critic 的网络结构和相关处理。 下面按照时间顺序记录一下调试过程。
actor 部分的网络采用两层全连接,第一层的激活函数用relu,第二层的激活函数用tanh。
critic 部分的网络采用两层全连接,第一层的激活函数用relu,第二层不设激活函数
代码如下:
class ActorModel(parl.Model):
def __init__(self, act_dim):
######################################################################
######################################################################
#
# 2. 请配置model结构
#
######################################################################
######################################################################
hide_dim = 100
act_dim = act_dim
self.fc1 = layers.fc(size=hide_dim,act='relu')
self.fc2 = layers.fc(size=act_dim,act='tanh')
def policy(self, obs):
######################################################################
######################################################################
#
# 3. 请组装policy网络
#
######################################################################
######################################################################
x = self.fc1(obs)
logits = self.fc2(x)
return logits
class CriticModel(parl.Model):
def __init__(self):
######################################################################
######################################################################
#
# 4. 请配置model结构
#
######################################################################
######################################################################
hide_dim = 100
self.fc1 = layers.fc(size=hide_dim,act='relu')
self.fc2 = layers.fc(size=1,act=None)
def value(self, obs, act):
# 输入 state, action, 输出对应的Q(s,a)
######################################################################
######################################################################
#
# 5. 请组装Q网络
#
######################################################################
######################################################################
merge_data = layers.concat([obs,act],axis=1)
x = self.fc1(merge_data)
Q = self.fc2(x)
Q = layers.squeeze(Q, axes=[1])
return Q
其他一些部分这里先不罗列。
直接开始训练,回报值一直在0以下大幅波动,训练约10个小时后,完成100万次也没有好转的迹象,看来此路不通。
想起老师布置作业时给出的提示,给每个轴比较均衡输出的情况下模型比较好收敛,于是开始尝试步骤2
要4个轴输出均衡的电压,直接给一个固定的值会怎样?
修改并测试了一下,回报值直接变成负10万多,此路不通!
要不在actor 模型的loss函数上添加对不均衡情况的惩罚吧,求取4个轴输出值的平均值,再求取方差,将这个方差乘以一个调节系数加入到loss中。
修改并长时间训练后没有发现什么效果,感觉思路可能也有一点问题,时间不够,放弃!
在作业讨论群中看到有人分享经验,将actor的输出值由4个改为5个,其中一个作为基础值另外4个作为偏离值。
[游侠流澈
分享两点心得:
1、科科老师说尽量保证4个旋翼的电压保持一致,但完全一致训练的结果一般(我最后基本在2000~3000分左右,偶尔还会翻车),所以我设置Actor输出的动作为5个数,第一个数为四个旋翼共享的基础电压action_main,后面四个数分别为四个旋翼在此基础上的action_offset。当然为了保证action_main占主导,action_offset需要乘以一个缩放系数,我设置的是0.2。]
感觉这个方法应该有效。于是进行了尝试,见下面有划线部分的修改
首先在act_dim上增加一个维度
再修改运行和测试代码如下:
开始训练后很快就出现了正的回报值,表明修改是有效的,继续训练发现最高的回报值可以到9000多,但没有超过10000,离14000的目标还有很大的距离。log记录如下:
时间不够,没有办法先交了,下面是评估的结果
(后面老师也觉得短时间内要调到14000以上有较大难度,因此将满分的评分标准改为大于8000分即可)。
「 提问:
作业5,除了设置这个基础值还有其他要注意的地方吗?我这边这样操作后也只收敛到9000多,上不去了。
遇到问题一般从什么角度入手来解决,改网络、调参数、调回报等等,具体问题具体分析,有什么一般性的经验可以分享吗? 」
- - - - - - - - - - - - - - -
老师回答:
1.先分析目前网络结构是否足够复杂,是否具备足够的表达能力表征目前的状态
2. 先debug 代码是否写的正确,比如一直训练某个batch的数据,看能否over-fit
3. 最后调回报,看下再这个reward设定下policy是否学得符合预期,不符合的话就尝试修改reward
「 提问:
老师认为强化学习最难的是什么?对问题进行适当的建模吗?比如作业5中设一个基础值。比如将实际问题转换为强化学习问题。 」
- - - - - - - - - - - - - - -
老师回答:
对问题的抽象能力是很重要的,有些看似不可解,但是从另一个角度建模,挖掘不同的action空间,就更好解决点
最后老师公布了作业5的答案
看了一下发现似乎没有用到什么基础值。有区别的是actor和critic网络都是三层而不是两层,第一层和隐藏层的输出维度为:64,激活函数都为tanh
其他的部分似乎与作业中的基础代码一致!
下载答案代码本地运行,50w步的时候确实是可以收敛到8000分以上的。
怎么回事,还真是玄学啊!怎么又不需要进行4轴输出的平衡啦!据说是Parl 1.3.1版本就不需要进行平衡,但,有大佬可以解释吗?
看来还是原来模型的太浅,复杂度不够导致的问题,。
老师的代码跑完100w步后最高也没有超过9000。难道还是需要将4轴输出平衡的方法用起来?可以试一下,有结果再更新。。。