Code › ai-engineering-study
선형회귀와 손실 함수
집값 예측 예제로 정리한 선형회귀, 평균 제곱 오차, 손실 함수의 의미
오늘은 선형회귀(linear regression)와 손실 함수(loss function)를 배웠다. 집 크기로 집 가격을 예측하는 예제가 나왔는데, 강의를 따라가다 보니 핵심은 어떤 선이 더 나은지를 숫자로 평가하는게 중요해 보였다.
예를 들어 집 크기가 30평일 때 가격이 얼마일지 예측한다고 해보자. 이미 여러 집의 크기와 가격 데이터가 있다면, 그 점들 사이를 가장 그럴듯하게 지나가는 직선을 하나 찾을 수 있다. 이 선을 최적선(the line of best fit)이라고 부르고, 선형회귀는 결국 이 최적선을 찾아서 새로운 입력에 대한 값을 예측하는 방식으로 이해했다.
여기서 집 크기는 입력변수(input variable 또는 feature)이고, 집 가격은 목표변수(target variable 또는 output variable)다. 맞추려는 값이 집 가격이므로 목표변수는 가격이고, 집 크기는 가격을 맞추기 위해 사용하는 정보이므로 입력변수다.
머신러닝은 크게 지도학습, 비지도학습, 강화학습으로 나뉜다고 한다. 선형회귀는 지도학습(supervised learning)에 들어가는데, 이유는 학습 데이터에 입력과 정답이 함께 있기 때문이다. 집 크기만 던져주고 알아서 구조를 찾게 하는 게 아니라, “이 크기의 집은 이 가격이었다”라는 답을 같이 주면서 모델을 학습시킨다.
이 지점에서 분류(classification)와 회귀(regression)도 같이 나왔다. 분류는 아파트, 주택, 오피스텔처럼 정해진 범주 중 하나를 고르는 문제이고, 회귀는 집 가격처럼 연속적인 값을 예측하는 문제라고 한다.
지금은 결과가 “종류”이면 분류, 결과가 연속적으로 변하는 “숫자 값”이면 회귀로 구분한다고 했고, 숫자로 표현된 값이라고 해서 전부 회귀는 아니고, 그 값이 연속적으로 움직이는 예측 대상인지가 기준이다. 집 가격은 5억, 5억 1천만, 5억 2천만처럼 이어지는 값이므로 회귀 문제다.
선형회귀에서 사용하는 선은 가설 함수(hypothesis function)로 표현한다. 직선이므로 익숙한 형태로는 이렇게 쓸 수 있다.
여기서 중요한 건 아직 기호 자체가 아니라, 여러 직선 중 어떤 직선이 데이터에 더 잘 맞는지 판단해야 한다는 점이다. 같은 집 크기 데이터가 있어도 선을 어떻게 긋느냐에 따라 예측 가격이 달라지고, 그래서 각 선의 예측이 실제 가격과 얼마나 차이 나는지를 계산해야 한다.
이때 나온 개념이 평균 제곱 오차(MSE, Mean Squared Error)였다. 모델이 예측한 값과 실제 값이 완전히 같으면 오차는 0이지만, 대부분은 조금씩 빗나가고 각 데이터마다 예측값과 실제값의 차이가 생긴다. 평균 제곱 오차는 이 차이를 제곱한 뒤 평균을 낸 값이다.
여기서 은 학습 데이터의 개수이고, 는 번째 입력값, 는 번째 실제 정답이다. 는 현재 가설 함수가 번째 입력에 대해 예측한 값이다.
오차를 제곱하는 이유도 이제 조금 이해됐다. 예측값이 실제값보다 크든 작든 제곱하면 양수가 되기 때문에 오차들이 서로 상쇄되지 않고, 큰 오차에는 더 큰 패널티가 들어간다. 예를 들어 오차가 2이면 제곱해서 4가 되지만, 오차가 10이면 100이 되기 때문에 많이 틀린 예측을 더 강하게 나쁘게 보는 방식이다.
평균 제곱 오차는 “이 선이 전체 데이터에 대해 얼마나 많이 틀렸는지”를 숫자로 나타낸 값이다. 값이 작을수록 실제 데이터에 더 잘 맞는 선이고, 값이 클수록 예측이 많이 빗나간 선이다.
평균 제곱 오차로 선을 평가하는 흐름을 보고 나서, 강의에서는 직선의 모양을 정하는 값을 θ로 표현했다. 익숙한 에서 와 를 직접 쓰는 대신, 머신러닝 표기에서는 보통 이렇게 쓴다고 한다.
여기서 는 입력 를 넣었을 때 모델이 예측한 값을 뜻한다. 집값 예측으로 보면 는 집 크기이고, 는 모델이 예측한 집 가격이다.
은 직선의 기울기이고, 집 크기가 1만큼 커질 때 예측 가격이 얼마나 증가하는지를 결정한다. 반면 은 상수항으로, 가 0일 때도 남아 있는 값이고 그래프에서는 직선이 세로축과 만나는 위치를 정한다. 그래서 은 입력값에 곱해지는 값이라기보다, 전체 예측값을 위아래로 옮기는 역할을 한다고 이해했다.
결국 선형회귀에서 찾으려는 것은 가장 적절한 θ 값들이다. 과 을 어떻게 정하느냐에 따라 선의 위치와 기울기가 달라지고, 같은 집 크기를 넣어도 예측 가격이 달라진다.
직선으로 부족할 때 다항 회귀
입력과 목표값의 관계가 곡선 형태라면 직선 하나로는 데이터를 충분히 설명하지 못할 수 있다. 이때 입력값 뿐 아니라 , 처럼 거듭제곱한 값을 새로운 특성으로 추가하는 방법이 다항 회귀(polynomial regression)다.
2차 다항 회귀의 가설 함수는 다음과 같이 쓸 수 있다.
항이 들어가므로 그래프는 곡선이 되지만, 학습할 대상인 , , 는 각 항에 선형으로 결합되어 있다. 그래서 다항 회귀도 선형회귀에 포함되며, 기존 입력을 다항 특성으로 변환한 뒤 같은 방식으로 가중치를 학습한다.
여기서 용어의 정의가 헷갈렸다. 입력 변수가 늘어나면 식의 항도 늘어나는데, 그렇다면 다중 선형회귀와 다항 회귀가 결국 같은 말 아닌가 싶었다.
계산식만 보면 둘은 비슷하지만, 이름은 항의 개수보다 그 항이 어디서 만들어졌는지를 구분해보면 좋을 것 같았다.
| 구분 | 원래 입력 | 모델에 넣는 특성 |
|---|---|---|
| 단순 선형회귀(Simple Linear Regression) | 집 크기 | 집 크기 |
| 다중 선형회귀(Multiple Linear Regression) | 집 크기, 방 개수 | 집 크기, 방 개수 |
| 다항 회귀(Polynomial Regression) | 집 크기 | 집 크기, 집 크기² |
| 다중 다항 회귀(Multiple Polynomial Regression) | 집 크기, 방 개수 | 집 크기, 방 개수, 집 크기², 집 크기 × 방 개수 |
다중 선형회귀는 집 크기와 방 개수처럼 서로 다른 입력 변수를 추가하면서 항이 늘어난다. 다중이라는 말은 입력 변수가 여러 개라는 뜻으로 정리했다. 반면 다항 회귀는 집 크기라는 입력으로부터 집 크기² 같은 새로운 특성을 만들어 항을 늘린다. 입력 속성이 여러 개이면서 제곱항이나 입력끼리 곱한 항까지 사용하면 다중 다항 회귀라고 부를 수 있다. 즉, 다중은 원래 입력 속성의 개수를 설명하고, 다항은 그 입력을 몇 차식으로 확장했는지를 설명한다.
다항 회귀에서는 먼저 집 크기 로부터 같은 특성을 만든다. 그러면 모델이 받는 값은 집 크기와 집 크기² 두 개가 되고, 각각에 과 를 곱한 뒤 상수항 과 더해 예측값을 계산한다. 다중 선형회귀가 집 크기와 방 개수에 각각 가중치를 곱해 더하는 것과 계산 구조가 같다.
다항 회귀의 그래프가 곡선이어도 선형회귀에 포함되는 이유가 여기에 있다. 선형이라는 말은 가 반드시 1차여야 한다는 뜻이 아니라, 학습할 계수 , , 가 서로 곱해지거나 제곱되지 않고 각 특성에 하나씩 곱해진 뒤 더해지는 구조를 뜻한다.
다항식이라는게, 수학에서 다항식은 1차식도 포함하지만, 머신러닝에서는 1차 모델을 이미 선형회귀라고 부른다. 그래서 다항 회귀는 보통 이상의 항을 추가한 모델을 구분할 때 사용하며, 다항 선형회귀라고 하지 않는다. 용어의 정의를 정리해두면 나중에 편하다.
항과 차수도 함께 구분해 두었다.
| 용어 | 의미 | 예시 |
|---|---|---|
| 항(Term) | 덧셈이나 뺄셈으로 나뉘는 식의 한 부분 | |
| 2차항(Quadratic Term) | 한 항에 있는 변수들의 지수 합이 2인 항 | , |
| 교차항(Interaction Term) | 서로 다른 입력 변수를 곱한 항 | |
| 차수(Degree) | 식에 포함된 항 중 가장 높은 지수의 합 | 의 차수는 2 |
제곱항만 2차항인 것은 아니다. 도 각 변수의 지수가 1이므로 지수의 합은 2이고 두 입력의 결합을 나타내는 2차 교차항이다. 따라서 와 는 모두 2차항이며, 이보다 높은 항이 없다면 전체 식은 2차식이다.
왜 다항 특성을 만드는가
입력 변수를 여러 개 넣는 것만으로는 두 조건이 함께 있을 때 생기는 추가 효과까지 자동으로 표현되지 않는다. 아파트 가격을 단순화해서 다음과 같은 학습 데이터가 있다고 하자.
| 아파트 | 대형 여부 | 핵심 입지 여부 | 실제 가격 |
|---|---|---|---|
| 소형, 외곽 | 0 | 0 | 2억 원 |
| 대형, 외곽 | 1 | 0 | 3억 원 |
| 소형, 핵심 입지 | 0 | 1 | 10억 원 |
| 대형, 핵심 입지 | 1 | 1 | 18억 원 |
여기서 과 는 해당 조건을 만족하면 1, 아니면 0인 값이다. 모델은 이 입력과 실제 가격 를 보고, 예측 가격과 실제 가격 사이의 손실이 작아지도록 가중치를 학습한다.
교차항이 없는 덧셈식은 앞의 세 가격을 다음처럼 표현할 수 있다.
이 식은 대형 아파트에 1억 원, 핵심 입지에 8억 원을 각각 더한다. 따라서 대형이면서 핵심 입지인 마지막 아파트의 예측 가격은 11억 원이 되고, 실제 가격 18억 원에 포함된 추가 프리미엄을 표현하지 못한다. 모델이 18억 원을 맞히려고 기존 가중치를 바꾸면 앞의 세 아파트 예측도 함께 달라지므로, 덧셈식 안에서는 네 가격을 모두 맞출 수 없다.
두 조건이 함께 만족될 때만 적용되는 교차항을 추가하면 이 관계를 따로 표현할 수 있다.
는 대형이면서 핵심 입지인 경우에만 1이 된다. 그래서 앞의 세 아파트 가격은 그대로 유지하면서 마지막 아파트에만 7억 원을 추가해 실제 가격 18억 원을 표현할 수 있다. 다항 특성을 만드는 이유는 이렇게 각 입력의 독립적인 효과만으로 설명할 수 없는 관계를 모델의 식에 넣기 위해서다.
교차항이 두 입력의 결합을 표현한다면, 같은 제곱항은 입력 하나와 결과 사이의 곡선 관계를 표현한다. 다항 회귀는 제곱항과 교차항을 특성으로 추가해서 단순한 직선이나 독립적인 덧셈만으로 설명할 수 없는 데이터를 학습한다.
차수를 높이면 더 복잡한 곡선을 만들 수 있지만, 학습 데이터의 작은 변화까지 따라가면 과적합이 발생할 수 있다. 어떤 차수까지 사용할지 결정하는 것이 모델 복잡도를 조절하는 일이고, 이 문제는 이후 정리한 스케일링과 규제와도 연결된다.
손실 함수(loss function)는 가설 함수의 예측이 실제 값에서 얼마나 벗어났는지 계산하는 함수다. 선형회귀에서는 평균 제곱 오차가 손실 함수의 값으로 쓰인다.
강의에서는 손실 함수를 J로 표현했다.
손실 함수를 보면 평균 제곱 오차와 거의 같은데 분모에 2가 곱해져 있는 부분만 달랐다. 지금은 평균 제곱 오차를 “오차를 계산하는 방식”으로 보고, 손실 함수는 “현재 를 넣었을 때 그 오차 값을 반환하는 함수”이다.
또 하나 헷갈렸던 건 왜 손실 함수의 입력이 나 가 아니라 인지였다. 식 안에는 와 도 분명히 들어가는데, 왜 가 아니라 라고 쓰는 걸까.
이 부분은 데이터를 고정된 값으로 보면 이해가 조금 됐다. 학습 데이터에 들어 있는 집 크기 와 실제 가격 는 이미 정해져 있다. 내가 바꿀 수 있는 것은 데이터가 아니라 가설 함수의 모양이고, 그 모양은 과 이 정한다.
그래서 손실 함수의 출력은 결국 를 어떻게 설정했느냐에 따라 달라진다. 같은 데이터라도 가 달라지면 직선이 바뀌고, 직선이 바뀌면 예측값이 바뀌며, 예측값이 바뀌면 평균 제곱 오차도 달라진다. 그래서 손실 함수는 J(θ)라고 쓴다.
식 앞의 계수가 원래 평균을 낼 때처럼 이 아니라 인 것도 나왔다. 엄밀히 말하면 이 식은 평균 제곱 오차에 를 곱한 형태라 값은 절반이 되지만, 어떤 에서 값이 가장 작아지는지는 바뀌지 않는다. 여기서 2가 붙는 이유는 이후 계산을 편하게 하기 위한 것이라고 한다.
오늘 정리한 범위에서는 선형회귀를 “최적선을 찾는 문제”로, 손실 함수는 “그 선이 얼마나 좋은지 숫자로 평가하는 방법”으로 정리했다. 입력 데이터와 정답은 이미 주어져 있고, 실제로 조정하는 대상은 다. 그래서 여러 중에서 손실 함수의 값이 가장 작아지는 쪽을 찾는 것이 선형회귀 학습의 목표다.
아직 손실을 줄이는 구체적인 방법까지는 정리하지 않았다. 일단 오늘은 평균 제곱 오차가 왜 손실 함수로 쓰이는지, 그리고 왜 손실 함수의 입력을 로 두는지까지 잡고 넘어가기로 했다.