이 사이트를 바탕으로 ml-agents 환경 정의 (특히 visual observation에 관하여) 부분을 서술해보고자 한다.
- Overriding the Agent.CollectObservations() method and passing the observations to the provided VectorSensor.
- Adding the [Observable] attribute to fields and properties on the Agent.
- Implementing the ISensor interface, using a SensorComponent attached to the Agent to create the ISensor.
1,2는 일반 멤버 변수를 등록할때 사용되는 방법이다. 1번과 달리 2번과 3번 방법은 behavior parameter의 vector size를 고려할 필요가 없다고 한다.
이중에서도 나는 CNN을 활용할 예정이기 때문에 camera를 통해 이미지를 가져올 수 있도록 3번 방식인 ISeonsor를 사용할 것이다. ISensor는 step이 실행될 때가 아닌, write()가 실행될 때 observation된다고 한다.
- CameraSensorComponent - Allows image from Camera to be used as observation.
feature vector를 [-1 ~ +1] 혹은 [0, 1]로 normalize하는게 좋다더라, PPO neural network를 사요할 때 더 빠르다. 의무가 아니지만 충분히 고려해볼만한 사항이다
RNN보단 간단히 input stack을 늘리는것도 좋다. 근데 이건 vector observation만 된다고 한다 (즉, 이미지 학습 중 기억하게 하려면 RNN밖엔 답이 없다)
CameraSensor or RenderTextureSensor를 통해 visual observation할 수 있다. Camera Sensor Component나 RenderTextures Sensor Component를 Agent에 추가하고, 추가하고자 하는 camera 혹은 render texture를 그 컴포넌트에 등록한다. 이 compoent들은 하나 이상이 될 수 있다. 이에 대해서 width와 height를 설정하고, grayscale화 할 수 있다. 같은 policy를 이용하는 각 agent는 같은 수의 visual observations를 사용해야하고 같은 resolutions를 가져야 한다. 도한 각 sensor component는 deterministical sorting을 위하여 유니크한 이름을 가져야 한다.
RenderTexture visual observations를 사용할 때, 디버깅을 위한 손쉬운 방법으로는 Canvas를 추가하고 Raw image를 그 RenderTexture set에 넣어는것이다. 이렇게 하면 agent observation을 게임 화면에 render할 수 있다.
When using Cameras as observations directly, this is done automatically by the Agent.
image size는 학습을 위한 모든 정보를 갖는 것에 한하여 가능한 최소로 유지되어야 한다
그런데 이 visual observation은 training속도가 느리고, 덜 효과적인 경우가 많다. 즉, vector나, ray-cast observations로 정의할 수 없는 경우에 사용한는 것을 권장한다.
Raycast Observations?
RayPerceptionSensorComponent3D (or RayPerceptionSensorComponent2D) 를 Agent GameObject에 추가하여 이용하면 된다. 이는 사전에 정의된 rays(레이저)가 게임에 생성되고, 그 레이저가 충돌한 object를 감지하는 형태이다.
문제 해결에 연관된 공간 데이터를 전체 이미지 대신, rays를 통해 얻을 수 있을 때 좋다
Raycast Observations는 다음과 같은 특성을 갖는다고 한다
- Detectable Tags A list of strings corresponding to the types of objects that the Agent should be able to distinguish between. For example, in the WallJump example, we use "wall", "goal", and "block" as the list of objects to detect. (탐지할 객체)
- Rays Per Direction Determines the number of rays that are cast. One ray is always cast forward, and this many rays are cast to the left and right. (레이저 갯수, 왼쪽에서 오른쪽으로 추가된다.)
- Max Ray Degrees The angle (in degrees) for the outermost rays. 90 degrees corresponds to the left and right of the agent. (레이저 최대 각도)
- Sphere Cast Radius The size of the sphere used for sphere casting. If set to 0, rays will be used instead of spheres. Rays may be more efficient, especially in complex scenes. (레이저가 객체를 탐색할 때 범위의 구)
- Ray Length The length of the casts (레이저 갯수)
- Ray Layer Mask The LayerMask passed to the raycast or spherecast. This can be used to ignore certain types of objects when casting. (레이저 캐스팅 시 무시될 객체의 마스킹)
- Observation Stacks The number of previous results to "stack" with the cast results. Note that this can be independent of the "Stacked Vectors" setting in Behavior Parameters. (stack 크기 / behavior parameter의 stacked vectors과는 독립적인 개념)
- Start Vertical Offset (3D only) The vertical offset of the ray start point. (레이저 시작 포인트)
- End Vertical Offset (3D only) The vertical offset of the ray end point. (레이저 종료 포인트)
이 특성에 의거하여 레이저의 갯수는 다음과 같다
-> (Observation Stacks) * (1 + 2 * Rays Per Direction) * (Num Detectable Tags + 2)
최대한 갯수와 태그는 학습을 위해 최대한 최소로 유지되어야 한다.
밑의 내용들은 거의 다 이전에 정리한 내용들이었다.
https://do-my-best.tistory.com/58
이외의 내용으로는 reward는 각 decision마다 [-1, 1]이여야 하는 이유가 그렇지 않으면 잘못된 학습으로 연결될 수 있다는 점이라던가, multi-agent scenarios를 정의하는 정도가 있겠다.
Defining Teams for Multi-agent Scenarios
Self-play is triggered by including the self-play hyperparameter hierarchy in the trainer configuration. To distinguish opposing agents, set the team ID to different integer values in the behavior parameters script on the agent prefab.
Team ID must be 0 or an integer greater than 0.
In symmetric games, since all agents (even on opposing teams) will share the same policy, they should have the same 'Behavior Name' in their Behavior Parameters Script. In asymmetric games, they should have a different Behavior Name in their Behavior Parameters script. Note, in asymmetric games, the agents must have both different Behavior Names and different team IDs!
For examples of how to use this feature, you can see the trainer configurations and agent prefabs for our Tennis and Soccer environments. Tennis and Soccer provide examples of symmetric games. To train an asymmetric game, specify trainer configurations for each of your behavior names and include the self-play hyperparameter hierarchy in both.
'ML' 카테고리의 다른 글
합성곱 신경망 (0) | 2021.07.01 |
---|---|
역전파와 신경 네트워크 (0) | 2021.07.01 |
트리 탐색과 유전 알고리즘을 활용한 외판원 문제 근접해 구하기 (0) | 2021.05.12 |
ML Agent의 강화학습을 활용한 Unity AI학습 (0) | 2021.05.11 |
DQN의 입력 (0) | 2021.04.07 |