밑바닥부터 시작하는 딥러닝 6장 - 학습 관련 기술들

DSC W/S·2020년 1월 28일
0
  • 학습할 내용들: 매개변수 갱신, 가중치의 초깃값, 배치 정규화, 오버피팅, 하이퍼파라미터 최적화

매개변수 갱신

우리는 항상 손실함수의 값을 가능한 낮추는 매개변수를 찾는 것이 목표이고, 이러한 것을 최적화 라고 한다.

앞서 역전파오류법에서 최적의 매개변수 값을 미분을 이용하는 확률적 경사 하강법(SGD)을 이용했다.

확률적 경사 하강법(SGD)

수식은 다음과 같다.

간단히 말하면, 기울어진 방향으로 일정 거리만큼 가겠다는 방법이다.
단순하고 구현도 쉽지만, 비효율적일 때가 있다. 비등방성 함수(방향에 따라 기울기가 달라지는 함수) 에서는 탐색 경로가 비효율적이다. SGD는 무작정 기울어진 방향으로 진행하고, 기울어진 방향이 본래의 최솟값과는 다른 방향을 가르킨다. 이러한 단점을 개선시켜주는 다른 방법을 설명하겠다.

모멘텀

모멘텀은 '운동량'을 뜻하는 단어로, 물리와 관계가 있다. 수식은 다음과 같다.


새로 등장한 v 변수는 속도로, 기울기 방향으로 힘을받아 물체가 지속된다는 물리법칙을 나타낸다. x축의 힘은 작지만 방향이 변하지 않아 한 방향으로 일정하게 가속하고, y축의 힘은 크지만 방향이 변해 위아래로 상충하여 방향과 속도가 일정치 않다. SGD보다 x축 방향으로 빠르게 다가간다.

AdaGrad

신경망 학습에서 학습률이 중요하다. 너무 크면 발산하고, 너무 작으면 학습시간이 너무 길어지기 때문이다. 이 학습률을 정하는 기술로 학습률 감소가 있다. 이는 학습을 진행하면서 학습률을 점차 줄여가는 방법을 말하는데, 학습률을 서서히 낮추는 가장 간단한 방법은 매개변수 전체의 학습률 값을 일괄적으로 낮추는 것인데, 이를 발전시킨 것이 AdaGrad인 것이다. AdaGrad는 개별 매개변수에 적응적으로 학습률을 조정하면서 학습을 진행한다. 수식은 다음과 같다.


h라는 새로운 변수는 기존 기울기값을 제곱하여 계속 더해준다. 그리고 매개변수를 갱신할 때 1/sqrt(h) 를 곱해 학습률을 조정한다. 즉, 매개변수의 원소 중 많이 움직인 원소는 학습률이 낮아진다. 즉, 학습률 간소가 매개변수의 원소마다 다르게 적용됨을 뜻한다.

Adam

Adam은 모멘텀과 AdaGrad를 융합한 기법이다. AdaGrad는 매개변수의 원소마다 적응적으로 갱신정도를 조정했고, 모멘텀은 속도를 가중치로 적용했다. 이 방법은 매개변수의 공간을 효율적으로 탐색해주고, 하이퍼파라미터의 편향보정이 진행된다는 점도 특징이다.

다음 사진은 지금까지 알아본 최적화 기법의 갱신경로를 비교한 것이다.

가중치의 초깃값

신경망 학습에서 중요한 것이 가중치 초기값이다. 따라서, 권장 초깃값에 대해 알아보고, 실험을 통해 확인해보겠다.

만약 초기값을 0으로 한다면?

가중치 감소는 오버피팅을 억제해 범용 성능을 높이는 테크닉으로, 가중치 매개변수의 값이 작아지도록 학습하는 방법이다. 가중치를 작게하고 싶으니까, 초깃값도 작게 시작하는 것이다. 지금까지 가중치 초기값을 0.01*np.random.randn(10,100) 을 사용했다.
만약 가중치의 초기값을 0으로 하면 학습이 올바르게 이루어지지 않는다. 이유는 오차역전파법에서 모든 가중치의 값이 똑같이 갱신되기 때문이다. 예를들어 2층 신경망에서 첫 번째와 두 번째 층의 가중치가 0이라고 가정하면, 순전파때 입력층의 가중치가 0이기 때문에 두 번째 층의 뉴런에 모두 같은 값이 전달된다. 두 번째 층의 모든 뉴런에 같은 값이 입력된다는 것은 역전파때 두 번째 층의 가중치가 모두 똑같이 갱신된다는 말이고, 그래서 가중치들은 같은 초기값에서 시작하고 갱신을 거쳐도 여전히 같은 값을 유지하게 되는 것이다. 이렇게 가중치가 고르게 되어버리는 상황을 막으려면 초깃값을 무작위로 설정해야 한다.

