Open johnjim0816 opened 2 years ago
目前model、algorithm、agent的设定是可以复用algorithm模块的,预留了model、agent分别给用户自行定义网络结构以及数据处理。 如果每个算法是一个agent,那别人怎么复用你这个agent呢?比如你这个agent能同时处理atari(图像输入)和cartpole(向量输入)吗
十分感谢在框架设计层面的探讨,PARL目前的设计其实有一部分是历史遗留的问题。 在PARL1.0发行时候,paddle还是静态图框架为主,数据处理是必须有的:得把数据整理成一个dict,feed到声明好的静态图中。所以之前agent的数据处理接口是很必要的。 目前parl框架的本体只有algorithm是复用的,其他的model、agent得要用户自己重写或者对着example来改。 你说的第三点我不是很理解,你指的是model和agent也放到parl内部?然后移除algorithm的抽象?
对了,agent的抽象是与环境进行交互,learn、Sample、Predict这三个是交互用的,save、restore是用于本地保存以及加载模型、get_weights、set_weights是获取参数到内存,用于并行计算的。 他目前承担的功能还是挺多,这部分和algorithm是有明显差异定位的,algorithm的定位是更新model里面的参数,侧重强化学习算法本身。
这些我都知道,“你指的是model和agent也放到parl内部?然后移除algorithm的抽象?”,这个我还没有仔细考究,应该不需要移动吧,一个套件包含algos(集成的算法),models(常见的模型,如果用户需要别的可以自定义),envs(自己做的模型)。其他的你说的都对。因为我看了源码写的跟我写的架构有些神似,目前来看我觉得这种转换tensor的数据接口再集成一些更好些,因为这个是应用模块而不是教学tutorials,傻瓜式对用户更友好些。
"目前来看我觉得这种转换tensor的数据接口再集成一些更好些"
赞同,我们内部也讨论下:)
可以的,我也是因为一些需要才想讨论一下。
理论上每个算法就是一个agent,然后model就是agent使用的网络,用户在使用的时候定义好model和agent,然后agent就predict,learn就行了,然而看DQN的example还需要另外定义类,重定义一下比如learn方法,重定义中只是先转换了一下数据类型比如转换成tensor,后面也是直接agent.learn,建议将这一部分直接集成到agent.learn中,因为一般agent.learn的输入是环境给的比如state啥,这些都是数组的形式,在agent.learn中直接讲这些数组转换就行,不需要额外重定义方法。