리니어 리그레션

지금 미디어에서 거론되는 인공지능이나 머신러닝의 99%는 ANN(인공 다층 신경망)임. 그리고 ANN은 '리그레션(회귀)'을 통해서 통해 학습을 함. 그래서 리그레션을 이해하는 것은 아주 중요함. 물론, 그렇다고 인공지능에서 오직 리그레션만이 쓰이는 것은 아님. 하지만 핵심 학습 알고리즘들은 결국 리그레션이라고 보면 됨.


리그레션을 이해하기 위한 예시로 가장 간단한 것이 '리니어 리그레션'이기 때문에 많은 대학교에서 머신러닝의 가장 처음 단원으로 배우고 우리도 이걸 배울 것임.

리니어 리그레션의 목표는 주어진 데이터(파란점들)를 가지고 그걸 근사/모사하는 함수(빨간색 직선)의 기울기를 구하는거다. 공학 수학에서의 상관 계수를 구하는 것과 많이 닮아 있는데 상관 계수를 구하는 방법은 단순한 계산인 반면에 리니어 리그레션은 회귀적인 알고리즘이 들어감.


수식의 일반화

함수의 수식은 다음과 같이 표현될 수 있다:

f(x) = y = θ·x + b

기울기는 θ, 상수는 b이다.

상수 b도 1·θ로 바꿈으로써 기울기로 표현할 수 있다.


그러면 리그레션은 어떻게 데이터를 근사/모사/학습하는지 차례대로 알아보자.

1. 모델을 만들어낸다.

먼저 함수를 하나를 아무 근거 없이 만든다. 이것을 이제부터 '모델'이라고 부를거다. 그러면 우리의 모델은 아마 다음과 같은 모습을 하고 있을거다.


데이터와는 완전히 딴판인 엉뚱한 직선(함수)이 그려져 있고 이러한 경우에 '모델에 에러가 많다'고 말한다. 리그레션의 목표는 에러를 줄여, 그림2의 함수를 그림1과 같게 만드는 것이다.


내 모델과 실제 관측 사이의 에러
앞서 본 개념을 통해 모델의 수식을 다음과 같이 일반화해보자:

f(x) = y = θ·x + b + ε

ε은 에러를 나타낸다. 현재의 모델과 우리가 앞으로 만들어야할 이상적 모델 간의 차이라고 할 수 있다.


2. 기울기를 학습한다

리그레션에서 기울기를 학습한다는 것은 어떤 값을 θ에 더한다는 것이다. 예로 들자면:

y = -3⋅x + 12었을 때, 기울기에서 4를 더하고 상수에서 10을 빼서 y = 4⋅x + 2를 만드는게 우리가 하고자 하는 것이다.



ε가 작아지도록 모델의 기울기를 조정하려면 모델과 실제 데이터(관측값)와 내 모델의 예측값 사이의 차이를 통계적으로 계산하는 것이 필요하다. 여기에서 손실함수(Loss)와 비용함수(Cost)란 개념이 등장한다. 하지만 손실함수는 설명하지 않는다. 비용함수와 손실함수는 사실상 거의 같은 개념이다. 비용함수가 모든 데이터를 다룬다면 손실함수는 오직 한 개의 데이터와 내 모델의 에러를 다룬다.


비용함수

비용함수에는 여러가지 종류가 있으나 가장 간단하고 많이 쓰이는 MSE(Mean Squared Errors)를 배워보자.


MSE의 수식은 다음과 같다:

MSE = (1/n) × Σ(actual_yt – predict_yt)2

표기의 설명:

predict_y는 내 모델이 만들어낸 y값을 말한다.

actual_y는 실제 데이터의 y 값을 말한다. 이는 계산을 통해서 만들어진 것이 아니고 처음에 데이터를 생성할 때, 관측된 값이다.

n은 내가 가진 데이터의 총 갯수를 말한다.

t는 데이터의 인덱스를 말한다. 인덱스란 쉽게 말해서 그냥 순서라고 보면 된다.

Σ는 시그마로 t를 0에서부터 시작시켜 n이 될 때까지, 수식에 대입해 모두 더한다는 뜻.


만약 내 모델이 y = 4⋅x + 2이고 내가 비교하고자 하는 데이터의 x 값이 3이라면, predict_y의 값은 14가 될 것이다. 따라서 predict_y가 actual_y와 비슷할수록 내 모델의 성능이 더 좋다는걸 의미한다.

[2, 3, 4, 5]이란 배열이 있을 때, n은 4가 되고 원소 '2'의 인덱스는 0이 되겠다(0부터 카운트 한다). n이 크면 클수록 계산할 양은 늘어난다.

---


MSE는 결국 다음을 의미한다:

실제 y의 값과 내 모델이 만든 y의 값 사이의 차이(즉, 에러 ε)를 제곱한 뒤 평균(다 더하고 갯수만큼 나누기)을 낸다.


즉, 손실함수를 줄이면 줄일수록 내 모델은 에러가 줄어들고 결국 더 성능이 좋아진다. 따라서 MSE의 절댓값이 줄어드는 방향으로만 기울기를 변화시키면 내 모델의 성능은 좋아질 것이다.

