[유니티(Unity)] (ML Agent) Training Configuration File

728x90

개요

이번 페이지에서는 강화 학습에 필요한 Training Configuration 파일에 대해 정리하겠습니다.

참고 : Training Configuration File

 

Training Configuration File - Unity ML-Agents Toolkit

Training Configuration File Table of Contents Common Trainer Configurations One of the first decisions you need to make regarding your training run is which trainer to use: PPO, SAC, or POCA. There are some training configurations that are common to both t

unity-technologies.github.io

공통 트레이너 설정

공통적으로 구성 할 수 있는 세팅 입니다.
설정 항목 설명
trainer_type (기본값 = ppo)

사용할 트레이너 유형: ppo, sac 또는 poca.
summary_freq (기본값 = 50000)

학습 통계를 생성하고 표시하기 전에 수집해야 하는 경험의 수입니다. 이는 TensorBoard 그래프의 세밀도를 결정합니다.
time_horizon (기본값 = 64)

에이전트가 경험을 모은 후, 경험 버퍼에 추가하기 전까지 저장할 단계 수입니다.

  • 이 값에 도달하기 전에 에피소드가 끝나면, 현재 상태에서 예상되는 보상을 예측해 보정합니다.
  • 값이 클수록 예측이 정확하지만 변동성이 커지고, 값이 작을수록 예측이 단순하지만 편향될 수 있습니다.
  • 보상이 자주 발생하거나 에피소드가 너무 길다면 작은 값이 더 적절할 수 있습니다.
  • 중요한 행동 패턴을 충분히 반영할 수 있도록 적절한 크기로 설정하는 것이 중요합니다.
권장 범위: 32 - 2048
max_steps (기본값 = 500000)

학습이 종료되기 전까지 환경에서 수행해야 하는 총 스텝 수(관찰 및 행동 횟수)입니다.

  • 여러 개의 환경을 병렬로 실행하는 경우, 모든 환경에서 수행된 스텝이 합산됩니다.
  • 동일한 행동 이름(behavior name)을 가진 여러 에이전트가 있다면, 그들의 모든 스텝이 max_steps에 포함됩니다.
권장 범위: 500,000 (5e5) ~ 10,000,000 (1e7)
keep_checkpoints (기본값 = 5)

저장할 모델 체크포인트의 최대 개수입니다.

  • 체크포인트는 checkpoint_interval 옵션에서 지정한 스텝마다 저장됩니다.
  • 최대 개수에 도달하면, 새 체크포인트를 저장할 때 가장 오래된 체크포인트가 삭제됩니다.
even_checkpoints (기본값 = false)

true로 설정하면 checkpoint_interval을 무시하고, keep_checkpoints와 max_steps를 기반으로 학습 전체에 걸쳐 균등하게 체크포인트를 저장합니다.

  • 계산 방식: checkpoint_interval = max_steps / keep_checkpoints
  • 학습 과정에서 에이전트의 행동 변화를 기록할 때 유용합니다.
checkpoint_interval (기본값 = 500000)

각 체크포인트 사이에 수집되는 경험의 수입니다.

  • keep_checkpoints로 설정된 최대 개수만큼 체크포인트가 저장되며, 그 이후에는 오래된 체크포인트가 삭제됩니다.
  • 각 체크포인트는 results/ 폴더에 .onnx 파일을 저장합니다.
init_path (기본값 = None)

이전에 저장된 모델을 불러와 트레이너를 초기화합니다.

  • 이전 실행과 동일한 트레이너 설정을 사용하고, 같은 ML-Agents 버전에서 저장된 모델이어야 합니다.
  • 체크포인트의 파일명 또는 전체 경로를 지정할 수 있습니다.
    • 예시: {checkpoint_name.pt} 또는 ./models/{run-id}/{behavior_name}/{checkpoint_name.pt}
  • 서로 다른 실행에서 저장된 체크포인트를 사용하거나, 이전 체크포인트에서 학습을 이어갈 때 활용할 수 있습니다.
  • 일반적으로 --initialize-from CLI 옵션을 사용하면 동일한 실행에서 모든 모델을 초기화하는 것이 더 간편합니다.
threaded (기본값 = false)

모델을 업데이트하는 동안 환경이 계속 진행되도록 허용합니다.

  • SAC를 사용할 때 학습 속도가 향상될 수 있습니다.
  • 자체 플레이(self-play)를 사용하는 경우 최적의 성능을 위해 이 설정을 false로 유지하는 것이 좋습니다.
hyperparameters -> learning_rate (기본값 = 3e-4)

경사 하강법의 초기 학습률로, 각 업데이트 단계에서 모델이 얼마나 조정되는지를 결정합니다.

  • 학습이 불안정하거나 보상이 지속적으로 증가하지 않는 경우 값을 낮추는 것이 좋습니다.
권장 범위: 1e-5 ~ 1e-3
hyperparameters -> batch_size 각 경사 하강법(iteration)에서 사용되는 경험의 수입니다.
  • 항상 buffer_size보다 훨씬 작은 값으로 설정해야 합니다.
  • 연속적(continuous) 행동을 사용할 경우 값이 커야 하며(1000 단위), 이산적(discrete) 행동만 사용할 경우 더 작은 값이 적합합니다(10 단위).
권장 범위:
  • 연속적 행동 (PPO): 512 ~ 5120
  • 연속적 행동 (SAC): 128 ~ 1024
  • 이산적 행동 (PPO & SAC): 32 ~ 512
hyperparameters -> buffer_size (기본값 = PPO: 10240, SAC: 50000)
  • PPO: 정책 모델을 업데이트하기 전에 수집할 경험의 수입니다. 학습이나 모델 업데이트를 시작하기 전에 수집해야 할 경험의 양을 나타냅니다. 이 값은 batch_size보다 여러 배 커야 합니다. 일반적으로 큰 buffer_size는 더 안정적인 학습 업데이트에 기여합니다.
  • SAC: 경험 버퍼의 최대 크기입니다. 에피소드보다 수천 배 더 긴 시간 동안 경험을 저장하여, SAC가 오래된 경험뿐만 아니라 새로운 경험도 학습할 수 있게 합니다.
