百度Aistudio飞桨强化学习7日打卡营小结

前言

一个多月前第一次参加打卡营,加了交流群。然后看到群里面有新的,本来想着观众模式,毕竟高端词汇。但随着下班时间不是无聊浇水活动就是其他网站戏耍。除了第一天临时加班没有看,后面的几次直播都看了。发现关键学习修改点很简单,后期的话在群里看到各种讨论的数据改造,就没有思路了,试试玩玩还是不错的。

摘要

PARL  GYM 强化训练

背景

由于上次有python各种不会的经验,然后我就专门搜了一下python的相关快查指令。gym的使用手册通过命令行看貌似比较少。parl系列的比较齐全点,但是参数例如激活函数由于以前没有接触过,因此可选取值不怎么清楚。

from parl.algorithms import DDPG
help(DDPG)

from paddle.utils.plot import Ploter
help(layers.fc)

import gym
gym.__all__
dir(gym.make)
help(gym.make)
help(gym) 

由于这次参加课程比较早,自己用租任空闲的服务器要部署python环境,发现由于当时服务器没有注重运行内存,造成下载安装其他配套环境失败。最后还没有本地化运行。这个课程看到一些人有本地化运行的化,看起来感觉会比较直观。

 

资源

官网: http://gym.openai.com/envs/

aistudio实验环境平台:https://aistudio.baidu.com/aistudio/index

paddle的github首页:https://github.com/PaddlePaddle

paddle的github强化学习库即PARL:https://github.com/PaddlePaddle/PARL

本次课程科科讲师提供的作业样例清单:https://github.com/PaddlePaddle/PARL/tree/develop/examples/tutorials/homework

主要课程

第一天直播主要讲解学习使用,依旧非常简单,基本文件已经全部提供,只需顺序执行,当然由于网络问题等,存在装载套件等问题。我操作比较晚,微信群中基本讨论了还给出了解决方案,因此跟着改动尝试非常快。

第二日课程,正式开始函数填空,表格型的处理,并主要涉及了sarsa和Q-learning。学过动态规划的都觉得挺像的。就是涉及到env有点,比较晦涩,涉及的环境不是很清楚,我在gym看了一个源码,就是粗糙看了一下,觉得这个env可以是深搜广搜的截支。类似大学经典N皇后问题,这个env可以类比是棋盘布局和规则要马步行走以及不能对面的中,而sarsa和Qlearning就是类似枚举出所有,并会逐渐优化最优解,这个过程类型dijkstra这种,用于取最优解最短路径,而这里的不一样的是具有随机性,或者是偏向优解而不一定要最优解。

第三日课程,为神经网络构造DQN(经验池)解决MountainCar,一个小车从V型底部爬坡的。主要网络模型组装,涉及激活函数和网络层。相对来说这个涉及env没有具体查看,因此对网络的处理模式还是比较不是那么清晰。

第四日课程,为神经网络构造PG解决乒乓球问题,区别为通过定义损失函数更新模型。数据挖掘课程有交叉熵,概率论和数理统计有近似然,数值计算有误差损失,这种应该和这些构建应该有这些基础知识的应用。

最后一次的大大作业是四轴飞行器悬浮问题,采用评估模型、演示模型以及经验池相结合的DDPG神经网络解决方案,讲师给的建议是四个电压尽可能的相近,保持平稳。跟着高手学习,后面通过带入调整四个参数极差较小的情况。整个收敛比较稳定,虽然我的测试评估的结果没有很高,但相对仅仅调整参数,整个收敛比较平稳。

百度Aistudio飞桨强化学习7日打卡营小结_第1张图片

class QuadrotorAgent(parl.Agent): def __init__(self, algorithm, obs_dim, act_dim=5):

-------

act_dim=5

model = QuadrotorModel(act_dim=act_dim) algorithm = DDPG(model, gamma=GAMMA, tau=TAU, actor_lr=alr, critic_lr=clr) agent =QuadrotorAgent(algorithm,obs_dim=obs_dim,act_dim=act_dim)

 

 

def run_episode(env, agent, rpm):
    obs = env.reset()
    total_reward, steps = 0, 0
    while True:
        steps += 1
        batch_obs = np.expand_dims(obs, axis=0)
        action = agent.predict(batch_obs.astype('float32'))
        action = np.squeeze(action)
        actoff=action[1:5]
        actcenter=action[0]
        action_new= [i*0.15 + actcenter  for i in actoff ]
        #print(action_new)
        # 给输出动作增加探索扰动,输出限制在 [-1.0, 1.0] 范围内
        action_new = np.clip(np.random.normal(action_new, 1), -1.0, 1.0)
       
        # 动作映射到对应的 实际动作取值范围 内, action_mapping是从parl.utils那里import进来的函数
        action_new = action_mapping(action_new, env.action_space.low[0], env.action_space.high[0])
        #print(action)

        next_obs, reward, done, info = env.step(action_new)
        rpm.append(obs, action, REWARD_SCALE * reward, next_obs, done)

        if rpm.size() > MEMORY_WARMUP_SIZE:
            batch_obs, batch_action, batch_reward, batch_next_obs, \
                    batch_terminal = rpm.sample_batch(BATCH_SIZE)
            critic_cost = agent.learn(batch_obs, batch_action, batch_reward,
                                      batch_next_obs, batch_terminal)

        obs = next_obs
        total_reward += reward

        if done:
            break
    return total_reward, steps

# 评估 agent, 跑 5 个episode,总reward求平均
def evaluate(env, agent):
    eval_reward = []
    for i in range(5):
        obs = env.reset()
        total_reward, steps = 0, 0
        while True:
            batch_obs = np.expand_dims(obs, axis=0)
            action = agent.predict(batch_obs.astype('float32'))
            action = np.squeeze(action)
            actoff=action[1:5]
            actcenter=action[0]
            action_new=[i*0.15+actcenter for i in actoff]
            action_new = np.clip(np.random.normal(action_new, 1), -1.0, 1.0)
            action_new = action_mapping(action_new, env.action_space.low[0], 
                                    env.action_space.high[0])

            next_obs, reward, done, info = env.step(action_new)

            obs = next_obs
            total_reward += reward
            steps += 1

            if done:
                break
        eval_reward.append(total_reward)
    return np.mean(eval_reward)

绘图是从paddle的其他样例里面抓出来用的

#绘图定义 执行器初始化
%matplotlib inline
train_prompt = "reward" 
from paddle.utils.plot import Ploter
plot_prompt = Ploter(train_prompt,"none")
for evaluate_reward in range(10):
    plot_prompt.append(train_prompt, evaluate_reward, evaluate_reward)
    plot_prompt.plot()

感言

感谢科科老师即相关团队的付出,微信群中的讨论也受益匪浅。此次强化学习中又一次认识了以前的理论知识奠定基础的重要性。以前只认识到天气预测等和分类,对于以前上课的课件涉及图像识别的等领域的重要性没有深刻了解,过于注重计算方法而没有转换到实际应用的全面了解,因此后期在图像识别语音识别等都没有回忆起,对于学过的决策树之类也没有其应用的概念。此次学习对于人工,数据挖掘、概率论和数理统计的应用有了更全面的认识,当然具体的前后关联调整以及具体落实到商业设施上面的应用还有待了解。

 

 

 

 

 

你可能感兴趣的:(笔记)