비용함수(Loss function/cost function)와 경사하강법(Gradient Descent)이란
00. 모델링(Modeling)
머신러닝과 딥러닝의 기본적 컨셉은
대용량의 데이터를 가지고 모델을 만들고, 이 모델에 새로운 데이터를 적용시켰을 때 예측을 잘하도록 하는 것이다.
(결국 과거의 데이터에서 어떠한 패턴을 파악하고 그것을 이용해 미래를 예측하고 싶은것.)
예를 들어, 아이스크림 가게를 운영하는 사장이 다음 달은 어느 정도의 물량을 미리 확보해놔야하는지 예측하고 싶을 수 있다. (실제 판매량 보다 너무 적거나 많게 물건을 준비해놓으면 그에 따른 손해가 발생하기 때문에 조금이라도 손실을 줄이고 싶은것.) 이때 최근 몇년동안의 데이터(날씨, 기온, 월, 강수량, 판매수량 등)를 이용하여 패턴을 파악하면 다음달에 어느정도의 아이스크림을 미리 확보해야 하는지 예측할 수 있을 것이다.
이처럼 데이터 내에 존재하는 관계/패턴/규칙등을 탐색하여 이를 하나의 모형화시키는 것을 '모델링'이라고 하며,
모델링은 데이터를 잘 설명하는 하나의 수식(y=f(x))을 생성해내는 것이라고도 할 수 있다.
01. 비용함수(loss function / cost function)
그렇다면 내가 만든 모델이 잘 예측을 하고 있는지 어떻게 알 수 있을까?
이와 관련하여 '비용함수(cost function)'라는 개념이 등장한다.
비용함수(cost function)는 내가 만든 모델이 실제 정답과 얼마나 다른지를 측정하는 수단이다.
다시 말해, 실제 값(정답)과 모델이 예측한 값 간의 차이를 의미하며 이를 '에러(Error)'라고 한다.
따라서 비용함수(cost function)의 값이 클수록 해당 모델의 정확도가 낮다는 것을 의미한다.
X(키)와 y(몸무게)의 두 가지 변수를 가진 데이터를 이용하여,
단순선형회귀 모형을 만들어보자.
먼저 2차원 평면상에 각 관측치(각 개인)를 시각화해 보면
(일반적으로) 키가 커짐에 따라 몸무게도 어느 정도 증가하는 추세를 보일 것이다.
선형회귀 모형은 위와 같이 데이터들을 가장 잘 설명하는 하나의 빨간 선(y=f(x))을 찾아내는데,
이 빨간 선을 '모델'이라고 한다.
이렇게 완성된 모델에 새로운 사람의 키(X) 값을 입력하면
모델은 새로운 사람의 몸무게를 예측한 값을 출력하게 된다.
이때 그어진 선(모델)은 완벽할 수 없으며 당연히 에러가 존재한다.
그럼 여기서,
빨간 선을 어떻게 긋는 게 최적의 선이라고 할 수 있으며
어떠한 방식으로 그것을 최적의 선이라고 정의할 수 있을까?
이때 판단 기준이 되는 것이 바로 '에러(오차)'값이다.
에러(오차)는 실제 정답과 우리가 만든 모델이 예측한 값의 차이를 의미한다고 했다.
위의 그림에서 빨간선(모델)과 각각의 점간의 차이(파란선)가 에러를 의미하며
파란색 선의 총합이 클수록 에러가 크다는 것을 의미한다.
여기서 내가 만든 모델의 오류를 줄이기 위해,
현재 모델이 어느 정도 오류를 뱉는지 측정하고 이를 줄여나가는 과정이 필요하다.
이때 각 오차들을 단순히 더해버리면 +값과 -값인 오차들이 함께 존재하므로 정확한 오차합을 계산할 수 없다.
따라서 이때 사용되는 방법이 크게 2가지 가 있는데
첫 번째, 각 오차에 절댓값을 씌운 뒤 그것을 합산하는 방법
두 번째, 각 오차를 제곱한 뒤 그것을 합산하는 방법
보통 두번째 방법이 많이 사용된다.
각 오류를 제곱한 뒤 더하는 방식을 통해
내가 만든 모델이 뱉어내는 전체적인 오류값을 하나의 수식으로 표현할 수 있으며,
그 식은 이차식의 형태가 된다.(각 오차들을 제곱했기 때문에)
이차식을 2차원 평면상에 그리면 위와 같은 포물선 형태로 표현되고
이 그래프를 '비용함수(cost function)'이라고 한다.
이때 에러가 최소인 지점이 우리가 가고자 하는 최적점이 된다.
📍손실함수(Loss function)와 비용함수(cost function)의 차이
보통 동일한 의미로 사용되지만 엄밀히 구분하자면,
손실함수(Loss function)는 샘플 하나에 대한 손실을 의미하며
비용함수(cost function)는 훈련세트에 있는 모든 샘플에 대한 손실함수의 합을 의미한다.
02. 경사하강법(Gradient Descent)
위의 그림과 같이 빨간색선의 기울기를 조금씩 변경해 보면 기울기마다 파란선의 길이(에러)가 달라지는 것을 알 수 있다.
이때 파란색 선의 총합이 우리가 만든 모델이 뱉어내고 있는 오류값이며 이를 최소화시키는 것이 우리의 궁극적인 목표이다.
그런데 이렇게 하나하나의 기울기를 전부 체크하는 것은 너무 비효율적인 방법이므로, 이때 사용되는 것이 '경사하강법(Gradient descent)'이다. 쉽게 말해서, 경사하강법(Gradient Descent)은 '에러를 최소화하는 방법'이라고 할 수 있으며 기본적인 아이디어는 비용함수를 최소화하기 위해 반복적으로 파라미터를 조정해나 가는 것이다.
경사하강법의 원리는 다음과 같다
1️⃣임의의 한점(노란색 점)을 찍고, 그 점에서의 미분값(기울기)을 구한다.
2️⃣그 점에서의 접선의 기울기를 바탕으로 파라미터를 '어느 방향'으로 '얼마큼'움직일지 결정한다.
(이때 기울기(gradient)가 감소하는 방향으로 조정해 나간다.)
3️⃣'기울기=0'이 되는 지점까지 반복해서 이동한다.
1~3번을 진행하는 과정에서,
만약 왼쪽그림과 같이 해당 지점에서의 기울기가 '음수'라면 파라미터를 오른쪽으로 이동하고
오른쪽 그림과 같이 해당 지점에서의 기울기가'양수'인 경우, 파라미터를 왼쪽으로 이동하게 된다.
또한 1번 그림에서처럼 기울기의 경사가 가파르다면 더 많이 이동,
2번 그림에서 처럼 기울기의 경사가 완만해질수록 조금씩 이동하게 되며
3번 그림과 같이 기울기=0이 되면 이동을 멈추게 된다.