권장 범위:
  • PPO: 2048 ~ 409600
  • SAC: 50000 ~ 1000000
hyperparameters -> learning_rate_schedule (기본값 = PPO: linear, SAC: constant)

학습률이 시간이 지남에 따라 어떻게 변하는지 결정합니다.

  • PPO: 학습률을 max_steps까지 선형적으로 감소시키는 것을 권장하여, 학습이 더 안정적으로 수렴할 수 있도록 합니다. 그러나 일부 경우(예: 학습 시간이 불확실한 경우)에는 이 기능을 비활성화할 수 있습니다.
  • SAC: 학습률을 일정하게 유지하는 것이 좋으며, 이를 통해 에이전트가 Q 함수가 자연스럽게 수렴할 때까지 계속 학습할 수 있습니다.
  • linear: 학습률을 선형적으로 감소시켜 max_steps에서 0에 도달합니다.
  • constant: 학습 전체 동안 학습률을 일정하게 유지합니다.
network_settings -> hidden_units
(기본값 = 128)

신경망의 은닉층에 있는 유닛의 수입니다.

  • 이는 신경망의 각 완전 연결층에 있는 유닛의 수를 나타냅니다.
  • 문제의 복잡도가 낮고 올바른 행동이 관찰 입력의 간단한 조합인 경우, 이 값은 작아야 합니다.
  • 행동이 관찰 변수 간의 매우 복잡한 상호작용인 경우, 이 값은 더 커야 합니다.
권장 범위: 32 ~ 512
network_settings -> num_layers (기본값 = 2)

신경망의 은닉층 수입니다.

  • 이는 관찰 입력 후, 또는 시각적 관찰의 CNN 인코딩 후에 있는 은닉층의 수를 나타냅니다.
  • 간단한 문제에서는 은닉층이 적을수록 학습이 더 빠르고 효율적일 수 있습니다.
  • 더 복잡한 제어 문제가 있을 경우, 은닉층을 더 많이 사용하는 것이 필요할 수 있습니다.
권장 범위: 1 ~ 3
network_settings -> normalize (기본값 = false)

벡터 관찰 입력에 정규화가 적용되는지 여부입니다.

  • 이 정규화는 벡터 관찰의 실행 평균과 분산을 기반으로 합니다.
  • 정규화는 복잡한 연속 제어 문제에서 도움이 될 수 있지만, 간단한 이산 제어 문제에서는 오히려 해로울 수 있습니다.
network_settings -> vis_encode_type (기본값 = simple)

시각적 관찰을 인코딩하는 방식입니다.

  • simple (기본값): 두 개의 컨볼루션 층으로 구성된 간단한 인코더입니다.
  • nature_cnn: Mnih et al.이 제안한 CNN 구현으로, 세 개의 컨볼루션 층을 사용합니다.
  • resnet: IMPALA Resnet을 사용하며, 세 개의 스택된 층 각각에 두 개의 잔차 블록이 포함되어 있어 다른 두 인코더보다 훨씬 더 큰 네트워크입니다.
  • match3: Gudmundsoon et al.이 제안한 작은 CNN으로, 보드 게임에 최적화되어 있으며 더 세밀한 공간 관계를 캡처할 수 있습니다.
  • fully_connected: 컨볼루션 층 없이 단일 완전 연결 밀집 층을 사용하는 인코더입니다.
각 인코더 유형은 컨볼루션 커널 크기 때문에 처리할 수 있는 최소 관찰 크기에 제한이 있습니다:
  • simple: 20x20
  • nature_cnn: 36x36
  • resnet: 15x15
  • match3: 5x5
  • fully_connected: 컨볼루션 층이 없으므로 크기 제한이 없지만, 표현력이 적어 매우 작은 입력에만 사용해야 합니다.
매우 큰 시각적 입력에 match3 CNN을 사용할 경우, 큰 관찰 인코딩으로 인해 학습 속도가 느려지거나 메모리 문제를 일으킬 수 있습니다.
network_settings -> conditioning_type (기본값 = hyper)

목표 관찰을 사용하여 정책을 조정하는 방식입니다.

  • none: 목표 관찰을 일반 관찰로 처리합니다.
  • hyper (기본값): 목표 관찰을 입력으로 사용하여 정책의 일부 가중치를 생성하는 하이퍼 네트워크(HyperNetwork)를 사용합니다.
하이퍼 네트워크를 사용할 경우 네트워크의 매개변수 수가 크게 증가합니다. 따라서 이 조정 방식을 사용할 때는 hidden_units의 수를 줄이는 것이 좋습니다.

PPO 관련 설정

 

설정 항목 설명
hyperparameters -> beta (기본값 = 5.0e-3)

엔트로피 정규화의 강도를 조정하는 값으로, 정책을 더 무작위하게 만듭니다.

  • 이는 학습 중 에이전트가 행동 공간을 충분히 탐색할 수 있도록 보장하는 역할을 합니다.
  • 값을 증가시키면 더 무작위적인 행동을 하도록 유도됩니다.
  • 엔트로피(Entropy)가 보상 증가와 함께 서서히 감소하도록 조정하는 것이 이상적입니다.
    • 엔트로피가 너무 빠르게 감소하면 beta 값을 증가시키세요.
    • 엔트로피가 너무 천천히 감소하면 beta 값을 감소시키세요.
권장 범위: 1e-4 ~ 1e-2
hyperparameters -> epsilon (기본값 = 0.2)

학습 중 정책이 얼마나 빠르게 변화할 수 있는지를 조절하는 값입니다.

  • 이는 경사 하강법 업데이트 시, 기존 정책과 새로운 정책 간의 허용 가능한 차이를 결정합니다.
  • 값이 작을수록 업데이트가 더 안정적이지만, 학습 속도가 느려질 수 있습니다.
권장 범위: 0.1 ~ 0.3
hyperparameters -> beta_schedule (기본값 = learning_rate_schedule)

