ML

[ML] 머신러닝 기초 (4) Linear Regression 회귀 이론

moonzoo 2024. 2. 15. 10:03

https://mcode.co.kr/video/list2?viewMode=view&idx=21

 

메타코드M

빅데이터 , AI 강의 플랫폼 & IT 현직자 모임 플랫폼ㅣ메타코드 커뮤니티 일원이 되시기 바랍니다.

mcode.co.kr

 

이전 ML 카테고리의 포스팅에 이어 머신러닝 강의를 들으면서 내용을 정리하고 있습니다. 현재 무료로 강의를 보실 수 있으니 궁금하신 부분은 강의를 수강하시면 좋을 것 같습니다.

 

아! 그리고 실습은 제가 머신러닝 이론에 대해서 학부과정에 배웠던 내용을 리마인드 하고자 강의를 듣고 있는 것이라 실습 관련된 포스팅은 진행하지 않습니다.

 

실습을 원하시는 분들은 강의를 듣고 직접 따라서 해보시는 것을 추천드립니다!


Linear Regression

 

차수를 높인 다항회귀 역시 선형 회귀로 봅니다.

 

우측 상단에 공부시간과 성적 표를 보면, 공부시간 = x, 성적 = y (실수 이기 때문에 회귀문제)

공부 시간이라는 피처의 갯수가 하나이므로, 단순 or 다항 회귀 문제로 풀 수 있습니다.

 

파라미터는 가중치나 편향처럼 모델이 학습을 통해 최적의 값을 찾는 변수라면, 하이퍼파라미터는 모델이 학습하면서 최적의 값을 자동으로 찾는 것이 아니라 사람이 직접 지정해 주어야하는 변수입니다.

 

하이퍼파라미터 종류는 학습률(Learning Rate), 비용 함수(Cost Function), 훈련 반복 횟수(Epochs) 등 다양하게 존재하며 최적의 하이퍼파라미터를 찾기 위한 과정을 하이퍼파라마터 튜닝이라고 합니다. 하이퍼파라미터 튜닝 관련 더 자세한 내용은 추후 강의에 등장할 것 같아서 나중에 다루도록 하겠습니다.

 


 

Optimization 

Optimization에 대해 설명하기 전에 편미분과 연쇄법칙에 대해 알고 넘어가는 것이 좋다고 하셨습니다.

EX.x에 대해 편미분해보면 x^2를 편미분하면 2x. xy에서 y를 상수로 보기 때문에 y. 3은 상수이기 때문에 0이 돼서 사라지면, 2x+y가 됩니다.

y에 대해 편미분해보면 x라는 값만 남게 됩니다.

 

u라는 새로운 변수를 도입시켜서 원래는 y에 대해서 x로 미분을 시켜야하는데 y에대해서 u로 미분을하고 u에대해서 x로 미분할 수 있는 두 가지의 step으로 쪼개는 것이 연쇄법칙 입니다.

 

EX.를 연쇄법칙으로 풀어보면

1. ln이라는 자연로그는 미분했을 때, 1/x가 되는 성질이 있고,

2. dy/du 는 1/u가 될 것이고, du/dx = 2라는 값이 나오게 됩니다.

3. 이를 곱하면 2/u이지만, 실제로는 x와 y라는 표현하고 싶기 때문에 u를 x로 변환해주면 2 / 2x+4로 1/x+2가 됩니다.

 

이러한 연쇄법칙을 통해 머신러닝과 딥러닝에서 복잡한 미분을 계산해나갈 수 있어 중요한 수학 공식 중 하나입니다.

 


Loss function (손실함수)

 

손실함수는 회귀문제에 어울리는 손실함수분류문제에 어울리는 손실함수가 존재합니다. 그렇기 때문에 문제에 맞는 손실함수를 정의할 필요가 있습니다.

MSE(평균 제곱 오차)는 예측값과 실제 값 사이의 차이를 정량화하는 데 사용되는 손실 함수입니다.

 

