본문 바로가기
Machine Learning

6. 머신이 학습하는 알고리즘 (Gradient descent algorithm)

by 대소니 2016. 7. 5.


지난번에 Cost 함수에 대해서 알아보았습니다.

이번에는 Cost 함수를 minimizing 하기 위한 알고리즘에 대해서 알아보겠습니다.

이 알고리즘의 이름은 Gradient descent algorithm이라고 합니다. 변역해서 이야기 하면 경사면을 하강하는 알고리즘이 되는데 실제로도 그렇습니다.


우리는 기본이 되는 linear regression에서 하나씩 살펴보고 있지만 실제로 이 알고리즘은 여러 다양한 분야에서 범용적으로 사용이 되는 알고리즘입니다. 중요하다는 뜻이 되겠습니다.


Cost 함수를 minimizing하기 위한 방법중에 하나인 이 Gradient descent algorithm은 이미 알고 계시듯이 우리가 목표로 하는 직선을 찾기 위한 방법이되고 이를 머신이 학습한다고 표현합니다.


현재까지 배운것을 아래와 같이 요약정리 할 수 있습니다.

Cost 함수인 J함수는 두개의 parameters를 가지고 있으며 우리가 원하는 목표는 이 Cost가 minimization되는 파라미터로 구성된 함수를 찾는 것입니다. 이 함수를 찾을때까지 우리는 두개의 파라미터를 변경해 가면서 J함수를 줄여가도록 할 것입니다.



J함수를 3차원으로 그려보면 아래와 같이 나타나는 경우도 있을 것입니다.

봉우리가 2개이상이 있는 그래서 골짜기 같은 것도 보여지는 함수인가 봅니다.

여기서 왼쪽 봉우리 쯤에서 시작을 한다고 생각을 해보면 경사면을 따라서 하강을 한다고 했으니 아래와 같은 경로로 내려와서 최저점에 도달하게 될 것입니다.



만약, 조금 다른 위치에서 시작한다고 가정을 해보면 위와는 다른 경로로 최저점에 도달한다는 것을 볼 수 있습니다.

결국 최저점이 다른 2개의 지점으로 생기게 되는군요. 이러면 안될거 같은데 뭔가 이상합니다. 이러한 최저점을 local optimum 혹은 local minimum 이라고 합니다. 우리가 원하는 목표는 global optimum 이겠지요?



위의 함수를 수학적으로 표현을 해보면 아래와 같습니다.

여기서 등호 비슷한 := 이 표현은 프로그램의 할당(Assignment)와 같습니다. 즉, 기호 오른쪽의 값(value)을 왼쪽의 항목에 할당(준다)한다는 의미로 오른쪽의 값과 동일한 값을 왼쪽 항목이 가지게 됩니다. 그냥 값을 오른쪽에서 왼쪽으로 전달해주는 겁니다.


그리고 빨간색으로 표기된 알파는 learning rate라고 합니다. 이것은 경사면을 따라 내려올때 한 걸음에 해당하는 step을 나타내는 기호입니다. 이 값이 크면 한걸음의 보폭이 커질 것이고, 작아지면 총총걸음이 되는 것과 같습니다.


그다음에 알파 뒤에 있는 구분은 고등학교때 배운 미분(편미분)인데 이것은 뒤에서 설명을 하게 됩니다. 그냥 J함수를 미분을 하는가 보다 생각하면 됩니다.


여기서는 경사면을 따라서 한걸음 내려오는 행위를 수학적으로 생각하면 두개의 파라미터인 세타zero와 세타one의 값이 변경되면서 Cost가 한단계 줄어드는 것과 같습니다. 그런데 Cost 함수(J)는 두개의 파라미터를 가지고 있기 때문에 두개의 파라미터 값이 동시에 변경되고 Cost가 산출이 되어야 합니다. 이것을 Simultaneous update라고 합니다. 