학습 과정에서 beta 값이 변하는 방식을 결정합니다.

  • linear: beta 값을 선형적으로 감소시켜 max_steps에서 0에 도달하도록 합니다.
  • constant: 학습 과정 내내 beta 값을 일정하게 유지합니다.
  • 별도로 설정하지 않으면 기본적으로 learning_rate_schedule 값을 따릅니다.
hyperparameters -> epsilon_schedule (기본값 = learning_rate_schedule)

학습 과정에서 epsilon 값이 변하는 방식을 결정합니다. (PPO 전용)

  • linear: epsilon 값을 선형적으로 감소시켜 max_steps에서 0에 도달하도록 합니다.
  • constant: 학습 과정 내내 epsilon 값을 일정하게 유지합니다.
  • 별도로 설정하지 않으면 기본적으로 learning_rate_schedule 값을 따릅니다.
hyperparameters -> lambd (기본값 = 0.95)

Generalized Advantage Estimate(GAE) 계산에 사용되는 정규화 매개변수(lambda)입니다.

  • 이 값은 에이전트가 현재 가치 추정치를 얼마나 신뢰할지를 결정합니다.
  • 값이 낮을수록 현재 가치 추정치를 더 신뢰하지만, 편향(bias)이 커질 수 있음.
  • 값이 높을수록 실제 보상을 더 반영하지만, 분산(variance)이 커질 수 있음.
  • 적절한 값을 설정하면 학습이 더 안정적으로 진행될 수 있습니다.
권장 범위: 0.9 ~ 0.95
hyperparameters -> num_epoch (기본값 = 3)

경사 하강법 최적화를 수행할 때 경험 버퍼를 몇 번 반복하여 학습할지를 결정하는 값입니다.

  • batch_size가 클수록 이 값을 크게 설정해도 괜찮습니다.
  • 값을 줄이면 학습 업데이트가 더 안정적이지만, 학습 속도가 느려질 수 있습니다.
권장 범위: 3 ~ 10
hyperparameters -> shared_critic (기본값 = False)

정책 네트워크와 가치 함수 네트워크가 동일한 신경망(backbone)을 공유할지 여부를 결정합니다.

  • 이미지 기반 관측으로 학습할 때 신경망을 공유하는 것이 유용할 수 있습니다.
  • 기본적으로는 별도의 네트워크를 사용합니다.
  • PPO 3DBall Example
더보기

behaviors:
  3DBall:
    trainer_type: ppo
    hyperparameters:
      batch_size: 64
      buffer_size: 12000
      learning_rate: 0.0003
      beta: 0.001
      epsilon: 0.2
      lambd: 0.99
      num_epoch: 3
      learning_rate_schedule: linear
    network_settings:
      normalize: true
      hidden_units: 128
      num_layers: 2
      vis_encode_type: simple
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    keep_checkpoints: 5
    max_steps: 500000
    time_horizon: 1000
    summary_freq: 12000

  • PPO WallJump Example
더보기

behaviors:
  BigWallJump:
    trainer_type: ppo
    hyperparameters:
      batch_size: 128
      buffer_size: 2048
      learning_rate: 0.0003
      beta: 0.005
      epsilon: 0.2
      lambd: 0.95
      num_epoch: 3
      learning_rate_schedule: linear
    network_settings:
      normalize: false
      hidden_units: 256
      num_layers: 2
      vis_encode_type: simple
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    keep_checkpoints: 5
    max_steps: 20000000
    time_horizon: 128
    summary_freq: 20000
  SmallWallJump:
    trainer_type: ppo
    hyperparameters:
      batch_size: 128
      buffer_size: 2048
      learning_rate: 0.0003
      beta: 0.005
      epsilon: 0.2
      lambd: 0.95
      num_epoch: 3
      learning_rate_schedule: linear
    network_settings:
      normalize: false
      hidden_units: 256
      num_layers: 2
      vis_encode_type: simple
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    keep_checkpoints: 5
    max_steps: 5000000
    time_horizon: 128
    summary_freq: 20000

SAC 관련 설정

 

설정 항목 설명
hyperparameters -> buffer_init_steps (기본값 = 0)

정책 모델을 업데이트하기 전에 버퍼에 수집할 경험의 수입니다.

  • 학습되지 않은 정책은 꽤 무작위적이기 때문에, 버퍼를 무작위 행동으로 미리 채우는 것이 탐색에 유용합니다.
  • 일반적으로 여러 에피소드에 해당하는 경험을 미리 채우는 것이 좋습니다.
권장 범위: 1000 ~ 10000
hyperparameters -> init_entcoef (기본값 = 1.0)

학습 초기 단계에서 에이전트가 얼마나 탐색할지를 결정합니다.

  • 학습 시작 시 초기 엔트로피 계수에 해당합니다.
  • SAC에서는 에이전트가 더 나은 탐색을 촉진하기 위해 엔트로피적인 행동을 하도록 유도합니다.
  • 엔트로피 계수는 실제 보상에 엔트로피 보너스를 추가하여 가중치를 둡니다.
  • 엔트로피 계수는 목표 엔트로피에 맞게 자동으로 조정되며, init_entcoef는 보너스 엔트로피의 시작 값을 설정합니다.
  • init_entcoef 값을 높이면 초기에 더 많이 탐색하고, 낮추면 더 빠르게 수렴할 수 있습니다.
권장 범위:
  • 연속적 행동 (Continuous): 0.5 ~ 1.0
  • 이산적 행동 (Discrete): 0.05 ~ 0.5
hyperparameters -> save_replay_buffer (기본값 = false)

훈련을 종료하고 다시 시작할 때 경험 리플레이 버퍼와 모델을 저장하고 로드할지 여부를 결정합니다.

  • 이 기능을 사용하면 수집된 경험이 삭제되지 않아 훈련을 재개할 때 더 원활하게 진행될 수 있습니다.
  • 다만, 리플레이 버퍼는 매우 클 수 있으며 상당한 양의 디스크 공간을 차지할 수 있기 때문에 기본적으로 이 기능은 비활성화되어 있습니다.