이를 수학적으로 표현하기 위해 i라는 인덱스를 도입하여, i가 1부터 N까지 모든 데이터 포인트에 대해 평균 제곱 오차를 계산합니다. 여기서 N은 데이터 포인트의 총 수입니다. 여기서 모든 데이터 샘플에 대한 오차를 줄이는 것이 모델의 목적입니다. 

 

제곱을 사용하는 이유는 오차의 크기를 강조하고, 예측이 실제 값보다 높든 낮든 간에 오차의 방향성을 무시하기 위함입니다. MSE 값이 작을수록 모델의 성능이 더 좋다고 평가할 수 있으며, 이는 예측 값이 실제 값에 더 가깝다는 것을 의미합니다.

 

 

Least Square Method

파라미터를 풀 수 있는 방법 중 하나가 최소제곱법 입니다.

최소제곱법의 손실함수는 mse loss를 사용하는 것을 보실 수 있습니다.

y^을 a라는 파라미터와 b라는 파라미터로 표현할 수 있습니다. 이를 최소화 시키는 것이 최소제곱법

 

이처럼 손실함수에 대한 a라는 파라미터 값의 편미분 값이 0이라 정의하고, 델타L/델타b 이 0이라 정의합니다.

여기서 사용하는 개념이 L은 2차식인데 2차식의 그래프는 U의 형태를 띄고 있고, 이러한 형태는 함수의 최솟값에서의 순간 변화율의 접선의 기울기가 0이라는 성질을 알고 있습니다.

그렇기 때문에 "편미분 값이 0이 될 수있도록 하는 a와 b를 구하자"라는게 첫 번째 풀이방법 입니다.

 

단순 선형회귀에서 mse loss를 사용해서 최소제곱법 문제를 풀면 완벽한 해를 찾을 수 있습니다. (a의 최적값, b의 최적값을 구할 수 있다)

풀이방법 1은 소거법을, 풀이방법2를 행렬적으로 푸는 방법이 존재하는데 선형회귀 문제를 풀 때는 최소제곱법으로 완벽한 해를 구할 수 있다는게 포인트입니다.

 

완벽한 해 마저도 오차가 존재하긴 하지만 주어진 데이터에서 표현할 수 있는 모델 중 가장 최적의 값을 찾았다고 합니다. 


Gredient Descent

복잡하지만 오차를 줄이고자 하는 다중 선형회귀, 비선형 모델을 사용합니다. 그러나, 함수가 복잡해지면 역행렬을 구하는 것이 굉장히 어려워지기 때문에 최소제곱법을 사용하기 어렵습니다. 그래서 나온 방법이 경사하강법입니다.

 

순간변화율의 반대 방향으로 파라미터 값을 업데이트 한다는 말은 다음과 같습니다.

우선 손실함수에 대한 편미분 값이 3이 나왔다면, 'a0+델타a'식에 의해 a0가 순간적으로 커졌을 경우 손실함수 L에 +3이 된다는 것입니다. 저희는 손실함수 값을 낮춰주는 것이 목표이기 때문에 델타a를 더하는 것이 아니라 델타a를 빼주어야 순간 변화율에 따라서 손실값이 낮아지는 방향으로 업데이트 하는 것입니다. 

 

머신러닝 프로세스에서는 다음과 같이 적용됩니다.

  1. 초기 파라미터 설정: 먼저, 모델 파라미터(예: 선형 회귀의 기울기와 절편)에 대해 임의의 초기값을 설정합니다.
  2. 손실 함수 결정: 최적화하려는 모델에 대한 손실 함수(또는 비용 함수)를 정의합니다. 이 함수는 실제 값과 모델 예측 값 사이의 오차를 측정합니다.
  3. 기울기 계산: 현재 파라미터에서 손실 함수의 기울기(각 파라미터에 대한 편미분)를 계산합니다. 
  4. 파라미터 업데이트: 계산된 기울기의 반대 방향으로 파라미터를 조정합니다. 이때, 학습률(Learning Rate)이라는 하이퍼파라미터를 사용하여 조정의 크기를 결정합니다.
  5. 반복: 위 단계를 반복하며, 비용 함수의 값이 더 이상 감소하지 않거나 특정 기준 아래로 떨어질 때까지 파라미터를 업데이트합니다.