은닉층의 활성화값 분포

이번에는 가중치의 초깃값에 따라 은닉층 활성화값들이 어떻게 변화하는지 확인해보자.
스탠퍼드 대학의 수업을 참고, 활성화 함수로 시그모이드 함수를 사용하는 5층 신경망에 무작위로 생성한 입력데이터를 흘리며 각 층의 활성화값 분포를 히스토그램으로 그려본 실험에 의거해 설명해보면,


가중치의 분포를 보면 각 층의 활성화 값들이 0과 1에 치우쳐 분포되어 있는 것을 볼 수 있다. 시그모이드 함수는 출력이 0에 가까워지면 미분이 0에 다가가기 때문에, 역전파의 기울기값이 점점 사라져 기울기 손실을 유발한다고 알려져 있다.

가중치의 표준편차를 0.01로 바꿔주면,


이번에는 0.5 부근에 집중되어 있다. 앞서 본 그림처럼 0과 1로 치우쳐지지는 않아 기울기 소실 문제는 없으나, 활성화값들이 치우쳐졌다는 것은 다수의 뉴런이 거의 같은 값을 출력하고 있으니 뉴런을 여러개 둔 의미가 없어지게 된다는 의미 다. 그래서, 이는 표현력 제한관점에서 문제가 된다.

다음으로는 sqrt(1/n) 인 정규분포, Xavier 초깃값 을 사용한 결과다,


결과를 보면, 층이 깊어질 수록 형태가 일그러지긴 하지만, 뉴런들이 확실히 넓게 분포됨을 알 수 있다. 따라서 각 층에 흐르는 데이터가 적당히 퍼져 있으므로, 시그모이드 함수의 표현력도 제한받지 않고 학습이 효율적으로 이루어질것으로 예상된다.

ReLU를 사용할 때의 가중치 초깃값

시그모이드 함수와 tanh 함수는 좌우대칭, 중앙부근이 선형인 함수로, Xavier 초깃값이 적당하다. 반면, ReLU를 이용할때는 ReLU에 특화된 초깃값을 이용해야 한다. 바로, He 초깃값 이라고 한다. He 초깃값은 앞 층의 노드가 n 개 일때 sqrt(2/n) 인 정규분포를 사용한다.

표준편차가 0.01 일때는 각 층의 활성화값들이 매우 작다. 이렇게 작은 데이터들이 흐른다는 것은 역전파때 가중치의 기울기가 작아진다는 뜻이며, 이렇게 되면 학습이 거의 이루어지지 않는다.
Xavier 초깃값의 결과를 보면 치우짐이 조금씩 커지며 이는 기울기 소실 문제를 일으킨다.
마지막으로 He 초깃값은 모든층에 균일하게 분포되어 역전파때도 적절한 값이 나올것으로 기대할 수 있다.

결론:


활성화함수로 ReLU를 사용할 때는 He 초깃값을, sigmoid 나 tanh 함수 들의 S자 모양 곡선일때는 Xavier 초깃값을 쓰겠다.

배치 정규화

앞서 가중치의 초깃값을 적절히 설정해 각 층의 활성화값 분포가 적당히 퍼지면 학습이 원활히 된다고 했는데, 배치 정규화는 각 층이 활성화값을 적당히 퍼뜨리도록 강제하는 아이디어에서 나왔다.

배치 정규화 알고리즘

배치 정규화 방법이 즐겨사용되는 이유는 다음과 같다.

- 학습을 빨리 진행할 수 있다.
- 초깃값에 크게 의존하지 않는다.
- 오버피팅을 억제한다.(드롭아웃의 필요성 감소)

배치 정규화는, 각 층에서의 활성화값이 적당히 분포되도록 조정한다. 어떻게? 우선 배치정규화 계층을 신경망에 삽입하는것으로 시작한다. 이 층에서는 학습 시 미니배치를 단위로 데이터 분포가 평균이 0, 분산이 1이 되도록 정규화한다.

바른 학습을 위해