이러한 과정을 머신러닝에선 '기계를 학습시킨다'라고 표현한다.


기계를 학습 시키는 알고리즘으로는 Gradient Descent Rule(경사 하강법)이 존재한다. 다른 알고리즘으로 Newton's Method도 있는데 이 방법은 local gradient 계산에서 saddle point에 걸릴 확률이 높아서 잘 안 쓰임. 간단한 문제에선 좋고 더 빠르지만 변수가 많고 복잡한 문제에선 성능이 떨어잔다고 생각하면 됨.


Gradient Descent Rule

GDR이라고 줄여서 부르겠다. GDR은 딥러닝에서도, 리그레션에서도 가장 중요한 개념 중 하나이다. GDR을 알기에 앞서 GDR에서 쓰이는 수학 개념을 알아보자.

그라디언트(Gradient):

그라디언트는 다변수 미적분학의 개념 중 하나이다. 쉽게 말하면 그냥 고등학교 때, 배운 '미분'이다. 근데, 그게 다변수인 상황을 다룬다. '다변수'란, 예를들어, y = a⋅x1 + c⋅x2 + b가 다변수 함수이다_함수에 들어가는 독립변수가 2개 이상, 종속변수는 1개인 경우를 말한다.


감이 잘 안 잡힌다면 그냥 gradient를 고등학교 때, 배운 순간 기울기나 접선이라고 생각하고 봐라. 그리고 나머지 내용도 다 그런식으로 설명할 것이다.

--


MSE는 제곱이 들어간 2차함수였다. 따라서 MSE를 그래프로 나타내면 아래의 그림과 같을거다. 이렇게 둥그런 곡선의 상황을 Convex 상황(저기서 x 대칭 시킨건 Concave라 함)이라고 부르며, 경사 하강법은 오직 convex나 concave 함수에서만 제대로 작동할 수 있음. 더 자세한 정의는 다음과 같음.

y 축은 Error라고 표기되어 있는데, 바로 MSE(x)의 값이다. 그리고 x축에 W로 표현된 것은 기울기 θ의 값이다. 이 그래프는 내 기울기 θ가 어떤 값이냐에 따라서 변하는 MSE(θ)의 값을 보여준다.


우리가 기계한테 학습 시키고 싶은 것은 MSE 함수의 저점의 θ이다. 인간은 대충 그래프만 그려주면 직관적으로 쉽게 저점(볼록한 부분의 가장 끝)을 찾을 수 있지만 기계는 그렇지 못함. 따라서 저점을 찾아줄 어떤 알고리즘이 필요한데 이게 바로 GDR임.

앞선 그림을 확대한 그림이다. MSE(θ)를 미분을 하면, MSE가 θ일 때의 순간 기울기 MSE'(θ)를 알 수 있다(파란색 화살표로 표현됨). 그리고 이렇게 구한 순간 기울기의 방향은 항상 저점을 향한다고 보장할 수 있다.


따라서 MSE(θ)를 미분하여 나온 순간 기울기를 계산해, 그 값을 θ 더하면 θ는 저점과 더 가까워지게 된다. 이걸 충분히 반복하면 언젠간 저점을 찾아낼 것이다.


GDR의 워크플로우:

MSE(θ)를 미분을 한다. 그리고 그 값을 θ에 더한다. 그리고 그렇게 얻은 θ를 다시 이용해 또 MSE(θ)를 미분한다. 이걸 반복한다. 만약 θ가 충분한 저점에 도달한다면 그때 계산될 미분값은 0이 될 것이다. 그러면 0을 더하게 됨으로 알아서 학습이 멈춘다.


MSE를 미분한 값은 다음과 같은데:

MSE'(θ) = -1 / N × 2 × Σ actual_yt – predict_yt

이렇게 계산한 MSE'(θ)를 θ에 더함으로써 학습을 진행한다. 즉, 컴퓨터가 'θ - (1 / N × 2 × Σ h(θ₍ₙ₎) – y₍ₙ₎)'을 계산함으로써 하나의 스텝이 진행된다. '인공지능이 파라미터를 학습한다', '이터레이션이나 에포크를 돌린다'는 표현은 전부 이러한 과정을 말한다.

그림6은 한 번의 스텝에 따라서 모델이 어떻게 변하는지를 보여준다. 맨 밑의 파란 직선에서 시작해서 점점 데이터를 잘 모사하는 모델로 학습되는 과정을 볼 수 있다. 자세히 보면 점점 변하는 폭이 줄어드는 것을 알 수 있다(미분의 절댓값이 점점 작아지는 것이 반영된 것이다).


이러한 일련의 과정, 기계가 미분을 이용하여 데이터를 학습하는 과정을 '리그레션'이라고 부른다.


아직까지 인공 다층 신경망은 배우지 않았지만, 짧은 직관을 준다면 '인공지능이 파라미터를 학습한다'는 것은 '뉴럴 네트워크에 존재하는 수많은 뉴런의 기울기를 리그레션한다'는 소리이다.