PaddlePaddle / PARL

A high-performance distributed training framework for Reinforcement Learning
https://parl.readthedocs.io/
Apache License 2.0
3.24k stars 819 forks source link

模块集成还不是很完整 #938

Open johnjim0816 opened 2 years ago

johnjim0816 commented 2 years ago

理论上每个算法就是一个agent,然后model就是agent使用的网络,用户在使用的时候定义好model和agent,然后agent就predict,learn就行了,然而看DQN的example还需要另外定义类,重定义一下比如learn方法,重定义中只是先转换了一下数据类型比如转换成tensor,后面也是直接agent.learn,建议将这一部分直接集成到agent.learn中,因为一般agent.learn的输入是环境给的比如state啥,这些都是数组的形式,在agent.learn中直接讲这些数组转换就行,不需要额外重定义方法。

TomorrowIsAnOtherDay commented 2 years ago

目前model、algorithm、agent的设定是可以复用algorithm模块的,预留了model、agent分别给用户自行定义网络结构以及数据处理。 如果每个算法是一个agent,那别人怎么复用你这个agent呢?比如你这个agent能同时处理atari(图像输入)和cartpole(向量输入)吗

johnjim0816 commented 2 years ago
  1. example“复用”的部分也就是改一下数据类型
  2. 设定的model不同,理论上是可以同时处理的,比如state只会对接你的model,你的对应model是CNN的自然也没有什么问题
  3. 我说的可能不是很清楚,我说的是每个算法包含agent和model,agent主要包含predict和learn方法,model则是一些基本模型
  4. 据我所知,agent的learn数据模式是固定的,就算是数据处理也不会是转换一个tensor这样子的
TomorrowIsAnOtherDay commented 2 years ago

十分感谢在框架设计层面的探讨,PARL目前的设计其实有一部分是历史遗留的问题。 在PARL1.0发行时候,paddle还是静态图框架为主,数据处理是必须有的:得把数据整理成一个dict,feed到声明好的静态图中。所以之前agent的数据处理接口是很必要的。 目前parl框架的本体只有algorithm是复用的,其他的model、agent得要用户自己重写或者对着example来改。 你说的第三点我不是很理解,你指的是model和agent也放到parl内部?然后移除algorithm的抽象?

TomorrowIsAnOtherDay commented 2 years ago

对了,agent的抽象是与环境进行交互,learn、Sample、Predict这三个是交互用的,save、restore是用于本地保存以及加载模型、get_weights、set_weights是获取参数到内存,用于并行计算的。 他目前承担的功能还是挺多,这部分和algorithm是有明显差异定位的,algorithm的定位是更新model里面的参数,侧重强化学习算法本身。

johnjim0816 commented 2 years ago

这些我都知道,“你指的是model和agent也放到parl内部?然后移除algorithm的抽象?”,这个我还没有仔细考究,应该不需要移动吧,一个套件包含algos(集成的算法),models(常见的模型,如果用户需要别的可以自定义),envs(自己做的模型)。其他的你说的都对。因为我看了源码写的跟我写的架构有些神似,目前来看我觉得这种转换tensor的数据接口再集成一些更好些,因为这个是应用模块而不是教学tutorials,傻瓜式对用户更友好些。

TomorrowIsAnOtherDay commented 2 years ago

"目前来看我觉得这种转换tensor的数据接口再集成一些更好些"


赞同,我们内部也讨论下:)

johnjim0816 commented 2 years ago

可以的,我也是因为一些需要才想讨论一下。