Published on

선형 모델 한 자리에서 다시 보기

Authors

선형 회귀는 ML을 시작할 때 가장 먼저 만나지만 막상 손에 잡히는 게 의외로 적은 모델이다. "선형"이 정확히 뭘 뜻하는지, OLS가 푸는 게 뭔지, 정규화는 왜 필요한지 같은 질문이 한 번씩 다시 떠오른다. 최근 풀던 문제들을 계기로 한 자리에 정리해 둔다.

OLS가 푸는 문제

선형 회귀 학습의 목표는 한 줄로 요약된다. 잔차 제곱합을 최소화하는 가중치를 찾는다.

minwi=1n(yiy^i)2\min_{w} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2

이 방식이 최소제곱법(Ordinary Least Squares OLS) 이다. 부호 상쇄만 막을 거라면 절대값도 쓸 수 있는데 굳이 제곱을 쓰는 데에는 두 가지 이유가 있다. 모든 점에서 미분 가능하고 닫힌 해가 깔끔하게 떨어진다. 절대값을 쓰는 LAD 회귀(Least Absolute Deviations)는 이상치에 강건하지만 미분이 까다로워 반복 알고리즘을 동원해야 한다.

행렬로 풀면 OLS의 닫힌 해는 다음과 같다.

w^=(XX)1Xy\hat{w} = (X^\top X)^{-1} X^\top y

이걸 정규방정식(Normal Equation) 이라 부른다. 유도는 간단하다. 손실 L(w)=yXw2L(w) = \lVert y - Xw \rVert^2ww로 미분해서 0으로 놓으면 XXw=XyX^\top X w = X^\top y가 나오고 양변에 역행렬을 곱하면 끝난다. 잔차 벡터 yy^y - \hat{y}XX의 열공간에 직교(normal)한다는 기하학적 사실에서 "정규(normal)"라는 이름이 왔다. yyXX의 열공간으로 정사영하는 작업과 같다.

닫힌 해와 반복 해

앞에서 슬쩍 나온 "닫힌 해"는 글 전체에서 계속 등장하니 한 번 짚고 가자. 닫힌 해(closed-form solution) 는 답을 수식 한 줄로 적을 수 있는 해를 말한다. 사칙연산 거듭제곱 지수 로그 행렬 연산 같은 표준 도구를 유한 번 써서 식이 완결되면 "닫혀 있다"고 한다.

가장 익숙한 예가 이차방정식의 근의 공식이다. ax2+bx+c=0ax^2 + bx + c = 0의 해는

x=b±b24ac2ax = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}

처럼 한 번에 적힌다. aa bb cc만 대입하면 끝이고 시행착오가 끼어들 여지가 없다. OLS의 정규방정식 w^=(XX)1Xy\hat{w} = (X^\top X)^{-1} X^\top y도 같은 성격이다. 입력 행렬과 정답을 넣으면 한 번의 계산으로 최적 가중치가 나온다.

반대편에 있는 게 반복 해(iterative solution) 다. 답을 한 식으로 못 적고 점점 정답에 가까워지는 갱신을 반복한다. 경사 하강법

wwηL(w)w \leftarrow w - \eta\, \nabla L(w)

가 전형이다. 한 번 갱신으로는 끝나지 않고 수백 수천 번을 반복하면서 점근적으로 답에 다가간다. 어디서 멈출지도 직접 정해야 한다.

라소가 닫힌 해를 못 쓰는 이유도 이 구분에서 나온다. 손실에 w|w|가 들어가면 w=0w = 0에서 미분이 안 돼서 "미분해서 0으로 놓고 푼다"는 전략이 막힌다. 그래서 좌표 하강법이나 LARS 같은 반복 알고리즘이 등판한다. 5차 이상 일반 다항방정식에 닫힌 해가 없다는 사실도 갈루아 이론으로 증명되어 있다. 이런 경우엔 뉴턴 방법 같은 수치 해법으로 근사한다.

요약하면 닫힌 해는 "식 한 줄로 정확한 답"을 주고, 반복 해는 "근사값에 점점 다가가는 과정"이다. 두 방식이 정확도 안정성 확장성 면에서 다른 성격을 가지기 때문에 모델별로 어떤 쪽이 가능한지가 실용적으로 중요하다.

"선형"의 진짜 의미

선형 회귀의 "선형"은 입력 xx에 대한 선형이 아니라 파라미터 ww에 대한 선형을 가리킨다. 다음 셋은 모두 선형 회귀다.

