딥러닝을 배우면서 optimizer에 대하여 한번쯤은 듣게 될거다.
하지만 이게 정확히 뭔지 모르고 그냥 대충 Adam을 사용하면 된다~ 정도로 알고 있을거다.
그게 맞다....(?)
물론 초급적인 과정에서는 그게 맞다.
하지만 조금만 깊이 가면, transformer 까지만 가면 반드시 차이를 알아야 한다.
딥러닝에서는 다양한 알고리즘을 사용한다.
그리고 이 다양한 알고리즘에서 파생된 여러가지 종류의 레이어가 있다.
가장 대표적인 것이 다음 3가지다.
활성화 함수, 손실 함수, 최적화 함수
이 세가지는 정확하게 이해해야한다.
안그러면 서로 헷갈리기도 하고 자꾸 찝찝한 마음이 들거다.
여기서 최적화 함수가 다른말로 옵티마이저. optimizer 이다.
정의
옵티마이저를 한줄로 정의하면
'최소의 loss로 학습하는 방법을 찾는 최적화 알고리즘'이다.
위 그림은 우리가 고등학교때 지겹도록 보던 그림이다.
그리고 저 뾰족 내려온 최소값. 저걸 찾는 작업은 지겹도록 하던 작업이다.
이건 매우 쉬운 알고리즘을 가지고 해결할 수 있다. 2차 방정식이니까.
하지만 loss는 loss 함수를 통해서 plot 하게 되고, feature가 수없이 많기 때문에,
이 그림이 몇차원 더 늘어나고 더 복잡한 형태로 나오게 될 것이다.
그걸 계산하는 것이 이 optimizer의 역할이다.
다시 말하자면...
손실함수가 가장 적은 지점이 최적값 즉 해이다.
이 해를 구하는 것이 optimizer의 핵심적인 알고리즘이다.
위 그림의 최솟값을 구하려면 미분해서 0인 지점을 찾는다.
optimizer도 똑같은 방식을 사용한다.
n차 함수 형태인 손실함수의 최솟값을 구하는 방법은 미분해서 0인 지점으로 다가가는 것.
(미분 = 경사, 다가가는 것 = 하강법.)
이게 바로 경사하강법. Gradient Descent. GD이다.
SGD는 이런 optimizer 중에서 가장 처음 등장했다.
직역하면 확률적 경사 하강법으로,
기존 샘플 1개와 새로운 데이터로 최대 그라디언트 계산하여 최대 속도로 학습한다.
위 그림에서 보면 전체 데이터를 사용하는 것이 아니라 새로운 데이터를 랜던 선택한다.
따라서 아주 빠르고 자주 업데이트하는 옵티마이저이다.
SGD가 처음 등장하고 옵티마이저에 대한 다양한 연구가 되면서
더 빠르고 정확하게 최적의 해를 찾는 알고리즘이 나오기 시작했다.
가장 대표적인 두가지가 RMS와 모멘텀 이다.
RMS는 Root Mean Square의 약자로, 기울기에 따라 학습률을 조절해서 '정확도'를 높인다.
모멘텀은 관성 개념을 추가해서 지역 최솟값에 갇히지 않고 '탈출'할 수 있도록 한다.
이 두가지가 모두 적용된 옵티마이저가 바로 Adam 이다.
실전
그럼 실전에선 이를 어떻게 사용해야 할까?
둘 중에서 뭘 사용해야 할까?
헷갈리는게 정상이다.
답은 천천히 꼼꼼하게 검사하는 Adam이 가장 안정적이고 좋다.
그래서 대부분의 경우는 Adam을 사용하면 된다.
하지만 어떤 경우에서는 SGD가 유리하다.
효율적으로 학습이 필요할때 그렇다.
그래서 보통 딥러닝 특히 Transformer 분야에서는 이렇게 사용한다.
Pre-training = Adam / Fine-tuning = SGD
위 내용을 꼼꼼하게 읽었다면 이런 심오한 뜻을 이해할 수 있을 것이다.
끝.
'이론' 카테고리의 다른 글
FLOPs, #param, throughput 계산, 의미, 관계 (0) | 2024.03.19 |
---|---|
learning rate와 batch size 관계 (0) | 2023.11.07 |
오차 역전파(back propagation) 설명, 의미, 고찰 (0) | 2023.09.18 |