|
|
이는 우리가 흔히 아는 1차 함수의 형태와 같다. 우리가 중학교에서 배우는 1차 함수 y = mx + b도 수학적으로는 선형 함수가 아니라 아핀 함수이다.
아핀 함수는 선형 함수에 평행이동을 추가한 형태이다.
여기서 wx는 선형 함수이고, +b는 함수를 출력축 방향으로 이동시키는 역할을 한다.
예를 들어
는 원점을 지나는 선형 함수이고,
는 이를 출력축 방향으로 3만큼 평행이동한 아핀 함수이다.
하지만 머신러닝에서 사용하는 아핀 함수는 입력값이 하나인 경우만 다루지 않는다. 현실의 데이터는 여러 개의 특징(feature)으로 이루어져 있기 때문에 입력은 일반적으로 다차원 벡터가 된다.
다차원 아핀 함수
입력이 여러 개인 경우 아핀 함수는 다음과 같이 표현할 수 있다.
또는 벡터 형태로
각 가중치 w_i는 입력값 x_i가 결과에 얼마나 큰 영향을 미치는지를 나타낸다.
다차원 아핀 함수도 본질적으로는 다차원 선형 함수에 평행이동을 추가한 것이다.
고차원에서의 선형 함수 이해
1차원과 2차원의 선형 함수는 직관적으로 이해하기 쉽지만, 고차원으로 넘어가면 이를 시각적으로 떠올리기는 어려워진다. 따라서 고차원에서의 선형 함수는 모양이 아니라 연산 구조로 이해해야 한다.
선형 함수의 본질은 입력값들을 각각 상수배한 뒤 모두 더하는 구조이다.
예를 들어
선형 함수의 핵심 구조는 입력에 대한 상수배와 덧셈으로 이루어진다는 점이다. 다만 이 구조가 원점을 보존하여 f(0) = 0을 만족할 때에만 수학적으로 선형 함수(linear function)가 된다.
선형 회귀의 목적
선형 회귀는 주어진 데이터를 가장 잘 설명하는 아핀 함수의 매개변수 w와 b를 찾는 방법이다.
데이터는 일반적으로 입력값 x와 정답 y로 이루진 쌍들의 집합으로 표현된다. 선형 회귀의 목표는 각 입력 x에 대해 예측값 𝑦̂를 만드는 함수
가 실제 값 y와 최대한 가까워지도록 w와 b를 조정하는 것이다. 여기서 중요한 점은 선형 회귀가 정답을 정확히 맞추는 함수를 찾는 것이 아니라, 전체 데이터에 대해 평균적으로 가장 잘 맞는 아핀 함수를 찾는다는 것이다.
즉, 일부 데이터에서는 오차가 발생할 수 있지만, 전체적으로 그 오차가 가장 적어지는 방향으로 w와 b가 결정된다.
가중치와 절편 초기화
우선 가중치와 절편 w, b는 임의의 값으로 초기화된다.
처음에는 적절하지 않은 값에서 시작하더라도, 이후 오차를 줄이는 방향으로 w와 b가 반복적으로 조정된다.
오차 확인 및 오차 기반 가중치, 절편 업데이트
초기화된 가중치와 절편을 사용하면 각 데이터에 대해 예측값 𝑦̂ 를 계산할 수 있다.
이 예측값과 실제 값 y의 차이를 통해 현재 모델이 데이터를 얼마나 잘 설명하고 있는지를 평가할 수 있다.
각 데이터(각 샘플)에 대한 오차는 다음과 같이 정의된다.
하지만 이러한 성능의 오차는 각 데이터(각 샘플)마다 각각 존재하기 때문에, 모델의 성능을 하나의 값으로 표현하기 위해서는 모든 오차를 종합해야 한다.
즉, 각 데이터(각 샘플)에서 발생하는 오차들을 하나의 기준으로 합쳐서 모델이 전체적으로 얼마나 틀렸는지를 측정할 필요가 있다.
그리고 이렇게 구해진 오차를 이용하여 오차가 줄어드는 방향으로 가중치와 절편을 업데이트한다.
손실 함수 (Loss Function)
선형 회귀에서는 이러한 개별 오차들을 하나의 값으로 종합하여 모델의 성능을 평가한다. 이를 위해 정의된 함수가 바로 손실 함수(loss function)이다.
손실 함수의 값이 작을수록 모델의 예측이 실제 데이터와 더 가깝다는 것을 의미한다. 따라서 선형 회귀의 목표는 이 손실 함수를 최소화하는 w와 b를 찾는 것이다.
평균 제곱 오차 (Mean Squared Error, MSE)
선형 회귀에서 가장 널리 사용되는 손실 함수는 평균 제곱 오차이다.
각 데이터에서 발생하는 오차를 단순히 더하는 방식은 문제가 있다. 오차는 양수와 음수가 섞여 있기 때문에 서로 상쇄되어 실제 오차의 크기를 제대로 반영하지 못할 수 있기 때문이다. 따라서 오차의 크기만을 고려하기 위해 각 오차를 제곱하여 사용한다. 제곱을 하면 모든 값이 양수가 되며, 큰 오차일수록 더 크게 반영되는 효과가 있다.
왜 평균을 쓰는가
MSE에서 전체 오차를 단순히 합하면
이 값은 데이터 개수 n에 따라 계속 커진다.
즉, 문제가 생긴다
같은 기준으로 비교할 수 없게 된다.
예를 들어
Case A: 데이터 10개, 오차 제곱 합 = 100
Case B: 데이터 100개, ****오차 제곱 합 = 1000
이것만 보면 Case B가 더 나쁜 모델처럼 보인다. 하지만 사실은 데이터가 10개 많아서 커진 것일 뿐, 이건 모델 성능이 아니라 데이터 개수 영향이 섞여버린 상태이다.
평균을 취하면
Case A: 100 / 10 = 10
Case B: 1000 / 100 = 10
으로 둘 다 같은 값이 된다. 즉, 평균을 취하면 데이터 개수와 무관하게 모델의 평균적인 오차 수준을 비교할 수 있다.
왜 큰 오차를 더 크게 반영해야 하는가
핵심은 모델의 목적에 있다. 선형 회귀는 전체적으로 가장 안정적인 예측을 하는 함수를 찾는 것이다. 그런데 중요한 사실이 하나 있다.
작은 오차 여러개 vs 큰 오차 하나
예를 들어
A: 오차 1이 100개
B: 오차 50이 1개
이 둘은 같은 총합이 될 수도 있지만 큰 오차가 더 위험하다.
왜 큰 오차가 더 위험한가
큰 오차는 보통 이런 의미를 가진다.
즉, 조금 틀리는 것보다 한 번 크게 틀리는 것이 더 치명적이다.
제곱을 사용하면
차이가 비선형적으로 확대된다.
MSE는 전체적으로 얼마나 틀렸는지를 공정하게 비교하면서, 동시에 큰 실수가 더 강하게 반영하도록 설계된 손실 함수다.
경사하강법 (Gradient Descent)
선형 회귀의 목적은 손실 함수의 값을 최소화하는 w와 b를 찾는 것이다.
손실 함수는 w, b에 따라 값이 달라지는 함수이다.
인 함수다.
여기서 주목해야할 점은 경사하강법에서 업데이트되는 건 w, b이고, x는 고정된 입력이라는 점이다.
경사하강법은 함수의 최소값을 찾기 위해 기울기(미분값)를 따라 반복적으로 이동하는 최적화 알고리즘이다.
입력 데이터는 왜 고정된 입력인가?
학습 데이터셋은 학습 과정동안 변하지 않는다.
즉, 데이터셋은 다음과 같이 고정되어있다.
선형 회귀의 목적은 이미 주어진 데이터들 사이의 관계를 가장 잘 설명하는 함수의 매개변수 w, b를 찾는 것이다. 학습 과정에서는 데이터 자체를 바꾸는 것이 아니라, 데이터를 더 잘 설명하도록 모델의 매개변수 w, b를 반복적으로 조정한다.
경사하강법 원리
선형 회귀의 목표는 손실 함수의 값을 점점 줄여나가는 것이다. 방법은 매우 간단하다.
현재의 w, b에서
즉, 손실이 증가하는 방향은 피하고 손실이 감소하는 방향으로 이동한다. 이 과정을 반복하면 손실값이 점점 감소하게 된다.
손실 함수는 w, b에 대한 함수이므로, 각 변수에 대해 얼마나 민감하게 손실이 변하는지를 계산할 수 있다.
이는 편미분(partial derivative)을 통해 계산한다.
편미분 (Partial Derivative)
손실 함수는 하나의 변수로만 이루어진 함수가 아니다.
예를 들어 입력 특징(feature)이 여러 개인 선형 회귀에서는 손실 함수가
처럼 여러 가중치와 절편에 의해 결정된다.
즉, 손실 함수는 여러 변수에 동시에 의존하는 다변수 함수(multivariable function)이다.
하지만 손실 함수는 여러 변수에 동시에 의존하므로, 현재 상태에서 손실 함수가 각 변수 방향으로 얼마나 변하는지를 각각 계산해야 한다.
이를 위해서는 특정 변수 하나를 조금 변화시켰을 때 손실 함수가 얼마나 변하는지를 알아아 한다. 이처럼 여러 변수 중 하나만 변화시켰을 때의 변화율을 구하는 미분을 편미분(partial derivative)이라고 한다.
편미분은 한 변수만 변화시키고 나머지 변수들은 고정한 상태에서 변화율을 계산한다. 손실 함수
를 w_1에 대해 편미분하면
으로 표기하고 이는 w_1을 제외한 다른 변수들을 상수처럼 취급한 상태에서, 손실 함수를 w_1에 대해 미분한 것이다.
편미분을 이용한 가중치와 절편 업데이트 방향 계산
손실 함수 MSE
여기서 예측값 𝑦̂ ^(i)는
이다. 이제 손실 함수를 특정 가중치 w_j에 대해 편미분한다.
MSE 함수는 모든 데이터 샘플에 대한 오차를 더하여 사용한다. 더해지는 각 항을 w_j에 대해 편미분하면,
이고, 이는 합성함수의 미분법(chain rule)에 의해
가 된다. 여기서 y^(i)는 상수이고,
이므로 𝑦̂ ^(i)를 w_j에 대해 미분하면 w_jx_j^(i) 항만 변수로 작용하고, 나머지 항들은 상수 취급된다. 따라서
이고
가 된다.
이제 모든 데이터 샘플에 대한 결과를 합치면 전체 손실 함수의 편미분은
가 된다.
이렇게 구한
는 손실 함수가 가중치 w_j값 변화에 따라 얼마나 빠르게 증가하거나 감소하는지를 나타내는 값이다.
즉,
값이 크면 w_j를 조금만 바꿔도 손실 함수가 크게 변하고
값이 작으면 w_j를 바꾸어도 손실 함수 변화가 작다.
또한 부호는 손실 함수가 증가하는 방향을 나타낸다.
∂L / ∂w_j > 0 이면 w_j를 증가시킬수록 손실 함수가 증가하고
∂L / ∂w_j < 0 이면 w_j를 증가시킬수록 손실 함수가 감소한다.
따라서 손실 함수를 줄이기 위해서는 편미분의 반대 방향으로 가중치를 이동시켜야 한다.
그리고 절편 b도 같은 방식으로 편미분할 수 있다.
절편 b에 대해 미분할 때는 𝑦̂ ^(i) 안에서 b의 계수가 1이므로
이 된다.
가중치와 절편 업데이트
이제 각 가중치 w_j와 절편 b에 대해 손실 함수가 어떻게 변하는지를 나타내는 편미분 값을 알 수 있다.
여기서 중요한 점은 선형 회귀의 손실 함수가 하나의 변수만으로 결정되는 함수가 아니라는 것이다.
손실 함수는
처럼 여러 변수에 동시에 의존하는 다변수 함수이다. 따라서 현재 모델의 상태는 단 하나의 숫자가 아니라,
처럼 모든 가중치와 절편 값을 모아놓은 하나의 상태(state)이며, 수학적으로는 (n+1)차원 공간에서의 한 점(point)으로 볼 수 있다.
현재 위치에서의 각 편미분 값은 각 축 방향으로 손실 함수가 얼마나 증가하는지를 나타낸다.
따라서 경사하강법은 특정 가중치 하나만 따로 조정하는 것이 아니라, 현재 상태에서 손실 함수를 감소시키는 방향으로 모든 가중치와 절편을 함께 이동시킨다.
이때 중요한 점은 모든 편미분 값이 한 시점을 기준으로 계산된다는 것이다. 즉, 가중치 하나를 먼저 업데이트한 뒤 그 변경된 상태에서 다음 가중치의 편미분 값을 다시 계산하는 것이 아니라, 현재 상태에서 모든 편미분 값을 먼저 계산한 뒤 그 결과를 이용해 모든 가중치와 절편을 동시에 업데이트한다.
경사하강법에서는 먼저 현재 상태에서의 모든 편미분 값을 계산하여
와 같은 하나의 벡터로 모은다. 이 벡터는 현재 위치에서 손실 함수가 가장 빠르게 증가하는 방향을 나타내며, 이를 기울기 벡터(gradient vector)라고 한다.
즉, 각 편미분 값은 각 축 방향의 변화율을 나타내고, 이를 하나로 모으면 현재 상태에서 손실 함수가 어느 방향으로 가장 가파르게 증가하는지를 나타내는 방향 벡터가 된다. 따라서 손실 함수를 감소시키기 위해서는 이 기울기 벡터의 반대 방향으로 이동해야 한다.
가중치 w_j는 다음과 같이 업데이트된다.
여기서 η는 학습률(learning rate)로, 한 번의 업데이트에서 얼마나 크게 이동할지를 결정하는 값이다.
경사하강법은 손실 함수를 줄이는 방향만 안다고 끝이 아니라 얼마나 이동해야 하는지도 정해야 하기 때문에 학습률을 사용한다.
또한 b도 가중치와 동일하게 업데이트 된다.
경사하강법은 이런 업데이트를 한 번만 수행하고 끝나는 것이 아니다.
현재 상태에서의 기울기 벡터를 계산한 뒤, 손실 함수가 감소하는 방향으로 조금 이동시킨다.
즉,
라는 현재 상태에서 새로운 상태
로 이동하게 된다.
여기서 입력 데이터는 고정되어 있으므로 손실 함수 자체의 형태가 바뀌는 것은 아니다. 하지만 손실 함수 위에서의 현재 위치가 바뀌므로, 새로운 위치에서의 기울기 벡터는 이전과 달라지게 된다. 따라서 새로운 상태에서 다시 편미분을 계산하여 새로운 기울기 벡터를 구해야 한다.
경사하강법은 이 과정을 반복한다.
이 과정을 반복하면서 모델은 손실 함수가 점점 작아지는 방향으로 이동하게 된다.
학습 반복 (Epoch)
경사하강법은 가중치와 절편을 한 번 업데이트하고 끝나는 것이 아니라, 손실 함수가 충분히 작아질 때까지 같은 과정을 반복 수행한다.
이때 학습 데이터셋 전체를 한 번 모두 사용하여 손실 함수와 기울기를 계산하고 가중치와 절편을 업데이트하는 과정을 1 epoch라고 한다.
예를 들어 데이터셋에 100개의 데이터 샘플이 있다면, 100개의 모든 데이터를 사용하여 한 번 학습을 수행한 것이 1 epoch이다.
경사하강법은 epoch를 반복할수록 손실 함수가 점점 감소하도록 가중치와 절편을 조정한다.
선형 회귀의 한계
선형 회귀는 입력과 출력 사이의 관계를 하나의 직선(또는 고차원에서는 초평면)으로 가정한다.
즉,
와 같은 선형 결합만으로 데이터를 설명하려고 한다.
하지만 실제 데이터는 항상 직선 형태로 분포하지 않는다. 입력과 출력 사이의 관계가 복잡하거나 비선형적이라면, 선형 회귀는 데이터를 충분히 잘 표현하지 못할 수 있다.
그럼에도 선형 회귀를 사용하는 이유
이러한 한계에도 불구하고 선형 회귀는 머신러닝에서 매우 중요한 모델이다.
가장 큰 이유는 구조가 단순하고 해석이 쉽기 때문이다. 각 가중치 w_j는 해당 특징이 예측값에 얼마나 영향을 주는지를 직접적으로 나타낸다.
예를 들어
라면,
즉, 모델이 왜 그런 예측을 했는지 사람이 직접 이해할 수 있다.
반면 딥러닝 모델은 수백만 개 이상의 매개변수를 가지는 경우가 많아, 정확도는 높더라도 내부 동작을 직관적으로 해석하기 어렵다. 또한 선형 회귀는 계산량이 적고 학습 속도가 매우 빠르다.
모델 구조가 단순하기 때문에 적은 데이터와 비교적 낮은 성능의 컴퓨터에서도 빠르게 학습할 수 있다. 그래서 실제 현장에서도 데이터를 처음 분석할 때 기본 기준 모델(baseline model)로 자주 사용된다.
예를 들어 어떤 복잡한 딥러닝 모델을 만들기 전에 먼저 선형 회귀를 사용해보면,
를 빠르게 확인할 수 있다.
또한 데이터가 실제로 선형 관계에 가까운 경우에는 복잡한 모델보다 오히려 더 좋은 선택이 되기도 한다.
첫댓글 선형회귀에 대하여 이보다 더쉽게 잘 설명해주는 자료는 본적이 없는것 같습니다. 모두들 읽어보기 바랍니다.
선형회귀나 신경망이나 결국 실제시스템의 기능을 어떻게 수학적으로 잘 표현할수 있을까의 문제를 다루는겁니다.