hyperparameters -> tau (기본값 = 0.005)

SAC에서 가치 추정을 위한 부트스트랩을 할 때 타겟 네트워크를 얼마나 공격적으로 업데이트할지를 결정합니다.

  • 이 값은 SAC 모델 업데이트 중 타겟 Q 업데이트의 크기와 관련이 있습니다.
  • SAC에는 두 개의 신경망이 있으며, 하나는 타겟 네트워크이고 다른 하나는 정책 네트워크입니다.
  • 타겟 네트워크는 주어진 상태에서 미래 보상에 대한 정책의 추정을 부트스트랩하는 데 사용되며, 정책이 업데이트되는 동안 고정됩니다.
  • 그런 다음 타겟은 tau에 따라 천천히 업데이트됩니다.
  • 이 값은 일반적으로 0.005로 두는 것이 좋습니다. 간단한 문제에서는 tau 값을 0.01로 증가시켜 학습 시간을 단축할 수 있지만, 안정성에는 비용이 발생할 수 있습니다.
권장 범위: 0.005 ~ 0.01
hyperparameters -> steps_per_update (기본값 = 1)

에이전트의 정책 업데이트에 비해 에이전트가 수행하는 행동(스텝)의 평균 비율을 결정합니다.

  • SAC에서 하나의 "업데이트"는 경험 리플레이 버퍼에서 batch_size 크기의 배치를 가져와 이 미니 배치를 사용하여 모델을 업데이트하는 과정에 해당합니다.
  • steps_per_update만큼의 스텝 후에 반드시 업데이트가 이루어진다는 보장은 없지만, 이 비율은 많은 스텝에 걸쳐 유지됩니다.
  • steps_per_update 값은 일반적으로 1 이상이어야 합니다.
  • 값을 낮추면 샘플 효율성이 향상되어 학습에 필요한 스텝 수가 줄어들지만, 업데이트 수행에 더 많은 CPU 시간이 소요될 수 있습니다.
  • 대부분의 빠른 환경에서는 steps_per_update 값을 씬에 있는 에이전트 수와 동일하게 설정하는 것이 균형 잡힌 선택입니다.
  • 느린 환경(스텝당 시간이 0.1초 이상 걸리는 경우)에서는 steps_per_update 값을 줄이면 학습 속도가 향상될 수 있습니다.
  • 또한 steps_per_update 값을 1보다 낮게 설정하여 한 스텝마다 여러 번 업데이트를 할 수 있지만, 이는 보통 환경이 매우 느린 경우에만 속도 향상을 가져옵니다.
권장 범위: 1 ~ 20
hyperparameters -> reward_signal_num_update (기본값 = steps_per_update)

보상 신호를 업데이트하는 데 사용되는 미니 배치당 스텝 수를 결정합니다.

  • 기본적으로 보상 신호는 주요 정책이 업데이트될 때마다 한 번씩 업데이트됩니다.
  • 그러나 특정 모방 학습 논문(예: Kostrikov et al., Blondé et al.)에서 제시된 훈련 절차를 모방하려는 경우, 정책이 업데이트될 때마다 보상 신호(GAIL)를 M번 업데이트하고자 할 수 있습니다.
  • 이를 위해 SAC의 steps_per_update 값을 N으로 설정하고, 보상 신호의 reward_signal_steps_per_update 값을 N / M으로 설정하면 됩니다.
  • 기본적으로 reward_signal_steps_per_update 값은 steps_per_update로 설정됩니다.
  • SAC 3DBall Example
더보기

behaviors:
  3DBall:
    trainer_type: sac
    hyperparameters:
      learning_rate: 0.0003
      learning_rate_schedule: constant
      batch_size: 64
      buffer_size: 200000
      buffer_init_steps: 0
      tau: 0.005
      steps_per_update: 10.0
      save_replay_buffer: false
      init_entcoef: 0.5
      reward_signal_steps_per_update: 10.0
    network_settings:
      normalize: true
      hidden_units: 64
      num_layers: 2
      vis_encode_type: simple
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    keep_checkpoints: 5
    max_steps: 200000
    time_horizon: 1000
    summary_freq: 12000

  • SAC WallJump Example
더보기

behaviors:
  BigWallJump:
    trainer_type: sac
    hyperparameters:
      learning_rate: 0.0003
      learning_rate_schedule: constant
      batch_size: 128
      buffer_size: 200000
      buffer_init_steps: 0
      tau: 0.005
      steps_per_update: 20.0
      save_replay_buffer: false
      init_entcoef: 0.1
      reward_signal_steps_per_update: 10.0
    network_settings:
      normalize: false
      hidden_units: 256
      num_layers: 2
      vis_encode_type: simple
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    keep_checkpoints: 5
    max_steps: 15000000
    time_horizon: 128
    summary_freq: 20000
  SmallWallJump:
    trainer_type: sac
    hyperparameters:
      learning_rate: 0.0003
      learning_rate_schedule: constant
      batch_size: 128
      buffer_size: 50000
      buffer_init_steps: 0
      tau: 0.005
      steps_per_update: 20.0
      save_replay_buffer: false
      init_entcoef: 0.1
      reward_signal_steps_per_update: 10.0
    network_settings:
      normalize: false
      hidden_units: 256
      num_layers: 2
      vis_encode_type: simple
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    keep_checkpoints: 5
    max_steps: 5000000
    time_horizon: 128
    summary_freq: 20000

보상 신호

 

  • reward_signals 섹션은 외부 보상(환경 기반)과 내부 보상(예: 호기심 및 GAIL) 신호의 설정을 정의합니다. 각 보상 신호는 적어도 두 가지 매개변수, strength와 gamma를 정의해야 하며, 클래스별 하이퍼파라미터를 추가할 수 있습니다. 보상 신호를 제거하려면 해당 항목을 reward_signals에서 완전히 삭제해야 합니다. 최소한 하나의 보상 신호는 항상 정의되어 있어야 합니다.

Extrinsic Rewards (외부 보상)

 

