4기(20200711)/이론팀

하이퍼파라미터 튜닝

KAU-Deeperent 2020. 9. 11. 02:42

[작성자 및 발표자 : 김모경]

Ⅰ. 튜닝 프로세스

신경망을 학습시킬 때 여러 가지 하이퍼파라미터가 관여한다. 여기서 하이퍼파라미터는 파라미터와 명확하게 다른 개념이다. 파라미터는 모델 내부에서 결정되는 변수를 뜻하고 하이퍼파라미터는 모델링을 할 때 사용자가 직접 세팅해주는 값을 뜻한다. 딥러닝에는 다양한 하이퍼파라미터가 존재한다. 상황에 따라 다를 수도 있지만 보통 우선 조정하는 순서로 나열해보면 다음과 같다.

- 학습률

- 모멘텀(Momentum)

- 학습률 (α)

- 모멘텀(Momentum) 알고리즘의 β

- 은닉 유닛의 수

- 미니배치 크기

- 은닉층의 갯수

- 학습률 감쇠(learning rate decay) 정도

- 아담(Adam) 알고리즘의 β1, β2, ϵ

이렇게 다양한 하이퍼파라미터가 존재하는데 심층 신경망을 학습 시킬 때 다뤄야할 하이퍼파라미터가 많다는 것이 가장 어려운 점이 된다.

 

만약 하이퍼파라미터를 튜닝한다면 어떤 값을 탐색할 것인지 어떻게 정할지에 대해 설명해보겠다. 머신러닝이 만들어진지 얼마 되지 않았을 때는 아래의 그림과 같이 격자점을 탐색하는 것이 일반적이었다.

두 개의 하이퍼파라미터, Hyperparameter1, Hyperparameter2가 있다고 할 때 체계적으로 여기에 있는 값들을 탐색하여 최고의 하이퍼파라미터를 정한다. 이는 하이퍼파라미터의 수가 적을 때 사용하는 방식이다.

딥러닝에서는 위 그림과 같이 무작위로 점들을 선택하는 방식을 더 추천한다. 동일하게 25개의 점이 있다고 가정하고 그 점들에 대해서 하이퍼파라미터를 정하는 것이다. 이렇게 하는 이유는 어떤 하이퍼파라미터가 문제 해결에 더 중요한지 미리 알 수 없기 때문이다. 위에서 설명한 것과 같이 하이퍼파라미터에는 중요도 순위가 있다. 설명을 위해 Hyperparameter1의 학습속도가 α이고 Hyperparameter2의 학습속도는 ϵ라고 해보겠다. 이와 같은 상황에서는 학습속도가 α인 Hyperparameter1를 고르는 것이 학습속도가 ϵ인 Hyperparameter2보다 더 중요하다.

격자점을 이용한 방식에서는 5개의 α값을 확인하게 되는데, 이때 ϵ값이 달라도 결과는 5개의 α값에 대해서만 학습시킨 것과 다른게 없다.

반대로 무작위로 모델을 고르면 25개의 서로 다른 학습속도 α 값을 이용하여 학습시키게 되고 더 좋은 하이퍼파라미터를 잘 찾게 된다.

여기서는 두 개의 하이퍼파라미터를 사용했지만 실제로는 더 많다. 예를 들어 3개의 하이퍼파라미터를 다룬다고 하면 위 방식들처럼 정사각형을 탐색하는 것이 아니라 정육면체를 탐색한다. 어플리케이션에서는 어떤 하이퍼파라미터가 가장 중요한지 미리 알기 어렵다. 격자점보다 무작위로 모델을 정하는 것이 가장 중요한 하이퍼파라미터의 다양한 값을 탐색할 수 있다.

 

다른 일반적 방법 중 하나는 정밀화 접근이 있다. 우선 전체 하이퍼파라미터 공간에서 탐색하여 좋은 점을 찾은 후, 그 근방에서 더 정밀하게 탐색하는 과정이다. 위 그림을 보자면 동그라미 표시된 점이 최고라는 것을 찾으면 아마 그 주변에 있는 점들도 좋은 성능을 보일 것이다. 그러면 정밀화 접근에서는 이렇게 더 작은 영역(사각형 그려진 부분)으로 확대해서 더 조밀하게 점들을 선택한다. 무작위인 것은 그대로이지만 최고의 하이퍼파라미터들이 이 영역에 있으리라는 믿음 하에 파란색 사각형 안에 초점을 두고 탐색한다. 즉, 전체 사각형에서 탐색한 뒤에 더 작은 사각형으로 범위를 좁혀나가는 것이다. 그럼 여기에서 또 더 조밀하게 시험해볼 수 있다. 이런 정밀화 접근도 자주 쓰이는 방식이다. 그리고 이렇게 하이퍼파라미터의 여러 값들을 시험해보며 학습의 목표나 개발 목표 등에 있어서 최적의 파라미터를 고른다. 이렇게 알아본 격자점을 이용한 방식, 무작위로 모델을 고르는 방식, 정밀화 접근을 이용한 방식 외에도 더 많은 종류의 탐색도 있다.

 