기계학습에서 오버피팅이 문제가 되는 일이 많다. 오버피팅이란 신경망이 훈련 데이터에만 지나치게 적응되어 그 외의 데이터는 제대로 대응하지 못하는 상태를 말한다. 기계학습은 범용성을 지향하기 때문에 학습된 데이터 이외에 새로운 데이터가 들어왔을 때 식별해내는 모델이 바람직하다. 따라서 오버피팅을 줄이는 것이 매우 중요하다.

오버피팅

오버피팅은 주로 다음과 같은 경우에 일어난다.

- 매개변수가 많고 표현력이 높은 모델
- 훈련 데이터가 적음

오버피팅을 억제하기 위해 주로 이용하는 방법에는,

1. 가중치 감소
2. 드롭아웃

이 있다.
가중치 감소는, 학습과정에서 큰 가중치에 대해 그에 상응하는 큰 패널티를 부과하여 오버피팅을 억제하는 방법이다. 손실함수의 가중치에 L2노름(=각 원소의 제곱들을 더해서 루트를 씌운 값) 을 더한 가중치 감소 방법이다.
드롭아웃은 뉴런을 임의로 삭제하면서 학습하는 방법이다. 훈련 때 은닉층을 무작위로 골라 삭제한다(=매번 다른 모델을 학습시킨다). 시험 때는 모든 뉴런에 신호를 전달한다. 단, 시험 때는 각 뉴런의 출력에 훈련 때 삭제한 비율을 곱하여 출력한다(=모델의 평균을 내는 것과 비슷한 효과).

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

신경망에서 등장하는 하이퍼파라미터는, 각 층의 뉴런 수, 배치 크기, 매개변수 갱신 시의 학습률과 가중치 감소 등을 말한다. 이러한 하이퍼파라미터 값은 모델의 성능에 있어서 매우 중요하다. 따라서, 하이퍼파라미터의 값을 최대한 효율적으로 탐색하는 방법을 알아보자.

검증 데이터

지금까지 데이터셋을 훈련데이터와 시험데이터라는 두가지로 분리해 이용했다. 훈련데이터로 학습하고, 시험데이터로 범용 성능을 평가한다. 주의할 점은, 하이퍼파라미터의 성능을 평가할 때는 시험데이터를 사용해서는 안된다. 이유는 시험 데이터를 사용하여 하이퍼파라미터가 조정되면 하이퍼파라미터값이 시험데이터에 오버피팅 되기 때문이다. 따라서 하이퍼파라미터를 조정할 때에는 전용 확인 데이터가 필요하다. 이런 하이퍼파라미터의 적절성을 평가하는 데이터를 검증데이터 라고 부른다.

- 훈련데이터: 매개변수 학습
- 검증데이터: 하이퍼파라미터 성능 평가
- 시험데이터: 신경망의 범용 성능 평가

데이터셋에 따라 이렇게 세 가지로 분류해 놓은 것도 있지만, 그렇지 않고 훈련데이터와 시험데이터로만 분리되어있을 경우에는 보통 훈련데이터 중 20% 정도를 검증데이터로 먼저 분리한다.

하이퍼파라미터 최적화

최적화 할 때 핵심은 '최적 값'이 존재하는 범위를 조금씩 줄여간다는 것이다. 그러려면, 우선 대략적인 범위를 설정하고 그 범위에서 무작위로 하이퍼 파라미터 값을 골라낸 후(=샘플링), 그 값으로 정확도를 평가한다.

하이퍼파라미터 최적화에서 범위는 대략적으로 0.001~1000 사이의 로그스케일로 지정하고, 그리드 서치같은 규칙적인 탐색보다는 무작위로 샘플링해 탐색하는 것이 좋다. 또한 하이퍼파라미터를 최적화할때는 딥러닝 학습시간이 오래걸리므로, 학습을 위한 에폭을 작게 하여 1회 평가에 걸리는 시간을 단축하는 것이 효과적이다.

결론:

1. 하이퍼파라미터 값의 범위를 설정한다. (대략적으로)
2. 설정된 범위에서 하이퍼파라미터의 값을 무작위로 추출한다.
3. 1단계에서 샘플링한 하이퍼파라미터 값을 사용하여 학습하고, 검증데이터로 정확도를 평가한다. (에폭은 작게 설정)
4. 1단계와 2단계를 특정 획수(100회 등) 반복하며, 그 정확도 결과를 보고 하이퍼파라미터의 범위를 좁힌다. 
profile
DSC Duksung 겨울방학 NLP 스터디

0개의 댓글