Info) 아래 포스팅은 LGAimers에서 제공하는 AI 전문가 과정 중 이화여자대학교 강제원 교수님의 [지도학습(분류/회귀)] 강의에 대한 요약과 생각들을 정리한 것입니다. 정리된 내용들은 강의를 토대로 작성되었으나 수강자인 저의 이해도에 따라 일부 틀린 부분이 있을 수 있다는 점 알려드립니다. 잘못된 점이 발견될 시에는 즉각 수정하도록 하겠습니다. 또한, 강의의 모든 내용을 정리하기는 어렵기 때문에 인상깊었던 내용을 중심으로 정리하였습니다. 따라서, 설명의 맥락이 끊길 수도 있다는 점 양해 부탁드립니다. 

0. Introduction

이번 part2는 linear regression에 대한 강의입니다. 선형회귀(linear regression)는 지도학습의 가장 기초적인 알고리즘이라 할 수 있습니다. 그래서 그 이론적 배경과 사용되는 concept이 다른 복잡한 모델들에 비해서 그나마 저에게 쉽게 다가왔습니다. 강의는 linear regression의 바탕이 되는 아이디어에 대해 짧게 설명하고 여러(?) 비용함수를 통해 linear regression을 optimization하는 과정을 중점적으로 다루었습니다. mean squared error와 gradient descent에 대해서는 기존에 linear regression을 공부하며 익히 들어보았지만 정확히 그 logic에 대해서는 잘 알지 못했던 터라 이번 강의가 굉장히 흥미로웠습니다. 확실히 머신러닝 분야는 어느 하나 허투루 넘길 수 있는 부분이 하나도 없는 것 같습니다. 앞으로 공부해야 될 것이 산더미인 것 같아 슬프기도 하지만 한편으로는 새로운 호기심을 끊임없이 자극하는 것 같아 설레기도 합니다.

1. Linear Model

linear regression의 기본적인 틀이라고 할 수 있는 linear model은 입력 feature와 모델 파라미터의 선형결합(linear combination)으로 이루어져 있습니다. 아래 수식의 가운데를 보면 theta(*기호를 어떻게 넣는지 몰라 그냥 말로 풀어 쓰겠습니다*)값과 x값의 곱의 합으로 구성되어 있는데 앞에 있는 theta는 모델이 최적화되는 과정에서 계속 바뀌게 되는 'model parameter'라고 부릅니다. 때로는 각 x값이 1증가하였을 때 output이 얼마나 많이 변하는지를 보여주기도 하기 때문에 'weight(가중치)'라고 부르기도 합니다. 일반적으로 linear model은 입력변수인 x에 대해 선형의 모습을 모이지만 반드시 그럴 필요는 없습니다. 아래 2번째 식처럼 x에 대해 커널 함수를 적용할 경우 입력변수는 비선형으로 바뀌게 되지만 매개변수인 theta에 대해서는 선형이 유지됩니다. 즉, h(x)의 linear model은 theta에 대해서는 선형이지만 x에 대해서는 그렇지 않다고 할 수 있습니다. 정확하게 기억이 나지는 않지만 BMI와 체지방률 사이의 선형회귀 모델이 아래 2번째 식과 같이 비선형적인 구조를 가진 것으로 알고 있습니다. 

출처: 강제원 교수님 강의자료

2. Cost function - Minimizing MSE

주어진 입력과 출력을 통해 추론한 linear model이 얼마의 오차를 가지며 데이터에 근접하게 fit되었는지 확인하기 위해 비용 함수(cost function)를 사용할 수 있습니다. 모델이 얼마나 좋은 성능(good)을 보이고 있는지 확인할 수 있는 지표라고 할 수 있습니다. 선형 회귀에서는 평균제곱오차(mean-squared-error)를 cost function으로 사용하고 있습니다. 여기서 잠깐 헷갈리는 부분 하나만 정리하고 가겠습니다. cost function과 비슷하게 사용되는 용어로서 손실 함수(loss function)가 있습니다. 둘이 의미상으로 비슷하여 혼용되어 사용되는 경우가 많은데 정확하게는 loss function은 각각의 값들이 가지는 오차를 말하고 이 오차들이 모여 이루어진 오차들의 합을 cost function이라고 구분할 수 있습니다. 제가 헷갈려서 적어놓고 가는 것이니 그냥 넘어가셔도 됩니다. 다시 본론으로 돌아와 mean-squared-error은 아래 식과 같이 정리할 수 있습니다. 왼쪽 식에 써져있는 것처럼 mse는 말그대로 오차의 제곱의 평균입니다. 오른쪽 식을 보게 되면 오차는 실제값에서 예측값을 뺀 것이라 할 수 있는데 모델이 좋은 성능을 보여 주어진 데이터에 잘 적합되었다면 이 오차가 0에 가까워질 것입니다. 그렇게 되면 cost function 또한 0에 가까워진다고 할 수 있습니다. 즉, 우리의 목표는 cost function인 mse를 최소화하는 것으로서 이를 충족하는 모델 파라미터 theta 값들을 찾아내는 것입니다. 

출처: https://suboptimal.wiki/explanation/mse/

