본문 바로가기

딥러닝/강화학습(RL)

[Analyse RLLib] 5. Explore and Curriculum Learning

Explore

모든 PolicyExploration Object를 가지고 있습니다. Policy가 Model에 의해서 정해지지 않고 탐색을 하는 방식으로 장기적으로 return값을 높이기 위해서 강화학습에 필수적입니다.

아래와 같은 방식으로 Explore를 설정할 수 있습니다.

Explore 방식과 hyperparameter setting은 Ray.io에서 확인할 수 있습니다.

# DQN 
config = {
    "explore": True,
    'expolration_config : {
        "type": "EpsilonGreedy",
        "initial_epsilon": 1.0,
        "final_epsilon": 0.02,
        "epsilon_timesteps": 10000
    }
}

# StochasticSampling
config = {
    "explore": True,
    "exploration_config": {
        "type": "StochasticSampling",
        "random_timesteps": 0,  
    }
}

Curriculum Learning

Cirriculum Learning은 학습을 진행하면서, 난이도가 유동적으로 변하는 경우입니다. 난이도가 너무 높은 Task에 대해서는 모델이 학습하기 어려우며, 쉬운 문제부터 차근차근 배워서 향후 어려운 Task에 대해서도 높은 성능 목표로 합니다.

Trainer()는 그대로 유지한 상태에서 특정 조건을 만족할 때마다 environment 자체만 바꿔주면 됩니다.

1. Using modification of train

import ray
from ray import tune
from ray.rllib.agents.ppo import PPOTrainer

# === define curriculum === 
def train(config, reporter):
    trainer = PPOTrainer(config=config, env=YourEnv)
    while True:
        result = trainer.train()
        reporter(**result)
        if result["episode_reward_mean"] > 200:
            phase = 2
        elif result["episode_reward_mean"] > 100:
            phase = 1
        else:
            phase = 0
        trainer.workers.foreach_worker(
            lambda ev: ev.foreach_env(
                lambda env: env.set_phase(phase)))

num_gpus = 0
num_workers = 2

# === tune ===
ray.init()
tune.run(
    train,
    config={
        "num_gpus": num_gpus,
        "num_workers": num_workers,
    },
    resources_per_trial=tune.PlacementGroupFactory(
        [{"CPU": 1}, {"GPU": num_gpus}] + [{"CPU": 1}] * num_workers
    ),
)

2. Using Callback

Callback에서는 Train이 끝날 때마다 작동하는 on_train_result() 함수가 있습니다. 이 함수를 변경해서 좀더 쉽게 Curriculum Learning을 할 수 있습니다.

import ray
from ray import tune

def on_train_result(info):
    result = info["result"]
    if result["episode_reward_mean"] > 200:
        phase = 2
    elif result["episode_reward_mean"] > 100:
        phase = 1
    else:
        phase = 0
    trainer = info["trainer"]
    trainer.workers.foreach_worker(
        lambda ev: ev.foreach_env(
            lambda env: env.set_phase(phase)))

ray.init()
tune.run(
    "PPO",
    config={
        "env": YourEnv,
        "callbacks": {
            "on_train_result": on_train_result,
        },
    },
)

References

[1] https://docs.ray.io/en/master/rllib-training.html