Bias & Variance (편향과 분산)

마지막으로 회귀에서 편향과 분산에 대해 알아보기 전에, 두 가지 질문을 던지고 가겠습니다.

 

1. 학습 데이터와 평가 데이터는 같은 분포를 가지는가?

-> 랜덤 샘플링으로 만들면 일반적으로 비슷한 분포를 갖게 됩니다.

 

2. 평가 데이터는 어느 정도 크기를 가져야 하는가?

-> 보통 10 ~ 20% (정해져 있는 것은 아님.)

 

 

Bias and Variance Trade-off (분산과 편향의 트레이드 오프)

Overfitting (과적합)

과적합은 모델이 훈련 데이터에 너무 잘 맞추어져서, 새로운 데이터나 검증 데이터에 대해서는 일반화 성능이 떨어지는 현상을 말합니다. 이는 모델이 훈련 데이터의 노이즈까지 학습해버려, 실제 데이터의 일반적인 패턴을 학습하기보다는 특정 훈련 데이터에 과도하게 최적화된 상태를 의미합니다.

  • Epochs와의 관계: 에폭 수가 너무 많으면 모델이 훈련 데이터에 과적합될 위험이 증가합니다. 각 반복에서 모델은 데이터의 특정 특징을 점점 더 세밀하게 학습하게 되며, 이는 결국 노이즈까지 학습하는 결과를 초래할 수 있습니다.
  • 모델 복잡도와의 관계: 모델이 너무 복잡하면(예: 레이어가 많거나 뉴런의 수가 많은 경우) 과적합의 위험이 커집니다. 복잡한 모델은 훈련 데이터 내의 작은 변화나 노이즈까지 학습할 수 있는 능력이 있기 때문에, 새로운 데이터에 대한 일반화 능력이 떨어질 수 있습니다.

Underfitting (과소적합)

과소적합은 모델이 훈련 데이터에 충분히 맞추어지지 않아, 훈련 데이터와 검증 데이터 모두에 대해 성능이 낮은 상태를 말합니다. 이는 모델이 데이터의 기본 구조를 학습하기에 충분히 복잡하지 않거나, 충분한 에폭 동안 훈련되지 않았을 때 발생합니다.

  • Epochs와의 관계: 에폭 수가 너무 적으면 모델이 충분히 학습되지 않아 과소적합이 발생할 수 있습니다. 적절한 에폭 수는 모델이 데이터의 일반적인 패턴을 충분히 학습할 수 있도록 해야 합니다.
  • 모델 복잡도와의 관계: 너무 단순한 모델(예: 레이어가 적거나 뉴런의 수가 적은 경우)은 데이터의 복잡성을 충분히 표현할 수 없어 과소적합을 일으킬 수 있습니다. 모델의 복잡도를 적절히 증가시켜 데이터의 기본 구조를 충분히 학습할 수 있도록 해야 합니다.

위의 질문에서  "1. 학습 데이터와 평가 데이터는 같은 분포를 가지는가?"에 대해 랜덤 샘플링으로 만들면 일반적으로 비슷한 분포를 갖게 된다고 말했으나, 반드시 평가 데이터 또는 실제 예측해야하는 데이터의 분포가 학습 데이터와 비슷하지 않습니다. 

 

이러한 경우 학습 데이터에 과적합이 발생하면 오차가 더 커지게 되는 문제가 발생해 일반화가 필요합니다.

 

요약하자면 모델의 복잡도가 증가하면 학습에 대한 정확도는 증가하나, 실제로 평가 데이터는 학습 데이터와 다른 분포를 가질 수 있기 때문에 과적합이 발생하는 문제가 생길 수 있습니다. 그래서 모델의 복잡도를 증가시키는 행위가 정답은 아니라는 것 입니다.

 

 

위의 식은, MSE loss에 대해 편향분산으로 개념으로 분해를 진행한 것입니다.

