百度飞桨世界冠军带你从零实践强化学习 -- 大作业心得笔记

四轴飞行器悬停作业--心得笔记

    这是“百度飞桨世界冠军带你从零实践强化学习”最后的大作业,同样是在baidu ai studio环境中完成。目标要求是回报值达到14000分以上。

    Ai studio环境下提供了notebook环境,提供了大部分的基础代码,作业需要填写有关模型和训练部分的内容,在Github中也有PARL DDPG参考的实现

    作业采用DDPG 算法,需要构建 actor 和 critic 的网络结构和相关处理。 下面按照时间顺序记录一下调试过程。

1、按照课堂示例cartpole的代码结构,填写model、agent等部分的代码

    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

2、如何让模型为4个轴输出比较均衡的电压--尝试方案A

    要4个轴输出均衡的电压,直接给一个固定的值会怎样?

         修改并测试了一下,回报值直接变成负10万多,此路不通!

    要不在actor 模型的loss函数上添加对不均衡情况的惩罚吧,求取4个轴输出值的平均值,再求取方差,将这个方差乘以一个调节系数加入到loss中。

         修改并长时间训练后没有发现什么效果,感觉思路可能也有一点问题,时间不够,放弃!

3、如何让模型为4个轴输出比较均衡的电压--尝试方案B

    在作业讨论群中看到有人分享经验,将actor的输出值由4个改为5个,其中一个作为基础值另外4个作为偏离值。

       [游侠流澈

       分享两点心得:

       1、科科老师说尽量保证4个旋翼的电压保持一致,但完全一致训练的结果一般(我最后基本在2000~3000分左右,偶尔还会翻车),所以我设置Actor输出的动作为5个数,第一个数为四个旋翼共享的基础电压action_main,后面四个数分别为四个旋翼在此基础上的action_offset。当然为了保证action_main占主导,action_offset需要乘以一个缩放系数,我设置的是0.2。]

    感觉这个方法应该有效。于是进行了尝试,见下面有划线部分的修改

    首先在act_dim上增加一个维度

百度飞桨世界冠军带你从零实践强化学习 -- 大作业心得笔记_第1张图片

    再修改运行和测试代码如下:

百度飞桨世界冠军带你从零实践强化学习 -- 大作业心得笔记_第2张图片
百度飞桨世界冠军带你从零实践强化学习 -- 大作业心得笔记_第3张图片

    开始训练后很快就出现了正的回报值,表明修改是有效的,继续训练发现最高的回报值可以到9000多,但没有超过10000,离14000的目标还有很大的距离。log记录如下:

百度飞桨世界冠军带你从零实践强化学习 -- 大作业心得笔记_第4张图片

  时间不够,没有办法先交了,下面是评估的结果

百度飞桨世界冠军带你从零实践强化学习 -- 大作业心得笔记_第5张图片

      (后面老师也觉得短时间内要调到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轴输出平衡的方法用起来?可以试一下,有结果再更新。。。

 

你可能感兴趣的:(百度飞桨世界冠军带你从零实践强化学习 -- 大作业心得笔记)