Ⅱ. 적절한 척도 선택하기

위 내용에서 무작위로 하이퍼파라미터를 찾는 방법이 보다 더 효율적인 탐색이라는 것을 알 수 있었다. 무작위로 뽑는 것이 합리적인 하이퍼파라미터들이 있다. 예로 은닉 유닛의 수, 은닉층의 수를 들 수 있다. 하지만 학습률이 다를 경우는 이는 적용되지 않는다. 무작위라는 것이 가능한 값들 중 공평하게 뽑는 것이라고는 할 수 없다. 대신 적절한 척도를 정하는 것이 더욱 중요하다.

 

어떤 레이어 l에 대해서 은닉 유닛의 수 n^l을 정한다고 하자. 그리고 값의 범위는 50부터 100이라고 가정한다.그리고 이런 경우 50부터 100까지의 수직선에서 무작위하게 값들을 고른다고 한다. 이는 하이퍼파라미터를 고르는 꽤 합리적인 방법이다.

또 다른 방법으로는 신경망에서 레이어의 숫자 L을 정한다고 했을 때 층의 숫자가 2에서 4사이라고 하자. 2에서 4까지의 숫자를 선택할 때 무작위하게 뽑는 것은 물론이거니와 격좌점을 사용해도 문제가 없다. 이 방법 또한 하이퍼파라미터를 고르는 합리적인 방법이다. 하지만 모든 하이퍼파라미터가 다 이렇지는 않다.

 

다른 사례로 학습률 알파를 탐색하는데 범위로 0.0001부터 1까지 있다고 생각하자. 0.0001에서 1까지의 수직선 상에서 균일하게 무작위로 값을 고른다. 여기서 약 90%의 샘플이 0.1과 1사이에 있을 것이다. 즉 90%의 자원을 0.1과 1사이를 탐색하는데 쓰는 것이다. 이 방식은 위 두 방법과는 달리 하이퍼파라미터를 고르는데 비합리적인 방식이다. 대신 선형척도 대신 로그 척도에서 하이퍼파라미터를 찾는 것이 더 합리적이다. 수직선 위에 0.0001부터 0.001, 0.01, 0.1, 1까지 값들이 있다고 하자. 이런 로그 척도에서 균일하게 무작위로 값을 뽑는다. 그러면 0.0001과 0.01 사이 0.001과 0.01사이를 탐색할 때 더 많은 자원을 쓸 수 있는 것이다.

 

파이썬에서 구현을 하자면,

 r = -4*np.random.rand()  (여기서 r은 –4와 0사이의 무작위 값이다.)

그럼 무작위로 선택된 α 값은 10^r 이 된다.

α = 10^r (여기서 알파 값은 10^-4와 10^0(=1) 사이이다.)

 

더 일반적인 경우를 살펴보자. 10^a에서 10^b까지를 로그 척도로 탐색한다면 a는 10을 밑으로 하는 log를 취0.0001에 적용하면 –4라는 결과가 나오고, 마찬가지로 b도 0이 밑인 log를 1에 취하면 0이라는 것을 알 수 있다. 그리고 r은 a와 b사이에서 균일하게 무작위로 뽑히고 (이 경우 r은 –4와 0사이), 무작위의 하이퍼파라미터 α는 10^r이 된다. r은 a와 b사이에서 균일하게 무작위로 뽑으면 하이퍼파라미터가 10^r이 되는 것이다.

 

또 다른 예시는 지수 가중 평균을 계산할 때 사용되는 하이퍼파라미터 β에 관한 것이다. β를 0.9와 0.999 사이에서 찾는다고 하고 이 범위를 탐색하는 것이다. 참고로 0.9의 경우 지수가중평균이 최근 10일의 평균기온처럼 마지막 10개 값의 평균과 비슷하고, 0.999의 경우, 마지막 1000개 값의 평균과 비슷하다. 만약 0.9와 0.999사이를 탐색한다면 이 사이를 균일하게 무작위 탐색하는 것은 합리적이지 않다. 더 나은 방법은 1 - β 에 대해서 값을 탐색하는 것이다.

=>그러면 1 - β = 0.1부터 0.111이 된다. 따라서 β를 0.1에서 0.01을 거쳐 0.001 사이에서 탐색하는 것이다.

그렇다면 10^(-1) 에서부터 10^(-3)이 된다. 앞 내용에서는 작은 값이 왼쪽, 큰 값이 오른쪽에 있었지만 여기서는 반대이다.

