선형 회귀
선형 회귀란 학습 데이터와 가장 잘 맞는 하나의 직선을 찾는 일
이때 선형 회귀의 가설(직선의 방정식)은 아래와 같은 형식
$$ y= Wx + b $$
가설의 H를 따서 y 대신 다음과 같이 식을 표현
$$ H(x) = Wx + b $$
이때 x와 곱해지는 W를 가중치(Weight)라고 하며, b를 편향(bias)이라고 함
비용 함수
비용 함수(cost function) = 손실 함수(loss function) = 오차 함수(error function) = 목적 함수(objective function)
수식적으로 단순히 '오차 = 실제값 - 예측값'으로 정의하면 오차값이 음수가 나오는 경우가 생김
제대로 된 오차의 크기를 측정할 수 없으므로, 각 오차를 제곱해준 뒤에 전부 더함
$$ cost(W,b) = \frac{1}{n}\sum^{n}_{i=1}[y^{(i)}-H(x^{(i)})]^2$$
이때 데이터의 개수인 n으로 나누면, 오차의 제곱합에 대한 평균을 구할 수 있는데
이를 평균 제곱 오차(Mean Squared Error, MSE)라고 함
따라서, cost(W, b)를 최소가 되게 만드는 W, b를 구하면 훈련 데이터를 가장 잘 나타내는 직선을 구할 수 있음
옵티마이저, Optimizer
비용 함수(Cost Function)의 값을 최소로 하는 W와 b를 찾는 방법을 위해 사용되는 최적화 알고리즘
학습 과정에서 적절한 W, b를 찾아냄
다음과 같은 비용함수 그래프가 있을 때 cost값이 가장 작을 때의 W를 찾는 것 (b가 0이라고 가정)
임의의 초기값 W값을 정한 뒤에, 맨 아래의 볼록한 부분을 향해 점차 W의 값을 수정해나감
이를 가능하게 하는 것이 경사 하강법(Gradient Descent)
경사하강법
선형 회귀에 적합한 옵티마이저
경사 하강법은 한 점에서의 순간 변화율 또는 접선에서의 기울기의 개념을 사용
맨 아래의 볼록한 부분으로 갈수록 접선의 기울기가 점차 작아진다는 점
따라서, 맨 아래의 볼록한 부분에서는 기울기가 결국 0이 됨
즉, cost가 최소화가 되는 지점은 접선의 기울기가 0이 되는 지점이며, 또한 미분값이 0이 되는 지점
경사 하강법의 아이디어는 비용 함수(Cost function)를 미분하여 현재 W에서의 접선의 기울기를 구하고,
접선의 기울기가 낮은 방향으로 W의 값을 변경하는 작업을 반복
이 반복 작업에는 현재 W에 접선의 기울기(gradient)를 구해 특정 숫자 α를 곱한 값을 빼서 새로운 W로 사용하는 식이 사용
$$gradient = \frac{∂cost(W)}{∂W}$$
1) 기울기가 음수일 때
W := W - α × (-gradient) = W + α × gradient
기울기가 음수면 W의 값이 증가하는데 이는 결과적으로 접선의 기울기가 0인 방향으로 W의 값이 조정됨
2) 기울기가 양수일 때
W := W - α × (+gradient)
기울기가 양수면 W의 값이 감소하게 되는데 이는 결과적으로 기울기가 0인 방향으로 W의 값이 조정
최종 가중치 W 업데이트 식
$$ W := W - α\frac{∂}{∂W}cost(W) $$
여기서 α는 학습률 (learning rate)를 의미
W를 변경할 때 얼마나 크게 변경할지를 결정함 (얼마나 큰 폭으로 이동할 지)
무작정 크게 한다고 해서 적절한 W를 찾을 수 있는 것은 아님.
지나치게 높은 값을 가지면 cost의 값이 발산하게 됨
지나치게 낮은 값을 가지면 학습 속도가 느려지므로 적당한 α를 찾는 것이 중요
실제 경사 하강법은 W와 b에 대해서 동시에 경사 하강법을 수행하면서 최적의 W와 b의 값을 찾아감 !!
optimizer = optim.SGD([W, b], lr=0.01)
# gradient를 0으로 초기화
optimizer.zero_grad() # 기울기를 초기화해야만 새로운 가중치 편향에 대해서 새로운 기울기를 구할 수 있습니다.
# 비용 함수를 미분하여 gradient 계산
cost.backward() # 가중치 W와 편향 b에 대한 기울기가 계산
# W와 b를 업데이트
optimizer.step() # 인수로 들어갔던 W와 b에서 리턴되는 변수들의 기울기에 학습률(learining rate) 0.01을 곱하여 빼줌으로서 업데이트
'전공 > 머신러닝' 카테고리의 다른 글
[ML] 원핫인코딩(One-Hot Encoding) (0) | 2024.11.20 |
---|---|
[ML] 로지스틱 회귀 (Logistic Regression) (0) | 2024.11.09 |
[ML] 피쳐(Featrue)와 샘플(Sample)의 차이 (0) | 2024.11.07 |
[ML] 다중 선형 회귀 (0) | 2024.11.07 |
[ML] K-NN(K-Neighbor Nearest)이란? (0) | 2024.04.02 |