y=w0+w1xy=w0+w1x+w2x2y=w0+w1logx+w2sinx\begin{aligned} y &= w_0 + w_1 x \\ y &= w_0 + w_1 x + w_2 x^2 \\ y &= w_0 + w_1 \log x + w_2 \sin x \end{aligned}

z1=xz_1 = x z2=x2z_2 = x^2 z3=logxz_3 = \log x로 치환해서 보면 평범한 다중 선형 회귀와 똑같다. 같은 닫힌 해 공식을 그대로 쓴다. 다음은 비선형 회귀다.

y=w0ew1x,y=w01+w1xy = w_0\, e^{w_1 x}, \qquad y = \frac{w_0}{1 + w_1 x}

가중치가 지수나 분모로 들어가면 선형성이 깨진다. 시각적으로 다항 회귀가 만든 곡선이 분명 휘어 있어서 비선형으로 보이지만, [x,x2,x3][x, x^2, x^3]을 각각 독립 차원으로 본 고차원 공간에서는 평면이다. 선형성의 기준은 그림이 아니라 파라미터 구조다.

이 시각의 일반화가 기저 함수(basis function) 회귀다. 가중치에 대해 1차식이기만 하면 어떤 변환을 끼워 넣어도 OLS의 수학적 도구를 그대로 쓴다. 다항식 로그 삼각함수 가우시안 RBF 스플라인이 모두 같은 우산 아래 들어간다.

정규방정식 vs 경사 하강법

닫힌 해가 있는데 굳이 경사 하강법(gradient descent)을 쓰는 이유는 계산 비용을 보면 드러난다. 특성 수 pp 샘플 수 nn 반복 횟수 kk일 때 두 방법의 복잡도는 다음과 같다.

방법시간 복잡도메모리
정규방정식O(np2+p3)O(np^2 + p^3)O(p2)O(p^2)
경사 하강법 (kk 반복)O(npk)O(npk)O(np)O(np)

문제는 p3p^3 항이다. 특성이 10만 개면 p3=1015p^3 = 10^{15}로 사실상 계산이 불가능하다. XXX^\top X를 메모리에 올리는 것조차 어렵다. 단정밀도 부동소수점만 잡아도 100,000 × 100,000 행렬은 약 40GB를 잡아먹는다. 텍스트 분류 추천 시스템 유전체 데이터처럼 특성이 수만에서 수십만 개에 이르는 영역에서는 닫힌 해를 그대로 쓰지 못한다.

경사 하강법은 한 반복이 O(np)O(np)에 끝나고 미니배치 SGD는 데이터 일부만 메모리에 올려도 된다. 데이터가 스트리밍으로 들어와도 한 샘플씩 갱신하고 GPU와도 잘 맞는다.

대신 특성 수가 작으면(대략 p<10,000p < 10{,}000) 정규방정식이 매력적이다. 학습률 같은 하이퍼파라미터가 없고 한 번에 정확한 해를 준다. scikit-learn의 LinearRegression이 기본적으로 SVD 기반 닫힌 해를 쓰는 것도 이래서다. 실제 구현에서는 (XX)1(X^\top X)^{-1}을 직접 계산하지 않고 QR 분해나 SVD를 거친다. 수치적으로 훨씬 안정적이다.

선형 회귀의 손실은 볼록 함수라 두 방법 모두 전역 최적해에 수렴한다. 정규방정식은 한 번에 정확히 도달하고 경사 하강법은 학습률만 적절하면 점근적으로 수렴한다. "경사 하강법이 더 정확하다"는 흔한 오해는 이 점에서 성립하지 않는다.

모델이 데이터를 얼마나 설명하는가: R2R^2

모델 적합도를 보는 표준 지표가 결정계수 R2R^2다.

R2=1SSresSStotR^2 = 1 - \frac{SS_\text{res}}{SS_\text{tot}}

분자 SSres=(yiy^i)2SS_\text{res} = \sum (y_i - \hat{y}_i)^2는 모델이 설명하지 못한 잔차 제곱합이다. 분모 SStot=(yiyˉ)2SS_\text{tot} = \sum (y_i - \bar{y})^2는 그냥 평균 yˉ\bar{y}로만 예측했을 때의 오차다. 둘의 비율을 1에서 빼면 모델이 평균 대비 얼마나 더 잘 맞추는가가 나온다.

해석은 직관적이다.

  • R2=1R^2 = 1: 잔차 0. 완벽한 적합
  • R2=0R^2 = 0: 그냥 평균으로 예측하는 것과 동일한 수준
  • R2<0R^2 < 0: 평균 예측보다도 못함. 테스트셋에서 종종 나온다