즉, 여기서 해야 할 일은 –3과 –1사이에서 균일하게 무작위로 값을 뽑는 것이다. 1 - β를 10^r로 생각하면 되니 β가 1-10^r이 된다.

 

여기까지 이렇게 적절한 척도 위에서 무작위로 하이퍼파라미터 샘플을 추출했다. 이 방법을 이용하면 0.9부터 0.99를 탐색했을 때와 0.99부터 0.999를 탐색할 때 동일한 양의 자원을 사용할 수 있다. 그에 대한 원인을 이해하기 위해서는 수학적 증명이 필요하다. 왜 선형척도에서 샘플을 뽑는 것은 안좋을까?

만약 β가 1에 가깝다면 β가 아주 조금만 바뀌어도 결과가 아주 많이 바뀌게 된다. 예를 들어 β가 0.9에서 0.9005로 바뀌었다면 결과에 거의 영향을 주지 않는다. 하지만 β가 0.999에서 0.995로 바뀌었다면 알고리즘의 결과에 큰 영향을 준다. 이 경우는 대략 10개의 값을 평균을 내는 것이지만 여기에서는 마지막 1000개의 값을 지수가중평균을 내는 것에서 마지막 2000개 값의 평균을 내는 것으로 바뀌었기 때문이다. 왜냐하면 1/(1-β) 라는 식이 베타가 1에 가까워질수록 작은 변화에도 민감하게 반응하기 때문이다. 따라서 β가 1보다 가까운 곳에서 더 조밀하게 샘플을 뽑는다. 반대로 1-β 는 0이 가까운 곳이 된다. 따라서 가능한 결과 공간을 탐색할 때 더 효율적으로 샘플을 추출할 수 있는 것이다.

 

만약 하이퍼파라미터를 고를 때 적절한 척도를 사용하지 않더라도 걱정할 필요 없다. 다른 척도가 우선하는 상황에서 균일한 척도에서 샘플링을 하더라도 정밀화 접근을 사용하면 괜찮은 결과를 얻을 수 있기 때문이다. 그래서 반복할수록 더 유의미한 하이퍼파라미터 범위를 탐색하게 된다.

 

 

Ⅲ. 하이퍼파라미터 튜닝 방법

 

 

하이퍼파라미터의 튜닝 방법은 2가지가 있다.

 

1) 모델 돌보기 방법 (Baby sitting one model)

컴퓨터의 자원이 많이 필요하지 않거나, 적은 숫자의 모델을 한번에 학습시킬 수 있을 때 사용한다. 하나의 모델로 매일 성능을 지켜보면서, 학습 속도를 조금씩 바꾸는 방식이다.

위 그림과 같이 학습곡선에서 하루가 다르게 점진적으로 감소하는 것을 볼 수 있다. 이 방법은 매일 모델을 돌보면서 학습을 시키기 때문에 비유를 하자면 모델돌보기는 판다와 같다고 본다. 판다와 같은 포유류는 한 마리씩만 자식을 낳고 그 자식 판다가 살아남을 수 있도록 정말 많은 노력을 기울이기 때문이다. 말그대로 모델이나 아기 판다를 ‘돌보기’하는 것이다.

 

2) 동시에 여러 모델 훈련하는 방법 (Training many models in parallel)

컴퓨터의 자원이 충분히 많아서 여러 모델을 한번에 학습 시킬 수 있을 때 사용한다. 이 방법을 또한 비유에 빗대어본다면 캐비어 전략이라고 말할 수 있다. 한철에 1억개의 알을 품는 물고기가 있는데 물고기가 번식하는 과정은 하나에 많은 집중을 쏟기보다 하나 또는 그 이상이 더 잘살아 남기를 바라며 그저 지켜보는 물고기와 비슷하기 때문이다.

 

이 두 접근 중 뭘 선택할지는 컴퓨터 자원의 양과 함수 관계에 있다. 만약 여러 모델을 동시에 학습시키기에 충분한 컴퓨터를 갖고 있다면 물론 캐비어 접근을 사용해서 서로 다른 하이퍼파라미터를 시험해볼 수는 있다. 하지만 온라인 광고나 컴퓨터 비전 어플리케이션 등 많은 데이터가 쓰이는 곳에서는 학습시키고자 하는 모델이 너무 커서 한번에 여러 모델을 학습시키기가 어렵다. 물론 어플리케이션에 따라 큰 차이가 있지만 팬더 접근을 주로 쓰인다. 하나의 모델에 집중해 매개변수를 조금씩 조절하며 그 모델이 잘 작동하게끔 만드는 것이다. 하지만 팬더 접근에서도 한 모델이 잘 작동하는지 확인한 뒤에 2주, 3주 후에 다른 모델을 초기화해서 다시 돌보기를 할 수 있다.