선형 회귀의 학습은 독립 변수와 종속 변수 간의 관계를 가장 잘 나타낼 수 있는 직선을 찾는 과정이다.
이를 바탕으로 모델을 학습시켜, 종속 변수가 주어지지 않은 데이터에 대해서 결과를 연속적인 숫자 값으로 예측할 수 있다.
import torch
import torch.nn as nn
classLinearRegressionModel(nn.Module):def__init__(self):super(LinearRegressionModel, self).__init__()
self.linear = nn.Linear(1,1)# input dim 1, output dim 1defforward(self, x):# 순전파return self.linear(x)
손실 함수
손실 함수는 모델 예측 값과 실제 값의 오차를 계산하는 함수이다.
모델 성능을 평가하고 최적화하기 위해 사용된다.
평균 제곱 오차(Mean Squared Error)
MSE=n1i=1∑n[ti−(wxi+b)]2
nn.MSELoss() 로 사용 가능
평균 절대 오차(Mean Absolute Error)
MAE=n1i=1∑n∣ti−(wxi+b)∣
경사하강법(Gradient Descent)
기본 개념은 기울기를 구하고 구한 경사의 반대 방향으로 이동시켜 극값에 이를때까지 반복하는 것이다.
이는 손실함수를 최소하하는데 많이 사용된다.
장점
모든 데이터를 사용하기 때문에 계산이 정확하고 안정적이다.
단점
전체 데이터셋을 사용하므로 대규모 데이터 셋의 경우 계산 비용이 크다.
이동을 통해서 찾은 손실함수의 최솟값이 전체 함수에서 가장 낮은 최솟값이 아닌 주변 값보다 낮은 값인 문제 (local minima 문제)
확률적 경사하강법(Stochastic Gradient Descent)
확률적 경사하강법은 경사 하강법의 변형 중 하나로, 전체 데이터셋이 아닌 하나의 데이터 포인트에 대해 기울기를 계산하고 파라미터를 업데이트한다.
장점
전체 데이터 셋이 아니라 단계마다 하나의 데이터를 활용하기 때문에 계산이 빠르다.
계산량이 적어 다소 부정확하지만 계산이 빨라 더 많은 step을 나아갈 수 있다.
local minima에 빠져도 빠져나와 global minima에 도달할 가능성이 BGD보다 높다.
기울기 업데이트를 하는 과정에서 이러한 코드를 많이 볼 것이다. optimizer.zero_grad()를 통해서 누적된 기울기가 기울기 계산에 영향을 주는 것을 방지하고, loss.backward() 를 통해서 파라미터들을 역전파 방식으로 기울기으로 계산한다. optimizer.step()를 통해서 계산된 기울기를 바탕으로 파라미터 업데이트 과정이 이루어진다.
그렇다면 여기서 optimizer과 loss는 독립되어 보이는데 어떻게 파라미터들의 기울기를 계산하고 업데이트 시킬까??
순전파를 통해서 얻어진 예측값과 실제값을 이용한 loss 계산
예측값은 파라미터의 가중치에 의존하므로, loss.backward() 수행시 해당 파라미터들 추적이 가능하다.
역전파를 통해서 연관된 파라미터들의 가중치의 기울기를 .grad 속성에 저장
optimizer.step() 수행시, 옵티마이저 선언시 인자로 전달 된 model.parameters()에 포함하는 파라미터에 접근하여 저장된 기울기를 바탕으로 고유한 방법(SGD 등)통해 가중치가 업데이트 된다.