[언리얼5.4] Learning Agents 개요
Learning Agents Intro (5.4) - 언리얼 Dev Community
(문서의 일부를 번역하며, 학습용이기에 틀린 내용이 있을 수 있음)
Learning Agents는 아직 실험용인 플러그인으로 AI 봇들에 강화학습 내지 모방학습을 시킬 수 있는 기능이다. 머신러닝 방식으로 작동하고, 생성형 AI는 아님을 유의한다. C++ 라이브러리, 블루프린트, 파이썬 스크립트로 동작하고, 학습 진행 중에는 PyTorch를 실행시키는 외부 파이썬 프로세스가 실행된다고 한다. 관찰이랑 행동을 정의하고, 신경망 구조를 설정하고 나면 이제 훈련이 된다고 한다. PPO(강화학습-Policy Based 알고리즘)와 BC(강화학습-모방 알고리즘)에 PyTorch 알고리즘을 포함시켰다.
https://dev.epicgames.com/community/learning/tutorials/owjW/unreal-engine-learning-to-drive-5-4
Learning to Drive (5.4)

플러그인을 활성화한다.
Learning Agents Manager
머신러닝을 가동할 LearningAgentsManager를 만든다. 이 러닝에이전트 매니저가 갖는 것은 학습하는 봇들(UObject면 다 가능), 그리고 학습 로직이다.

액터에 LearningAgentsManager 컴포넌트를 붙인다.

학습시킬 봇(이하 Agent)을 Manager 액터에 AddAgent로 등록시킨다.
Learning Agents Interactor
Agent가 월드(환경)와 어떻게 상호작용할지 정의해주는 오브젝트이다. 오버라이딩할 함수로는 SpecifyAgentObservation, SpecifyAgentAction, GatherAgentObservation, PerformAgentAction가 있다. LearningAgentsInteractor 클래스를 상속받아 오브젝트를 만든다.
- SpecifyAgentObservation - Agent의 schema(환경인식, 스키마)를 입력해준다. 매니저가 init할 때 한번 불러온다.
- GatherAgentObservation - 게임 상태로부터 관찰들을 수집한다.
- MakeLocationObservation - 위치 정보를 관찰할 때 사용할 함수 파라미터는 다음과 같다.
- Object 데이터를 가공할 관찰
- Location 인풋으로 사용될 주요데이터
- Relative Transform (optional) 상대 Transform
- Location Scale 위치(locaiton) 데이터 정규화((-1,1)하여 뉴럴 네트워크로 전달함)
-아래의 모든 BP노드들은 링크 문서에 등장하는 예시이다.-
Specify Agent Observation 예시

Specify Location/Direction Along Spline Observation으로 가장 가까운 스플라인 포인트를 Agent가 알게 한다. 복수의 Observation들을 구조체로 한데 묶을 수 있는데, Specify Struct Observation으로 묶으면 된다. 이걸 몇번 반복해서 최종 Struct 구조체를 만든다.
Gather Agent Observation 예시

위(SpecifyAgentObservation)과 다른 게 있다면, Specify~는 구조체 '정의'이고, Gather~은 실제로 들어갈 '값'을 세팅해주는 것 같다.
Specify Agent Action 예시

Perform Agent Action 예시

마찬가지로 Specify~에서 Action 스키마를 정의해주고, Perform Agent Action에서는 등록된 Action을 어떻게 실행하는지 로직을 짠다.
Learning Agents Trainer
LearningAgentsTrainer를 상속하여 액터를 생성한다.
Gather Agent Reward

Gather Agent Completion

학습이 불가능할 상태일 때는 학습을 종료한다. Completion은 조기 종료하는 로직이다. 종료(terminations)와 절단(truncations)로 나뉘며, 종료는 긍정 보상이 불가능할 때 이후 모든 단계 보상이 0이라고 가정되는 것이다. 반면에 절단은 그런 상황은 아니지만 일단 조기 종료를 원할 때, 앞으로 예상되는 보상을 추정하여 최종 누적 보상을 예측하는 것이다.
Learning Agents Manager 실행하기 (Begin Play)
필요한 변수들 : 에이전트들, Interactor, Policy, Critic, Trainer, Trainer Settings, Run Inference, Critic Settings, Policy Settings 등.