흔한 함정 하나. 학습 데이터에서는 특성을 늘리면 R2R^2항상 올라간다. 의미 없는 잡음 특성을 추가해도 손해 볼 일이 없어서다. 이를 보정한 것이 수정된 R2R^2(adjusted R2R^2) 로, 모델 비교에서는 보통 이쪽을 본다.

잔차가 알려주는 것

OLS가 최소화하는 그 잔차 ei=yiy^ie_i = y_i - \hat{y}_i는 모델 진단의 출발점이기도 하다. 어떤 점에서 잔차가 크면 그 점에서 모델 예측이 실제값과 멀리 떨어졌다는 신호다. OLS는 잔차의 제곱합을 최소화하므로 부호와 무관하게 절대값이 큰 잔차에 큰 페널티를 준다.

큰 잔차가 가리키는 건 한 가지가 아니다. 진짜 이상치일 수도 있고, 모델이 너무 단순해서 비선형 패턴을 잡지 못한 것일 수도 있고, 중요한 특성이 누락된 것일 수도 있다. 그래서 잔차 하나가 아니라 잔차 전체의 패턴을 본다. 잔차 vs 예측값 그래프에서 무작위 산포가 나오면 가정이 잘 만족되는 것이고, 곡선 패턴이 보이면 비선형성이 누락된 것, 깔때기 모양이면 등분산성이 깨진 것이다.

OLS 잔차에는 알아둘 만한 수학적 성질이 있다. 절편이 포함된 모델이면 다음이 항상 성립한다.

ei=0,xijei=0,y^iei=0\sum e_i = 0, \quad \sum x_{ij}\, e_i = 0, \quad \sum \hat{y}_i\, e_i = 0

잔차의 합 자체가 항상 0이라 잔차 평균을 회귀 진단 지표로 쓰는 건 무의미하다.

또 하나 헷갈리기 쉬운 게 잔차와 레버리지(leverage) 의 구분이다. 잔차는 그 점이 회귀선에서 수직으로 얼마나 떨어졌는지를 재고, 레버리지는 그 점의 xx값이 평균에서 얼마나 떨어졌는지를 잰다. 두 개념은 독립이며, 큰 잔차와 높은 레버리지가 동시에 나타나는 점이 회귀선을 가장 크게 흔든다. Cook's distance가 이 둘을 함께 묶는 영향력 지표다.

다중공선성

선형 회귀에서 가장 골치 아픈 가정 위반 하나가 다중공선성(multicollinearity) 이다. 특성들끼리 강한 선형 상관관계가 있을 때 발생한다. 극단적으로는 한 특성이 다른 특성들의 선형 결합으로 거의 완벽히 표현된다.

문제는 닫힌 해 w^=(XX)1Xy\hat{w} = (X^\top X)^{-1} X^\top y에서 XXX^\top X가 특이행렬에 가까워진다는 점이다. 역행렬 계산이 수치적으로 불안정해지고 결과적으로 가중치 추정이 출렁인다. 데이터를 조금만 바꿔도 계수의 부호가 뒤집히는 일이 흔하다.

집값 예측에서 "평수"와 "방 개수"가 함께 들어간 모델을 떠올리면 이해가 쉽다. 한 표본에서는 평수 +500만원 방 개수 -200만원이 나오다가 다른 표본에서는 평수 -100만원 방 개수 +800만원으로 부호가 뒤집히기도 한다. 합쳐 보면 비슷한 예측을 내지만 개별 계수의 해석은 무의미해진다. "x1x_1이 1 증가할 때 yyw1w_1만큼 변한다"는 해석은 다른 특성을 고정한 상태를 전제하는데, 두 특성이 강하게 묶여 있으면 한쪽만 움직이는 게 사실상 불가능해서다.

진단은 VIF(Variance Inflation Factor) 로 한다. 각 특성을 다른 특성들로 회귀했을 때의 R2R^2로 계산한다.

VIFi=11Ri2VIF_i = \frac{1}{1 - R_i^2}

대략 VIF가 10을 넘어가면 다중공선성을 의심한다. 해결책은 상관 높은 특성 중 일부를 제거하거나, PCA로 직교화하거나, 정규화로 넘어가는 것이다.

L2 정규화: 릿지

다중공선성과 과적합을 동시에 손볼 수 있는 가장 단순한 처방이 릿지 회귀(Ridge regression) 다. OLS 손실에 가중치 제곱합 항을 더한다.

