-
Hyperparameter 튜닝은 어떻게 하는걸까?머신러닝 및 딥러닝 2021. 1. 17. 10:56
딥러닝에는 여러가지 하이퍼 파라미터가 존재한다.
예를들어 대표적으로 몇개만 써보면
1. 층 별로 hidden unit의 갯수
2. 학습률
3. Adam optimizer로 예시를 들면 베타값 2(0.9 와 0.999)개와 입실론값(10^-8)
4. layer의 수
5. 학습률을 쓰지 않는다면 learning rate decay
6. mini-batch 의 크기
7.모멘텀 값(0.9 가 가장 좋은 초기값으로 알려져 있다.)
빨간색이 가장 중요한 하이퍼파라미터이고 그다음 차례대로 중요한 것이 주황색 초록색이라고 생각하면 될 것 이다.(당연히 이렇게가 항상 중요한 순서다 라는 것은 아니다! 일반적으로 그렇다고 생각하면 될 것이다.)
과거의 머신러닝에서는 위의 그림과 같이 하이퍼파라미터가 2개만 있다고 가정했을때. Grid Search를 사용했었다. 위 그림이라면 25번의 비교를 통해서 가장 좋은 하이퍼파라미터를 탐색할 수 있을것이다. 하지만 하이퍼파라미터가 상당히 많은 딥러닝에서는 이런 방법이 권장되지 않는다.
하이퍼 파라미터가 무척 많은 딥러닝에서는 위와 같이 무작위하게 하이퍼 파라미터를 정하는 것이 권장된다. 왜냐하면 어떤 하이퍼 파라미터가 문제해결에 더 중요한지 미리 알 수 없기 때문이다.
또한 하이퍼파라미터의 중요도 순위도 영향을 끼친다. 예를 들어 Hyperparameter1 을 learning rate(학습률, lr), Hyperparameter2를 E(입실론, Adam 알고리즘에서 분모에 있는 값) 이라고 가정해보자. 이런경우 당연히 lr을 고르는 것이 E고르는 것보다 더 중요하다.
Grid Search일 경우 E보다 더 중요한 lr 값은 5번 밖에 비교 되지 않지만 random search 경우 Hyperparameter1의 값이 고루 퍼져있다고 했을때 25번 비교할 수 있다. 따라서 더 좋은 하이퍼 파라미터를 찾을 수 있게 된다.
또한 하이퍼파라미터를 탐색하는 방법중엔 Coarse to fine 과 같은 방법도 있다. 해당 방법은 우선 어떤 점에서 가장 결과값이 좋았다면 그 점 주변으로 가장 좋은 값이 있을 확률이 높기 때문에 그 점 주위만 다시 조밀하게 세분화 해서 값을 비교해 보는 방식을 취한다.
여기서 Random 이라는 것이 조금 모호할 수 있는데 예를 들어 아래 그림의 경우 은닉 유닛의 갯수를 50개에서 100개 사이 층의 갯수를 2개에서 4개 사이로 뽑는다고 했을 때 여기서는 정말 무작위하게 뽑아 비교를 해도 괜찮다. 여기서 가장 작은 범위는 1이므로(은닉층의 갯수도 1개씩 추가할 수 있고 층도 1개씩 추가 할 수 있고) 둘의 scale이 비슷하기 때문에 괜찮다.
만약 lr을 구할때 범위를 0.0001 에서 1까지를 생각하고 있다고 해보자. 그러면 0.1과 1에서 90%를 찾게 되고 0.1과. 0.0001에서는 10%만 찾게 될것이다. 상당히 불공평하지 않은가? 이럴 경우에는 log-scale로 찾아보는게 합리적이다. 그렇게 되면 -4부터 0까지 랜덤하게 찾기 때문에 공평하게 된다.(10^-4 와 10^0 이므로).
만약에 여기서 B의 값을 0.9부터 0.999에서 고른다고 할때 이 값에 공평하게 뽑기 위해서는 1에서 B값을 빼준다. 그렇게 되면 0.1 에서 0.001의 값이 나오게 되는데 이를 log-scale로 표현하게 된다면 [-3.-1] 이 된다. 여기서 B값이 1-10^r 이라고 했을 때 r을 랜덤으로 뽑게 되면 아까 보았던 경우의 수와 같이 공평하게 뽑을 수 있게 된다.
마지막으로 컴퓨팅 파워에 따라서 하나의 모델에 서로다른 하이퍼 파라미터를 적용해서 실험을 진행하는것을 캐비어 방법 그리고 하나의 모델에 하나의 하이퍼 파라미터를 적용하여 계속 섬세하게 모델의 파라미터를 교정하는것을 판다 방법이라고 한다.
'머신러닝 및 딥러닝' 카테고리의 다른 글
Pytorch에서는 왜 항상 optimizer.zero_grad()를 해줄까? (0) 2021.01.17 Batch Normalization은 왜 사용하는 것일까? (0) 2021.01.17 Dropout 이란 무엇인가 (2) 2021.01.16 CycleGAN 이란? (0) 2021.01.16 nn.Module에서 super (1) 2021.01.10