반갑습니다.
선형 회귀에 대해 설명해보도록 하겠습니다.
통계학에서 선형 회귀는 종속 변수 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 활용 등 여러가지가 있겠습니다.
다양한 기술들에 대해서도 차차 제가 정확히 배웠을 때 다뤄보도록 하겠습니다.