본문 바로가기
유니티/mlAgents

유니티 머신러닝 개발 ML Agents 7편, 목표 찾기 예제 개선. 1 뷰잉변경, 회전제한과 스텝제한, 환경개선과 재교육

by NGVI 2021. 4. 7.

유니티 머신러닝 개발 ML Agents 7편, 목표 찾기 예제 개선. 1 뷰잉 변경, 회전 제한과 스텝 제한, 환경개선과 재교육

저번 시간까지 진행한 내용이 기본 mlAgent에서 제공하는 예제의 내용입니다.

 

요기서부터 진행되는 내용은 해당 예제를 가지고 추가로 이것저것을 해보는 행위일 듯하네요

 

일단 보이는 게 너무 없어 보이니 색도 좀 칠하고 모델도 넣어보고 합시다.

 

여러분이 mlAgentRelease15을 프로젝트에서 파일을 가져오셨으면 

아래와 같은 폴더가 존재합니다.

 

해당폴더

floor에는 block 머티리얼을 설정할게요

floor에는 block 머티리얼을 설정

모델 적용시키기

요렇게 할겁니다.

sharedSharedAssets/Prefabs

AgentCube_Blue.prefab

를 

RollerAgnet의 자식으로 붙여줍니다.

 

그리고 자식이 된 AgentCube_Blue의 트랜스폼을 초기화(Reset) 시켜줍니다.

 

다시 실행해봅니다.

뭔가 되는 모양

그래도 이전에 색도 없는 공을 때보다는 상태가 많이 좋아졌죠

 

박스에 눈이 달려있는데, 그냥 굴러다니는 게 이상합니다.

목표를 보면서 이동할 수 있게 만들어 봅시다.

 

물체를 먼저 회전하지 않는 물체로 만들게요.

 

사진자료

RollerAgnet의 Rigidbody 컴포넌트의 Constraints의 Freeze Rotation모두 체크해줍니다.

 

실행해 보시면 더 이상 박스가 굴러다니지 않고 무회전으로 움직이는 모습을 보실 수 있습니다.

 

박스가 타깃을 바라보면 더욱 좋을 거 같은데요, 요걸 해보겠습니다.

 

gRollerAgent.cs 파일을 수정합니다.

public GameObject viewModel = null; //해당코드 추가

//아래 함수 수정
public override void OnActionReceived(ActionBuffers actionBuffers)
    {
        //학습을 위한, 학습된 정보를 해석하여 이동을 시킨다.

        // Actions, size = 2
        Vector3 controlSignal = Vector3.zero;
        controlSignal.x = actionBuffers.ContinuousActions[0];
        controlSignal.z = actionBuffers.ContinuousActions[1];
        rBody.AddForce(controlSignal * forceMultiplier);

		//아래 한줄 추가됨
		viewModel.transform.LookAt(Target);

        // Rewards
        float distanceToTarget = Vector3.Distance(this.transform.localPosition, Target.localPosition);

        //타겟을 찻을시 리워드점수를 주고, 에피소드를 종료시킨다.
        // Reached target
        if (distanceToTarget < 1.42f)
        {
            SetReward(1.0f);
            EndEpisode();
        }

        //판 아래로 떨어지면 학습이 종료된다.
        // Fell off platform
        else if (this.transform.localPosition.y < 0)
        {
            EndEpisode();
        }
    }

추가된 코드는 두줄입니다.

대략적으로 보시라고 코드를 가져다 둡니다.

 

public GameObject viewModel = null;

보이는 모델을 받기 위한 코드와

 

viewModel.transform.LookAt(Target);

학습 데이터로 힘을 받을 때 타깃을 보게하는 코드입니다.

 

실행해봅니다.

실행화면

모델이 타겟을 바라보며 이동되는 현상을 보실 수 있습니다.

 

저는 타깃에도 AgentCube_Purple 프리 팹을 자식으로 달아주었습니다.

적당히 이쁘게 꾸며고 진행하도록 합시다.

 

플레이해보시면, 목표를 찾아가는 과정이 이정과 다르게 뭔가 어색해 보입니다.

가끔씩 타깃 주변에서 어물 절 거리는 에이전트를 보실 수 있을 건데요.

 

환경이 달라졌기 때문에 해당 현상이 발생합니다.

대표적으로 위에서 에이전트의 회전을 막아버졌죠, 이전 스피어 모델 같은 경우는 회전을 받으며 모델이 굴러갔는데, 현재의 에이전트는 회전이 없기 때문에 환경이 많이 다릅니다.

 

그리하여

다시 학습을 시켜 봅니다.

 

만회동안 아무런 결론을 얻지 못했을때,

학습을 시켜봅니다. 보시면 많은 시간을 들여서 보상치가 0.7 이상에 도달했는데,

이후 학습에서는 에피소드가 완료되지 못하고 있습니다.

 

요런 케이스가 여러분에게도 발생된다고는 보장하지 못합니다.

학습은 동일한 조건에서 일어나는 게 아니니까요.

 

하지만 요런 경우는 충분히 발생할 수 있으니 한번 대처를 해보도록 합시다.

 

학습이 올바른 선택을 못하고 있습니다. step 만회가 진행되는 동안 종료가 되는 케이스를 발생시키지 못한 것이죠.

 

RollerAgnet의 g roller agent 컴포넌트의 값을 변경시켜줍니다.

 

참고이미지 02

max step를 1000으로 변경시켜줍니다.

1000번의 스텝 동안 에피소드 종료가 없으면 새로운 에피소드를 진행하게 해 줍니다.

 

그리고 모델 움직임이 느려 보여서

Force Multiplier 또한 10에서 20으로 변경시켜주었습니다.

 

다시 교육 들어갑니다.

0.9 보상까지 증가하였습니다.

머신러닝의 학습에 있어서는

 

내가 어떤 학습환경을 제공하면 더 머신러닝이 잘 될 수 있는가가 포인트인 거 같습니다.

변경된 학습환경에서 더 의미 있는 보상이 나왔네요

 

해당 학습 데이터로 플래이를 해보겠습니다.

 

이전보다 좋아진 상태

이번 시간에는 보이는 모습 변경과

회전 제한으로 인한 상태 이상 관련 재교육을 진행했네요

 

봐주셔서 감사합니다.

댓글