基于DQN与gym的小车爬坡训练

文章目录

  • 前言
  • 一、pytorch环境搭建
    • 1.GPU下的环境搭建
    • 2.CPU下的环境搭建
    • 3.其他依赖包
  • 二、环境学习
    • 1.观测
    • 2.行为
    • 3.物理交互
    • 4.奖励
    • 5.小车初始状态
    • 6.终止条件
  • GPU加速
  • 模型保存
  • 读取模型
  • 调参大法
  • 奖励的自定义
  • 总结


前言

强化学习智能体:DQN(基于pytorch)
环境:gym的MountainCar-v0环境
基于DQN与gym的小车爬坡训练_第1张图片


一、pytorch环境搭建

重要:cpu下预计训练时间30min
GPU预计5-6min
建议安装GPU版的torch环境

1.GPU下的环境搭建

参考:文章环境配置部分
文章为最新版本环境配置(2022-04-27),经验证可以运行

2.CPU下的环境搭建

安装方式

pip install torch==1.11.0
#torch==xxx 版本根据python以及包依赖选择 
pip install torch#默认版本也是ok的

torch一般上百mb,对于网速问题可以使用清华镜像
一种是更改系统(pip或conda的默认搜索源)

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
#some pachage 为包名称
#可以快捷使用清华源

大部分torch的引用运行错误可以通过卸载重装解决,pip安装失败可以考虑换conda安装

conda install torch

3.其他依赖包

pip install gym
pip install pygame
pip install tensorboard
pip install tensorboardX
pip install matplotlib
pip install seaborn

后记:环境搭建建议使用Anaconda创建管理虚拟环境
PyCharm选择虚拟环境

二、环境学习

1.观测

小车速度
小车距离目的地横向距离
ps:小车高度不会直接返回,但可以通过下式计算

h = np.sin(3 * p) * 0.45 + 0.55

2.行为

向左加速
向右加速
无行为

3.物理交互

*velocity<sub>t+1</sub> = velocity<sub>t</sub> + (action - 1) * force - cos(3 * position<sub>t</sub>) * gravity*
*position<sub>t+1</sub> = position<sub>t</sub> + velocity<sub>t+1</sub>*```
#force = 0.001 
#gravity = 0.0025
#position [-1.2, 0.6]
#velocity [-0.07, 0.07]

4.奖励

采用惩罚机制小车每次行动后
如果不在目的地reward=-1
到达目的地不在惩罚reward=0

5.小车初始状态

position=[-0.6,-0.4]
velocity=0

6.终止条件

1.到达目的地(position>=0.5)
2.步长到达200


GPU加速

程序段开始加入这句话

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(device)

有关向量的计算转入GPU加速

self.target_net, self.act_net = Net().to(device), Net().to(device)
self.loss_func = nn.MSELoss().to(device)
state = torch.tensor(state, dtype=torch.float).unsqueeze(0).to(device)
state = torch.tensor([t.state for t in self.memory]).float().to(device)
action = torch.LongTensor([t.action for t in self.memory]).view(-1, 1).long().to(device)
reward = torch.tensor([t.reward for t in self.memory]).float().to(device)
next_state = torch.tensor([t.next_state for t in self.memory]).float().to(device)

模型保存

torch保存方式如下

torch.save(model, PATH)

建议通过字典保存(可以保存权重以及一些训练过程信息)
示例如下:

PATH = './DQN/'
now_time = datetime.datetime.now().strftime('%Y%m%d_%H%M')
PATH = PATH + now_time + agent.canshu + 'model.pth'
print(PATH)
MS = {}
MS['act_net'] = agent.act_net.state_dict()
MS['target_net'] = agent.target_net.state_dict()
MS['optimizer'] = agent.optimizer.state_dict()
torch.save(MS, PATH)
#agent为DQN网络示例

读取模型

torch读取方式如下

MS2=torch.load(PATH)

例子如下:

PATH = './DQN/model.pth'
render = True
agent2 = DQN()
MS2=torch.load(PATH)
agent2.act_net.load_state_dict(MS2['act_net'])
agent2.target_net.load_state_dict(MS2['target_net'])
agent2.optimizer.load_state_dict(MS2['optimizer'])

调参大法

DQN可调参数一般包括

gamma
learning_rate 
e_greedy 
reward 

gamma代表智能体对未来收益的考虑
learning_rate学习速率
e_greedy智能体做出预计决策的概率
reward 奖励方式

一般来说:
gamma越小,越容易陷入局部最优
lr越小,越难以收敛
e_greedy越大,训练越稳定
reward 关于奖励倍率(基础奖励放大或缩小)不合理的倍率会使训练不稳定,收敛变慢

奖励的自定义

奖励方式:
默认奖励方式:每一步决策消耗一点能量,奖励-1,到达终点得分0.5
更新方式:引入小车能量的概念作为奖励
效果较好的一个奖励方式:
动能=1/2*速度平方(质量当做一个可调系数,这里取10)
势能=高度 * 质量 * 重力系数(质量取10)

reward = reward_v*reward_v/2 + reward_e + reward_p - 1
if reward_p>=0:  reward = 200-t

运行中:奖励=动能+势能+距离惩罚+能量消耗(-1)
结束时:奖励=目标步数-消耗步数
基于DQN与gym的小车爬坡训练_第2张图片
100步左右遍出现完成目标的小车,收敛很快(默认奖励大概在400-500出现成功小车)
基于DQN与gym的小车爬坡训练_第3张图片
奖励迅速趋于稳定

总结

基于DQN的爬坡小车,尝试更改了各项参数,了解了各项参数的影响
成功修改奖励方式提升性能
还有些未尝试的参数:例如网络深度,记忆池大小等

你可能感兴趣的:(自动驾驶路径规划从0开始,pytorch,深度学习,人工智能,神经网络,自动驾驶)