만약에 아래 그림의 오른쪽으로 나타낼 수 있는것처럼 세타zero가 값이 먼저 바뀌고 Cost를 구하게 된 이후에 세타one의 값이 바뀐다고 하면 어떻게 될까요? Cost 함수가 하나의 파라미터 값만 바뀌고 움직이고 또 다른 하나의 파라미터 값이 바뀌고 또 움직이고 마치 짝다리 걸음을 하는 것 같은 이상한 모양새가 될 것 같습니다. 이렇게 되면 안된다라는 의미가 됩니다. 이는 구현시에 참고해야 할 내용이 됩니다.




자 이제 다시 Gradient descent algorithm을 봅니다.

아래 수식을 잠깐 보면 한점에 도달할때까지 이 식을 반복된다고 합니다. 그리고 마이너스 알파(learning rate)과 J를 미분하는 식(derivative:편미분), 그리고 파라메터인 세타zero와 세타one이 동시에 업데이트가 되어야 한다고 되어있습니다. 간단히 나타내기 위해서 세타one만 조금더 살펴봅니다.



만약에 세타one 파라미터의 값이 최저점보다 크다(오른쪽에 위치)라고 생각해보면 아래 그림의 위쪽 그래프와 같이 됩니다. 이때 J함수를 미분을 하면 빨간선과 같은 기울기가 됩니다. 미분은 기울기 맞죠?

경사도를 따라 내려가는 알고리즘이니까 기울기를 따라 왼쪽으로 이동하게 됩니다. 이때 알파 뒷부분의 공식은 positive number, 플러스 수가 되는데 앞에 마이너스가 붙어 있으니까 theta값이 줄어듭니다.


이번에는 세타one 파라미터의 값이 최저점보다 작다(왼쪽에 위치)라고 생각해봅니다. 아래 그림의 아래쪽 그래프가 보이시죠. 미분한 기울기는 반대 방향의 마이너스로 생기게 됩니다. 역시 경사면을 따라서 내려오면 오른쪽으로 이동하게 되겠네요. 이때 알파 뒷부분의 공식은 negative number가 됩니다. 앞에 마이너스가 있으니 플러스 값이 되어 더해지겠네요. 그래서 오른쪽으로 이동하게 됩니다.


결국 어느 점에서 시작하더라도 최저점을 향해서 잘 찾아 움직이는 것 같습니다. 이것이 미분으로 생긴 공식이 하는 역활입니다.



이번에는 알파에 대해서 알아보겠습니다.

경사면을 내려오는 step이라고 했었는데 너무 작으면 아래 그림의 위쪽 그래프와 같이 총총걸음으로 하염없이 오래 내려옵니다. 반대로 너무 크면 아래쪽 그래프와 같이 최저점을 찾지 못하고 양쪽을 오락가락 하다가 스탭이 꼬여서 거꾸로 올라가 버리는 경우도 발생한다고 합니다. 우리가 원하는 것은 한점으로 이동하는 것(converge)인데 반대로 분산되는 것(diverge)처럼 됩니다.



만약 아래 그림과 같은 함수가 있을때 세타one에서 시작을 한다고 생각을 해보면 (파라미터가 하나이고 세타one의 위치가 곧 local optima 위치가 동일합니다) 어떤일이 발생할까요? 한번 생각해보시겠습니까? 원 강의에서 나오는 문제입니다^^



이번에는 알파에 대해서 좀더 알아보겠습니다.

알파는 learning rate이고 step인데 만약에 이 알파 값이 고정되었다면 어떻게 될까요

알파 값은 뒤에 미분으로 나타나는 식과의 곱하기입니다. 미분 값, 즉 경사도가 가파를 수록 크고 경사도가 작아질 수록 작아지게 될 것입니다. 곱하기를 하니 알파 값이 고정이라도 움직임이 점차 내려오면서 같이 작아질 것 같습니다. 아래 그래프의 표시처럼 말입니다. 별도로 알파 값을 조절하지 않아도 이 식에서 자연스럽게 적절한 값으로 조절이 되니 신통방통합니다. 멋진 알고리즘인 것 같습니다





