본 내용은 밑바닥부터 시작하는 딥러닝 1도서를 참고하여 작성되었습니다.
밑바닥부터 시작하는 딥러닝 1 - 예스24
딥러닝 분야 부동의 베스트셀러!머리로 이해하고 손으로 익히는 가장 쉬운 딥러닝 입문서이 책은 딥러닝의 핵심 개념을 ‘밑바닥부터’ 구현해보며 기초를 한 걸음씩 탄탄하게 다질 수 있도록
www.yes24.com
매개변수 갱신
모험가 이야기
어떠한 모험가가 지도와 눈을 가리고 산을 오른다고 상상해보자.
모험가는 어떻게 길을 찾을까?
발의 감각을 느끼며, 기울기가 산 정상을 향하는 방향을 찾을 것이다.
참고) 해당 지점이 진짜 정상이 아니라 작은 언덕일수도 있다.
확률적 경사 하강법(SGD)
시작하기 전, SGD를 복습해보자.
경사 하강법의 매개변수 갱신 기법은 SGD만 있는게 아니다.
그러므로 이 SGD를 모듈화하여 객체지향적으로 바꾸자.
SGD의 단점
SGD는 단순하고 구현도 쉽지만, 문제에 따라서는 비효율적일 때가 있다.
지금부터 SGD의 단점을 알아보기 위해 다음 함수의 최솟값을 구하는 문제를 생각해보자.
위 함수의 그래프를 그리면 다음과 같을 것이다.
위 함수의 기울기를 벡터장으로 표현하면 아래와 같을 것이다.
이 기울기는 y축 방향은 크고 x축 방향은 작다.
또한, 최솟값이 되는 장소는 (0, 0)이지만, 대부분의 기울기가 가리키는 방향은 (0, 0)을 가리키고 있지 않다.
해당 그래프에 SGD를 적용시키면 SGD는 아래와 같이 움직일 것이다.
이는 굉장히 심하게 굽어진, 비효율적인 움직임이다.
즉, SGD의 단점은 비등방성(anisotropy) 함수(방향에 따라 성질, 즉 여기에서는 기울기가 달라지는 함수)에서는 탐색 경로가 비효율적이라는 뜻이다.
이럴때는 SGD말고 다른 매개변수 탐색 함수가 필요해지는데, 지금부터 SGD가 아닌 다른 기법들을 알아보자.
4가지 매개변수 갱신 관련 최적화 기법
해당 링크의 GIOF는 각 매개변수 탐색 기법으로 최솟값을 탐색하는 속도와 방식을 확인할 수 있다.
https://imgur.com/saddle-point-NKsFHJb
이중에서 주요한 매개변수 갱신 최적화 기법 4가지를 알아보자.
모멘텀(Momentum)
- 가중치 변경값에 관성(momentum)을 추가
- 관성 때문에 기울기가 0인 부분에서도 가중치 업데이트 가능
AdaGrad(아다그라드)
- Adaptive Gradient
- 학습 속도(learning rate)를 가중치 변경과 함께 조정
- 가중치가 업데이트됨에 따라 학습 속도가 감속하도록 설계
RMSProp
- 시간이 지남에 따라 학습 속도가 줄어드는 AdaGrad 알고리즘 단점 개선
- 최근 학습한 데이터가 학습 속도 변경에 좀 더 많은 영향을 미치도록 설계
Adam
- Momentum 알고리즘 + RMSProp 알고리즘
- 가중치와 학습 속도를 모두 변경하면서 안정적으로 비용 함수 최솟값 학습
- 잘 모르겠으면 아담 써라!
출처: 프로그래머를 위한 강화학습, 2021
모멘텀
모멘텀은 '운동량'을 뜻하는 단어로, 물리와 관계가 있다.
모멘텀 기법은 수식으로는 아래와 같이 나타낸다.
위에서 v라는 속성이 새로 나오는데, 이는 물리에서 말하는 속도(velocity)에 해당한다.
속도와 속력을 헷갈리지 말자. 속도는 방향이 있는 벡터이다.
즉, 모멘텀은 SGD를 진행 시, 해당 곡면의 기울기를 기준으로 움직이는 것이 아닌, 현재 학습 모델의 "속도"를 계산하여 이 기준으로 움직인다.
모멘텀의 이미지화를 하면 다음과 같다.
모멘텀은 공이 그릇의 곡면(기울기)을 따라 구르듯 움직이는 것을 의미한다.
또 식의 av 항은 문제가 아무런 힘을 받지 않을 때 서서히 하강시키는 역할을 수행한다.(a는 보통 0.9 등의 값으로 설정한다). 물리에서의 지면 마찰이나 공기 저항 역할을 수행한다.
아래는 모멘텀의 구현이다.
이제 모멘텀을 사용해서 처음 정의한 식을 풀면 아래와 같은 형태로 나타난다.
그림에서 보듯 모멘텀의 갱신 경로는 공이 바닥을 구르듯 움직인다. SGD와 비교하면 '지그재그 정도'가 덜함을 알 수 있는데, 이는 x축의 힘은 아주 작지만 방향은 변하지 않아서 한 방향으로 일정하게 가속하기 때문이다.
거꾸로 y축의 힘은 크지만 위아래로 번갈아 받아서 상충하여 y축의 방향의 속도는 안정적이지 않다.
AdaGrad
신경망 학습에서는 학습률(수식에서는 η)값이 중요하다.
이 값이 너무 작으면 학습 시간이 너무 길어지고, 반대로 너무 크면 발산하여 학습이 제대로 이루어지지가 않는다.
이 학습률을 정하는 효과적 기술로, 학습률 감소(learning rate decay)가 있다.이는 학습을 징행하면서 학습률을 점차 줄여나가는 방법이다.
학습률을 서서히 낮추는 가장 간단한 방법은 매개변수 "전체"의 학습률 값을 일괄적으로 낮추는 것이다. 이를 더욱 발전시킨 기법이 AdaGrad이다. AdaGrad는 "각각의" 매개변수에 "맞춤형" 학습률을 만들어준다.
행렬의 덧셈에서 원소별로 더하듯이 곱한다고 생각하면 된다.
여기서 새로 h라는 변수가 등장하는데, h는 식에서 보듯 기존 기울기 값을 제곱하여 계속 더해준다.
그리고 매개변수를 갱신할 때 h^{-1/2}를 곱해주어 학습률을 조정한다.
매개변수의 원소 중에서 많이 움직인(크게 갱신된) 원소는 학습률이 낮아진다는 뜻인데, 다시 말해 학습률 감소가 매개변수의 원소마다 다르게 적용됨을 뜻한다.
그럼 AdaGrad를 구현해보자.
마지막 줄에 1e-7은 self.h 에 0이 담겨있다고 해도 0으로 나누는 사태를 방지한다.
이번엔 AdaGrad를 이용해 식을 풀어보자. 풀면 아래와 같은 형태로 나타난다.
RMSProp
AdaGrad는 과거의 기울기를 계속 제곱하여 더해가는데, 그래서 학습을 진행할수록 갱신 강도가 약해진다.
실제로 무한히 계속 학습한다면 어느 순간 갱신량이 0이 되어 전혀 갱신되지 않기 때문이다.
이 문제를 개선한 방법이 RMSProp이라는 기법인데, 이는 AdaGrad처럼 과거의 모든 기울기를 균일하게 더해가는 것이 아닌, 먼 과거의 기울기는 서서히 잊고 새로운 기울기 정보를 크게 반영한다.
이를 지수이동평균(Exponential Moving Average, EMA)라고 하며, 과거의 기울기 반영 규모를 기하급수적으로 감소시킨다.
본 내용은 밑바닥부터 시작하는 딥러닝 1 책에 없는 내용입니다.
여기서 γ 변수는 decay rate로, 기억할 과거 기울기의 비율을 의미한다.
일반적으로 0.9 혹은 0.99 를 사용하고, 이는 마치
- 0.9일 경우
- 과거 기울기는 90% 저장
- 새로운 기울기 10% 반영
- 0.99일 경우
- 과거 기울기 99% 저장
- 새로운 기울기 1% 반영
으로 해석 가능하다.
이것이 누적되면 과거 기울기의 반영 규모가 기하급수적으로 감소중이라는 것을 알 수 있다.
여기서도 또한 입실론을 더해, 0으로 나눠지는 문제를 방지한다.
구현은 아래와 같다.
Adam
아담은 2015년에 제안된 새로운 방법으로, 그 이론은 다소 복잡하지만 모멘텀과 RMSProp을 융합한듯한 방법이다.
m이 모멘텀의 기능에 가중이동평균을 더하고, v가 RMSProp 기능을 수행하는 것을 확인할 수 있다.
여기서 2개의 베타는 하이퍼파라미터로, 논문에서는 1과 2 각각 0.9와 0.999를 권장한다.
논문 링크는 아래와 같다. http://arxiv.org/abs/1412.6980v8
Adam: A Method for Stochastic Optimization
We introduce Adam, an algorithm for first-order gradient-based optimization of stochastic objective functions, based on adaptive estimates of lower-order moments. The method is straightforward to implement, is computationally efficient, has little memory r
arxiv.org
이를 코드로 나타내면 아래와 같다.
이를 이용해 위에서 정의한 문제를 풀면 아래와 같은 형태가 된다.
어느 갱신 방법을 이용할 것인가?
그래서 어느 갱신 방법이 좋을까?
유감스럽게도 모든 문제에서 항상 뛰어난 기법은 (아직까진) 없지만, 요새는 일반적으로 "잘 모르겠으면 Adam 써라" 라는 말이 있는 만큼, 아담을 사용해보는 것을 추천한다.
MNIST 데이터셋으로 본 갱신 방법 비교
지금까지 배운 4가지(RMSProp 제외) 기법을 비교해보자.
각 방법의 학습 진도가 얼마나 다른지를 아래 그래프로 비교해보았다.
가장 빨라보이는건 AdaGrad인 것으로 보인다. 다만 여기선 하이퍼파라미터 값이 최적화되지 않았고, 신경망의 구조마다 결과가 달라질 수 있음에 주의하자.
다만 일반적으로 SGD보다 다른 세 기법이 빠르게 학습하고, 최종 정확도도 높게 나타난다.
가중치의 초깃값
가중치의 초깃값은 작은 것이 좋다. 가중치가 클 경우, 모델이 입력에 대해 너무 민감하게 반응하게 되고, 이는 실제로 과대적합을 유발한다.
따라서 가중치를 최대한 낮은 절댓값으로 두려고 하는데, 이를 가중치 감소(Weight decay) 기법이라고 한다.
가중치 감소 기법은 아래에서 자세하게 알아봅니다.
이는 신경망 학습에서 가중치의 초깃값이 특히 중요하다는 것을 알려준다.
가중치의 초깃값을 무엇으로 설정하느냐가 신경망 학습의 성패를 가르는 일이 실제로 자주 있다.
따라서 이번엔 권장 초깃값인 Xavier, He 초깃값에 대해 알아보자.
초깃값을 0으로 하면?
우리는 가중치를 설정할 때, 아래 코드로 초기화를 진행했다.
여기서 가중치 값을 0.01 * 랜덤한 값으로 초기화했는데, 만약 이를 편향처럼 모두 0으로 초기화하면 어떨까?
사실 가중치를 모두 0으로 초기화하면(정확히는, 모두 동일한 값으로 초기화하면) 제대로 된 학습이 이루어지지 않는다.
그 이유는 역전파 시 모든 가중치의 값이 똑같이 갱신되기 때문이다.
예를 들어 1층 레이어와 2층 레이어의 가중치가 모두 0인 2층 신경망을 상상해보자.
- 해당 신경망은 입력층의 가중치가 모두 동일하기 때문에 두번째 층의 뉴런에 모두 같은 값이 전달될 것이다.
- 두번째 층의 모든 뉴런에 같은 값이 입력된다는 것은 역전파 때 두 번째 층의 가중치가 모두 똑같이 갱신된다는 말이 된다. (역전파 시의 편미분값 계산을 떠올려보자.)
- 그래서 가중치들이 같은 초깃값에서 시작하고 갱신을 거쳐도 여전히 다른 뉴런과 같은 값을 유지하게 된다.
결국 이 '가중치가 고르게 되어버리는 상황'을 막으려면 초깃값을 무작위로 설정해야 한다.
은닉층의 활성화값 분포
은닉층의 활성화값(활성화 함수의 출력 데이터)의 분포를 관찰하면 중요한 정보를 얻을 수 있다.
아래는 가중치를 표준편차가 1인 정규분포로 초기화할 때의 각 층의 활성화값 분포이다.
각 층의 활성화값들이 0과 1에 치우쳐져 있다.
여기에서 사용한 시그모이드 함수는 그 출력이 0에 가까워지자(또는 1에 가까워지자) 그 미분은 0에 다가간다.
그래서 데이터가 0과 1에 치우쳐 분포하게 되면 역전파의 기울기 값이 점점 작아지다가 사라진다.
이 현상을 기울기 소실(Vanishing Gradient)라고 하며, 딥러닝에서는 이 현상이 더욱 심하게 나타나게 된다.
딥러닝의 경우, 레이어가 늘어날수록 거쳐가는 활성화 함수가 많아지게 되고, 이는 더 많은 기울기 소실의 가능성을 높인다.
시그모이드의 경우 0과 1에 치우치게 되면 기울기가 0에 가까워지고,
ReLU의 경우 음수가 입력값으로 들어오면 기울기가 0이 되어 학습이 멈추게 된다.
이 문제는 초기값을 잘 설정해도 층이 더욱 깊어지는 순간 발생하는 문제로, 더욱 깊은 층을 사용하기 위한 신경망 최적화의 주요 포인트이기도 하다.
이번에는 가중치의 표준편차를 0.01로 바꿨을 때의 각 층의 활성화값 분포를 살펴보자.
이번에는 0.5 부근에 집중되었다.
앞의 예처럼 0과 1로 치우치진 않았으니 기울기 소실 문제는 일어나지 않지만, 표현력 측면에서 큰 문제가 있다고 할 수 있다.
- 다수의 뉴런이 거의 같은 값을 출력하고 있다.
- 이는 뉴런을 여러개 둔 것과 유사한 출력이 된다.
그래서 활성화값들이 치우치면 표현력을 제한한다는 관점에서 문제가 된다.
이를 위해 사비에르 글로로트와 요슈아 벤지오의 논문에서 권장하는 가중치 초깃값인, 일명 Xavier 초깃값을 사용해보자.
Xavier 초깃값
이 논문은 각 층의 활성화값들을 광범위하게 분포시킬 목적으로 가중치의 적절한 분포를 찾고자 했다.
그리고 앞 계층의 노드가 n개라면 표준편차가 n^{-1/2}인 분포를 사용하면 된다는 결론을 이끌었다.
사비에르의 논문은 앞 층 뿐만 아니라 다음 층의 출력 노드 수도 고려한 설정값을 제안하지만, 주요 프레임워크들은 앞 층의 입력 노드만으로 계산하도록 단순화했다.
Xavier 초깃값을 사용하면 앞 층에 노드가 많을수록 대상 노드의 초깃값으로 설정하는 가중치가 좁게 퍼진다.
이제 Xavier 초깃값을 써서 실행해보자.
모든 층의 뉴런 수가 100개라고 단순화했다.
그 결과, 이전보다 활성화값이 고르게 분포한것을 확인할 수 있었다.
참고로 활성화 함수로는 원점에서 대칭인 함수가 바람직하다고 알려져 있다.
그래서 시그모이드보다는 하이퍼볼릭 탄젠트 함수를 은닉층의 활성화 함수로 하는것이 더 바람직하다.
Xavier 초깃값은 활성화 함수가 선형이라는 전제로 이끈 결과이다.
시그모이드와 하이퍼볼릭 탄젠트 함수는 좌우 대칭이라 중앙 부근이 선형인 함수로 볼 수 있다. 그래서 Xavier 초깃값이 적당하다.
ReLU를 사용할 때의 가중치 초깃값 - He 초깃값
ReLU는 선형이 아니기 때문에, 특화된 초깃값을 사용해야 한다.
이 특화된 초깃값을 카이밍 히의 이름을 따 He 초깃값이라 한다.
활성화 함수로 ReLU를 사용한 경우의 가중치 초깃값에 따른 활성화값 분포 변화를 살펴보자.
결과를 보면 std=0.01일 때의 각 층의 활성화값은 매우 작다.
Xavier의 경우에도 점점 낮은 숫자로 편향이 발생하여 기울기 소실이 발생한다.
He의 경우, 층 깊이가 깊어져도 분포가 비교적 균일하게 유지되기에 역전파 때도 적절한 값이 나올 것으로 기대할 수 있다.
MNIST 데이터셋으로 본 가중치 초깃값 비교
이번엔 실제 데이터를 가지고 가중치의 초깃값을 두는 방법이 신경망 학습에 얼마나 영향을 주는지 확인해보자.
위에서 보듯, 표준편차가 0.01인 정규분포의 경우 학습이 이루어지질 않았다.
Xaiver, He의 경우 학습이 잘 이루어지는 것을 확인할 수 있었다.
배치 정규화 (Batch Normalization)
우리는 앞 절에서 가중치가 편향되지 않아야 학습이 원할하게 수행됨을 확인할 수 있었다.
그렇다면 아예 활성화 함수 앞에, 활성화 값을 적당히 퍼트리도록 "강제" 하는 추가 계층을 두면 어떨까?
이것이 바로 "배치 정규화(Batch Normalization)"이다.
배치 정규화 알고리즘
배치 정규화는 2015년에 제안된 방법으로, 다음과 같은 효과를 가지고 있다.
- 학습을 빨리 진행할 수 있다.
- 초깃값에 크게 의존하지 않는다.
- 활성화값이 넓게 분포되어, 표현력이 올라간다.
- 과대적합을 억제한다.(드롭아웃 등의 필요성 감소)
아래 두가지 이미지를 보며 Batch Norm 레이어의 위치가 어디 있는지 확인해보자.
배치 정규화는 그 이름과 같이 완전 연결 계층과 활성화 함수 사이에서 미니배치를 단위로 정규화를 수행한다.
구체적으로는 데이터 분포가 평균이 0, 분산이 1이 되도록 정규화하며, 수식으로는 다음과 같다.
위 식은 입력 데이터를 평균이 0, 분산이 1이 되도록 정규화한다.
이 식에서도 입실론(1e-7)은 0으로 나누는 사태를 예방하는 값으로 들어간다.
또한 배치 정규화 계층마다 이 정규화된 데이터에 고유한 선형변환을 수행한다.
수식으로는 아래와 같다.
이 식은 데이터 확대(scale) 및 이동(shift)을 수행한다.
이를 계산 그래프로 표현하면 아래와 같다.
배치 정규화의 효과
이제 배치 정규화의 효과를 알아보자.
아래는 MNIST 데이터셋을 사용하여 배치 정규화 계층을 사용할 때와 사용하지 않을 때의 학습 진도가 어떻게 달라지는지를 나타낸 그래프이다.
그래프에서 보듯이, 배치 정규화가 학습을 빠르게 진전시키고 있다.
다음은 가중치의 초깃값에 표준편차를 다양하게 줬을 때의 배치 정규화 유무를 가지고 성능을 비교해보자.
거의 모든 경우에서 배치 정규화를 사용할 때의 학습 진도가 빠른 것으로 나타났다.
바른 학습을 위해 - 오버피팅/가중치 감소 방지
머신러닝에서는 과대적합이 문제가 되는 일이 많다.
복잡하고 표현력이 높은 모델도 중요하지만, 그만큼 범용적이고 일반적인 모델 또한 중요하다.
과대적합
과대적합은 주로 다음의 두 경우에 일어난다.
- 매개변수가 많고 표현력이 높은 모델
- 훈련 데이터가 적은 모델
먼저, 의도적으로 과대적합을 발생시켜보자.
현재 훈련 데이터의 결과와 테스트 데이터의 결과 사이에 30% 가까이 격차가 발생하고 있다.
지금부터 이 그래프를 두가지 기법을 통해 개선해보자.
가중치 감소(Weight decay)
첫번째는 위에서 소개한 "가중치 감소"기법이다.
위에서 이야기했듯, 과대적합은 가중치 매개변수의 값이 커서 발생하는 경우가 많다.
가중치를 "똑똑하게" 줄이는 다른 방법은 뭐가 있을까?
우리의 목표는 결국 손실함수의 최솟값을 찾는거지, 손실함수의 값 자체가 중요한 것이 아니다.
그렇다면 손실함수의 값을 줄이면, 경사 하강법 시 도출하는 W의 값 자체를 줄이면서, 손실 함수의 최솟값을 찾을 수 있다.
손실함수의 값을 줄이는데는 크게 두가지 기법이 사용된다.
- L2 노름(가중치 벡터의 유클리드 거리, 피타고라스 거리) 더하기
- L1 노름(가중치 벡터의 맨해튼 거리, 직각 거리) 더하기
주로 L2 노름이 많이 사용되므로, L2 노름에 대해 설명하겠다.
손실에 아래와 같은 추가항을 더해보자.
이를 w에 대해 미분하면, (경사하강법에는 손실함수의 미분값이 사용된다.)
라는 식이 도출된다.
따라서 SGD 업데이트는 다음과 같이 수행된다.
즉, 다음 가중치의 변화가 있기 전, 기존 가중치가 줄어드는 효과를 갖게 된다.
이를 이용한 개선 결과는 아래와 같다.
이전보다 훈련 데이터와 테스트 데이터 간 성능 차이가 줄어든 것을 확인할 수 있다.
드롭아웃
앞에서는 손실 함수에 가중치의 L2노름을 더한 가중치 감소 방법을 사용했다.
가중치 감소는 어느정도 지나친 학습을 억제하지만, 신경망 모델이 복잡해지면 가중치 감소만으로는 대응하기 어려워진다. 이럴 때 흔히 드롭아웃이라는 기법을 이용한다.
드롭아웃은 뉴런을 임의로 삭제하면서 학습하는 방법이다.
삭제한 뉴런은 아래와 같이 신호를 전달하지 않게 된다.
훈련 때는 매 데이터를 흘릴 때마다 삭제할 뉴런을 무작위로 선택하고, 시험 때는 모든 뉴런에 신호를 전달한다.
단, 시험 때는 각 뉴런의 출력에 훈련 때 삭제 안 한 비율을 곱하여 출력한다.
주로 뉴런을 조작하거나, 아래와 같이 데이터를 직접 조작하기도 한다.
이를 구현한 코드는 아래와 같다.
이번에도 MNIST를 이용한 학습 결과 비교를 수행해보자.
그림과 같이 훈련 데이터와 시험 데이터에 대한 정확도 차이가 줄어들었다.
또한, 훈련 데이터에 대한 정확도가 100%에 도달하지도 않게 되었다.
이처럼 드롭아웃을 이용하면 표현력을 높이면서도 과대적합을 억제할 수 있다.
머신러닝에서는 앙상블 학습을 애용한다. 앙상블 학습은 개밸적으로 학습시킨 여러 모델의 출력을 평균 내어 출력하는 방식이다. 신경망의 맥락에서 얘기하면 가령 같은(혹은 비슷한) 구조의 신경망을 5개 준비하여 따로따로 학습시키고, 시험 대는 그 5개의 출력을 평균 내어 답하는 것이다.
앙상블 학습은 드롭아웃과 밀접하다. 드롭아웃이 학습 때 뉴런을 무작위로 삭제하는 행위를 매번 다른 모델을 학습시키는 것으로 해석할 수 있기 때문이다.
그리고 추론 때는 뉴런의 출력에 삭제하지 않은 비율을 곱함으로써 "앙상블 학습에서의 여러 모델의 평균을 내는 것"과 같은 효과를 내게 된다.
즉, 드롭아웃은 앙상블 학습과 같은 효과를 (대략) 하나의 신경망으로 구현했다고 볼 수 있다.
적절한 하이퍼파라미터 값 찾기
우리는 여태까지 학습하면서 다양한 하이퍼 파라미터들을 마주했다.
이 하이퍼 파라미터의 튜닝 관련해선 언급이 없었는데, 지금부터 이 하이퍼파라미터 튜닝에 대해 알아보자.
검증 데이터
지금까지는 데이터셋을 훈련 데이터와 시험 데이터라는 두 가지로 분리해 이용해왔다.
앞으로 하이퍼파라미터를 다양한 값으로 설정하고 검증할 텐데, 여기서 주의할점은 시험 데이터를 이용해 하이퍼파라미터를 튜닝해서는 안된다.
시험 데이터에 하이퍼파라미터가 과대적합되면 이 또한 시험 데이터의 취지에 맞지 않기 때문이다.
따라서 일반적으로 훈련 데이터에 있던 20%정도를 분리해 하이퍼파라미터 조정용으로 검증 데이터(Validation data)를 사용한다. 즉, 하이퍼파라미터의 적절성을 평가하는 데이터로 사용하는 것이다.
즉, 역할을 구분하면 다음과 같다.
- 훈련 데이터: 매개변수 학습
- 검증 데이터: 하이퍼파라미터 성능 평가
- 시험 데이터: 신경망의 범용 성능 평가
지금부터 검증 데이터를 사용하여 하이퍼파라미터를 최적화하는 기법을 살펴보자.
하이퍼파라미터 최적화
하이퍼파라미터 최적화의 핵심 아이디어는 하이퍼파라미터의 '최적 값'이 존재하는 범위를 조금씩 줄여나간다는 것이다.
하이퍼파라미터 최적화는 그리드 서치(grid search)같은 규칙적인 탐색보다는 무작위로 샘플링해 탐색하는 편이 좋은 결과를 낸다고 알려져 있다.
따라서 하이퍼파라미터의 범위는 '대략적'으로 지정하는 편이 효과적이다.
실제로 0.001 에서 1000 사이와 같이 '10의 거듭제곱' 단위로 범위를 지정한다. 이를 '로그 스케일로 지정'한다고 한다.
하이퍼파라미터 최적화 시에는 딥러닝 학습에는 오랜시간이 걸린다는 점을 기억해야 한다. 따라서 나쁠 듯한 값은 일찍 포기하는 게 좋다. 또한 학습을 위한 에포크를 작게 하여, 1회 평가에 걸리는 시간을 단축하는 편이 효과적이다.
지금까지의 이야기를 정리하면 다음과 같다.
- 하이퍼파라미터 값의 범위를 설정한다.
- 설정된 범위에서 하이퍼파라미터의 값을 무작위로 추출한다.
- 위에서 샘플링한 하이퍼파라미터 값을 사용하여 학습하고, 검증 데이터로 정확도를 평가한다. (단, 에포크는 작게 설정한다.)
- 2단계와 3단계를 특정 횟수(100회 등) 반복하여, 그 정확도의 결과를 보고 하이퍼파라미터의 범위를 좁힌다.
이상을 반복하여 하이퍼파라미터의 범위를 좁혀나가고, 어느 정도 좁아지면 그 압축한 범위에서 값을 하나 골라낸다. 이것이 하이퍼파라미터를 최적화하는 하나의 방법이다.
참고: 위와 같은 지혜, 직관이 아닌 수학적으로 세련된 기법을 원한다면, 아래와 같은 베이즈 최적화 기법이 존재한다. 자세한 내용은 해당 링크를 참고하길 바란다.
https://arxiv.org/pdf/1206.2944
하이퍼파라미터 최적화 구현하기
예를 들어, 아래와 같이 하이퍼파라미터를 무작위로 추출한다.
이렇게 무작위로 추출한 값을 사용하여 학습을 수행한다.
그 실험 결과를 보면 다음과 같다.
이 그림을 보면 Best-7 까지는 학습이 잘 진행되는 것을 확인할 수 있었다.
이제 Best-7까지의 하이퍼파라미터를 범위로 다시한번 이 작업들을 반복하면 된다.
이번 장에서 배운 것
- 매개변수 갱신 방법에는 확률적 경사 하강법(SGD) 외에도 모멘텀, AdaGrad, RMSProp, Adam 등이 있다.
- 오버피팅은 가중치 값이 커지면 발생한다.
- 은닉층의 활성화값이 편향되면 표현력이 제한된다.
- 가중치 초깃값을 정하는 방법은 올바른 학습을 하는 데 매우 중요하다.
- 가중치의 초깃값으로는 'Xavier 초깃값'과 'He 초깃값'이 효과적이다.
- 배치 정규화는 활성화값을 고르게 분포시키는 기법이다.
- 배치 정규화를 이용하면 학습을 빠르게 진행할 수 있으며, 초깃값에 영향을 덜 받게 된다.
- 오버피팅을 억제하는 정규화 기술로는 가중치 감소와 드롭아웃이 있다.
- 하이퍼파라미터 값 탐색은 최적 값이 존재할 법한 범위를 점차 좁히면서 하는 편이 효과적이다.
'CS Repository > 기초 딥러닝' 카테고리의 다른 글
[밑바닥부터 시작하는 딥러닝] word2vec (3) | 2025.08.13 |
---|---|
[밑바닥부터 시작하는 딥러닝] 자연어와 단어의 분산 표현 (4) | 2025.08.12 |
[밑바닥부터 시작하는 딥러닝] 역전파 (7) | 2025.08.09 |
[밑바닥부터 시작하는 딥러닝] 신경망 학습 (12) | 2025.08.07 |
[밑바닥부터 시작하는 딥러닝] 신경망 (7) | 2025.08.06 |