대충 1년 만에 다시 포스팅을 시작하게 되었다.
원래 이 정도로 미룰 줄은 몰랐는데 항상 그렇듯 한번 미루니 끝도 없이 미뤄지게 되었다 ㅋ
강의는 예전에 다 듣고 정리도 다 했지만 워낙 오래되어서 그냥 다시 듣고 정리도 다시 해서 포스팅할 계획이다.
그렇다 보니 지금 10강 넘게 남았는데 솔직히 2월 내로 모든 포스팅을 끝마칠 수 있을지는 모르겠지만
어쨌든 이번에는 미루지 않고 끝날 때까지 매주 2회 정도의 포스팅을 목표로 해서 꾸준히 해보고자 한다.
.
.
.
.
.
강의 유튜브
https://www.youtube.com/watch?v=WUazOtlti0g&list=PL5-TkQAfAZFbzxjBHtzdVCWE0Zbhomg7r&index=11
강의 슬라이드
https://web.eecs.umich.edu/~justincj/slides/eecs498/498_FA2019_lecture11.pdf
이번 강의에서는 저번 강의에 이어서 동적인 학습 기법들과 학습이 끝난 후 결과를 개선하기 위해서
취할 수 있는 방법들에 관해서 배워볼 것이다.
먼저 Learning Rate Schedule에 관해서 배워볼 것이다.
머신 러닝 모델을 학습할 때에는 어떤 Learning Rate 선택하는지에 따라 위와 같이 epoch 당 loss는 다양한 모습으로 나타난다. 위 그래프에서 볼 수 있듯이 학습 시에는 loss의 변화가 빨간색 그래프를 그리는 Learning Rate을 선택하는 것이 이상적일 것이다. 하지만, 최적의 값을 선택하는 것은 힘들기에 일반적으로 처음에는 높은 Learning Rate을 선택해서 loss를 빠르게 감소시키다가 학습이 원활해지지 않는 지점이 오면 Learning Rate 값을 감소시켜 학습이 계속 이루어지게 한다 그리고 이때 Learning Rate을 서서히 감소시키는 것을 Learning Rate Decay라고 하며 Learning Rate을 감소시키는 방식을 바로 Learning Rate Schedule이라고 한다.
Learning Schedule 중 흔히 사용되는 방식이 바로 Step Schedule이다. Step Schedule 방식은 이름처럼 Learning Rate을 특정 epoch 마다 일정한 값만큼 감소시킨다. 이 방식은 간단하지만 언제 Learning Rate (이하 LR)을 감소시킬 것인지, 그리고 그때 얼마나 감소시킬 것인지 등의 추가적인 hyperparameter를 필요로 한다. 그래서 사람들인 보통 휴리스틱한 방식으로 Step Schedule을 위한 hyperparameter를 찾는다. 그렇기에 시간이 촉박한 등의 휴리스틱한 방식의 적용이 힘들 경우에는 보통 적용하기 힘든 LR schedule 방식이다.
그래서 이 강의를 찍었던 2019년즈음 나름 트렌드였던 방식이 바로 Cosine Schedule이다. 이 방식에서는 처음의 LR과 학습할 epoch만을 가지고 시간에 따라 LR을 코사인 함수의 $\frac{1}{2}$ 주기의 형태로 감소시켜나간다. 이 방식은 이전 Step Schedule에 비해 사용하기 훨씬 간결하다는 장점을 가지고 있다. 그리고 이때 LR이 감소하는 모습은 굳이 코사인 함수를 따를 필요가 없어서 여러 방식이 존재하는데
그중 하나가 바로 Linear Schedule이다. 이 Schedule 방식은 단지 LR을 선형적으로 감소시키기만 한다.
논문에서는 다양한 schedule 방식을 사용하지만 그중에 어떤 방식이 가장 좋은지 등을 알려주는 명확한 근거는 없으며 일반적으로 computer vision에서 Cosine Decay Schedule을 사용하고 NLP에서는 Linear Decay Schedule을 사용하지만, 이것도 그냥 해당 분야에서 전통적으로 사용했기 때문이다.
계속해서 알아볼 방식은 Inverse sqrt Schedule도 있는데 이는 초기 LR을 시간 $ = t$일 때 $\sqrt{t}$만큼 감소시킨다. 이 방식은 학습 초기에만 높은 LR 값을 사용한다는 특징이 있으며 널리 쓰이지는 않는다.
마지막으로 소개할 방식은 LR을 단지 상수값을 사용하는 것이다. 이 방식은 현재 일반적으로 가장 널리 사용되고 있으며 모델을 학습시키는 목적이 SOTA 모델의 성능에 도전하는 것이 아니거나 SGD Momentum 등의 방식이 아닌 RMSprop이나 Adam과 같이 LR 값을 보정해주는 optimizer를 사용하는 경우에는 이 방식을 사용해도 원하는 성능까지 무난하게 학습을 진행할 수 있다.
그리고 얼마나 학습을 진행해야 할지를 정하는 방식이 있는데 바로 Early Stopping이다. 이 방식은 과적합으로 인해 Train Accuracy와 Validation Accuracy의 차이가 증가하면 모델의 학습을 중단시키는 방식이다. Early Stopping은 모델을 학습할 때 항상 사용하는 것이 좋다.
이어서 모델의 Hyperparameter들을 어떻게 정해야 하는 가에 대해 알아볼 것이다.
먼저 사람들이 일반적으로 시도하는 방식은 Grid Search이다. 탐색할 hyperparameter들을 정하고 각 hyperparameter 들의 후보 값도 정한다. 이때 값은 보통 $\log_{10}x$ 규모의 값으로 정한다. 그리고 가능한 모든 값들의 조합을 모델을 학습시켜서 평가해보는데, 이 방식은 hyperparameter의 수가 증가하면 할수록 GPU의 자원이 지수함수적으로 증가하기에 현실적으로는 실현 불가능한 방식이다.
Grid Search 대신에 사람들이 많이 선택하는 방식이 바로 Random Search로 일단은 Grid Search와 유사하게 탐색해 볼 hyperparameter들과 그것들의 후보 값을 정하는데 이때 정확한 값들이 아니라 값의 하한과 상한을 지정하고 그 범위는 $\log_{10}x$ 규모로 정한다. 그리고 그 범위 사이의 값들을 랜덤하게 조합해서 평가를 진행한다. 그리고 지금까지 탐색을 진행하는 값의 범위는 로그 스케일이라고 했었지만, 모델의 크기나 drop out 확률 등과 같은 것들은 선형 스케일로 지정한다.
지금부터는 Grid Search와 Random Search 중, 어떤 것이 좋은 가에 관해서 알아볼 것이다.
2012년에 나온 한 논문에 따르면 Grid Search는 항상 grid 상에 위치한 값만을 탐색할 수 있다. 그래서 어떠한 hyperparameter가 다른 것들에 비해 매우 중요해서 더 많은 탐색을 진행해야 하지만 이를 놓칠 수 있는데, Random Search의 경우 Grid 상에 위치하지 않은 값들도 탐색을 진행하기에 상대적으로 추천된다고 주장하였다.
앞서 살펴본 Grid Search와 Random Search는 모두 모델을 완전히 학습시키고 평가하는 방식이라 많은 양의 GPU 자원을 요구했다. 그래서 지금부터는 대량의 GPU 자원 없이도 hyperparameter를 정하는 방법에 대해 알아볼 것이다.
최소한의 GPU만으로 Hyperparameter를 튜닝하는 방법은 다음 7단계로 이루어져 있다.
1. weight decay를 중단한 채로 1 iteration만을 학습시켜 loss가 해당 loss function의 기댓값만큼 나오는 지를 확인한다.
2. 모델의 optimization 과정을 관찰하기 위해서 5~10 mini batch 정도의 소규모 데이터에 100% train accuracy가 나오도록 모델 아키텍처를 조정해가며 정규화를 하지않고 과적합시켜본다. 만약 이때 loss가 감소하지 않는다면 LR이 너무 낮거나 parameter initialization이 잘못된 것이고, loss가 급증하거나 Not a Number로 나온다면 LR이 너무 높거나 parameter initialization이 잘못된 것이다.
3. 이전 과정에서 찾은 모델 아키텍처를 바탕으로 정규화를 적용해서 전체 학습 데이터를 학습해본다. 그래서 train loss가 100 iteration 내에 충분하게 감소하는 LR을 찾는다.
4. 3에서 찾은 LR을 기준으로 몇 개의 LR 후보 값과, 정규화 후보들을 grid 형태로 준비해서 1~5 epoch 정도 모델을
학습시켜본다.
5. 4에서 찾은 최고의 모델들을 가져와서 LR decay 없이 다시 10 ~ 20 epoch 정도 학습해본다.
6. 5에서 진행한 학습 과정의 Learning Curve를 살펴본다. 그리고 이를 바탕으로 이전 과정에서 찾은 hyperparameter grid를 조정해나간다.
7. 원하는 결과가 나올 때까지 5로 다시 돌아간다.
그리고 위 7단계 중 6단계에서 볼 수 있는 학습 상황별 Learing Curve와 대처법을 몇 개 추려보면
위와 같은 Curve가 대표적이다. 과거에는 위 과정을 관리하기 위해서 별도의 작업이 필요했으나 요즘에는 텐서 보드를 활용하면 쉽게 관리할 수 있다.
그리고 때로는 Update 규모와 parameter 값의 규모의 비율이나 gradient의 규모가 너무 크거나 작지 않은지 살피는 것도 도움이 된다.
동적 학습 기법은 이걸로 마무리하고 지금부터는 모델을 학습시키고 난 후, 무엇을 하면 좋을지에 관해서 알아볼 것이다.
먼저 모델 앙상블 기법이다. 이 방식은 여러 개의 모델을 학습시키고 그것들의 결괏값을 평균 내는 기법이다. 일반적으로 1~2% 정도의 성능 향상이 있다.
그리고 앙상블 기법에는 굳이 여러 개의 모델을 학습시키지 않고 하나의 모델만을 학습시킬 때 여러 개의 체크포인트를 저장한 후에 그 체크포인트들의 결과를 평균 내는 기법도 있다. 또한 모델의 parameter의 평균을 활용해서 SGD 등의 optimizer에서의 노이즈를 완화하는 방식인 Polyak averaging 방식도 있다.
계속해서 전이 학습에 관해서 배워볼 것이다.
일반적인 이미지 분류 등의 딥러닝 모델들은 대량의 데이터를 필요로 한다. 그래서 데이터를 구하기 쉽지 않은 도메인에서는 딥러닝 모델을 사용하는 것에 많은 어려움이 따르는데, 이 어려움을 완화할 수 있는 방식이 바로 전이 학습이다.
예를 들어 이미지 분류 작업에서 전이 학습을 사용한다고 할 때, 먼저 모델을 Imagenet 데이터를 사용해서 학습시키고 그 모델에서 마지막 레이어만을 제거한 모델을 통해 단순히 feature vector를 얻어내면 데이터가 부족한 작업도 적절히 처리할 수 있다. 만약 해당 도메인의 데이터가 어느 정도 존재한다면, 그 데이터에 대해서 다른 도메인의 데이터로 학습한 모델의 마지막 레이어를 원하는 작업에 적합한 레이어로 교체한 모델을 추가로 학습시키는 fine-tuning을 통해서 좋은 성능을 보여주는 모델을 만들 수 있다.
이미지 분류 작업에 대해서 전이 학습 시에 취할 수 있는 방법들을 정리해보면 위와 같다. 참고로 모델에서 'More specific', 'More generic'의 의미는 해당 레이어에서 생성되는 feature vector들의 특징을 의미한다.
전이 학습은 적은 시간과 GPU 자원, 그리고 적은 데이터만으로도 효과적인 성능을 보여주기에 머신러닝 분야에서 널리 쓰이고 있는 중이다.
마지막으로 이번 강의에서는 분산 학습에 관해서 다루는데 이 부분은 시간 상의 관계 대문인지 간략하게만 하고 넘어간다.
먼저 모델의 일정 부분마다 나눠서 GPU를 사용하는 방법이 있는데, 이 방식은 GPU가 사용되지 않는 부분에서는 GPU 자원이 그대로 낭비된다는 문제가 있다.
그리고 다음 방법으로는 모델을 병렬적으로 동작하게 하는 방법이 있는데, 이 방법은 GPU 간의 gradient나 activation 등을 동기화해주는 것이 쉽지 않다는 문제점을 가지고 있다.
마지막 방법으로는 모델을 각 GPU마다 독립적으로 메모리 상에 복사해서 서로 다른 데이터를 사용하지만, weight을 업데이트할 때는 서로 각자의 데이터로 얻어낸 gradient를 교환해주어서 하나의 동일한 gradient를 생성 및 이용해서 학습하는 방법이다. 이 방식은 mini batch의 크기를 크게 증가시킬 수 있으며 오늘날의 분산 학습의 주류를 이루고 있다.
그리고 분산 학습 시에는 mini batch의 크기가 당연히 커지지만 이 경우 LR의 크기도 그만큼 커져야 학습이 원활하게 이루어질 수 있다.
하지만 초기 학습 단계에서 LR의 크기가 너무 크면 loss 값이 폭발해버리는 수가 있다. 그래서 보통 LR을 0에서부터 선형적으로 증가시키는 Learning Rate Warmup 방식을 사용하기도 한다.
그리고 분산 학습 시에는 LR에 관한 것 말고도 위와 같은 주의사항들도 있다.
'Deep Learning for Computer Vision' 카테고리의 다른 글
EECS 498-007 / 598-005 Lecture 12 : Recurrent Neural Networks (1) | 2022.02.03 |
---|---|
빠르면 연말부터 이어서 포스팅할게요 ㅜㅜ (0) | 2021.11.25 |
EECS 498-007 / 598-005 Assignment #3-2 (1) | 2021.02.05 |
EECS 498-007 / 598-005 Assignment #3-1 (0) | 2021.02.03 |
EECS 498-007 / 598-005 Lecture 10 : Training Neural Networks (Part 1) (0) | 2021.02.02 |