🔥 메타코드에서 머신러닝 입문 부트캠프 강의를 듣고 있다. 머신러닝 강의에서 그냥 무지성으로 돌렸던 코드에 대해 깊이 이해하고, 내 손으로 최적의 파라미터를 뽑아내고, 하이퍼파라미터 튜닝도 해보고 싶다. 지난 글에서는 선형 회귀의 다양한 종류와 손실함수, 최적화, 파라미터 등을 배웠는데.. 이번에는 복잡한 모델에서 최적의 파라미터를 찾는 경사하강법을 공부한다. 경사하강법 많이 듣긴 했는데, 이렇게 제대로 배우긴 처음이라... 지금 배워 놓은 것들이 나중에 꼭 도움이 되었으면 좋겠다. ㅠ
3. 최적화(optimization) - 경사하강법(Gradient Descent)
지난 글에서, 단순 선형 회귀는 MSE로 최적의 파라미터를 구했는데, 더 복잡한 식이 되었을 땐 어떻게 하는지에 대한 문제제기까지 정리했었다. 안 읽은 분은 이전 글을 읽고 오시라..
좀 더 복잡한 다중 선형 회귀, 다항 회귀, 비선형 함수 등을 사용하면 더 완벽에 가까운 모델로 만들 수 있을 것이라는 생각으로, 사람들은 복잡한 식에서 최적의 파라미터를 찾는 방법을 강구하게 되었다.
이 과정에서 나온 개념이 경사하강법(Gradient Descent)으로, 손실함수 값을 최소화 시키는 방향으로 계속 업데이트, 수정해 나가는 것이다.
손실함수의 최솟값은 무조건 순간변화율이 0이라는 점을 이용해서, 순간변화율(손실함수에 대한 미분값)이 0이 되는 방향으로 파라미터를 업데이트하기로 했다.
슈도 코드 논리 순서는,
1. 현재 파라미터에서 손실 함수에 대한 미분값을 계산한다.
→ a0이 3이라고 해보자.
2. 미분값의 반대 방향으로 파라미터 값을 업데이트 한다.
→ a0이 3일 때 0쪽으로 가려면 마이너스 방향으로 이동시켜야 한다.
△L/ △a0 = a1 이런 식으로 미분값을 다시 a1이라고 하면, 그때의 L값을 구할 수 있다. 1.5라고 해보자.
3. 미분값이 0이 될 때까지 1번 2번을 에포크(epoch)만큼 반복한다.
→ △a1을 1만큼 이동시키면, L은 1.5씩 달라지네? 그럼 조금 더 줄여볼까? 미분값이 0이 될 때까지 1, 2번을 반복한다.
이렇게 해서 a epoch가 최적값 a*와 최대한 유사하게 만드는 것이 경사하강법이다.
여기서 에포크는 하이퍼파라미터로, 인간이 정해줘야 하는 값이다.
보통은 미분값을 그대로 사용해 업데이트하지 않고, 학습률과 미분값을 곱한 값을 반영해서 파라미터를 조정한다.
이때 학습률은 하이퍼파라미터로 사람이 정해주는 값이다.
만약 계산한 미분값이 너무 크면, 너무 크게 왔다갔다해서 최저점을 중간에 두고 계속 왔다 갔다 하면서 수렴에 걸리는 시간이 매우 늦어진다. 반면 미분값이 너무 작으면 너무 천천히 이동해서 오래 걸림..
그러므로, 학습초기 또는 미분값이 작은 경우에는 학습률을 확 높여서 빨리빨리 최적값 근처로 이동시키고, 학습후기 또는 미분값이 큰 경우에는 학습률을 낮추어서 서서히 최적값에 다가갈 수 있도록 해주는 것이다.
학습률을 크게 하다가 작은 값으로 점차 변화시키는 걸 가지고 학습 스케줄러라고 부른다. 아래쪽 큰 그래프처럼 처음에는 크게 크게! 마지막에 가까울수록 천천히... 최적값에 다가가는 것이다.
스텝(step)은 업데이트 횟수를 말한다고 함. Multi-step Scheduler는 중간 위쪽 그림처럼, 손실함수를 그렸을 때 계단식으로 떨어진다. 반면 Cosine annealing scheduler는 코사인 그래프처럼, 부드러운 곡선을 그리며 떨어진다. 중간에 작게 그려진 그래프를 보면 됨!
기본적인 경사하강법은 전체 데이터셋을 활용한다. 데이터가 커지면 커질수록, 전체 데이터셋을 활용한 경사하강법은 계산 비용이 매우 커질 수밖에 없다..ㅠ 그래서 나온 방법 두 가지가 확률적 경사하강법, 미니 배치 경사하강법이다.
먼저, 확률적 경사하강법은.. 데이터가 엄청 많으니까 1개의 샘플 데이터만 뽑아서 업데이트 하고, 이걸 여러번(n) 반복하면 되지 않을까? 라는 생각으로 나왔다. 자세한 식은 강의 자료를 참고...! 단, 엄청 많은 데이터를 쓰는데 딱 하나의 샘플값만 뽑아서 업데이트 한다는 게... 좀 대표성이 없기도 하고, 파라미터도 너무 왔다갔다 할 수 있다는 단점이 있다.
전체 데이터셋을 다 조사할 수도 없는데, 샘플 뽑아서 하는 게 별로라고 하면 어쩌란 말인가?
여기에 대한 절충안으로 나온 게 미니 배치 확률적 경사하강법이다. 배치(batch)라는 개념을 도입했는데, 배치는 작은 데이터 꾸러미, 덩어리를 말한다. 작은 덩어리 덩어리로 뽑아서 확률적 경사하강법 개념을 적용시키면 단점은 보완하면서 큰 데이터셋으로 인한 계산 비용도 절약할 수 있으니까! 배치 크기를 조절해서 학습 속도와 정확성을 조절한다.
머신러닝은 비교적 단순한 식이라 기본적인 경사하강법으로도 괜찮지만, 보통 딥러닝에서 미니 배치 방법을 많이 쓴다고 한다. 결국에 딥러닝도 머신러닝의 일부이고 나중을 위해 이해해두면 좋다.
업그레이드 된 경사하강법에는 5가지 정도가 있다.
Adam은 적응형 경사하강법이다.
파라미터 a, b, c... z까지 파라미터의 개수가 많을 때, 특정 파라미터 a는 학습이 더이상 필요 없고 최적값에 있는 반면, b는 최적값이 아니고 학습이 더 필요한 상황이 있을 수 있다. 모든 파라미터가 동시에 학습 시작! 학습 끝~ 최적화 끝~ 이렇게 되는 게 아니라는 말씀!
이렇게 파라미터마다 학습 상태가 다르면, 학습률을 파라미터 별로 조정할 수 있다. 이를 적응형(adaptive)이라고 한다.
Momentum은 관성을 말하는데, 위 캡처에 있는 그래프를 보자. 아래쪽으로 구부러진 부분이 2번 있다. 완전 최적값(optimal)은 우측이고, 좌측 값은 조금 덜 최적값(sub-optimal)이다. 글로벌, 로컬 옵티멀이라고도 부른다.
이때까지 왔던 방향이 우측이니까 좌측으로 수렴하기 전에 우측으로 한 번 학습을 시도해보렴~ 관성에 따라~ 이런 느낌으로 진행하는 게 Momentum 방식이다.
매번 공부하는 시간은 꽤 긴데, 정리한 글을 보면 짧단 말이지? 흠... 그나마 다행인 것은, 다음 진도에서 나오는 부분은 빅분기에서도 많이 배우고 다루었던 내용이란 것이다 히히 >ㅁ< 담주는 회사 일이 엄청 바쁠 예정인데다 본가도 가야 하지만... 중간중간 시간 내서 힘내봐야지 🔥🔥
* 메타코드 서포터즈로서 강의를 제공받아 작성하였습니다. 이미지를 클릭하면 홈페이지로 이동합니다.
'빅데이터분석' 카테고리의 다른 글
[머신러닝] 메타코드 강의 후기_머신러닝 입문 부트캠프 (6) 편향과 분산의 Trade-off를 해결하는 방법 (1) | 2024.10.27 |
---|---|
[머신러닝] 메타코드 강의 후기_머신러닝 입문 부트캠프 (5) 편향과 분산(Bias and Variance) (1) | 2024.10.27 |
[머신러닝] 메타코드 강의 후기_머신러닝 입문 부트캠프 (3) 선형 회귀(Linear Regression)와 최적화(optimization) (1) | 2024.10.20 |
[머신러닝] 메타코드 강의 후기_머신러닝 입문 부트캠프 (2) 머신러닝에 사용되는 기본 수학 개념 (2) | 2024.10.13 |
[머신러닝] 메타코드 강의 후기_머신러닝 입문 부트캠프 (1) 인트로, 용어정리 (0) | 2024.10.13 |