여기까지 공부를 (제대로)했다면 선형회귀를 직접 코딩으로 만들 수 있게 된다. 그래서, 아래의 포스트에 실습 자료를 올려 두었으니, 참고가 되시면 좋겠다.

 

선형 회귀(Linear Regression) 실습 - C++ 소스 코드

아래 사이트에 선형 회귀를 C++로 직접 구현한 소스 코드를 업로드하고 있다. 21.02.15 - 연립방정식(linear system) 및 최소제곱법(least squares method)에 대한 코드가 올라가 있다. 21.02.21 - 릿지회귀(ridge..

swjman.tistory.com

 

교재링크(광고 아님): freelec.co.kr/book/인공지능을-위한-수학/

 

※ 복기하기 전에... 이 번 섹션을 공부하면서 본 챕터(선형회귀)의 내용은 이 교재가 다룰 수 있는 범위를 벗어나고 있다는 사실을 깨달았다. 단적인 예로 손실함수(loss function)가 전후사정 설명없이 정말 뜬금 없이 나타난다. 검색을 좀 해보니 기계학습 등에서 정말 중요한 함수인데, 교재에서는 뜬금 없이 등장한데다가 각주 몇줄로 설명을 마쳐버렸다. 사실 응용편으로 오면서 모든 게 뜬금없긴 하지만, 이 건 좀 정도가 과하다는 생각이다. 4장까지는 교재 만으로도 나름 진도를 나갈 수 있었지만, 5장부터는 배경지식이 너무 많이 필요해서 교재보다 훨씬 더 많은 분량의 외부 자료를 참고할 수 밖에 없었다. 아직도 두 챕터가 더 남았는데, 어떻게 전개될지 안봐도 훤해서 아득한 기분이 든다. 따로 무엇을 공부하라고 가이드라도 좀 해주면 좋았을텐데... 한정적인 분량 내에서 너무 많은 내용을 담으려고 하다보니 이런 결과에 이르게 된 것으로 보인다. 내 개인적인 생각엔 차라리 예제는 5장만 싣고 6,7장의 분량을 5장을 위한 배경지식을 설명하는 챕터로 구성했으면 길이길이 칭송 받는 책이 됐을 것 같다. 또, 교양서적을 넘어 각 대학의 전공서적으로 선택되는 영광도 누렸을 것이라고 감히 아쉬워 해 본다.

 

 

과학습(overfitting)

과적합이라고도 하는데, 학습된 모델이 학습에 이용한 데이터에 너무 들어 맞는 상태를 말한다.(이런 연유로 사실 '과학습'은 '많이 학습시켰다'의 의미로도 해석이 가능하여 어폐가 있다고 본다.) 이 상태에서는 약간의 variation만 가진 필드(실제) 데이터를 넣어도 엉뚱한 추론을 하게 된다.

 

일반화 능력(generalization ability)

Overfitting된 모델이 가진 특성의 반대 특성이라고 보면 된다. 과적합 모델은 특정 데이터에 편중되지만, 과적합이 해소된 모델은 필드 데이터에도 강한 적응성을 보일 것이다. 이를 일반화 능력이라고 하는 것 같은데, 구글링 상으로는 딱히 용어라기 보단 어구 정도인 듯 하다.

 

정규화(regularization)

역연산을 통한 문제 해결 시 발생하는 overfitting을 최소화하는 기법이다. 이번 챕터에서 공부하는 선형회귀는 역연산의 결정체 중 하나이므로 정규화는 꼭 필요하다. 이 용어는 우리나라에서는 다양한 단어로 번역되고 있다. 당장 한글 위키는 정칙화(正則化, 어렵다...) 로 표기하며, 일반화, 규제(?) 등으로도 불린다. 일견 맞는 뜻이라 편한대로 표현하면 될 듯 하다. (하지만, '규제'는 솔직히 너무 나간 것 같다.)

 

손실함수(loss function)

모델의 최적화(optimization) 관점에서 실제 데이터와 예측 데이터 간의 격차를 나타내는 함수라고 한다. 둘 간의 격차가 적으면 적을수록 최적화가 잘되었다고 볼 수 있다. 나아가, 그 격차를 될 수 있는한 최소화하는 것이 기계학습의 가장 중요한 부분 중 하나다. 앞선 절의 최소제곱법(least squares method)가 손실함수 중에서 가장 기본이면서도 유용한 함수라고 한다.(복기하면서도 너무 뜬금없다...)

 

정규화 항(regularization term)

정규화를 위해 손실함수에 더해주는 항(term)을 뜻한다. regularizer 라고도 부르는데, 구글링을 해도 적당한 번역이 없어서 그냥 레귤러라이저라고 하면 될 듯 하다.

 

L1 정규화(L1 regularization) 또는 lasso 회귀(lasso regression)

독립 변수에 곱해지는 가중치 파라미터(parameter)들을 벡터로 묶고, 이에 대한 L1 norm을 정규화 항으로 설정한다.

수식으로 표현하면 아래와 같다. w는 파라미터 벡터를 뜻한다.

$$ \lambda R(w) = \lambda ||w||_1 $$

람다(λ) 기호는 정규화의 강도를 설정하기 위한 계수이다. 1.0을 기본으로 하여 키우고 줄이는 것 같다. 그리고, 0일 경우에는 정규화를 안한다는 뜻이다. 개인적으로 람다를 정규화 제어자(controller)라고 부르면 어떨까 싶다.

L1 정규화는 최소제곱법으로 표현된 손실함수에 위의 정규화 항을 더하여 최소오차를 구하는 것을 말한다. 이에 대한 수식은 아래와 같다.

$$ \sum_{k=1}^{n}[y_k - f(x_k)]^2 + \lambda ||w||_1 $$

이 정규화를 lasso 회귀라고도 부르는데, lasso의 어원은 전혀 예상 밖으로 람의 이름이 아니었다! "Least Absolute Shrinkage and Selection Operator"의 acronym이었으며, 해석해보면 최소절대축소 및 선택자 정도 되겠다. 역시 절대값을 이용한다는 의미인 듯.

 

L2 정규화(L2 regularization) 또는 ridge 회귀(ridge regression)

L1 정규화에서 L1 norm을 사용하는 대신 L2 norm을 이용하는 것을 말한다. L2 norm은 제곱 표현 수식인데 미분이 쉬워지기 때문에 L1 정규화보다 훨씬 일반적이다.

레귤러라이저의 수식은 아래와 같다.

$$ \lambda R(w) = \lambda ||w||_{2}^{2} $$

특이한 점은 L2 norm에 제곱을 가했다는 것인데, L2 norm은 원래 제곱근이기 때문에 이를 벗겨내기 위해 사용된 것 같다. 이로 인해 미분이 엄청 수월해지는데, 어차피 정규화 항(term)은 제곱이든 제곱근이든 일정한 비율로 제어를 하는 것을 목적으로 하기 때문에 이득이 되는 방향으로 수식을 조작하는 것 같다.

이 정규화는 ridge regression이라고도 한다. lasso가 사실 LASSO였기에 ridge도 사람 이름이 아닐 것이란 생각이 들었다. 역시나, 그냥 영어 단어였다.(조금 옛날에 릿지 레이서라는 산에서 레이싱하는 게임이 있었는데, 바로 그 릿지였다.)

ridge하면 떠오르는게 산(mountain)이다. 산은 계수가 함수인 2차 함수와 똑같이 생겼다. 최소제곱법과 L2 norm을 생각하면 왜 이렇게 부르는지 감이 오시리라.

전체 수식은

$$ \sum_{k=1}^{n}[y_k - f(x_k)]^2 + \lambda ||w||_{2}^{2} $$

여담으로 개발자의 이름을 딴 티호노프 정규화(Tikhonov regularization)라는 용어도 많이 통용되는 것 같다.

※ L2 정규화에 대한 자세한 설명과 실제 프로그램 구현 상에서 어떻게 작동하는지는 차후 별도 포스트에서 다루도록 하겠다.

 

Elastic Net

L1xL2 정규화, 즉, 두 정규화 기법을 조합한 기법을 회귀에 적용한 모델이라고 한다. 조합이라고 해서 무지 복잡해 보이지만, 실제로는 L1, L2 정규화 항 각각을 더해주는 작업만 할 뿐이다. 다만, 최적화 하기에는 좀 더 예민할 것으로 보인다.


L2 정규화(ridge regression)를 적용한 모델과 적용하지 않은 모델의 계수는 각각 아래와 같다. 이 결과는 내가 작성한 선형회귀 실습 코드(C++)를 통해 도출된 것인데, 교재의 그것과는 약간 차이가 있으나 기조를 벗어나지는 않았다.

=========
solving Boston Housing Dataset
---------
parameters (not regularized) :
crim:-0.108011, zn:0.046420, indus:0.020559, chas:2.686734, nox:-17.766611, rm:3.809865, age:0.000692, dis:-1.475567, rad:0.306049, tax:-0.012335, ptratio:-0.952747, b:0.009312, lstat:-0.524758, bias:36.459488
---------
parameters (regularized) :
crim:-0.104595, zn:0.047443, indus:-0.008805, chas:2.552393, nox:-10.777015, rm:3.854000, age:-0.005415, dis:-1.372654, rad:0.290142, tax:-0.012912, ptratio:-0.876074, b:0.009673, lstat:-0.533343, bias:31.597670
=========

 

Posted by JMAN