Pytorch Random seed 고정

Kim Min hyuk·2023년 4월 17일
0
post-thumbnail
post-custom-banner

Hyper-Parameter Tuning

Hyper-Parameter Tuning에서 개인적으로 가장 중요하게 생각하는 부분은, 변인통제이다.
각각의 Hyper-Parameter를 단계별로 Tuning하는 것도 방법이 될 수 있겠지만,
Randomness가 다분한 Deep learning model의 Hyper-parameter Tuning일 경우, 이 Randomness를 철저하게 통제하는것이 특히 중요하다고 생각한다.

필자는 Deep learning framework로 pytorch를 애용하는 편이다.
그리고 이러한 framework에서는 backbone code로 다양한 난수 발생기를 사용하기 때문에, 모든 Randomness를 통제하는 것이 쉽지 않다.

최근에 발견한 한 블로그 포스팅에서 Reproducible PyTorch를 위한 randomness 올바르게 제어하기! 라는 내용으로, backbone code를 포함한 난수 발생기에 seed를 설정하는 방법이 있어, 간략하게 저장해 두려고 한다.

Random seed 고정 Code

torch.manual_seed(random_seed)
torch.cuda.manual_seed(random_seed)
torch.cuda.manual_seed_all(random_seed) # if use multi-GPU
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
np.random.seed(random_seed)
random.seed(random_seed)

해당 코드의 효용성 검증을 위해, 간단한 예제 를 만들어 결과를 확인해보았다.
Model은 간단한 CNN으로, Convolutional layer 4개와 FNN 3개로 구성되었고,
실험 결과는 다음과 같이 동일한 결과를 보여준다.

seed 고정후, output동일한 seed와 같은 조건으로 학습을 끝낸 output

여기서 한번 더 생각해 보아야 할 것은, init seed에서의 특정성이 있기 때문에, 해당 변인 통제로 인한 실험의 결과(Tuning한 Hyper-parameter에 대한 영향)를 절대적인 정답으로 오해하면 안 된다.
즉, Tuning이 해당 문제에 끼치는 영향의 경향성을 파악하는 정도로 생각하는 것이 좋다.
그렇다면, seed를 고정하는것이 의미가 없다고 생각할 수 있지만,

  • 모든 Randomness + seed의 특징에서 발생하는 우연 = Tuning의 영향
  • 통제된 Randomness(0) + seed의 특징에서 발생하는 우연 = Tuning의 영향

정도로 생각해도, Tuning의 신뢰도를 높일 수 있고, 반복적인 실험을 통해 경향성을 어느정도 확정지을 수 있다.



참고로 사용된 포스팅과는 목적은 다르지만, 해당 포스팅에는 각 단계별로 자세한 설명이 있으니 참고하면 좋을것 같다.

post-custom-banner

0개의 댓글