强化学习4 a3c

基本思想

存在一个共享的网络,有多个线程是这个共享网络的拷贝,每个线程用这个网络进行与环境交互、训练。这样可以达到提高训练样本多样性的目的。

实现CartPole-v0

(1)一个网络的类,ACnet,包含了动作网络、分值网络
(2)class Worker(object) ,每个用来独立训练共享网络的线程,只要执行这个worker.work(),就会开始训练共享网络。

然后就是一个for循环,执行worker.work(),就会更新共享网络的参数。

各个线程在代码中没有任何的通信,只是去更新共享网络参数,并周期的读取共享网络参数。

动作选择是随机选择的。

实现超级马里奥

参考自:
https://github.com/uvipen/Super-mario-bros-A3C-pytorch

和CartPole-v0差不多,区别:
(1)模型是卷积模型,共享特征提取层

本质原理:
看了源码,比critic-actor强的无非就是加个多线程收集更多的数据。

伪代码:
线程i:

循环:
(0)提取global model权重
(1)环境交互一定轮数
(2)更新global model权重,不更新自己权重
(3)重复(0)

然后就是多个线程异步的执行各个线程;

代码细节

total_loss = -actor_loss + critic_loss - opt.beta * entropy_loss
这个计算解读:
entropy_loss是actor的输出算的:
policy = F.softmax(logits, dim=1)
log_policy = F.log_softmax(logits, dim=1)
entropy = -(policy * log_policy).sum(1, keepdim=True)
这么算的意义是啥呢?应该是不断的让actor选择这个动作的概率变小,可以理解成一个正则项。

剩余的按照得分的metric都可以推导出来:
actor_loss = actor_loss + log_policy * gae
R = R * opt.gamma + reward
critic_loss = critic_loss + (R - value) ** 2 / 2

代码评价:

(1)多线程报错,可以改成单线程模拟多线程。
(2)目前代码中每一个小关分别是不同的模型。。。这不是搞笑么。。。用a关的模型打b关游戏就是乱打。。有待改进

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值