설정 항목 설명
extrinsic -> strength (기본값 = 1.0)

환경에서 제공하는 보상에 곱해지는 계수입니다. 보상 신호에 따라 일반적인 범위는 다를 수 있습니다.

일반적인 범위: 1.00
extrinsic -> gamma (기본값 = 0.99)

환경에서 주어지는 미래 보상에 대한 할인 계수입니다. 이는 에이전트가 미래의 보상을 얼마나 중요하게 여겨야 하는지를 결정합니다. 먼 미래의 보상을 대비하여 현재 행동해야 하는 경우에는 이 값을 크게 설정해야 합니다. 반대로 보상이 즉각적인 경우에는 더 작게 설정할 수 있습니다. 1보다 작아야 합니다.

일반적인 범위: 0.8 - 0.995

Curiosity Intrinsic Reward (호기심 기반 내부 보상)

 

설정 항목 설명
curiosity -> strength (기본값 = 1.0)

호기심 기반 내부 보상 모듈이 생성하는 보상의 크기입니다. 환경에서 제공되는 외부 보상 신호에 의해 묻히지 않을 만큼 충분히 커야 하지만, 반대로 외부 보상을 압도할 만큼 너무 크지 않도록 조정해야 합니다.

권장 범위: 0.001 - 0.1
curiosity -> gamma (기본값 = 0.99)

미래 보상에 대한 할인율입니다.

권장 범위: 0.8 - 0.995
curiosity -> network_settings (기본값 = 128)

내재적 호기심 모델(ICM)이 사용하는 네트워크 설정입니다. hidden_units 값은 원본 관측값을 압축하도록 충분히 작아야 하지만, 예상된 관측과 실제 관측을 구별하는 학습을 방해하지 않을 정도로 작지는 않아야 합니다.

권장 범위: 64 - 256
curiosity -> learning_rate (기본값 = 3e-4)

내재적 호기심 모듈(ICM)을 업데이트하는 학습률입니다. 훈련이 불안정하고 호기심 손실이 일정하지 않다면 이 값을 줄이는 것이 좋습니다.

권장 범위: 1e-5 - 1e-3

GAIL Intrinsic Reward (GAIL 기반 내부 보상)

 

  • GAIL을 활성화하려면(데모를 녹화했다고 가정하고) 다음 설정을 제공하세요.
설정 항목 설명
gail -> strength (기본값 = 1.0)

원본 보상에 곱하는 계수입니다. GAIL을 외부 보상 신호(Extrinsic Signal)와 함께 사용할 경우, 시연 데이터가 최적이 아닐 때(예: 사람이 제공한 시연) 이 값을 낮게 설정하는 것이 좋습니다. 이렇게 하면 훈련된 에이전트가 시연을 그대로 복사하는 것이 아니라 외부 보상 획득에 집중할 수 있습니다. 이러한 경우 강도를 0.1 이하로 유지하는 것이 좋습니다.

권장 범위: 0.01 - 1.0
gail -> gamma (기본값 = 0.99)

미래 보상에 대한 할인 계수입니다.

권장 범위: 0.8 - 0.9
gail -> demo_path (필수, 기본값 없음)

.demo 파일 또는 .demo 파일이 포함된 디렉터리의 경로입니다.
gail -> network_settings (기본값 = 128)

GAIL 판별기에 대한 네트워크 사양입니다. hidden_units 값은 원본 관측값을 압축하도록 충분히 작아야 하지만, 시연된 행동과 실제 행동을 구별하는 학습을 방해하지 않을 정도로 작지는 않아야 합니다. 이 값을 지나치게 크게 설정하면 학습 시간이 증가할 수 있습니다.

권장 범위: 64 - 256
gail -> learning_rate (Optional, 기본값 = 3e-4)

판별자를 업데이트하는 데 사용되는 학습률입니다. 학습이 불안정하거나 GAIL 손실이 불안정할 경우 이 값을 줄이는 것이 좋습니다.

권장 범위: 1e-5 - 1e-3
gail -> use_actions
(기본값 = false)

판별자가 관측과 행동을 모두 구별할지, 아니면 관측만을 기준으로 구별할지를 결정합니다.

  • true: 에이전트가 시연된 행동을 그대로 모방하도록 합니다.
  • false: 에이전트가 시연과 동일한 상태를 방문하도록 유도하지만, 행동은 다를 수 있습니다.
불완전한 시연 데이터가 있을 경우 false로 설정하는 것이 더 안정적일 가능성이 높지만, 학습 속도가 느려질 수 있습니다.
gail -> use_vail (기본값 = false)

GAIL 판별기에 변분 병목(variational bottleneck)을 활성화합니다.

이 설정을 사용하면 판별기가 보다 일반적인 표현을 학습하도록 강제되어 구별 능력이 지나치게 높아지는 것을 방지하고, 학습을 보다 안정적으로 만듭니다. 하지만 학습 시간이 증가할 수 있습니다.
모방 학습이 불안정하거나 원하는 작업을 제대로 학습하지 못하는 경우 활성화하는 것이 도움이 될 수 있습니다.
  • GAIL Crawler Example
더보기

behaviors:
  Crawler:
    trainer_type: ppo
    hyperparameters:
      batch_size: 2024
      buffer_size: 20240
      learning_rate: 0.0003
      beta: 0.005
      epsilon: 0.2
      lambd: 0.95
      num_epoch: 3
      learning_rate_schedule: linear
    network_settings:
      normalize: true
      hidden_units: 512
      num_layers: 3
      vis_encode_type: simple
    reward_signals:
      gail:
        gamma: 0.99
        strength: 1.0
        network_settings:
          normalize: true
          hidden_units: 128
          num_layers: 2
          vis_encode_type: simple
        learning_rate: 0.0003
        use_actions: false
        use_vail: false
        demo_path: Project/Assets/ML-Agents/Examples/Crawler/Demos/ExpertCrawler.demo
    keep_checkpoints: 5
    max_steps: 10000000
    time_horizon: 1000
    summary_freq: 30000
    behavioral_cloning:
      demo_path: Project/Assets/ML-Agents/Examples/Crawler/Demos/ExpertCrawler.demo
      steps: 50000
      strength: 0.5
      samples_per_update: 0

  • GAIL Hallway Example
