본문 바로가기
유니티/mlAgents

유니티 머신러닝 개발 ML Agents 6편, 목표찻기 예제 제작.2 학습프로그램 제작, 학습시키고, 학습데이터 확인해보기

by NGVI 2021. 4. 6.

유니티 머신러닝 개발 ML Agents 6편, 목표 찾기 예제 제작. 2 학습 프로그램 제작, 학습시키고, 학습 데이터 확인해보기

지난 편에서는 폭표찾기 예제를 진행하였고, 

그중 유니티 프로젝트를 제작하였습니다.

 

추가로 Heuristic 모드로는 잘 동작하는 것까지 진행했어죠.

 

오늘은 아나콘다에서 파이썬으로 학습프그램을 돌리고, 만들어둔 유니티 프로젝트를 구동시켜 학습을 시켜보겠습니다.

그리고 학습된 파일을 가져와서 사용도 해보고요.

 

이전 배포 예제들을 돌렸을 때, 학습 프로그램들이 들어있는 위치를 기억하실 겁니다.

ml-agents-release_15\config\ppo

요기종

 

이런식의 폴더

Basic.yaml을 복사해서 사본을 만들고, 이름을 바꿉니다.

rollerball_config.yaml 

로 교체합니다.

 

작업된 파일을 모습

해당 파일을 편하신 에디터 툴로 오픈합니다.

전 그냥 비주얼 스튜디오로.

 

내부에 내용을 모두 교체합니다.

behaviors:
  RollerBall:
    trainer_type: ppo
    hyperparameters:
      batch_size: 10
      buffer_size: 100
      learning_rate: 3.0e-4
      beta: 5.0e-4
      epsilon: 0.2
      lambd: 0.99
      num_epoch: 3
      learning_rate_schedule: linear
    network_settings:
      normalize: false
      hidden_units: 128
      num_layers: 2
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    max_steps: 500000
    time_horizon: 64
    summary_freq: 10000

트레이닝 파일에 대한 자세한 정보는 다음 페이지를 보시면 좋습니다.

 

github.com/Unity-Technologies/ml-agents/blob/release_15_docs/docs/Training-Configuration-File.md

 

진행하도록 하겠습니다.

 

이제 다시 아나콘다를 켭니다.

아나콘다를 열고 환경세팅

미리 만들어둔 가상 환경을 활성화시키고

받아둔 파일 경로로 맞추어둡니다.

 

학습 프로그램이 구동시켜 봅니다.

경로를 바로 잡으셨으면 다음과 같이 타이핑합니다.

mlagents-learn config/ppo/rollerball_config.yaml --run-id=myRB01

정상 작동한다면 아래와 같이 작동됩니다.

유니티 에디터의 플레이를 대기중인 모습

유니티에서 플레이를 시켜 봅니다.

먼가 구동되는 모습

floor에 머티리얼 하나 넣었습니다. 구분이 안돼서 이건 알아서 적당히 해주세요

 

아마 아나콘다에는 처음 구동시키면 아래와 같이 표시될 겁니다.

중간 빨간 테두리가 플레이 버튼을 눌려라고 시킨 문구가 나온 부분

중간 빨간 태투리 부분이 플레이 버튼을 눌러주세요라고, 나왔던 부분이고

플레이시키면 아래와 같이 진행됩니다.

 

한동안 교육이 됩니다. 시간이 필요합니다.

어느 정도 시간이 흐린 뒤(PC 성능에 따라 시간은 다릅니다.)

 

다음과 같은 진행상황이 올라옵니다.

2021-04-05 21:09:43 INFO [stats.py:180] RollerBall. Step: 10000. Time Elapsed: 155.122 s. Mean Reward: 0.561. Std of Reward: 0.496. Training.
2021-04-05 21:12:11 INFO [stats.py:180] RollerBall. Step: 20000. Time Elapsed: 303.015 s. Mean Reward: 0.958. Std of Reward: 0.200. Training.
2021-04-05 21:14:31 INFO [stats.py:180] RollerBall. Step: 30000. Time Elapsed: 442.886 s. Mean Reward: 0.994. Std of Reward: 0.077. Training.

만 스텝을 진행하면 진행상황을 보여줍니다.

현제 제 PC 성능에서는 초기 교육에서는 3분 정도

이후 교육 정밀도가 올라가는 시점에서는 시간이 더욱 소요되고 있습니다.

 

추가로 Mean Reward를 통해서 교육이 잘 되고 있나를 확인하실 수 있습니다.

 

보상 쪽 코드만 좀 보도록 하겠습니다.

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);

        // 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();
        }
    }

보시면, 타깃에 접근하면 보상 수치를 1점을 주고,

외부로 떨어지면 보상 수치가 0점입니다.

 

처음만 스텝이 진행되는 동안 Mean Reward는 0.521 점 정도입니다.

만회 교육받으면서 절반 정도 성공한 듯 보입니다.

 

이후 진행되며 보상점수가 점점 좋아지는 걸 볼 수 있습니다.

 

3만 회부터는 0.994 점입니다. 거의 성공이라고 봐야겠죠

그런 만큼 정밀도를 올리는 교육에서 시감이 더욱 소요되고 있습니다.

 

4만 회에서는 오히려 보상 수치가 떨어졌습니다.

교육을 더 시킨다고 보상 수치가 늘어만 나는 건 아니네요

 

교육을 끝내는 방법은

파이썬에서 Ctrl + C 키를 누르거나(유니티 프로젝트 플레이도 자동으로 종료됩니다.)

유니티에서 플레이를 종료시키거나,

원하시는 방식으로 진행하시면 됩니다.

교육이 끝나고, 저장되었다고 뜨는 장면

이제는 학습된 결과를 적용시켜볼 때입니다.

--run-id=myRB01

해당 아이디를 사용했어줘

 

ml-agents-release_15\results 폴더에 가면

해당 아이디 폴더가 존재합니다.

 

해당 폴더로 진입합니다.

태두리 쳐준 파일이 학습 결과 파일입니다.

적당히 이름을 바꿔 유니티 프로젝트로 가져다 두겠습니다.

저는 myRollerBall.onnx 라고 바꿔서 복사하겠습니다.

 

복사시킴

이후

RollerAgnet내부 컴포넌트 Behavior Parameters에 Model에 연결시켜줍니다.

아래 사진 참조

요렇게 해주세요

이제는 학습 프로그램을 구동시키지 말고,

그냥 플레이해봅니다.

 

똑똑한데..

우리가 만들 학습 데이터가 잘 적용됐고 타깃을 잘 찾아가는 모습을 볼 수 있습니다.

 

이번 학습은 여기까지!

 

다음 시간에는 요기까지 만든 내용으로 부터 파생해서 

재미있는걸 이것저것을 해볼 계획입니다.

댓글