前言:
上一篇博文已经介绍了Unity ml-agents的环境配置(https://www.cnblogs.com/KillerAery/p/10629963.html)了。
我的建议先敲demo再摸清概念比较容易上手。所以本文先提供一个demo示例,再提供概念相关。html
并将以前下载的ml-agents项目UnitySDK目录下的Assets和ProjectSettings导入(复制覆盖)进新建的Unity项目ios
RollerAcademy 是将用于学院(更确切是指学习环境的管理)的组件:git
//RollerAcademy.cs //继承Academy用于重写学院设置,就目前而言无需改动,所以简单的直接继承便可。 using MLAgents; public class RollerAcademy : Academy { }
RollerAgent 是将用于智能体对象的组件:github
//RollerAgent.cs //继承Agent用于重写智能体的AgentReset,CollectObservations,AgentAction等方法。 using MLAgents; using UnityEngine; public class RollerAgent : Agent { Rigidbody rBody; void Start() { rBody = GetComponent<Rigidbody>(); } public Transform Target; //Reset时调用 public override void AgentReset() { if (this.transform.position.y < 0) { //若是智能体掉下去,则重置位置+重置速度 this.rBody.angularVelocity = Vector3.zero; this.rBody.velocity = Vector3.zero; this.transform.position = new Vector3(0, 0.5f, 0); } //将目标球重生至一个新的随机位置 Target.position = new Vector3(Random.value * 8 - 4,0.5f,Random.value * 8 - 4); } //收集观察结果 public override void CollectObservations() { //------ 观测 //观测到目标球和智能体的位置 AddVectorObs(Target.position); AddVectorObs(this.transform.position); //观测到智能体的速度 AddVectorObs(rBody.velocity.x); AddVectorObs(rBody.velocity.z); //在这里由于目标球是不会动的,智能体也不会在y轴上又运动,因此没有必要观察这些值的变化。 //AddVectorObs(rBody.velocity.y); } public float speed = 10; //处理动做,并根据当前动做评估奖励信号值 public override void AgentAction(float[] vectorAction, string textAction) { //------ 动做处理 // 接受两个动做数值 Vector3 controlSignal = Vector3.zero; controlSignal.x = vectorAction[0]; controlSignal.z = vectorAction[1]; rBody.AddForce(controlSignal * speed); //------ 奖励信号 float distanceToTarget = Vector3.Distance(this.transform.position,Target.position); // 到达目标球 if (distanceToTarget < 1.42f) { //奖励值+1.0f SetReward(1.0f); Done(); } // 掉落场景外 if (this.transform.position.y < 0) { Done(); } } }
更改好名字(本文取了RollerBallBrain和RollerBallPlayer),这样就建立了两个Brain文件。dom
LearningBrain适用于训练模型的决策体,而PlayerBrain只是映射键盘按键的决策体(即玩家控制)。
之因此建立PlayerBrain,在训练前可以让玩家经过真实操控测试当前游戏环境是否正确,而后确认无问题后再切换LearningBrain交给机器去操控(训练)。机器学习
从上面写的RollerAgent脚本,咱们知道:ide
而后咱们让RollerBallBrain直接Copy Brain Parameters from刚刚配置好的RollerBallPlayer:学习
而后如今能够打开开始菜单,直接使用cmd命令窗口,
cd到以前下载ml-agents项目的目录里测试
cd C:\Downloads\ml-agents
再输入激活ml-agents环境:ui
activate ml-agents
开启训练:
mlagents-learn config/config.yaml --run-id=RollerBall-1 --train
下面是config.yaml示例:
default: trainer: ppo batch_size: 10 beta: 5.0e-3 buffer_size: 100 epsilon: 0.2 gamma: 0.99 hidden_units: 128 lambd: 0.95 learning_rate: 3.0e-4 max_steps: 3.0e5 memory_size: 256 normalize: false num_epoch: 3 num_layers: 2 time_horizon: 64 sequence_length: 64 summary_freq: 1000 use_recurrent: false use_curiosity: false curiosity_strength: 0.01 curiosity_enc_size: 128
config/config.yaml里面的参数具体配置之后再更新说明,如今懒得写
当出现以下画面:
你的命令窗口也会时刻告诉你训练阶段的信息。
另一提,最新的介绍文档资料示例等都在Unity官方机器学习的github项目,感兴趣能够持续保持关注它的更新:
https://github.com/Unity-Technologies/ml-agents
Unity官方博客机器学习概念详解(1):https://blogs.unity3d.com/2017/12/11/using-machine-learning-agents-in-a-real-game-a-beginners-guide/
Unity官方博客机器学习概念详解(2):https://blogs.unity3d.com/2017/06/26/unity-ai-themed-blog-entries/
Unity ml-agents概念详解国内翻译博客:https://blog.csdn.net/u010019717/article/details/80382933
这里只作部分概念简介,懒得写太多了。
为了更好理解概念,这里以多人战争游戏中的军医AI为例介绍:
它能够被附加到一个 Unity 游戏对象上(场景中的 任何角色),负责生成它的观测结果、执行它接收的动做并适时分配奖励。在例子里,它应该附加到军医游戏对象上。
观测 : 军医对环境的感知。观测能够是数字和/或视觉形式。数字观测会从 Agent 的角度测量环境的属性。对于军医来讲,这将是军医能够看到的战场属性。根据游戏和 agent 的不一样,数字观测的数据能够是__离散__的或__连续__的形式。对于大多数有趣的环境,Agent 将须要若干连续的数字观测,而对于具备少许独特配置的简单环境,离散观测就足够了。另外一方面,视觉观测是附加到 agent 的摄像头所生成的图像,表明着 agent 在该时间点看到的内容。
- 咱们一般会将 agent 的观测与环境状态混淆。环境状态表示包含全部游戏角色的整个场景的信息。可是,agent 观测仅包含它本身所了解的信息,一般是环境状态的一个子集。例如,军医观测不能包含隐身敌人的信息。
动做 : 军医可采起的动做。动做能够是连续的或离散的。就军医而言,若是环境是一个只是简单的网格世界, 那么采用四个方向的离散动做就足够了(即上下左右)。可是,若是环境更加复杂而且军医能够自由移动,那么使用两个连续动做(一个对应于方向, 另外一个对应于速度)更合适。
- 除了上述的移动动做外,军医还应有救治动做等。
奖励信号 : 一个表示军医行为的标量。例如,军医在死亡时会获得很大的负奖励,每当恢复受伤的队员时会获得适度的正奖励,而在受伤队员因缺少救助而死亡时会获得适度的负奖励。
- 奖励信号表示如何将任务的目标传达给 agent,因此采用的设置方式须要确保当得到的奖励达到最大值时,agent可以产生咱们最指望的行为。
- 注意,不须要在每一个时刻都提供奖励信号,只有在军医执行好的或坏的动做时才提供。
它封装了 Agent 的决策逻辑。实质上,Brain 中保存着每一个 Agent 的 policy,决定了 Agent 在每种状况下应采起的动做。更具体地说,Agent 给其绑定的 Brain 发送 Agent的观测结果和奖励 ,而后 Brain 返回下一步的动做。
每一个它是负责指挥场景内全部 Agent 的观测和决策过程的总体训练环境。它能够指定若干环境参数,例如渲染质量和环境运行速度参数。