사이토고키의 <밑바닥부터 시작하는 딥러닝>을 공부하고 정리해보았습니다.
검증 데이터로 하이퍼파라미터의 성능을 평가한다는 것을 배웠습니다.
이번에는 하이퍼파라미터 최적화를 알아보겠습니다.
하이퍼파라미터 최적화
하이퍼파라미터를 최적화할 때의 핵심은 하이퍼파라미터의 '최적 값'이 존재하는 범위를 조금씩 줄여간다는 것입니다.
범위를 조금씩 줄이려면 우선 대략적인 범위를 설정하고 그 범위에서 무작위로 하이퍼파라미터 값을 골라낸 후, 그 값으로 정확도를 평가합니다.
정확도를 잘 살피면서 이 작업을 여러 번 반복하며 하이퍼파라미터의 '최적 값'의 범위를 좁혀나가는 것입니다.
신경망의 하이퍼파라미터 최적화에서는 그리드 서치 같은 규칙적인 탐색보다는 무작위로 샘플링해 탐색하는 편이 좋은 결과를 낸다고 알려져 있습니다.
이는 최종 정확도에 미치는 영향력이 하이퍼파라미터마다 다르기 때문입니다.
하이퍼파라미터의 범위는 '대략적으로' 지정하는 것이 효과적입니다.
실제로도 0.001에서 1,000 사이와 같이 10의 거듭제곱 단위로 범위를 지정합니다.
이를 로그 스케일로 지정한다고 합니다.
하이퍼파라미터를 최적화할 떄는 딥러닝 학습에는 오랜 시간이 걸립니다.
따라서 나쁠 듯한 값은 일찍 포기하는 게 좋습니다.
그래서 학습을 위한 에폭을 작게 하여, 1회 평가에 걸리는 시간을 단축하는 것이 효과적 입니다.
하이퍼파라미터 최적화 단계
0단계
하이퍼파라미터 값의 범위를 설정합니다.
1단계
설정된 범위에서 하이퍼파라미터의 값을 무작위로 추출합니다.
2단계
1단계에서 샘플링한 하이퍼파라미터 값을 사용하여 학습하고, 검증 데이터로 정확도를 평가합니다. (단, 에폭은 작게 설정합니다.)
3단계
1단계와 2단계를 특정 횟수(100회 등) 반복하며, 그 정확도의 결과를 보고 하이퍼파라미터의 범위를 좁힙니다.
이를 반복하여 하이퍼파라미터의 범위를 좁혀가고, 어느 정도 좁아지면 그 압축한 범위에서 값을 하나 골라냅니다.
이것이 하이퍼파라미터를 최적화하는 하나의 방법입니다.
여기에서 설명한 하이퍼파라미터 최적화 방법은 실용적인 방법입니다.
하지만 과학이라기보다는 다분히 수행자의 '지혜'와 '직관'에 의존한다고 느낌이 듭니다.
더 세련된 기법을 원한다면 베이즈 최적화(Bayesian optimization)을 소개할 수 있습니다.
베이즈 최적화는 베이즈 정리를 중심으로 한 수학 이론을 구사하여 더 엄밀하고 효율적으로 최적화를 수행합니다.
하이퍼파라미터 최적화 구현하기
MNIST 데이터셋을 사용하여 하이퍼파라미터를 최적화해보겠습니다.
여기에서는 학습률과 가중치 감소의 세기를 조절하는 계수를 탐색하는 문제를 풀어보겠습니다.
하이퍼파라미터의 검증은 그 값을 0.001~1,000 사이 같은 로그 스케일 범위에서 무작위로 추출해 수행합니다.
[하이퍼파라미터의 무작위 추출 코드]
weight_decay = 10 ** np.random.uniform(-8, -4)
lr = 10 ** np.random.uniform(-6, -2)
이렇게 무작위로 추출한 값을 사용하여 학습을 수행합니다.
그 후에는 여러 차례 다양한 하이퍼파라미터 값으로 학습을 반복하며 신경망에 좋을 것 같은 값이 어디에 존재하는지 관찰합니다.
실험 결과는 다음과 같습니다.
위 그림은 검증 데이터의 학습 추이를 정확도가 높은 순서로 나열했습니다.
이를 보면 'Beta-5' 정도까지는 학습이 순조롭게 진행되고 있습니다.
이를 바탕으로 'Beta-5'까지의 하이퍼파라미터의 값(학습률과 가중치 감소 계수)을 살펴보겠습니다.
이 결과를 보면 학습이 잘 진행될 떄의 학습률은 0.001 ~ 0.01, 가중치 감소 계수는 $10^{-8}$ ~ $10^{-6}$정도라는 것을 알 수 있습니다.
이처럼 잘될 것 같은 값의 범위를 관찰하고 범위를 좁혀갑니다. 그런 다음 그 축소된 범위로 똑같은 작업을 반복하는 겁니다. 이렇게 적절한 값이 위치한 범위를 좁혀가다가 특정 단계에서 최종 하이퍼파라미터 값을 하나 선택합니다.
'수학 > 딥러닝 이론' 카테고리의 다른 글
[딥러닝] 합성곱 신경망(CNN) - 완전연결 계층(Affine 계층)의 문제점과 CNN의 특징 (0) | 2020.10.04 |
---|---|
[딥러닝] 합성곱 신경망(CNN) - CNN의 전체 구조 (0) | 2020.10.04 |
[딥러닝] 검증 데이터 - 하이퍼파라미터의 성능을 평가 (0) | 2020.10.03 |
[딥러닝] 3. 오버피팅 억제법 - 드롭아웃 (0) | 2020.10.03 |
[딥러닝] 2. 오버피팅 억제법 - 가중치 감소 (0) | 2020.10.03 |