3. Optimization - Normal Equation

우리의 목표는 이 녀석을 최소화하는 theta(여기서는 w로 표현되어 있는값)를 찾아내야 합니다.

그렇다면 이제는 어떻게 mse값을 최소화할 수 있는 최적의 theta들을 찾아낼수 있을지 고민해봐야 합니다. 이를 위해 최소제곱법(least squared method)을 활용할 수 있습니다. 이때 문제를 해결하는 방적식을  nomal equation이라고 하며 그 유도 과정은 복잡하여 여기서는 생략하도록 하겠습니다. 어쨌든 어쩌어찌 방정식을 잘 풀어내면 최적 파라미터 theta에 대한 식을 만들어 낼 수 있습니다. 아래와 같이 X의 의사역행렬(pseudoinverse)값에 y를 곱한 값으로 정의될 수 있습니다. 

출처: http://mlwiki.org/index.php/Normal_Equation

하지만 이러한 normal equation 방법으로 최적의 파라미터값을 찾아내는 것은 현실적으로 쉽지 않을 때가 많습니다. 가령, 데이터의 sample 숫자가 늘어나는 경우 X의 inverse값을 계산하는데 복잡하여 너무 오랜 시간이 걸리게 됩니다. 또한, X의 역행렬이 존재하지 않을 경우도 있습니다. 이러한 문제를 해결하기 위해 경사하강법(gradient descent)을 활용할 수 있습니다.

개인적으로 gradient descent는 머신러닝/딥러닝 알고리즘들의 기초가 되는 핵심적인 방법론이지 않을까 생각됩니다. gradient descent의 이론적 아이디어에 대해 간단히 말씀드리면 iterative(반복적)하게 최적의 파라미터 theta를 찾아가는 과정이라고 할 수 있을 것 같습니다. 

4. Optimization - Gradient Descent

경사하강법(gradient descent)에서의 descent는 '함수의 변화도' 또는 '기울기'입니다. 즉, 함수를 미분하는 과정에서 얻는 값으로 해당 함수의 변화하는 정도를 나타내는 값이라 할 수 있습니다. 바로 이 descent가 경사하강법의 핵심적인 아이디어입니다. 함수의 기울기는 함수의 최대값 또는 최소값에서 0이 됩니다. 이 원리를 이용하여 mse가 최소가 되는 지점을 찾아낼 수 있는 것입니다. 정리하자면 기울기가 0이 되는 지점 혹은 함수의 변화가 큰 방향으로 이동하다 더 이상 변화가 이루어지지 않는 지점까지 iterative(반복적)하게 이동하는 것이 gradient descent라고 할 수 있습니다. 아래 왼쪽 그림은 제 설명을 잘 표현해준 그림입니다. 물론 여기서는 cost function이 간단한 2차함수 형태이기 때문에 gradient가 0이 되는 지점이 전역해(global optimum)라고 당당히 말할 수 있습니다. 하지만 실제로 cost function은 오른쪽 그림처럼 복잡한 형태를 가지게 됩니다. 따라서, gradient 값이 0이 되어 학습을 종료했는데 알고 보니 안장점(saddle point)이거나 지역해(local optimum)인 경우가 있습니다. 그래서 이를 해결하기 위한 고민이 또 이루어져야 하는데 이는 다음 시간에 알아볼 예정입니다. 

출처: https://sebastianraschka.com/faq/docs/gradient-optimization.html

gradient 값을 구한 후에는 이를 계속 파라미터 theta값에 업데이트 해야 합니다. 이때 단순히 업데이트하는 것이 아닌 학습률(learning rate)인 알파값을 곱하여 업데이트하게 됩니다. 이는 업데이트 속도를 조절하기 위한 것으로 local optimum에 빠지지 않기 위한 방지책입니다.학습률(learning rate)는 사용자가 직접 지정해줘야 하는 하이퍼 파라미터값으로 learning rate가 너무 작으면 최소값으로 수렴하는데 너무 많은 시간이 걸리게 되고 반대로 learning rate 값이 너무 크면 값이 수렴하지 못하고 발산하게 됩니다. 따라서 적절한 learning rate를 지정해주는 것이 중요하며 이는 hyper parameter tuning의 과정을 통해 찾아낼 수 있습니다.  

출처: 강제원 교수님 강의자료

아래 그림은 하이퍼 파라미터인 learning rate의 크기에 따라 학습이 어떻게 진행되는지 보여주고 있습니다. 

출처: https://www.codingninjas.com/codestudio/library/nesterov-accelerated-gradient

마지막으로 gradient descent algorithm을 정리하자면, 임의의 theta에서 시작하여 cost function이 최소가 될 때까지 계속 theta를 업데이트 해나가며 최적의 파라미터 theta를 찾아내는 것이라고 할 수 있습니다. 물론 그 과정에서 지역해에 빠지거나 시간이 너무 오래 걸린다는 단점이 존재하게 됩니다. 이번 시간은 여기서 마무리하고 다음 차시에서 앞서 언급한 문제점들을 해결하는 다양한 gradient descent algorithm의 변형들을 살펴보겠습니다. 

+ Recent posts