선형 회귀

용가리·2024년 8월 9일

Pytorch

목록 보기
5/7

반갑습니다.
선형 회귀에 대해 설명해보도록 하겠습니다.

선형 회귀가 뭔가요?

통계학에서 선형 회귀는 종속 변수 y와 한 개 이상의 독립 변수 X와의 선형 상관 관계를 모델링하는 회귀분석 기법이다. 한 개의 설명 변수에 기반한 경우에는 단순 선형 회귀, 둘 이상의 설명 변수에 기반한 경우에는 다중 선형 회귀라고 한다. - 위키독스 -

선형회귀는 간단하게 말씀드려보자면 y = wx + b 를 놓고, 가지고있는 데이터를 가장 잘 설명하는 함수값 w 와 b를 찾는 과정이라고 설명할 수 있을거같습니다. (단순선형회귀)
독립 변수가 많다면 y = w1x + w2x ··· + b 로 표현할 수 있겠죠. (다중선형회귀)

그럼 w랑 b를 어떻게 찾느냐
이제 우리가 자주 보던 로스, 역전파, 옵티마이저 등이 나옵니다.

일단 weight와 bias를 지정합니다.
가중치의 초기화 방법에는 다양한 방법이 있는데, nn.module.Linear의 가중치 초기화는 (-k^(1/2), k^(1/2))의 uniform distribution으로 초기화를 하고 있습니다.

nn.module없이 모델을 구현하신다면 파라미터를 torch.randn()을 통해 초기화를 해도 되겠지만, initialization 없이 학습을 진행할 경우 로스의 초기값이 좀 높습니다.
학습을 어렵게 시작한다는 얘기겠죠.

그 다음 데이터를 뽑아서 함수에 넣습니다.
그러면 어떤 값이 나오겠죠? 그 값을 답과 비교합니다.
x = 1, y = 2인 데이터가 있다 했을 때, 출력값이 y = 2와 차이가 크다 싶으면 차이가 적어지는 방향으로 weight와 bias를 줄이는 겁니다.

그 차이를 구하는 것이 loss 함수이고,
로스를 통해 weight와 bias를 조정하는 과정을 수행하는 함수가 optimizer입니다.

코드로 표현해보겠습니다.

import torch
import torch.optim as optim
import torch.nn as nn

model = 님이만든모델()
optimizer = optim.SGD(model.parameters(), lr = 0.01)
criterion = nn.MSELoss()
for epoch in num_epochs:

	optimizer.zero_grad()
   
	y_hat = model(x)
    
    loss = criterion(y_hat, y)
    
    loss.backward()
    
    optimizer.step()
    
    if (epoch+1) % 100 == 0:
        print(f'Epoch [{epoch+1}/{num_epochs}], 
        Loss: {loss.item()}')

optimizer.zero_grad()는 이전에 학습했을 때 남아있는 gradient들을 초기화해주는 함수입니다.
이것을 사용하지 않으면 학습에 지장이 갈 수 있기 때문에 항상 학습 시작 전에 지정합니다.

모델에 데이터를 넣어 y_hat을 구합니다.
y_hat과 y간의 로스를 구합니다.
로스함수는 MSELoss, BCELoss 등이 있을 수 있겠죠.
각 로스함수마다 다양한 특징이 있습니다.
제작하신 모델에 맞는 로스 함수를 지정하시면 되겠습니다.
loss.backward()를 통해 파라미터들의 그레디언트를 계산합니다.
optimizer.step()을 통해 가중치를 업데이트합니다.

지정하신 epoch만큼 반복하시다보면 데이터를 잘 설명하는 y = wx+b 함수가 나옵니다.
여기까지가 큰 틀이고, 학습을 더 잘 시키기 위해서 다양한 기술들을 접목하시면 됩니다.
Cross-validation, DataLoader 활용 등 여러가지가 있겠습니다.
다양한 기술들에 대해서도 차차 제가 정확히 배웠을 때 다뤄보도록 하겠습니다.

0개의 댓글