이제 거의 다왔습니다. 배운것을 정리를 하면서 중요한 점 하나만 보면 끝이납니다.

Linear regression에서 h 함수를 만들었고, J함수를 봤습니다. 이 J 함수를 우리가 원하는 minimizing 하기 위한 알고리즘이 지금 공부하는 Gradient descent algorithm이 되겠습니다. 




이 알고리즘의 미분식에 대해서 조금 더 보면,

두개의 파라미터로 구성이 되어 있고 이것을 각각의 파라미터로 편미분을 하면 아래와 같이 두개의 식이 만들어집니다. 일단 h 함수를 대입해서 일차방정식을 넣고 이것을 처음 세타zero로 편미분을 한 것이 아래 위쪽 식이 되고 다음 세타one으로 편미분을 하면 맨밑에 식이 됩니다. 


편미분을 하게 되면 제곱은 곱하기로 내려오고 2 * 1/2m이 되어 결국 1/m이 된 것입니다. 그리고 세타zero는 원래 상수 였기때문에 x 변수가(input data) 사라지는 것이고 세타one으로 미분한 것은 x 변수가 살아있는 것이 두 식의 차이점입니다.



어찌되었든간에, 결국 두개의 파라미터 세타zero와 세타one은 동시에 업데이트 되어 경사면을 내려오게 만든다는 것이고 위에서 본것처럼 아래와 같은 굴곡있는 함수의 경우 다른 점(local optima)로 내려가는 이상한 현상이 생길 수 있다는 것입니다.



그래서 우리는 아래와 같이 하나의 최저점을 가지고 있는 활 같은 모양(bow shaped function)을 선호하며 위의 굴곡있는 함수가 만약 있다면 아래와 같은 이쁘게 구부러진 모양의 함수로 만들어야 한다는 것이 핵심입니다. 그래야 우리가 원하는 global optimum를 찾을 수 있고 이것을 잘 찾는 알고리즘이 좋은 알고리즘이 됩니다. 잘 찾았다면 결과도 아주 잘 예측할 수 있는 것이기도 하게 되겠습니다.



이제 등고선으로 표현을 해보면 아래와 같습니다. 한번 본적이 있었져?

오른쪽 동고선에 빨간점에서 시작을 합니다. 조금씩 움직이면서 이때의 파라미터로 구성이 되는 h 함수를 그리면 왼쪽의 직선처럼 되는데 실제 데이터와 조금 다르기 때문에 Cost가 아직 큽니다.



이렇게 계속 동시에 파라미터가 변경이 되면서 등고선의 중앙(global optimum)에 다다르게 되면 이때의 파라미터가 구성하는 h 함수 일차방정식인 직선을 그려보면 아래와 같이 되고 이것은 실제 결과 값과 거의 비슷하므로 우리가 찾는 것이 됩니다. 잘 찾았다는 것은 잘 학습을 했다는 것이 되겠습니다.



이와 같이 반복적으로 움직이고 판단하고 다시 움직이는 알고리즘들을 batch라고 불른다고 합니다. 뭔가 조금 어색해 보이지만 그렇게 많이 쓴다고 하니 용어만 알아두면 되겠습니다. 그럼 batch가 아닌것도 있을까? 네 있다고 합니다. 나중에 다루는 것 같습니다만 위의 편미분을 한번에 수학적으로 풀수 있다면 여러 step을 반복하지 않아도 될 것인데 이러한 것은 일부 작은 dataset에서만 가능하다고 합니다.


우리가 하려고 하는 큰 스케일의 dataset에서는 지금 배운 Gradient descent algorithm이 보다 범용적으로 사용이 가능한 좋은 알고리즘이 되겠습니다.



여러분은 Gradient descent algorithm에 대해서 모든 것을 배우셨습니다.^^

긴 글 읽으시느냐고 수고하셨습니다

댓글