E($\theta$) : E라는 평균값 자체가 랜덤값을 정의해주는 것인데, $\theta$ 라는 값 자체가 정해진 값이기 때문에 랜덤성이 없습니다. 그렇기 때문에 $\theta$ 에대해 평균값을 내려도 값은 항상 $\theta$ 로 고정되게 됩니다.

 

세번째 줄의 중간항의 식입니다. 분배법칙을 적용하면 E( $\hat{\theta}$ ) - E(E($\hat{\theta}$)이 되는데 E와 E가 만나게 되면, 평균과 똑같은 E 하나로 볼 수 있습니다. 그래서 왼쪽의 식은 0이되고, 중간항도 0이됩니다.

 

 

편향(Bias)

  • 정의: 편향은 모델이 실제 데이터를 얼마나 잘 대표하지 못하는지를 나타내는 척도입니다. 즉, 모델의 예측값이 실제 값에서 얼마나 멀리 떨어져 있는지를 측정합니다. 높은 편향을 가진 모델은 실제 데이터의 복잡성을 충분히 학습하지 못한 상태로, 주로 과소적합을 의미합니다.
  • 예시: 선형 회귀 모델이 비선형 데이터를 모델링하는 경우, 모델은 데이터의 복잡한 관계를 충분히 학습하지 못해 높은 편향을 가지게 됩니다.

분산(Variance)

  • 정의: 분산은 훈련 데이터 세트의 작은 변동에 모델이 얼마나 민감하게 반응하는지를 나타냅니다. 모델이 훈련 데이터에 너무 과도하게 최적화되어 새로운 데이터에 대해 예측할 때 일관성이 없는 경우, 즉, 다른 데이터 세트를 사용할 때 결과가 크게 달라지는 경우 높은 분산을 가진다고 합니다.
  • 예시: 결정 트리가 깊어질수록 훈련 데이터에 대해 더욱 세밀하게 학습하지만, 이로 인해 새로운 데이터에 대한 예측이 일관성 없게 될 수 있습니다. 이는 모델이 과대적합 상태임을 나타냅니다.

 

편향-분산 트레이드오프(Bias-Variance Tradeoff)

 

모델을 학습시킬 때 편향을 줄이려고 하면 분산이 증가하고, 분산을 줄이려고 하면 편향이 증가하는 경향이 있습니다. 이를 편향-분산 트레이드오프라고 합니다. 목표는 두 가지 오류를 모두 최소화하는 것이지만, 실제로는 둘 사이의 최적점을 찾는 것이 중요합니다.

 

선형모델일 경우 언더피팅 현상이 심해서 편향에 대한 에러가 큽니다.

비선형모델은 학습데이터 셋을 더 완벽하게 맞추면서 언더피팅 문제가 해결되면서 편향에 대한 에러가 줄어들게 됩니다.

 

선형모델은 어떤 데이터셋이 여러번 들어와도 일관된 에러로 보여주기 때문에 분산 에러가 적습니다.

비선형모델은 학습데이터셋에 완벽하게 맞춰지는 오버피팅 문제가 나타나서 다른 데이터셋에 대한 오차가 커지고 분산 에러가 커지게 됩니다.

 

분산과 편향을 모두 고려하고자 한 것이 mse loss로 mse loss = 분산 + 편향 입니다.

분산과 편향을 모두 고려한 total error인 mse loss가 최소화되도록 하는 것이 머신러닝의 목표입니다.

 

 

이 트레이드오프를 이해하고 적절한 균형을 찾는 것은 모델의 성능을 최적화하고, 일반화 능력을 높이는 데 필수적입니다. 모델의 복잡도를 조절하거나, 정규화 기법을 사용하여 편향과 분산을 조절하는 방법이 있습니다.

 

일반적으로 모델의 복잡도를 키우고, 과적합을 막는 방법론을 사용하고 있습니다.


How to solve that trade-off

모델 학습 시 학습 데이터와 테스트 데이터로 나누는데, 테스트 데이터를 다시 한번 쪼개서 검증 데이터를 만듭니다.

검증 데이터와 테스트 데이터의 가장 큰 차이점은 '학습시에 볼 수 있느냐?' 입니다. 학습에 참여하지 않는 것은 테스트 데이터와 동일하나, 검증 데이터는 학습 시 계속해서 평가를 하고 최적의 파라미터를 찾고 마지막 테스트 데이터에 적용해서 정확도를 테스트 하는 방법입니다.

 

모든 데이터 샘플에 학습을 진행하면 계산비용이 증가하는 문제가 존재하여 K-fold cross validation 방법이 등장했습니다.

 

 

모든 데이터 샘플이 아니라 K개라는 파트로 나누어 검증을 진행하기 때문에 계산비용이 낮아집니다.

 

그렇다면 K 값이 커지면, 무엇이 달라질까요?

 

K값이 커질 수록 LOOCV와 비슷한 형태가 됩니다.

1. K값이 커지면 학습 데이터의 수가 커지게 됩니다.

2. 학습 데이터 수의 값이 커지므로 모든 데이터셋의 분포를 학습하기 때문에 Bias 에러는 작아집니다.

3. 검증 데이터셋은 하나이기 때문에 많은 데이터를 검증하다보면 분산이 들쑥날쑥해져서 Variance 에러가 커집니다.

 

Regularization

정규화라는 것은 손실함수를 건드리는 방법입니다. L1 정규화와 L2 정규화는 모델의 손실함수에 각각 L1 규제와 L2규제를 추가해준 것을 말합니다.

 

복잡도가 큰 모델을 정의한다는 의미는 언더피팅의 위험도는 낮아지지만 오버피팅의 경우가 커지게 됩니다. 이 때, 정규화는 모델을 복잡하게 정의하고 언더피팅 문제를 없애는 상황에서 2만개의 파라미터가 있다면 중요한 파라미터 1만개를 찾아서 학습을 진행하자! 라는 개념입니다. 즉, 필요없는 파라미터 값을 0으로 만들어 중요하지 않은 파라미터를 제거합니다.

 

정규화의 종류에는 릿지 회귀(L2)와 라쏘 회귀(L1)이 존재합니다.

 

L2 정규화손실 함수에 계수(가중치)의 제곱의 합 (파라미터의 크기) 을 더하는 형태로, weight의 크기에 따라 weight값이 큰 값을 더 빠르게 감소시키는 weight decay 기법입니다. Weight 크기에 따라 가중치의 패널티 정도가 달라지기 때문에 가중치가 전반적으로 작아져서 학습 효과과 L1 대비 더 좋게 나타납니다.

 

또한, 이는 모든 가중치를 동시에 줄이되, 완전히 0으로 만들지는 않습니다. 이로 인해 모델이 더 부드럽게 되어 과대적합을 방지하면서도 데이터의 노이즈에 대해 더욱 강건하게 만듭니다. 

 

쉽게 예시를 들면 B1, B2, B3...Bn이 존재할 때, B2에 대한 편미분을 계산하고 경사하강법을 진행해도 학습이 잘되지 않는 상황이 있습니다. 이러한 상황에서 B2에 값이 10이라고 하면 위의 식에서 빨간색으로 색칠된 10^2 = 100으로 손실함수에 100* $\lambda$ (정규화)가 추가됩니다. 이 때, 어차피 mse loss를 줄이는데 도움이 되지 않는 B2를 제곱을 거쳐 키워서 더해주는 바에 0에 가깝게 만들어서 학습을 해버리자는 것입니다. 이렇게 되면 mse loss에 떨어지는 폭은 적어질 것이고 정규화에 대한 값은 크게 줄어드게 됩니다.

 

 

L1 정규화는 모델의 손실 함수에 계수(가중치)의 절대값의 합을 더하는 형태로, 미분 시 weight의 크기에 상관 없이 일정한 상수값을 빼거나 더해주게 됩니다. 이를 통해 일부 계수를 정확히 0으로 만들어, 결과적으로 덜 중요한 특성의 가중치를 제거합니다. 이러한 특성 때문에 L1 정규화는 특성 선택(feature selection)이 자연스럽게 이루어지는 효과를 가지고 있습니다. 이를 통해 특정 가중치를 삭제해 모델의 복잡도를 낮출 수 있습니다.

 

절대값이 들어가는 이유는 불필요한 파라미터 값을 0으로 만드는 것이 목표여서 0과의 차이를 봐야하기 때문입니다.

 

 

 

왼쪽의 그림에서 |B1|+|B2| <= s에 해당하는 부분이 마름모 부분입니다.

B1, B2는 마름모안에 존재하며, MSE 등고선에서 최적의 값은 등고선과 마름모와 만나는 부분 B2입니다. 이 때 B1은 0의 값을 갖게되고 B2만 어떠한 값을 갖게 되는데, 불필요한 파라미터인 B1을 지워 오버피팅 Variance 에러를 줄이겠다는 것입니다.

 

 

 

 

 

 

 

 

 

L1 정규화는 절대값 함수가 선형 부분으로 나타나면서 중심에서부터 대각선으로 뻗어나가는 형태를 생성합니다. 결과적으로, 이 제약은 마름모꼴(또는 2차원에서는 다이아몬드 형태)의 제약 영역을 형성합니다. 마름모꼴 형태는 가중치 벡터가 마름모의 꼭지점, 즉 "코너"에 위치할 때 최적화가 이루어지기 쉽다는 것을 의미합니다. 이 꼭지점에서는 하나 이상의 가중치가 정확히 0이 되어 특성 선택 효과를 나타냅니다.

 

 

 

L2 정규화는 제곱항 때문에, 모든 방향으로 동일한 거리를 유지하면서 가중치 공간을 채웁니다. 이 형태는 모든 방향으로 균일하게 제약을 적용하며, 결과적으로 원형(또는 고차원에서는 구 형태)의 제약 영역을 생성합니다. 형태는 가중치 벡터가 원의 표면에 위치할 때 최적화가 이루어지며, 이는 모든 가중치가 동시에 작아지게 하지만, 대부분의 경우 완전히 0이 되지는 않습니다.

 

또한, 두 방법 모두 람다가 커지면 불필요한 파라미터를 0으로 보내는 현상을 더 키워주기 때문에 모델의 복잡도가 줄어들고 되는데, 이로 인해 파라미터 수가 줄어들어 Bias 에러가 커지고, 모델의 복잡도가 줄어들어 어떤 데이터가 들어와도 잘 못맞추기 때문에Variance 에러가 줄어들게 됩니다. (모두 비슷하게 못맞추기 때문에)

 

 

L1 vs L2 정규화의 주요 차이점

  • 특성 선택: L1 정규화는 계수를 정확히 0으로 만들 수 있어 특성 선택에 유용합니다. 반면, L2 정규화는 모든 특성을 유지하되 가중치를 줄입니다.
  • 계수 축소: L2 정규화는 계수를 급격히 줄이지 않고 점진적으로 줄여, 모든 특성의 정보를 어느 정도 보존합니다.
  • 수학적 속성: L1 정규화는 비용 함수에 비볼록(non-convex) 항을 추가하지만, L2 정규화는 비용 함수를 볼록(convex) 유지합니다. 이는 최적화 문제를 해결하는 데 있어 L2 정규화가 수학적으로 더 단순하고 안정적임을 의미합니다.
  • 용도: L1 정규화는 불필요한 특성이 많은 고차원 데이터셋에서 유용하며, L2 정규화는 데이터의 노이즈에 강건한 모델이 필요할 때 선호됩니다.

마치며...

강의에서 회귀 관련 내용을 수강했습니다. 수강 중에 제가 추가적인 이해가 필요하다고 생각한 부분만 자세하게 적어둔 것이라 글에서 자세한 설명이 생략된 부분도 있을 것이고, 이해하기 어렵게 난잡한 부분도 있을 것입니다.

 

정보 공유보다는 제가 부족한 부분을 정리하면서 글로 남기는 것이기 때문에 이해가 어려우신 분들은 강의를 들으시는 것을 추천합니다!