더보기

behaviors:
  Hallway:
    trainer_type: ppo
    hyperparameters:
      batch_size: 128
      buffer_size: 1024
      learning_rate: 0.0003
      beta: 0.01
      epsilon: 0.2
      lambd: 0.95
      num_epoch: 3
      learning_rate_schedule: linear
    network_settings:
      normalize: false
      hidden_units: 128
      num_layers: 2
      vis_encode_type: simple
      memory:
        sequence_length: 64
        memory_size: 256
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
      gail:
        gamma: 0.99
        strength: 0.01
        learning_rate: 0.0003
        use_actions: false
        use_vail: false
        demo_path: Project/Assets/ML-Agents/Examples/Hallway/Demos/ExpertHallway.demo
    keep_checkpoints: 5
    max_steps: 10000000
    time_horizon: 64
    summary_freq: 10000

 

RND Intrinsic Reward (RND 기반 내부 보상)

 

  • Random Network Distillation(RND)은 PyTorch 트레이너에서만 사용할 수 있습니다. 
설정 항목 설명
rnd -> strength (기본값 = 1.0) 

내부 RND 모듈이 생성하는 호기심 보상의 크기입니다. 환경에서 제공되는 외부 보상 신호에 비해 너무 작아서 영향을 받지 않거나, 너무 커서 외부 보상을 압도하지 않도록 적절히 조정해야 합니다.

권장 범위: 0.001 - 0.01
rnd -> gamma (기본값 = 0.99)

미래 보상에 대한 할인 계수입니다.

권장 범위: 0.8 - 0.995
rnd -> network_settings (네트워크 설정 참고)

RND(Random Network Distillation) 모델에서 사용하는 네트워크 사양입니다. 자세한 내용은 공통 부분의 network_settings 문서를 참조하세요.
curiosity -> learning_rate (기본값 = 3e-4)

RND 모듈을 업데이트하는 데 사용되는 학습률입니다. 상태 표현을 빠르게 학습할 수 있을 정도로 충분히 커야 하지만, 안정적인 학습이 가능하도록 너무 크지는 않아야 합니다.

권장 범위: 1e-5 - 1e-3

 

Behavioral Cloning (행동 복제)

 

  • 행동 복제를 사전 학습 옵션으로 활성화하려면 (데모가 기록되어 있다고 가정) behavioral_cloning 섹션에 다음 설정을 제공해야 합니다.
설정 항목 설명
demo_path demo_path (필수, 기본값 없음)

.demo 파일 또는 .demo 파일이 포함된 디렉터리의 경로를 지정합니다.
strength learning_rate (기본값 = 1.0)

PPO의 학습률에 대한 모방 학습의 상대적 학습률입니다. BC가 정책에 미치는 영향을 얼마나 강하게 허용할지를 결정합니다.

권장 범위: 0.1 - 0.5
steps (기본값 = 0)

BC가 활성화되는 학습 단계 수입니다. 에이전트가 보상을 경험한 후, 데모를 더 이상 사용하지 않고 스스로 최적화하거나 일반화할 수 있도록 설정할 수 있습니다. 이 값이 0이면 전체 학습 과정에서 BC가 지속적으로 적용되며, 설정된 값에 따라 BC의 학습률이 점진적으로 감소합니다.
batch_size (기본값 = 트레이너의 batch_size)

한 번의 경사 하강 업데이트에 사용되는 데모 경험 수입니다. 설정하지 않으면 트레이너의 batch_size 값을 따릅니다.

권장 범위:
  • 연속적 행동(Continuous): 512 - 5120
  • 이산적 행동(Discrete): 32 - 512
num_epoch (기본값 = 트레이너의 num_epoch)

경사 하강 시 경험 버퍼를 반복하는 횟수입니다. 설정하지 않으면 PPO의 에포크 수를 따릅니다.

권장 범위: 3 - 10
samples_per_update (기본값 = 0)

각 모방 학습 업데이트에서 사용할 최대 샘플 수입니다. 데모 데이터셋이 매우 클 경우, 과적합을 방지하기 위해 낮출 수 있습니다. 0으로 설정하면 모든 데모 데이터를 사용합니다.

권장 범위: buffer_size
  • BC Pyramids Example
더보기

behaviors:
  Pyramids:
    trainer_type: ppo
    time_horizon: 128
    max_steps: 1.0e7
    hyperparameters:
      batch_size: 128
      beta: 0.01
      buffer_size: 2048
      epsilon: 0.2
      lambd: 0.95
      learning_rate: 0.0003
      num_epoch: 3
    network_settings:
      num_layers: 2
      normalize: false
      hidden_units: 512
    reward_signals:
      extrinsic:
        strength: 1.0
        gamma: 0.99
      curiosity:
        strength: 0.02
        gamma: 0.99
        network_settings:
          hidden_units: 256
      gail:
        strength: 0.01
        gamma: 0.99
        demo_path: Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo
    behavioral_cloning:
      demo_path: Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo
      strength: 0.5
      steps: 150000

 

 메모리를 활용하는 RNN 에이전트

 

  • 에이전트가 메모리를 사용할 수 있도록 설정하려면 network_settings 아래에 memory 섹션을 추가하고, memory_size 및 sequence_length 값을 지정하면 됩니다.
설정 항목 설명
network_settings -> memory -> memory_size (기본값 = 128)

에이전트가 유지해야 하는 메모리의 크기입니다. LSTM을 사용하려면 단일 경험이 아닌 **일련의 경험(시퀀스 데이터)**을 기반으로 학습해야 합니다. 이 값은 정책 네트워크의 순환 신경망(hidden state)을 저장하는 부동소수점 배열의 크기에 해당합니다.

이 값은 2의 배수여야 하며, 에이전트가 과제를 성공적으로 수행하기 위해 기억해야 하는 정보의 양에 따라 적절히 조정해야 합니다.

