ml-agent学习记录

ml-agent学习记录

十二月 29, 2023

环境

装gpu加cuda,略,b站有安装视频

原理

强化学习是观察(observation)到决定(decision)到行动(action)到奖励(reward)后循环反馈到观察的过程。

代理制作流程

构建Agent

新建的脚本要继承于Agent

加入观察参数

1
2
3
4
5
6
public override void CollectObservations(VectorSensor sensor) {
sensor.AddObservation(transform.position);
foreach (Transform target in targets) {
sensor.AddObservation(target.position);
}
}

Space Size:这是观察空间或动作空间的大小。对于观察空间,它是智能体每次观察到的信息的维度。对于动作空间,它是智能体可以执行的动作的数量或类型。

Stacked Vectors:这是一个参数,用于指定智能体在每次决策时应该考虑多少个连续的观察。例如,如果Stacked Vectors设置为3,那么智能体在做出决策时,会考虑当前的观察以及前两个观察。这可以帮助智能体理解观察之间的时间关系,例如物体的运动方向和速度。
其中Space Size和塞入的观察参数大小相关

行动下一步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public override void OnActionReceived(ActionBuffers actions) {
float moveX = actions.ContinuousActions[0];
float moveY = actions.ContinuousActions[1];
//print(new Vector3(moveX, 0, moveY));
transform.position += new Vector3(moveX, 0, moveY) * speed;
for(int i=0;i<targets.Count;i++) {
float tempDistant = Vector3.Distance(targets[i].position, transform.position);

if (tempDistant < distants[i])
AddReward(0.001f);
else
AddReward(-0.0005f);
distants[i] = tempDistant;
}
}

获取下一步行动的参数

重置训练场景

1
2
3
4
5
6
7
8
9
public override void OnEpisodeBegin() {
distants.Clear();
transform.position = RandomPosition();
foreach (Transform t in targets) {
t.position= RandomPosition();
distants.Add(Vector3.Distance(t.position, transform.position));
}
SetReward(1);
}

手动控制ai(可选)

1
2
3
4
5
public override void Heuristic(in ActionBuffers actionsOut) {
ActionSegment<float> continuousAction = actionsOut.ContinuousActions;
continuousAction[0] = Input.GetAxisRaw("Horizontal");
continuousAction[1] = Input.GetAxisRaw("Vertical");
}

重点记得加入脚本Decision Request

卡了很久没动就是忘记挂这个组件了,,”Decision Requester”组件是用来控制智能体决策频率的一个组件。

“Decision Requester”组件有一个”Decision Period”参数,它指定了智能体应该多久做一次决策。例如,如果”Decision Period”设置为5,那么智能体每5个步骤会做一次决策。

在智能体不做决策的步骤中,它会重复执行上一次的动作。这可以减少智能体需要做决策的次数,从而提高训练速度。

注意,”Decision Requester”组件只在训练时有效。在推理(即使用训练好的模型)时,智能体会在每个步骤都做决策。

附件

激活conda环境

1
conda activate 环境名

训练ml-agent

Basic.yaml训练参数,run2文件夹

1
2
mlagents-learn  Basic.yaml --run-id=run2 --train --force//重新训练
mlagents-learn Basic.yaml --run-id=run2 --train --resume//继续训练

查看训练数据

1
tensorboard --logdir=results //result可递归文件夹下