这两天大概解读了一下ml-agents中3DBall的代码,算是做个记录吧。
框架跟docs中提供的文件(ML-Agents-Overview.md)一致。
Key Components
ML-Agents toolkit 包含了三个high-level 的组件:
学习环境(Learning Environment )- 包含Unity场景和所有游戏角色
Python API - 包含用于训练(学习行为或策略)的所有机器学习算法。需要注意的是,Python API与学习环境不同,不是Unity的一部分,而是存在于外部并通过外部通信器与Unity通信。
外部通信器(External Communicator )- 将学习环境与Python API连接起来。它存在于学习环境中。
学习环境包含有助于组织Unity场景的三个附加组件:
Agents - 附加到Unity GameObject(场景中的任何角色)并处理生成它的观察值,执行其接收的Actions并在适当时分配reward(正/负)。每个Agent都与一个Brain相连接。
代码对应于Agent.cs中。OnEnable()处理每个Agent注册的事件;SetStatus()是否需要Action还是Decision(RequestAction表示仅执行当前的已有的Action,RequestDecision需要外部通信器去tensorflow中拿最新训练数据然后做Action);ResetIfDono()若训练中Agent“死亡”或者达到最大步数,重置数据,3DBall这里就平板旋转和小球位置重置。SendInfo()若requestDecision是true,则需向Brain请求决策,收集当前观察值,等待Brain的决策。接下来就是AgentStep(),Agent行动,3DBall中是平板的X和Z的旋转值,并分配reward(正/负)。
Brains - 它封装了为Agent做出决策的逻辑。从本质上讲,Brain是每个Agent的策略,并确定Agent应该在每个实例中采取的Action。更具体地说,它是从Agent接收观察和奖励并返回Action的组件。
代码对应于Brain.cs中。根据BrainType的不同序列化不同的CoreBrain接口,有CoreBrainExternal,CoreBrainHeuristic,CoreBrainInternal和CoreBrainPlayer。CoreBrain中核心函数DecideAction(),从Agent接收观察和奖励,通过Academy的Communicator交互通讯,SendBatchedMessageHelper()中m_communicator.Exchange拿到返回数据更新agent(Action操作)。
Academy - 协调观察和决策过程。在学院内,可以指定几个环境范围的参数,例如渲染质量和环境运行的速度。外部通信器存在于Academy内。InitializeEnvironment()和EnvironmentStep()两个核心方法。
并没有很细致的读代码,可能有漏或者错误的地方,欢迎指点交流!