에이전트들이 Tick하기 전에 매니저 단에서 먼저 Tick을 실행하게 세팅한다. 에이전트들의 AddTickPrerequisiteActor에 매니저를 등록하면 에이전트 Tick전에 매니저 Tick을 먼저 실행하고 이를 에이전트에 반영하게 할 수 있다.

매니저의 Interactor에 미리 만들어둔 Interactor를 세팅한다.

데이터 에셋을 만드는데, LearningAgentsNeuralNetwork 클래스로 필요한 몇 개의 데이터에셋들을 만든다. Encoder와 Policy, Decoder, Critic이 그것이다.

위에서 만든 데이터에셋들 중 Encoder와 Policy, Decoder를 매니저의 MakePolicy에서 세팅해준다.

MakeCritic에서 Critic 데이터에셋을 세팅해준다.

MakeTrainer에서 만들어두었던 Trainer를 세팅해준다.

inference time 끝날 때마다 에이전트들의 랜덤 포인트를 리셋하게 한다.
이렇게 초기 셋업은 끝!
Learning Agents Manager 실행 (Tick)

Run Training에서 모든 필요한 데이터 처리 코드들을 호출한다 (Gather Agent Observation, Perform Agent Action, Gather Agent Reward, Gather Agent Completion). 관찰과 행동들이 버퍼에 저장되고, 에피소드가 완료되면 해당 데이터는 언리얼이 백그라운드에서 실행하는 파이썬 기반 학습 프로세스에 공유된다. 학습이 진행되면서 신경망이 계속 최신 버전으로 업데이트 된다. Run Training은 그냥 가장 심플한 함수이고, 여러 가지의 API가 존재한다고 한다.
마무리 작업
Manager가 Tick으로 학습을 하긴 하는데, 실시간 물리 시뮬레이션 결과를 잘 반영하기 위해선 Tick 속도를 조금 줄이는 게 좋다. 0.1 정도로 설정해두면 시뮬레이션 상태를 충분히 반영할 수 있다.
에이전트 숫자는 Manager의 컴포넌트 패널에서 Max Agent Num에서 설정할 수 있다. 에이전트가 많을수록 더 많은 데이터를 수집할 수 있다. 수집 데이터가 적을수록 학습에는 병목이 발생한다.
학습하기
플레이해서 학습시킬 수 있는데, 잠시 멈췄다가 다시 학습시키고 싶으면 Manager 세팅 시 Make Policy에서 'Reinitialize~' 옵션들을 false로 꺼주면 된다. Make Critic도 똑같이 옵션을 끈다. 학습 가중치가 에셋에 저장되게 되는데, 만일 이 Reinitialize 옵션을 true로 해두면 레벨 시작할 때 리셋된다. 실수로 true로 했을 경우엔 신경망 데이터 에셋 저장하지 말고 에디터 끄고 다시 켜면 된다.

Inference
그렇게 모델을 다 학습시켜 놓고 나면, Inference(추론) 모드로 돌려놓을 수 있다. 게임에 이용할 수 있는 상태가 된다. 파이썬이 실행되지 않고, 언리얼 엔진 내부 프로세스로만 순수하게 실행되는 상태이다. Shipping모드로 패키징하고 빌드하면 학습 코드에 어플리케이션에 포함되지 않는다. 추론 모드로 하는 방법은 Manager의 Run Inference 변수를 True로 설정하면 된다.
다음 단계
지금까지 강화 학습 에이전트 훈련 튜토리얼이다. 블루프린트 위주로 설명되어 있지만 C++로도 접근할 수 있다. 관찰Observations, 행동Actions, 보상Rewards 관련한 더 많은 사항들이 있으니 확인해볼 필요가 있다.
오래 훈련을 시켜놔도 리얼하게 학습상태에 도달하지 못할 수가 있다. 보상을 계속 개선하여 최선의 상태로 도달하도록 도전하도록 한다.