RL 코드를 작성하면서 최종적으로 성능을 판단해야될 때가 있다.

당연히 똑같은 실험을 여러번 하면 안되므로 환경과 agent가 랜덤하게 세팅되도록 설정해주어야 한다.

거꾸로 디버깅을 위해서는 최대한 재현이 가능하도록 random하지 않게 (deterministic하게) 만들어주는 것이 좋다.

 

환경 같은 경우에는 openAI gym을 활용하고 있다면 reset(seed[Int])를 통해 seed를 만들어 줄 수 있다.

똑같은 실험과 성능을 재현하고 싶다면 train할 때나, eval할 때나 고정된 seed값을 줘야 할 것이다.

 

torch에도 random seed를 주어야 하는데, torch.random을 활용할 때, sample할 때, weight를 initialize할 때 등 다양한 곳에 random seed가 쓰인다.

이 때는 torch.manual_seed(Int)를 활용하면 된다.

 

참고로 random seed는 각각 PRNG(Pseudo Random Number Generator)의 input으로 들어가게 되어서 우리가 random한 동작을 실행시킬 때 다른 숫자가 나오도록 한다.

seed를 넣지 않으면 특정 entropy(random source)에서 가져온다고 한다.

env 같은 경우 예를 들면 timestamp나 /dev/urandom을 읽어들인다고 한다.

 

""" Env """
def reset(
    self,
    *,
    seed: Optional[int] = None,
    options: Optional[dict] = None,
) -> Tuple[ObsType, dict]:

""" pytorch """
import torch
torch.manual_seed(0)

""" python """
import randomm
random.seed(0)

""" numpy """
import numpy as np
np.random.seed(0)

 

 

+ Recent posts