본문 바로가기
딥러닝

딥러닝에서 왜 시드(seed) 고정할까?

by 데이널 2024. 2. 4.

딥러닝에서 열심히 학습을 시키다 보면 "시드 고정하라"라는 말을 들을 때가 있습니다. 가중치의 초기값을 어떻게 주는지에 따라 학습의 성능이 달라진다는 글을 작성했는데요. 그 말은 초기값이 다르면 학습 결과도 다르다는 이야기가 됩니다. 벌써 힌트가 다 나왔는데요. 딥러닝에서 시드를 고정하는 이유는 무엇일까요?

 

 

시드 고정이란?

시드(seed) 고정은 가중치 초기값 설정의 랜덤성을 고정(하나의 값으로 설정)한다는 개념입니다. 이는 모델의 재현성, 안정성 및 신뢰성을 보장하는 데 중요한 역할을 합니다. Xavier, He와 같은 알고리즘은 난수 생성으로 초기값을 결정합니다. 이런 가중치의 초기값을 고정하는 기법을 말합니다. 

 

시드를 고정하는 이유는?

1. 재현성

딥러닝 모델 훈련 과정에서 시드(seed) 고정을 하지 않으면 무작위성 때문에 다시 결과를 재현하기가 어렵습니다. 시드를 고정하면 모델이 훈련될 때마다 동일한 초기값이 사용되어 결과 복제 및 비교가 쉬워집니다.

2. 모델 안정성

무작위성은 훈련 중에 모델 성능에 영향을 줄 수 있습니다. 시드 고정을 통해 학습 과정을 더 효과적으로 제어할 수 있어서 모델을 미세 조정하거나 다양한 아키텍처를 비교할 때 특히 중요한 역할을 합니다.

3. 디버깅 및 문제 해결

예상치 못한 결과나 오류가 발생할 경우에도 시드를 고정합니다. 이렇게 하면 디버깅 프로세스가 단순화됩니다. 분석가와 개발자는 문제 식별 및 해결에만 집중함으로써 문제를 보다 효과적으로 찾아낼 수 있습니다.

4. 하이파파라미터 튜닝

하이퍼파라미터 튜닝할 때 시드를 고정하는 것이 원칙입니다. 그래야 하이퍼파라미터의 다양한 구성 세트를 공정하게 비교할 수 있습니다. 이 방법을 사용하면 모델 성능에서 발생한 차이가 하이퍼파라미터로 인해 발생한 것들만 볼 수 있습니다. 하이퍼파라미터 최적값이 할 때 마다 너무 다른 값이 나온 경우는 시드를 고정하지 않은 것인지 의심해 봐야 합니다. 


시드(seed)를 고정하는 방법

 

TensorFlow 및 PyTorch와 같은 대부분의 딥러닝 프레임워크는 난수 생성기에 대한 시드를 고정하는 옵션을 제공합니다. 모델 훈련에 앞서 TensorFlow의 tf.random.set_seed() 또는 PyTorch의 torch.manual_seed()와 같은 함수를 사용하여 시드를 명시적으로 설정합니다.

 

1.텐서플로우 시드 고정

1
2
3
4
5
6
7
8
import tensorflow as tf
 
# Fixing the seed for TensorFlow
tf.random.set_seed(42)
 
# TensorFlow operations will now produce reproducible results
random_tensor = tf.random.normal((33))
print(random_tensor.numpy())
cs

 

2.파이토치 시드 고정

1
2
3
4
5
6
7
8
import torch
 
# Fixing the seed for PyTorch
torch.manual_seed(42)
 
# PyTorch operations will now produce reproducible results
random_tensor = torch.rand((33))
print(random_tensor)
cs

 

두 코드를 확인해 보면 seed값을 일반적으로 42로 고정하는 것을 볼 수 있습니다.  '은하수를 여행하는 히치하이커를 위한 안내서'라는 책에서 "삶과 우주, 그리고 모든 것에 대한 답은 42이다"라는 구절에서 따왔다고 하네요. 그냥 통상적으로 사용한다고 생각할 수 있겠네요. 

 

은하수를 여행하는 히치하이커를 위한 안내서
은하수를 여행하는 히치하이커를 위한 안내서(출처: 알라딘)


만약 서버가 다른 경우의 재현성을 위해서는 딥러닝 프레임워크뿐만 아니라 전체 실행에 기여하는 다른 라이브러리 및 구성 요소에 대한 시드도 고정해야 합니다. 여기에는 NumPy 작업, GPU 작업 및 기타 관련 구성 요소에 대한 시드 설정이 포함됩니다.

 

마무리 

종종 시드(seed)를 고정하지 않아 제대로된 결과를 얻지 못하는 경우가 있습니다. 또 고정한다고 했는데 모든 시드를 고정하지 않아 차이가 나기도 합니다. 주위사항은 알고리즘 내에서 모든 랜덤성을 가지고 있는 코드를 찾아 고정해줘야 합니다. 모두 완료해야 동일한 작업 결과를 얻을 수 있습니다.