L(w)=(yiy^i)2+λwj2L(w) = \sum (y_i - \hat{y}_i)^2 + \lambda \sum w_j^2

λ=0\lambda = 0이면 일반 OLS와 같고 λ\lambda가 커질수록 가중치를 0에 가깝게 압박한다. 닫힌 해에는 단위행렬 II 항이 추가된다.

w^=(XX+λI)1Xy\hat{w} = (X^\top X + \lambda I)^{-1} X^\top y

대각선에 λ\lambda를 더하면 XX+λIX^\top X + \lambda I가 항상 가역이 되어 다중공선성과 p>np > n 상황 모두에서 해가 안정적으로 떨어진다. 행렬 대각선을 따라 능선을 쌓아 올리는 모양이라 "ridge(능선)"라는 이름이 붙었다.

릿지는 가중치를 0에 가깝게 줄이지만 정확히 0으로 만들지는 않는다. 모든 특성을 사용하되 영향력만 줄인다. 약간의 편향을 받아들이는 대신 분산을 크게 낮추는 편향-분산 트레이드오프의 전형적인 사례다.

L1 정규화: 라소

페널티에서 제곱 대신 절대값을 쓰면 라소 회귀(Lasso) 가 된다.

L(w)=(yiy^i)2+λwjL(w) = \sum (y_i - \hat{y}_i)^2 + \lambda \sum |w_j|

이 작은 차이가 만드는 결과 차이는 꽤 크다. L1 페널티는 일부 가중치를 정확히 0으로 만든다. 변수 선택(feature selection) 효과가 자동으로 따라온다.

기하학적으로 정규화는 OLS 손실 등고선이 페널티 영역의 경계와 처음 만나는 점을 찾는 일이다. L2의 제약 영역은 원(구) 모양이라 등고선과 부드럽게 만나고 보통 축 위에 정확히 떨어지지 않는다. L1의 제약 영역은 마름모 모양이고 꼭짓점이 축 위에 있어서 등고선이 자주 그 꼭짓점에서 만난다. 그 꼭짓점에서는 일부 좌표가 정확히 0이다.

   L2 (릿지)            L1 (라소)
        |                   |
||
   ─────┼─────         ─────┼─────
        |                   |
  → 축 근처에서 만남     → 축 위 꼭짓점에서 만남
0에 가까울 뿐        → 정확히 0

라소는 수만 개 특성 중 정말 중요한 소수만 골라내는 데 잘 맞는다. 유전자 발현 데이터나 텍스트 BoW처럼 고차원 희소 데이터에서 자주 쓰는 이유다. 단점도 분명하다. 상관 높은 특성 중 하나만 임의로 선택해서 둘 다 중요한 경우에도 한쪽이 버려진다. w|w|w=0w = 0에서 미분 불가능하기 때문에 닫힌 해가 없어 서브그래디언트나 좌표 하강법 같은 반복 알고리즘이 필요하다. p>np > n 상황에서는 최대 nn개의 특성만 선택한다는 한계도 있다.

L1과 L2의 한계를 합쳐 보완한 것이 엘라스틱 넷(Elastic Net) 이다.

L(w)=(yiy^i)2+λ1wj+λ2wj2L(w) = \sum (y_i - \hat{y}_i)^2 + \lambda_1 \sum |w_j| + \lambda_2 \sum w_j^2

선택은 데이터 성격에 달렸다.

상황추천
모든 특성이 골고루 기여릿지
일부 특성만 중요라소
상관 높은 특성 그룹이 함께 중요엘라스틱 넷
다중공선성이 심함릿지 또는 엘라스틱 넷
둘 다 애매함엘라스틱 넷

정리

선형 모델을 처음 배울 때 얼떨결에 받아들이고 넘어갔던 사실이 의외로 많다. "선형"의 의미가 입력이 아니라 파라미터에 대한 것이라는 점, 다항 회귀가 여전히 선형 회귀라는 점, 잔차의 평균이 항상 0이라 진단 지표로 쓸 수 없다는 점, 닫힌 해가 있어도 큰 데이터에서는 경사 하강법이 더 효율적이라는 점이 그렇다.

한 자리에 모아 놓고 보면 OLS 정규방정식 R2R^2 잔차 다중공선성 릿지 라소가 모두 하나의 흐름 위에 놓인다. 다음 단계는 일반화 선형 모델(GLM)로 분포 가정을 넓히거나 커널 트릭으로 비선형성을 들여오는 방향이다.