6.5 적절한 하이퍼파라미터 값 찾기

2024. 11. 24. 16:17스터디/24-2 스터디 _ 밑바닥부터 시작하는 딥러닝

 

 

하이퍼파라미터 값 설정

-> 모델의 성능 결정

-> 효율적인 하이퍼파라미터 값 탐색의 중요성

 

 

 

6.5.1 검증 데이터

 

1. 데이터셋

  • 훈련 데이터 : 학습
  • 시험 데이터 : 범용 성능 평가
  • 검증 데이터
    • 하이퍼파라미터의 성능 평가
    • 하이퍼파라미터 '전용'  확인 데이터

 

 

2. 하이퍼파라미터의 성능을 평가할 때 시험 데이터를 사용하면 안된다.

-> 이유 :
시험 데이터를 사용하여 하이퍼파라미터를 조정하고
또 시험 데이터를 사용하여 성능을 평가하게 되면,
하이퍼파라미터의 값이 시험 데이터에만 적합하도록 조정되는 '오버피팅'이 발생한다.

(-> 모델의 범용 성능은 떨어진다.)

 

 

 

3. 검증 데이터 얻기

: 훈련 데이터, 검증 데이터, 시험 데이터 로 미리 분리된 데이터셋도 있음.

: 그렇지 않다면 따로 분리해줘야함.

 

-훈련 데이터 중 20% 정도를 검증 데이터로 먼저 분리하기

(x_train, t_train), (x_test, t_test) = load_mnist()

# 훈련 데이터를 뒤섞는다.
x_train, t_train = shuffle_dataset(x_train, t_train)

# 20%를 검증 데이터로 분할
validation_rate = 0.20
validation_num = int(x_train.shape[0] * validation_rate)
x_val = x_train[:validation_num]  # x_train에서 앞부분을 검증 데이터로 할당
t_val = t_train[:validation_num]  # t_train에서 앞부분을 검증 데이터로 할당
x_train = x_train[validation_num:]  # 나머지 x_train을 훈련 데이터로 할당
t_train = t_train[validation_num:]  # 나머지 t_train을 훈련 데이터로 할당
  • 훈련 데이터를 분리하기 전에 입력 데이터와 정답 레이블 뒤섞음.                                  (데이터셋 안에서도 데이터가 치우쳐 있을 수 있기 때문임)
  • 훈련 데이터에서 처음의 (validation_num)개를 검증 데이터로 빼서 분리한 뒤,                나머지 데이터를 훈련 데이터로 분리해서 다시 할당함.

 

  • x_train, t_train : 훈련 데이터에 대한 특성, 훈련 데이터에 대한 레이블
  • x_val, t_val : 검증 데이터에 대한 특성, 검증 데이터에 대한 레이블
  • validation_num : 검증 데이터로 사용할 샘플의 개수

 

x_val = x_train[:validation_num]
t_val = t_train[:validation_num]

앞에서부터 (validation_num)개만큼의 데이터를 분리하여 검증 데이터로 할당함

 

x_train = x_train[validation_num:]
t_train = t_train[validation_num:]

(validation_num)번째 이후의 남은 데이터들을 가져와서 다시 훈련 데이터로 할당함

 

 

 

 

6.5.2 하이퍼파라미터 최적화

 

 

-하이퍼파라미터 최적화 과정

 

0단계) 하이퍼파라미터의 값 범위 설정하기

  • '대략적으로', '로그 스케일'(=10의 거듭제곱 단위) 로 지정

 

 

1단계) 범위 내에서, 하이퍼파라미터의 값을 무작위로 추출하기

  • 무작위로 하이퍼파라미터 값을 골라 샘플링
  • 하이퍼파라미터 최적화에서는 규칙적인 탐색보다 무작위 샘플링 탐색이 더 좋은 결과  (최적값 찾는 속도 빠름+더나은 모델의 성능)낼 수 있음
  • 이유
최종 정확도에 미치는 영향과 최적 값이 각 하이퍼파라미터마다 다르므로
모든 데이터를 동일한 간격으로 탐색(규칙적 탐색)하는 것보다 상대적으로,
중요한 파라미터에 대해 더 많은 탐색을 할 수 있음.

규칙적인 탐색은 일정한 간격으로 탐색하기 때문에
하이퍼파라미터에 따른 정확도 차이를 반영하기 어려움.

 

 

 

2단계) 학습 -> 정확도 평가

  1. 샘플링한 하이퍼파라미터 값을 사용하여 학습
  2. 검증 데이터로 정확도 평가

-학습할 때 주의할 점

하이퍼파라미터를 최적화할 때는 딥러닝 학습에는 오랜 시간이 걸리므로
1. 나쁠 듯한 값은 일찍 포기해야함
2. 학습 시, epoch은 작게 설정하여 1회 평가에 걸리는 시간을 단축해야함

 

 

 

3단계) 1단계와 2단계를 반복 -> 정확도의 결과를 반영하여 하이퍼파라미터의 범위 좁히기

 

 

 

4단계) 압축된(좁아진) 범위 내에서 값 하나를 고르기

: 최적의 하이퍼파라미터 값 찾았음!!!

 

 

 

-또 다른 하이퍼파라미터 최적화 방법 : 베이즈 최적화

 

 

 

 

6.5.3 하이퍼파라미터 최적화 구현하기

 

학습률과 가중치 감소의 세기를 조절하는 계수(가중치 감소 계수)를

탐색하는 문제를 풀어보쟈.

 

 

-하이퍼파라미터의 무작위 추출코드

 weight_decay = 10 ** np.random.uniform(-8, -4)
 lr = 10 ** np.random.uniform(-6, -2)

무작위로 값 추출 -> 학습

-> 여러 차례 다양한 하이퍼파라미터 값으로 학습 반복

-> 최적의 하이퍼파라미터 값 찾기

  • np.random.uniform(a, b) :                                                                                                    uniform distribution에 따라 a와 b 사이의 값을 무작위로 생성하는 함수.                           a, b 사이의 균등한 확률로 값을 샘플링함.
  • a : 생성될 값의 최솟값
  • b : 생성될 값의 최댓값

 

 

-결과 : 검증 데이터의 학습 추이를 정확도가 높은 순으로 나열

  • 학습률 범위 : 10^-6 ~ 10^-2
  • 가중치 감소 계수 범위 : 10^-8 ~ 10^-4

 

-Best-1 ~ Best-5 까지가 학습이 잘 진행됨

이때의

학습률 : 0.001~0.01

가중치 감소 계수 : 10^-8~10^-6

 

 

-잘될 것 같은 값의 범위 관찰 -> 범위 좁혀나가기

-> 반복

-> 하이퍼파라미터 값(최적이라고 생각되는 값) 하나 선택하기