본 포스팅은 2022-10-03(월), 국민대학교 김장호교수님의 컴퓨터 비전 수업을 통해 배운내용을 정리하기 위해 작성하는 게시글입니다.
# 한탄
인공지능, 컴퓨터 비전 수업 모두 초반기에는 이해가 꽤 됐는데 중반기에 접어들면서 수학적인 개념이 너무 많이나오니까 어려워졌다ㅠㅠ 이젠 마지막으로 미분해본게 4년전인데ㅠㅠ 엄청난 개념들이 쏟아져 나온다.
각설하고 이번시간에는 Gradient Descent와 Stochastic Gradient Descent에 대해서 배웠다. 천천히 되새겨 보자.
# 경사하강법 - Gradient Descent
이전시간에는 파라메타를 바꾸어가면서 최적의 파라메타를 찾아야 함을 알았다. 최적의 파라메타는 손실함수(Cost Function)의 값이 가장 낮은 값을 나타내주는 값이었다. MSE를 통해서 구한 손실함수는 오른쪽 그래프와 같이 표시됐다. Convex한 함수이기 때문에 어디가 최소값인지 한눈에 알아보기도 편했다. 그리고 우린 저 값을 구하라고 하면 손실함수를 미분해서 0인지점을 찾았을 것이다.
그러나 실제세계에서는 이렇게 미분계수가 0인지점을 찾는 것이 어려운 경우가 많다. 실제 보게 되는 함수는 Closed form이 아니거나 함수의 형태가 매우 복잡하여 미분계수와 그 근을 찾기가 어렵고, 실제로 컴퓨터로 미분계수를 구하는것보다 경사하강법을 이용하는 것이 더 쉽다. 특히 데이터의 양이 많아짐에 따라서 미분계수를 이용하면 n^3의 시간복잡도를 가지게 된다고 한다.
결국 경사하강법또한 함수 최적화(optimization - 함수의 최대값 또는 최소값을 구함) 방법 중 하나이다.
# 미분
위 그래프의 x축인 w는 찾고자하는 Weight(파라메타)를 나타낸다. y축은 손실함수(Cost Function)의 값이다. 그렇다면 y축이 가장 낮은 지점 즉, 손실함수가 가장 낮은지점을 찾아야하는 목적을 가지게 됐다.
이제 미분이 주는 의미를 생각해보자.
파란점 하나를 선택하고 그 부분을 미분해서 얻은 값은 Gradient(기울기)가 증가하는 방향이다. 우린 y축이 가장 낮은 지점으로 이동해야 한다. 그렇다면 기울기가 증가하는 방향의 반대방향으로 가게된다면 가장 낮은 지점이 나올 것이라는 생각을 할 수 있다. 그러면 그 방향(기울기가 감소하는)으로 이동하고 그지점에서 다시 미분을 해보자. 이러한 방법을 반복한다면 손실함수가 최소값이 되는 지점에 도달할 수 있지 않을까? 즉, 이러한 방법을 반복하여 w(x좌표)를 계속 갱신하면 결국 최솟값에 도달할 수 있다는 것이다.
-(마이너스) 를 곱해줌으로 반대방향으로 가게 w를 갱신해준다.
그러나 일반적인 상황에서는 여러 파라메타가 있기 때문에 w값이 한개가 아닐 것이다. 그렇다면 이러한 w를 편미분한 것을 벡터화하여 가지고 있는다.
# Learning rate
우리가 유도해낸 이 식에서 알파값은 Learning rate라고 한다. 즉 w값을 어느정도의 크기로 전진시킬것인지에 대한 값이다. 값이 크다면 당연히 더 크게 전진할 것이고, 값이 작다면 더 조금 전진할 것이다. 일반적으로 낮은값(0.01 or 0.0001)에서 출발한다고 한다.
이제 이 Learning rate에 따라 어떻게 전진하는지 봐보자. 너무 작은경우, 큰경우, 엄청 큰경우 세가지 예시를 살펴본다.
너무 작은경우(too small)은 매우 촘촘한 간격으로 이동할 것이다. 언젠가는 도착하겠지만 그만큼 많은 연산을 해야한다.
큰 경우(too large)는 마치 진동운동을 하듯 큰 간격으로 이동할 것이다. 아까 위에서 본 그림을 다시 봐보자. 4번을 보게 되면 아주 큰 스텝(step)으로 전진했기 때문에 우리가 맞춰야하는 곳을 지나쳐버렸다. 그 다음 번에 이동할때도 크게 이동해서 또 지나칠 것이다.
매우 큰 경우(much too large)는 예상 가능하듯 산으로 가버린다. 안으로 들어와야하는데 step을 이동할때마다 더 밖으로 나가버리게 되는 것이다. 그렇기 때문에 적절한 Learning Rate을 설정하는게 중요하고, 같은 모델을 사용했더라도 튜닝을 잘하는 사람은 이러한 값을 잘 조정해 더 좋은 성능을 내게 만들 수 있는 것이다.
시간이 지낼수록 학습을 잘하고 있는지를 나타낸 그래프를 살펴보자.
빨간색은 Learning rate가 매우 작은경우이다. 매우 천천히 가고있는 모습이고, 파란색은 너무 커서 산으로 가버리는 경우이다. 이런 경우에는 Learning rate를 낮추거나 높여서 good convergence가 되도록 해야한다.
# Stochastic Gradient Descent
손실함수(Loss Function)을 알아야지 Gradient Descent를 사용할 수 있다. 그러나 손실함수는 모든 트레이닝 데이터셋에서의 오차를 구해야만 알아 낼 수 있다. 데이터셋은 매우 많다. 매우매우 많고 많아질수록 연산은 매우매우매우매우 많아진다. 여기서 경사하강법(Gradient Descent)의 문제점이 나타난다. 모든 트레이닝 데이터셋으로 구한 손실함수를 사용해야하기 때문에 연산이 느려진다는 것이다.
이런 트레이닝 데이터의 전체를 batch training이라고 한다. 모든 Stochastic Gradient Descent(SGD)는 이런 모든 데이터를 사용하는 것이 아닌 single training example를 사용하거나 mini-batch를 사용하여 연산의 양을 줄이는데 사용한다.
그러나 stochastic gradient에서 single training example을 사용하면 노이즈가 많이 끼게 된다. 이러한 방법은 노이즈가 많이 끼기 때문에 mini-batch를 사용할 수도 있다.
노이즈가 끼지만 결국 옵티멀한 값에 도달 하는 이유는 아래와 같다.
결국 이렇게 mini-batch를 사용해도 모집단의 기대값과 같기 때문이다.
# critical point
경사하강법으로 critical point 즉 우리가 찾으려는 최소값을 찾는데 한가지 문제점이 있다. global한 위치를 찾아야 하지만 local지점의 최소값을 찾을 수 있다는 것이다. 경사하강법은 미분하여 감소하는 방향으로 w값을 갱신하는 것이었다. 즉 시작위치에 따라서 이동방향이 달라질 수 있는 것이다.
만일 빨간점(1번)위치에서 시작했다면 local minimum을 찾았을 것이고 초록점(2번)에서 시작했다면 global minimum지점을 찾았을 것이다.
Convexity 함수라면 당연히 global한 한 지점만을 찾을 것이다. 그 지점이 local이자 global일테니까 말이다.
# 참고