본문 바로가기

Data Science/Deep Learning

[밑바닥부터 시작하는 딥러닝 1] Ch 6. 학습 관련 기술들

이번 포스팅에서는 가중치 매개변수의 최적값을 탐색하는 최적화 방법, 가중치 매개변수 초깃값, 하이퍼파라미터 설정 방법 등 신경망 학습에서 중요한 기술들에 대해서 설명하고, 과적합의 대응책인 가중치 감소, Dropout, 배치 정규화 등의 정규화 방법에 대해서도 설명하도록 하겠다.

 

  • 확률적 경사하강법(SGD)
    • 기울어진 방향으로 일정 거리만큼 가겠다는 단순한 방법
    • 단점은 기울기가 달라지는 함수에서는 탐색 경로가 비효율적
    • 따라서 SGD는 단순하고 구현도 쉽지만, 문제에 따라서는 비효율적일 때가 있음
    • 이러한 SGD의 단점을 개선해주는 방법으로는 "Momentum, AdaGrad, Adam"이 있음

확률적 경사하강법(SGD)의 작동 원리 수식

 

  • Momentum
    • 기본적으로 SGD와 유사하지만, "속도(v)"라는 개념이 추가됨
    • 즉, 물체가 아무런 힘을 받지 않을 때에도 서서히 하강시키는 역할을 수행함

Momentum 작동 원리 수식

 

  • AdaGrad
    • 신경망 학습에서 중요한 학습률(learning rate)을 서서히 낮추는 방법
    • 개별 매개변수에 적응적으로(Adaptive) 학습률을 조정하면서 학습을 진행함
    • 즉, 학습률 감소가 매개변수의 원소마다 다르게 적용
    • 그러나 AdaGrad는 과거의 기울기를 제곱해서 계속 더하기 때문에, 학습을 진행할수록 갱신 강도가 약해져서 무한히 계속 학습할 경우에는 어느 순간 갱신량이 "0"이 되어서 갱신이 이루어지지 않는 단점이 있음
    • 이러한 AdaGrad의 단점을 개선한 방법으로는 "RMSProp"이 있으며, 과거의 모든 기울기를 균일하게 더해가는 것이 아니라, 먼 과거의 기울기는 서서히 잊고 새로운 기울기 정보를 크게 반영(지수이동평균)

AdaGrad 작동 원리 수식

 

  • Adam
    • Momentum과 AdaGrad 방법을 결합한 방법
    • Adam 방법은 하이퍼파라미터의 "편향 보정"이 진행됨
    • Adam은 하이퍼파라미터를 3개 설정함
      1. 학습률(learning rate) = alpha
      2. 일차 모멘텀용 계수 beta1 (default 값은 0.9)
      3. 이차 모멘텀용 계수 beta2 (default 값은 0.999)

아쉽게도 앞서 언급한 매개변수의 갱신 방법들 중 가장 뛰어난 기법이라는 것은 존재하지 않는다.

 

각자의 장단점이 존재하고 풀어야 할 문제가 무엇이느냐에 따라 결과가 달라지기 때문이다.

 

다만, 일반적으로 SGD보다 다른 세 기법(Momentum, AdaGrad, Adam)이 빠르게 학습하고, 때로는 최종 정확도도 높게 나타난다는 점만 참고하도록 하자.

 

 

 

다음은 "가중치의 초깃값"에 대해 설명하도록 하겠다.

 

신경망 학습에서 가중치의 초깃값을 무엇으로 설정하느냐가 신경망 학습의 성패를 가를 수 있기 때문에, 그만큼 가중치의 초깃값 설정이 매우 중요하다.

 

그렇다고 가중치의 초깃값을 "0"으로 설정하면 안 된다!!

(정확하게는 가중치를 균일한 값으로 설정하면 안 된다!!)

 

그 이유는 오차역전파법에서 모든 가중치의 값이 똑같이 갱신되기 때문이다.

 

만약 각 층의 활성화 값이 아래 두 개의 그림과 같이 치우친 분포를 보인다면, 기울기 소실이나 표현력 제한 문제에 빠져서 학습이 잘 이뤄지지 않는다.

 

가중치를 표준편차가 1인 정규분포로 초기화할 때의 각 층의 활성화 값 분포
가중치를 표준편차가 0.01인 정규분포로 초기화할 때의 각 층의 활성화 값 분포

 

때문에 각 층의 활성화 값은 적당히 고르게 분포되어야 하는데, 이를 위해 대표적으로 많이 사용되는 초깃값으로는 Xavier 초깃값He 초깃값이 있다.

 

  • Xavier 초깃값
    • 앞 계층의 노드가 n개일 때, 표준편차가 1/root(n)인 정규분포를 갖도록 가중치의 초깃값을 설정하는 방식임
    • Xavier 초깃값은 특히 tanh 활성화 함수와 어울릴 때 효과가 좋음
    • 즉, Xavier 초깃값은 원점에서 대칭인 활성화 함수와 어울릴 때 바람직하다고 알려져 있음
  • He 초깃값
    • 앞 계층의 노드가 n개일 때, 표준편차가 2/root(n)인 정규분포를 갖도록 가중치의 초깃값을 설정하는 방식임
    • He 초깃값은 ReLU 활성화 함수와 어울릴 때 효과가 좋음

 

 

 

