[네부캠] Week1 - 선형 회귀 모델

오홍석·2024년 8월 9일
0

네부캠

목록 보기
3/28

학습내용


선형 회귀

  • 한 개 이상의 독립 변수xx와 종속변수 yy의 선형 관계를 모델링하는 것이다.
  • 데이터를 가장 잘 대변하는 최적의 선을 찾는 과정이라고도 할 수 있다.
  • 여기서 x가 1개라면 단순 선형 회귀, 둘 이상일 때는 다중 회귀라고 한다.

장점과 단점

  • 장점
    • 학습 속도가 빠르고 예측도 빠르다.
    • 예측이 어떻게 이루어지는지 수식을 통해 쉽게 이해할 수 있다.
  • 단점
    • 선형관계로 제한하기 때문에, 직선 관계가 있다고 가정하여 가끔 올바르지 않을 때가 있다.
    • 이상치(= outlier, 특이치)에 민감하다.
    • 계수의 값들이 도출 이유가 명확하지 않을 때가 있다. (데이터셋의 특성이 서로 깊게 연관되어 있을때)

선형 관계를 알아야 모델링하는데 선형 관계를 어떻게 알 수 있을까??


상관 관계

  • 상관 관계는 두 변수 간의 연관성을 나타내는 통계적 개념이다.
  • 이는 두 변수 사이의 관계를 측정하는 방법으로, 한 변수가 변할 때 다른 변수가 어떻게 변하는지를 나타내는 것이다.
rxt=i=1n(xixˉ)(titˉ)i=1n(xixˉ)2i=1n(titˉ)2    (표본  상관  계수)r_{xt}\,=\,\frac{\sum_{i=1}^n(x_i\,-\,\bar{x})(t_i\,-\,\bar{t})}{\sqrt{\sum_{i=1}^n(x_i\,-\,\bar{x})^2\sum_{i=1}^n(t_i\,-\,\bar{t})^2}} \;\;(표본\;상관\;계수)
  • 두 변수 간의 상관 관계를 측정한다.
  • r = 1은 강한 양의 상관 관계
  • r = -1은 강한 음의 상관 관계
  • r = 0은 상관 관계 X
  • np.corrcoef(x, y) : xxyy의 상관 계수를 측정하여 행렬로 반환한다.
  • plt.scatter(x, y) : 상관 관계를 산점도로 시각화할 수 있다.

선형 회귀 모델의 학습

  • 선형 회귀의 학습은 독립 변수와 종속 변수 간의 관계를 가장 잘 나타낼 수 있는 직선을 찾는 과정이다.
  • 이를 바탕으로 모델을 학습시켜, 종속 변수가 주어지지 않은 데이터에 대해서 결과를 연속적인 숫자 값으로 예측할 수 있다.
import torch
import torch.nn as nn

class LinearRegressionModel(nn.Module):
	def __init__(self):
    	super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(1, 1) # input dim 1, output dim 1
    
    def forward(self, x): # 순전파
    	return self.linear(x)

손실 함수

  • 손실 함수는 모델 예측 값과 실제 값의 오차를 계산하는 함수이다.
  • 모델 성능을 평가하고 최적화하기 위해 사용된다.
  • 평균 제곱 오차(Mean Squared Error)
    MSE  =  1ni=1n[ti    (wxi  +  b)]2MSE\;=\;\frac{1}{n}\sum_{i=1}^n[t_i\;-\;(wx_i\;+\;b)]^2
    • nn.MSELoss() 로 사용 가능
  • 평균 절대 오차(Mean Absolute Error)
    MAE  =  1ni=1nti    (wxi  +  b)MAE\;=\;\frac{1}{n}\sum_{i=1}^n|t_i\;-\;(wx_i\;+\;b)|

경사하강법(Gradient Descent)

  • 기본 개념은 기울기를 구하고 구한 경사의 반대 방향으로 이동시켜 극값에 이를때까지 반복하는 것이다.
  • 이는 손실함수를 최소하하는데 많이 사용된다.
  • 장점
    • 모든 데이터를 사용하기 때문에 계산이 정확하고 안정적이다.
  • 단점
    • 전체 데이터셋을 사용하므로 대규모 데이터 셋의 경우 계산 비용이 크다.
    • 이동을 통해서 찾은 손실함수의 최솟값이 전체 함수에서 가장 낮은 최솟값이 아닌 주변 값보다 낮은 값인 문제 (local minima 문제)

확률적 경사하강법(Stochastic Gradient Descent)

  • 확률적 경사하강법은 경사 하강법의 변형 중 하나로, 전체 데이터셋이 아닌 하나의 데이터 포인트에 대해 기울기를 계산하고 파라미터를 업데이트한다.
  • 장점
    • 전체 데이터 셋이 아니라 단계마다 하나의 데이터를 활용하기 때문에 계산이 빠르다.
    • 계산량이 적어 다소 부정확하지만 계산이 빨라 더 많은 step을 나아갈 수 있다.
    • local minima에 빠져도 빠져나와 global minima에 도달할 가능성이 BGD보다 높다.
  • 단점
    • 경사를 계산하는 데이터 포인트를 무작위로 선택하여 불안정성이 높다.
    • 최적해에 근접하게 움직이지만, 최적해에 정확하게 도달하지 못할 가능성이 있다.

기울기 업데이트 과정에 대한 생각

optimizer = optim.SGD(model.parameters(), lr=0.01)
loss = loss_function(output, target)
optimizer.zero_grad()
loss.backward()
optimizer.step()

기울기 업데이트를 하는 과정에서 이러한 코드를 많이 볼 것이다.
optimizer.zero_grad()를 통해서 누적된 기울기가 기울기 계산에 영향을 주는 것을 방지하고, loss.backward() 를 통해서 파라미터들을 역전파 방식으로 기울기으로 계산한다.
optimizer.step()를 통해서 계산된 기울기를 바탕으로 파라미터 업데이트 과정이 이루어진다.
그렇다면 여기서 optimizerloss는 독립되어 보이는데 어떻게 파라미터들의 기울기를 계산하고 업데이트 시킬까??

  1. 순전파를 통해서 얻어진 예측값과 실제값을 이용한 loss 계산
  2. 예측값은 파라미터의 가중치에 의존하므로, loss.backward() 수행시 해당 파라미터들 추적이 가능하다.
  3. 역전파를 통해서 연관된 파라미터들의 가중치의 기울기를 .grad 속성에 저장
  4. optimizer.step() 수행시, 옵티마이저 선언시 인자로 전달 된 model.parameters()에 포함하는 파라미터에 접근하여 저장된 기울기를 바탕으로 고유한 방법(SGD 등)통해 가중치가 업데이트 된다.
profile
기동코딩

0개의 댓글