www.youtube.com/watch?v=CO3-sFmADfI
Part 1
모델은 트레이닝과정에서 Loss function을 최적화시키면서 훈련된다.
여기서 Optimization에 대해 살펴보자.
파라미터 $\theta$는 다음과 같이 업데이트 되는데, 파라미터가 간단하게 2차원이라 했을 때 시각화한 그래프는 위와 같다.
위의 그래프에서 검은 점이 최소의 점을 향해 업데이트되는 과정을 optimization이라 한다.
알고리즘은 두 가지 단계를 거치는데, 최소점으로의 방향을 찾고 적절하게 업데이트 시키는 과정이다.
여기서 $\alpha$는 얼마나 업데이트를 시킬 건지를 말한다.
가장 널리 알려진 최적화방법인 Gradient Descent에 대해 알아보자.
말그대로 Gradient(각 파라미터에 대해 미분한 값을 모아놓은 벡터라고 생각)의 반대방향으로 최적화시키는 방법이다.
Gradient descent방법을 시각화하면 다음과 같다.
나이테처럼 생긴 것을 contour라 하는데 같은 contour에 있다면 $L(\theta)$가 같은 값을 가진다.
위와 같이 파라미터에 Gradient를 빼가며 다른 contour로 이동하며 minimum으로 향하는 방법이 Gradient Descent 방법이다.
🌟 하지만, 여기서 문제가 있다. 적절하게 minimum으로 이동하면 best겠지만 항상 원하는 대로 이동하지 않는다.
위와 같이 gradient를 계속해서 빼서 최적화하는 방법은 최선책이 아닐 수 있다.
예를 들어, 왼쪽의 그래프와 같이 Loss function이 생겼다면(convex라고 보통 불리는 형태), 어떤 점에서 시작하더라도 최적의 점을 쉽게 찾아갈 수 있다.
여기서 Convex란 그래프 위의 두 점을 이은 선이 항상 그 그래프보다 위에 있는 경우를 말한다.
보통 Convex에서는 Gradient descent를 통해 최적의 해(Global optimum)을 찾아간다.
하지만 이런 경우는 실제 딥러닝 훈련과정에서 흔치 않을 것이다.
간단하게 생각해봐도 많은 레이어, 많은 파라미터를 가진 모델에서의 Loss function은 위와 같이 단순한 그래프로 나오지 않을 것이다. 사실 시각화도 쉽지 않다. (오른쪽과 같이 이를 시도한 논문이 있긴 하지만...)
굳이 시각화해보자면 절벽처럼 생긴 중간의 모형과 같다. 볼 수 있듯이 하나의 optima를 갖지 않고 많은 local optima를 가지게 된다. 하지만 skip connection을 가진 모델은 오른쪽과 같이 단순한 형태를 가질 수 있다고도 한다.
Loss function의 lanscape를 더 자세히 알아보자.
1. Local optima
첫번째로는 Local optima가 있다.
사람들이 neural network에 대해 걱정하는 주 이유중 하나이기도 한다. 이러한 local optima에 빠지면 global optima를 찾아가기 힘들기 때문이다.
하지만 놀랍게도 파라미터의 수가 늘어나면서 이러한 이슈가 줄어들고 있다고 한다.
위의 히스토그램을 보면 hidden layer의 수가 많아질수록 굉장히 loss가 적은 곳에 분포하는 것을 알 수 있다.
2. Plateaus
아래의 그림처럼 굉장히 flat한 영역을 뜻한다.
이는 learning rate를 마냥 작게만 할 수 없는 주된 이유이기도 한다. learning rate가 작으면 영원히 plateau에 갇힐 수도 있기 때문이다. Momentum을 사용하여 이를 예방하는데 뒤에서 더 자세히 다루게 된다.
3. Saddle Points
말의 안장처럼 생겨서 Saddle points라 불리는 점인데, 축에 따라 min이 될수도, max이 될수도 있는 점이다.
여기서 gradient는 매우 작기 때문에 그만큼 빠져나오기가 힘들게 된다.
미적분학에 나오듯이 Critical point는 미분값이 0인 point를 뜻한다. 이는 min, max 그리고 saddle point 모두가 될 수 있다. min인지 max인지 구분하기위해 두번 미분값의 부호를 이용하게 되는데 만약 고차원에서라면 두번 미분한값들을 가지고 있는 Hessian Matrix를 가지고 판단한다.
여기서 Saddle point는 아래와 같이 양수와 음수의 diagonal entries의 Hessian matrix를 가진다.
(min point는 diagonal entries가 모두 양수, max point는 모두 음수여야 한다.)
😂 그럼 어느 방향으로 최적화를 해야할까?
Part 2
앞에서 다룬 최적의 방향은 사실 Newton's method를 가지면 지름길을 찾을 수 있다.
Newton's method는 Taylor series에서 아이디어를 얻은 optimization 방법으로 다음과 같다.
하지만 Neural Network에서는 사용할 수가 없다.
왜일까? 👉🏻 예상할 수 있듯이 시간때문이다.
위에서도 말했듯이 만약 n-dim의 파라미터라면 Hessian Matrix는 nXn matrix가 되고 역행렬을 구할 때는 $O(n^3)$가 된다. 딥러닝 모델에서 n은 보통 몇일까? 아마 1000은 넘을 것이다. 그말인 즉슨 이러한 역행렬을 구하는 시간은 천문학적인 시간이 된다...
그럼 어떻게 조금 더 "빨리" 최적화를 할 수 있을까?
먼저 몇개의 gradient를 평균낸 방향으로 update하는 방식을 생각할 수 있다.
이러한 방법을 시각화하면 아래의 녹색 선과 같다.
위의 녹색 선, 즉 몇개의 방향을 통합한 선은 Momentum방식을 뜻한다.
아래의 식을 보면 전에 그 setp에서의 gradient만 사용하던 과정에서 나아가 이전의 step을 통합하여 새로 방향을 설정한 것을 볼 수 있다.
여기까지 Update 방향에 대해 알아보았다. 그럼 이제 얼만큼 가야하는지 Scale에 대해 알아보자.
직관적으로 생각해보면 처음에 성큼성큼 갔다가 나중에는 아주 세심하게 Update를 해야 optimum을 지나치지 않을 것이다.
이러한 아이디어를 알고리즘으로 알아보자.
(아래 부분들은 강의만으로 이해하기가 어려워 다른 글들을 참고하였다.)
1. AdaGrad
Learning rate가 너무 작으면 최적화에 시간이 오래 걸리고 크면 발산할 가능성이 있다.
이를 위해 Learning rate를 decay시키는 방법이 AdaGrad이다.
💫 $s_k$는 기존 gradient의 제곱이 계속해서 누적으로 더해지는 값이고 이러한 $s_k$의 sqrt값을 나누어준 뒤 파라미터 업데이트를 하게 되는데 이는 스텝이 커질수록 $s_k$값이 커지기 때문에 이를 sqrt값을 취해 나눠주는 방식을 통해 스텝이 커짐에 따라 업데이트되는 정도가 줄게 된다.💫
👉🏻 하지만 이로인해 자연스럽게 스텝 수가 매우 커지다보면 업데이트가 거의되지 않는 경우가 생긴다. 이러한 문제는 RMSProp에서 개선된다.
.
2. RMSProp
앞서 배운 AdaGrad은 스텝수가 커지게 되면 업데이트가 되지 않을 수 있다. AdaGrad는 간단한 convex problem에서는 잘되지만 사실 딥러닝 loss function은 단순하지 않기 때문에 AdaGrad가 잘 작동하지 않는 경우가 대다수다.
이를 개선하는 방법 중 하나가 RMSProp이다.
👉🏻위의 식을 보면 $s_k$ 업데이트 부분이 AdaGrad와 조금 다름을 알 수 있다.
AdaGrad가 단순히 Gradient의 제곱을 누적하는 것과는 달리, RMSProp은 새로운 파라미터($\beta$)를 추가하여 최신 기울기가 더 크게 반영되는 방법을 택하였다.
3. Adam
Momentum과 RMSProp를 합친 방식이 Adam이다.
$m_k$는 gradient값과 이전의 모멘텀의 combination으로 업데이트되고
$v_k$는 gradient의 제곱값과 이전의 속도의 combination으로 업데이트된다.
여기서 한번 더 계산을 거쳐 최종적으로는 $\hat{m}_{k}$와 $\hat{v}_{k}$를 업데이트에 사용하는데
이는 초기에 값 m, v의 값이 작으므로 보정해주는 역할을 한다.
Part 3
앞에서는 Gradient descent 방법에 대해 다루었다. 하지만 이를 곧바로 딥러닝에 적용하는 것은 적절하지 않다.
모든 데이터를 이용해서 Gradient desncent를 한다면 계산양이 어마어마할 것이다. 가장 널리 알려진 ImageNet만 해도 1.5m의 이미지를 가지기 때문이다.
위의 식에서 $L(\theta)$를 모든 데이터를 이용하여 계산하는 Loss function이라 하면 1.5m의 이미지를 이용해서 계산하는 과정은 엄청난 시간이 소요될 것이다.
🌟 이때문에 일부 데이터만 이용해서 업데이트하는 방식이 Stocahstic gradient descent이다.
통계에서 모집단을 이용해서 평균을 구하는 방식과 맥락이 비슷하다고 할 수 있다.
더 자세히 알아보자.
Stochastic gradient descent는 다음의 방식을 따른다고 할 수 있다.
먼저 전체 데이터셋($N$)에서 일부 샘플($B$)을 랜덤하게 고르고 이 샘플을 이용한 gradient descent방법을 사용한다.
하지만, 사실 매 스텝마다 랜덤하게 샘플을 고르는 것은 메모리때문에 비효율적이다.
👉🏻 이때문에 실제로 Stochastic gradient descent를 사용할 때는 데이터셋을 미리 한 번 섞고 난 후 배치들을 구성하는 방식을 사용한다. 이는 계속해서 데이터의 순서가 같으므로 "True" Gradient descent방법은 아니지만 계산측면에서 매우 효율적임을 알 수 있다.
그렇다면 여기서 Learning rate는 어떻게 설정해야 할까?
다음의 그래프를 보자.(1 epoch = dataset 전체를 한 번 훑는 것)
Epoch가 갈수록 각 그래프가 어떻게 수렴하는지에 대해 다룬다.
- 빨간색의 그래프(learning rate를 적절히 가졌을 때)는 epoch를 거듭할수록 loss가 계속해서 낮아지는 것을 볼 수 있다.
- 초록색의 그래프는 learning rate가 낮은 경우로 loss가 느리게 줄어드는 것을 볼 수 있다. 이러한 경우 위에서 언급한 Plateau와 같은 영역에 갇히는 최악의 경우가 일어날 수 있다.
- 노란색의 그래프는 learning rate가 큰 경우로 몇번의 epoch후 loss가 더 줄어들지 않는 상황이 일어날 수 있다. (optimum 근처에서 오버슈팅할 가능성이 있기 때문이다.)
그럼 Learning rate가 갈수록 작아지는 경우는 어떨까?
아래는 Learning rate를 조정하는 ImageNet의 Training과정이다.
이러한 전략은 보통 효과적인 편이다. 앞서 배운 ADAM 등이 대표적인 전략 중 하나이다.
특히 ADAM은 튜닝이 매우 쉽다고 한다.
이러한 튜닝에 대해 알아보자.
하이퍼파라미터를 어떻게 정해야 최적의 해를 찾을 수 있을까?
앞서 말한 배치사이즈는 사실 클수록 적절한 gradient를 계산할 수 있지만 계산량이 크다는 단점이 있다.
(교수님은 배치사이즈가 커서 문제가 되는 경우는 보지 못했다고 한다.)
Learning rate는 크게 설정한 후에 시간이 지날수록 작아지는 것이 좋다.
Momentum은 보통 디폴트로 설정된 값을 쓰는것이 무난하다.
Stochastic Gradient descent와 Regularization간의 관계는 복잡한데 몇몇은 SGD를 정규화의 일종으로 보고 Validation loss에서 튜닝해야한다고 한다. (나 또한 석사시절 배울 때 SGD가 Overfitting을 어느정도 예방하는 regularizer의 역할을 한다고 배웠다.)
참고 : ucsd.tistory.com/50
'개발 > UC Berkely CS182' 카테고리의 다른 글
[Lecture 7] Initialization, Batch Normalization (0) | 2021.05.02 |
---|---|
[Lecture 5] Backpropagation (6) | 2021.04.18 |
[Lecture 3] Error Analysis (2) | 2021.04.04 |
[Lecture 2] Machine Learning Basics (2) | 2021.03.28 |
[Lecture 1] Introduction (2) | 2021.03.20 |
댓글