위와 같이 가중치의 초깃값을 적절히 설정해서 각 층의 활성화 값 분포가 적당히 퍼지게 하면 신경망의 학습이 원활하게 수행됨을 확인하였다.

 

그렇다면 각 층의 활성화 값 분포가 적당히 퍼지도록 "강제"해보면 어떨까? 이러한 아이디어에서 출발한 방법이 바로 "배치 정규화(Batch Normalization)"이다.

 

  • 배치 정규화(Batch Normalization)
    • 신경망의 순전파 때 적용되며, 각 측에서의 활성화 값이 적당히 분포되도록 조정하는 방법임
    • 즉, 학습 시 미니배치를 단위로 정규화를 수행
    • 구체적으로는 데이터의 분포가 평균이 0, 분산이 1이되는 정규분포를 따르도록 정규화를 수행함
    • 배치 정규화를 활성화 함수의 앞(혹은 뒤)에 삽입함으로써 데이터의 분포가 덜 치우치게 할 수 있음
    • 또한 배치 정규화 계층마다 정규화된 데이터에 고유한 "확대(scale)""이동(shift)" 변환을 수행
    • <장점>
      • 학습 속도가 빨라짐
      • 초깃값에 크게 의존하지 않음
      • 과적합을 억제함

배치 정규화를 사용한 신경망의 예시

 

 

 

기계학습에서는 학습 데이터에 대한 정확도는 높으나 테스트 데이터에 대한 정확도는 떨어지는 과적합(Overfitting) 문제가 발생하는 경우가 많다.

 

과적합 문제는 주로 다음의 두 경우에 일어난다.

 

  • 매개변수가 많고 복잡한 모델
  • 학습 데이터가 적은 경우

이러한 과적합 문제를 해결해주는 대표적인 방법으로는 "가중치 감소(Weight Decay)""드롭아웃(Dropout)"이라는 방법이 있다.

 

  • 가중치 감소(Weight Decay)
    • 과적합은 가중치 매개변수의 값이 커서 발생하는 경우가 많기 때문에, 학습 과정에서 큰 가중치에 대해서는 그에 상응하는 큰 페널티를 부과하여 과적합을 억제하는 방법임
    • 가중치의 제곱 Norm(즉, L2 Norm)을 손실 함수에 더함으로써 가중치가 커지는 것을 억제
    • 정규화 항으로 L2 Norm, L1 Norm, L ∞ Norm 중 어떤 것도 사용할 수 있으나, 일반적으로 L2 Norm을 가장 많이 사용함
  • 드롭아웃(Dropout)
    • 신경망 모델이 복잡해지면 가중치 감소(Weight Decay)만으로는 과적합 문제를 해결하기가 어려워지는데, 이러한 경우에 사용하는 방법이 바로 "드롭아웃(Dropout)"
    • 드롭아웃은 뉴런을 임의로 삭제하면서 학습하는 방법
    • 즉, 학습할 때 은닉층의 뉴런을 무작위로 골라서 삭제하고, 삭제된 뉴런은 신호를 전달하지 않게 됨
    • 학습할 때는 데이터를 흘릴 때마다 삭제할 뉴런을 무작위로 선택하지만, 테스트할 때는 모든 뉴런에 신호를 전달한다는 점을 주의해야 함!!
    • 단, 테스트할 때는 각 뉴런의 출력에 학습할 때 삭제 안 한 비율을 곱해서 출력

드롭아웃은 학습할 때 뉴런을 무작위로 삭제하는 행위를 통해 매번 다른 모델을 학습시키는 것으로 해석할 수 있기 때문에, 앙상블 학습은 드롭아웃(Dropout)과 밀접하다고 할 수 있다.

 

추론할 때는 뉴런의 출력에 삭제한 비율을 곱함으로써 앙상블 학습에서 여러 모델의 평균을 내는 것과 같은 효과를 얻는 것이라고 할 수 있겠다.

 

따라서 드롭아웃(Dropout)은 앙상블 학습과 같은 효과를 (대략) 하나의 네트워크로 구현했다고 생각할 수 있다.

 

** 여기서 앙상블 학습이란 개별적으로 학습시킨 여러 모델의 출력을 평균 내서 추론하는 방식이다. **

 

 

 

다음으로 "하이퍼파라미터 최적화"에 대해 설명하도록 하겠다.

 

신경망에는 다수의 하이퍼파라미터가 등장한다. 예를 들면, "각 층의 뉴런 수, 배치 크기, 매개변수 갱신 시의 학습률과 가중치 감소" 등이 있겠다.

 

이와 같은 하이퍼파라미터를 적절한 값으로 튜닝해줌으로써 모델의 성능을 높일 수 있다.

 