일반적인 범위: 32 ~ 256
network_settings -> memory -> sequence_length (기본값 = 64)

학습 시 사용할 경험(sequence)의 길이를 정의합니다.
이 값이 너무 작으면 에이전트가 장기적인 정보를 기억하기 어려워지고, 반대로 너무 크면 신경망의 학습 속도가 느려질 수 있습니다.

일반적인 범위: 4 ~ 128

 

메모리를 사용할 때 고려해야 할 몇 가지 사항:

  • LSTM은 연속적인 행동(Continuous Actions)과 잘 맞지 않습니다. 더 나은 결과를 위해 이산적인 행동(Discrete Actions)을 사용하는 것이 좋습니다.
  • 순환 레이어(Recurrent Layer)를 추가하면 신경망의 복잡도가 증가합니다. 따라서 순환 네트워크를 사용할 경우 num_layers 값을 줄이는 것이 권장됩니다.
  • memory_size 값은 반드시 2로 나누어떨어져야 합니다.

Self-Play

 

Self-Play 학습은 강화 학습에서 일반적으로 발생하는 문제 외에도 추가적인 변수들을 도입합니다. 일반적으로, 최종 정책의 숙련도와 일반화 성능 사이에서 학습의 안정성과의 트레이드오프(trade-off)가 발생합니다.

  • 변화가 느리거나 고정된 상대를 두고 학습하면 과정이 더 안정적입니다.
  • 상대가 빠르게 변화하고 다양성이 높을 경우, 학습이 불안정해질 수 있습니다.

이러한 맥락에서, 이 가이드는 Self-Play의 하이퍼파라미터 및 이를 조정하는 방법에 대한 직관적인 설명을 제공합니다.

만약 환경에 여러 에이전트가 팀으로 나뉘어 있다면, 각 Behavior에 대해 다음 설정을 적용하여 Self-Play 학습을 활용할 수 있습니다.

 

설정 항목 설명
save_steps (기본값 = 20,000)

스냅샷 간 저장되는 트레이너 스텝(trainer step) 수를 지정합니다. 예를 들어, save_steps=10000으로 설정하면 현재 정책(policy)의 스냅샷이 매 10,000 트레이너 스텝마다 저장됩니다.
참고로, 트레이너 스텝은 개별 에이전트 기준으로 계산됩니다.

save_steps 값을 크게 설정하면 더 넓은 범위의 숙련도와 다양한 플레이 스타일을 가진 상대가 포함될 가능성이 높아집니다. 이는 정책이 더 많은 학습을 거치게 하기 때문입니다.
  • 결과적으로 에이전트는 보다 다양한 상대를 상대로 학습하게 되며,
  • 더 다양한 상대를 이길 수 있는 정책을 학습하는 것은 난이도가 높지만,
  • 최종적으로는 보다 일반적이고 강인한 정책을 얻을 가능성이 커집니다.
이 값은 환경의 난이도에도 영향을 받으며, 적절한 값을 선택해야 합니다.

일반적인 범위: 10,000 ~ 100,000
team_change (기본값 = 5 × save_steps)

학습 팀을 교체하기까지의 트레이너 스텝(trainer step) 수를 정의합니다.
이 값은 특정 고스트 트레이너(ghost trainer)와 연결된 팀이 학습한 후, 다른 팀이 새로운 학습 팀이 되기까지의 트레이너 스텝 수를 나타냅니다.

비대칭적인 게임(asymmetric games)에서는 한쪽 팀이 같은 성능 향상을 이루는 데 더 적은 학습 스텝이 필요할 수도 있습니다. 이 설정을 통해 더 복잡한 에이전트 팀은 더 많은 학습 스텝을 진행하고, 단순한 팀은 적은 학습 스텝을 진행하도록 조정할 수 있습니다.
  • 값을 크게 설정하면 에이전트가 같은 상대와 더 오랫동안 훈련하게 됩니다.
  • 동일한 상대와 너무 오래 훈련하면 특정 전략에 과적합(overfitting)될 수 있으며, 이후 새로운 상대에게 취약해질 가능성이 있습니다.
  • 이 값은 에이전트의 정책 스냅샷이 얼마나 자주 저장되어 상대 팀의 학습에 사용될지를 결정합니다.
    따라서, 이전에 설명한 save_steps 값을 고려하여 적절하게 설정하는 것이 좋습니다.
일반적인 범위: 4 × save_steps ~ 10 × save_steps
swap_steps (기본값 = 10,000)

**고스트 스텝(ghost step)**을 기준으로 상대 정책을 새로운 스냅샷으로 교체하는 주기를 정의합니다.
여기서 고스트 스텝이란 고정된 정책을 따르는 에이전트가 수행하는 스텝으로, 학습을 하지 않는 스텝을 의미합니다.

이 설정이 필요한 이유는 **비대칭적인 게임(asymmetric games)**에서 팀 간 에이전트 수가 다를 수 있기 때문입니다.

예를 들어, 2대1 경기(예: Strikers vs Goalie 환경)에서는

  • 두 명의 공격수(2명의 에이전트)가 한 번의 환경 스텝마다 2개의 에이전트 스텝을 수행하는 반면,
  • 골키퍼(1명의 에이전트)는 같은 환경 스텝에서 단 하나의 에이전트 스텝만 수행합니다.
이러한 차이를 보정하기 위해 트레이너 스텝(trainer step)과 고스트 스텝을 별도로 관리하며, 팀 간 공정한 상대 정책 교체가 이루어질 수 있도록 설정해야 합니다.
사용자가 특정 팀의 정책을 **x번 교체(swap)**하고 싶다면, 팀 교체(team_change) 동안의 총 스텝을 기준으로 swap_steps 값을 다음 공식으로 계산할 수 있습니다:

(num_agents / num_opponent_agents) * (team_change / x)

  • num_agents: 학습하는 팀의 에이전트 수
  • num_opponent_agents: 상대 팀의 에이전트 수
  • team_change: 팀 교체(team_change)까지의 총 트레이너 스텝
  • x: 사용자가 원하는 한 팀이 상대 정책을 교체하는 횟수