단, 여기서 주의할 점은 하이퍼파라미터의 성능을 평가할 때는 테스트 데이터를 사용해서는 안 된다는 것이다!!

(왜냐하면 테스트 데이터를 사용해서 하이퍼파라미터를 조정하면 과적합 문제가 발생하기 때문이다)

 

따라서 하이퍼파라미터를 조정할 때는 하이퍼파라미터 전용 확인 데이터가 필요하며, 이러한 데이터를 "검증 데이터(Validation data)"라고 부른다.

 

여기서 잠깐 학습/검증/테스트 데이터에 대한 내용 정리를 해보면 다음과 같다.

 

  • 학습 데이터(Train)
    • 매개변수(가중치와 편향) 학습에 이용
  • 검증 데이터(Valid)
    • 하이퍼파라미터의 성능을 평가하는 데 이용
  • 테스트 데이터(Test)
    • 신경망의 범용 성능을 평가하는 데 이용

하이퍼파라미터를 최적화할 때의 핵심은 하이퍼파라미터의 "최적 값"이 존재하는 범위를 조금씩 줄여간다는 것이다.

 

<Step 1>

- 대략적인 범위를 설정하고 그 범위에서 무작위로 하이퍼파라미터 값을 샘플링한 후, 그 값으로 정확도를 평가

 

<Step 2>

- 정확도를 살펴보면서 Step 1 과정을 여러 번 반복하며 하이퍼파라미터의 최적 값의 범위를 좁혀가기

 

신경망의 하이퍼파라미터 최적화에서는 "그리드 서치(Grid Search)"와 같은 규칙적인 탐색보다는 무작위로 샘플링을 해서 탐색하는 편이 좋은 결과를 낸다고 알려져 있다. 이는 최종 정확도에 미치는 영향력이 하이퍼파라미터마다 다르기 때문이다.

 

따라서 하이퍼파라미터 범위"10의 거듭제곱" 단위와 같이 "대략적으로" 지정하는 것이 효과적이다.

 

하이퍼파라미터를 최적화할 때는 오랜 시간이 걸린다는 점을 항상 기억해야 한다. 따라서 학습을 위한 에폭(Epoch)을 작게 해서 1회 평가에 걸리는 시간을 단축하는 것이 효과적이다.

 

지금까지 얘기한 하이퍼파라미터의 최적화 과정을 정리 요약하면 다음과 같다.

 

  • 1단계
    • 하이퍼파라미터 값의 범위 "대략적으로" 설정
  • 2단계
    • 설정된 범위 내에서 하이퍼파라미터의 값을 무작위로 추출
  • 3단계
    • 2단계에서 샘풀링한 하이퍼파라미터 값을 사용하여 학습하고, 검증 데이터로 정확도를 평가
    • 단, 에폭(Epoch)은 작게 설정할 것!! (학습 시간이 오래 걸리기 때문)
  • 4단계
    • 2단계와 3단계를 특정 횟수(ex. 100회) 반복하며 정확도를 살펴보고, 하이퍼파라미터의 범위를 좁혀나가기
  • 5단계
    • 어느 정도 하이퍼파라미터 범위가 좁혀지면, 그 범위 내의 값을 하나 골라내기

위에서 설명한 하이퍼파라미터 최적화 방법은 실용적인 방법이긴 하지만, "경험"과 "직관"에 의존한다는 느낌이 강하다.

 

위와 같은 방법말고 조금 더 세련된 방법으로는 "베이즈 최적화" 기법이 있다.

 

베이즈 최적화는 베이즈 정리를 중심으로 한 수학 이론을 구사하여 더 엄밀하고 효율적으로 최적화를 수행한다.

 

이러한 이유 때문에 필자는 개인적으로 Grid Search나 Random Search보다 Bayesian Optimization 기법을 선호하는 편이다.

 

베이즈 최적화와 관련하여 자세한 설명을 적어놓은 블로그 두 개를 첨부하였다. 아래의 블로그들을 참고하면 베이즈 최적화에 대한 이해를 높이는 데 도움이 되지 않을까 싶다.

 

shinminyong.tistory.com/37

 

하이퍼 파라미터 Bayesian Optimize

1. 들어가며 베이지안 최적화(Bayesian Optimize)를 통한 하이퍼 파라미터 최적화 방법을 소개해드리겠습니다. 요즘 대회들을 많이 참가하면서 모델 선택 및 Feature engineering이 어느정도 마무리 된 후

shinminyong.tistory.com

daheekwon.github.io/bayes_opt/

 

Bayesian Optimization

Data Science through Statistics

daheekwon.github.io

 

이번 포스팅은 여기서 마치도록 하겠다.

 

다음 포스팅은 현재 컴퓨터 비전(이미지 및 영상) 분야에서 활발히 사용되는 모델들의 기초가 되는 "합성곱 신경망(CNN)"에 대해서 정리해보도록 하겠다.

 

 

★ 참고 자료

- 밑바닥부터 시작하는 딥러닝 교재