일반적인 범위:
10,000 ~ 100,000
play_against_latest_model_ratio (기본값 = 0.5)

에이전트가 최신 상대 정책과 대전할 확률을 정의합니다.
확률이 1 - play_against_latest_model_ratio일 경우, 에이전트는 이전 학습 반복에서 저장된 상대 정책(snapshot)과 대전하게 됩니다.

  • 값이 클수록(최신 상대와 자주 대전)
    • 매 학습 반복마다 상대가 바뀌므로 학습 환경이 불안정해질 수 있음.
    • 하지만 더욱 어려운 상황을 자동으로 제공(auto-curricula)하여 강력한 최종 정책을 학습할 가능성이 높아짐.
  • 값이 작을수록(이전 스냅샷과 자주 대전)
    • 학습이 더 안정적이지만, 상대가 너무 예측 가능해질 수 있음.
일반적인 범위: 0.0 ~ 1.0
window (기본값 = 10)

과거 스냅샷을 저장하는 슬라이딩 윈도우의 크기를 정의합니다.
즉, 에이전트가 상대를 선택할 때 참조할 수 있는 과거 정책의 개수를 결정합니다.

예를 들어, 윈도우 크기가 5라면 최근 5개의 스냅샷을 저장하며,
새로운 스냅샷이 생성될 때 가장 오래된 스냅샷이 삭제됩니다.

  • 값이 클수록
    • 다양한 상대와 학습할 수 있어 일반화된 정책을 학습할 가능성이 높아짐.
    • 하지만 더 다양한 상대를 이겨야 하므로 학습 난이도가 올라가고 더 많은 학습 스텝이 필요할 수 있음.
  • 값이 작을수록
    • 학습 상대의 변화가 적어 안정적인 학습 환경을 제공하지만,
    • 다양한 상대에 대한 적응력이 떨어질 가능성이 있음.
일반적인 범위: 5 ~ 30

 

보상 신호(Reward Signals) 관련 참고 사항

우리는 트레이젝트리(trajectory)의 최종 보상이 해당 에피소드의 결과를 반영한다고 가정합니다.
즉, 최종 보상이 +1이면 승리, -1이면 패배, 0이면 무승부를 의미합니다.
최종 보상 값(+1, 0, -1)은 ELO 계산에 사용되므로, 반드시 이 형식을 따라야 합니다.

보상 신호는 다른 트레이너 문서에서 설명된 대로 사용해야 하지만,
적대적 학습(adversarial training)에서는 학습이 불안정하고 비정상적(non-stationary)일 가능성이 높으므로, 보상 함수를 보수적으로 설계할 것을 권장합니다.

특히, 가능한 한 단순한 보상 함수부터 시작하는 것이 좋습니다.

  • 예: "승리 시 +1, 패배 시 -1"의 기본 보상 구조
  • 이후 보상이 희소(sparse)하더라도 충분한 학습 반복(iteration)을 통해 보완하는 것이 더 효과적입니다.

Swap Steps 관련 참고 사항

예를 들어, 2대1 경기에서

  • 팀 교체 주기(team_change)가 200,000 스텝이고,
  • 팀별로 4번씩 상대 교체(swap x=4)를 진행하려는 경우

각 팀의 swap_steps는 다음과 같이 계산됩니다.

1명의 에이전트가 있는 팀의 swap_steps:

swap_steps=(1/2)×(200000/4)=25000

2명의 에이전트가 있는 팀의 swap_steps:

swap_steps=(2/1)×(200000/4)=100000

 

같은 팀 크기(예: 1v1)일 경우

  • 첫 번째 항이 1이 되므로, 단순히 총 스텝을 원하는 교체 횟수로 나눈 값이 swap_steps가 됨.
    • swap_steps = team_change / x

swap_steps 크기에 따른 학습 영향

  • 큰 값 → 같은 상대와 더 오래 훈련
    • 학습이 더 안정적이지만, 특정 상대에 과적합(overfitting)될 가능성 증가
    • 새로운 상대가 교체되었을 때, 초반에 적응하지 못하고 많이 질 위험이 있음
  • 작은 값 → 상대가 자주 교체됨
    • 학습이 더 다양해지고 일반화된 정책을 학습할 가능성이 높아짐
    • 하지만 너무 자주 바뀌면 학습이 불안정해질 수 있음

따라서, swap_steps 값은 학습 안정성과 상대 다양성 간의 균형을 맞추는 것이 중요합니다.

 

  • self_play  StrikersVsGoalie Example
더보기

behaviors:
  Goalie:
    trainer_type: poca
    hyperparameters:
      batch_size: 2048
      buffer_size: 20480
      learning_rate: 0.0003
      beta: 0.005
      epsilon: 0.2
      lambd: 0.95
      num_epoch: 3
      learning_rate_schedule: constant
    network_settings:
      normalize: false
      hidden_units: 512
      num_layers: 2
      vis_encode_type: simple
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    keep_checkpoints: 5
    max_steps: 30000000
    time_horizon: 1000
    summary_freq: 10000
    self_play:
      save_steps: 50000
      team_change: 200000
      swap_steps: 1000
      window: 10
      play_against_latest_model_ratio: 0.5
      initial_elo: 1200.0
  Striker:
    trainer_type: poca
    hyperparameters:
      batch_size: 2048
      buffer_size: 20480
      learning_rate: 0.0003
      beta: 0.005
      epsilon: 0.2
      lambd: 0.95
      num_epoch: 3
      learning_rate_schedule: constant
    network_settings:
      normalize: false
      hidden_units: 512
      num_layers: 2
      vis_encode_type: simple
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    keep_checkpoints: 5
    max_steps: 30000000
    time_horizon: 1000
    summary_freq: 10000
    self_play:
      save_steps: 50000
      team_change: 200000
      swap_steps: 4000
      window: 10
      play_against_latest_model_ratio: 0.5
      initial_elo: 1200.0

728x90