1. 선형 회귀 모델
선형 회귀(Linear Regression)는 종속 변수(y)와 하나 이상의 독립 변수(X, 설명 변수)의 상관관계를 설명하는 모델링을 하는 것으로 상관관계를 시각화하였을 때 선형으로 나타나기 때문에 '선형'이라 표현합니다. 선형회귀는 선형성, 독립성, 등분산성, 정규성이라는 4가지 가정을 두고 수행합니다. [1]
- 선형성 : 종속 변수와 독립 변수의 관계가 선형적 (y = wx + b)
- 독립성 : 데이터들이 무작위로 분포(독립적)되어 있어야 함. 만약 시간의 흐름에 따라 패턴이 있으면 독립성 x
- 등분산성 : 오차(잔차)의 분포가 일정
- 정규성 : 오차가 정규 분포를 따름
1.1. 모델 구성
선형 회귀는 출력(y)을 계산하기 위해 입력(x)에 가중치(A, 회귀 계수)를 곱하고 편향(bias)을 더해서 조정하는 방식으로 계산되며, 수식로 표현하면 다음과 같습니다
파이토치에서는 torch.nn.Module 상속을 통해 파이토치에서 이미 구현된 기능을 사용할 수 있습니다. 아래 코드는 선형 회귀 클래스(LinearRegression)를 만들어서 순전파까지 구현한 것입니다.
import torch.nn as nn
import torch.optim as optim
# 선형 회귀 모델 클래스
class LinearRegression(nn.Module):
def __init__(self, input_size, output_size):
super(LinearRegression, self).__init__() # 상속받은 nn.Module 초기화
self.linear = nn.Linear(input_size, output_size) # linear 속성 정의 : 선형 변환
def forward(self, x): # 순전파 연산 정의 : x를 입력 받아 linear 속성에 y를 계산
y = self.linear(x)
return y
model = LinearRegression(1, 1) # 모델 인스턴스 생성. (1, 1)
1. 2. 손실함수와 최적화
머신러닝에서 학습은 손실값을 줄이는 방향으로 파라미터를 업데이트 합니다. 선형 회귀 모델에서는 손실함수가 MSE가 되고, 파이토치에서는 torch.nn.MSELoss()로 구현할 수 있습니다. [2]
MSE에 대한 이전 글 : https://seanpark11.tistory.com/109#3.1.-mse
머신러닝 과정에서 손실함수와 최적화가 필요한 이유
1. 머신러닝 개요와 모델 기반 학습 머신러닝은 데이터로부터 학습할 수 있도록 컴퓨터를 프로그래밍하는 것을 말합니다. 잘 설계된 머신러닝의 프로세스는 다음과 같이 정의할 수 있습니다.
seanpark11.tistory.com
또한, 선형 회귀 모델에서 학습은 경사하강법을 사용하게 되는데, 전체 데이터셋에 대해서 적용하기 보다는 확률적 경사하강법으로 조금 더 효율적으로 이용이 가능합니다. 확률적 경사하강법은 아래와 같은 절차로 이뤄집니다.
1) 이전 단계에서 계산된 그래디언트 초기화
2) 손실 함수의 그래디언트 계산
3) 경사하강법 공식에 따라 파라미터 업데이트
또한, 확률적 경사하강법을 수행하는데 있어 같은 데이터셋을 여러 번 학습하여 모델 파라미터를 업데이트할 수 있습니다. 이렇게 모델이 전체 데이터셋을 학습하는 과정을 '에폭'이라고 하며, 여러 번의 에폭을 통해 모델의 성능이 향상될 수 있습니다.
criterion = nn.MSELoss() # 손실 함수 정의
optimizer = optim.SGD(model.parameters(), lr=0.01) # 최적화 정의
# 모델 학습
# x,y 는 실제값으로 입력되어 있다고 가정
epochs = 100
for epoch in range(epochs):
y_hat = model(x)
loss = criterion(y_hat, y) # 손실값 계산
optimizer.zero_grad() # 그래디언트 초기화
loss.backward() # 손실함수 그래디언트 계산 (역전파)
optimizer.step() # 계산된 그래디언트로 가중치 업데이트 : 위에서 SGD 정의로 최적화 진행
1.3. 최종 코드
이렇게 작성된 전체 코드는 아래와 같습니다. 입력값(x)과 목표값(y)은 별도로 정의해서 진행하면 됩니다.
import torch.nn as nn
import torch.optim as optim
# 선형 회귀 모델 클래스
class LinearRegression(nn.Module):
def __init__(self, input_dim, output_dim):
super(LinearRegression, self).__init__()
self.linear = nn.Linear(input_dim, output_dim)
def forward(self, x):
y = self.linear(x_tensor)
return y
model = LinearRegression(1, 1)
# 손실함수
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 모델 학습
# x,y 는 실제값으로 입력되어 있다고 가정
epochs = 100
for epoch in range(epochs):
y_hat = model(x)
loss = criterion(y_hat, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
참고자료
[1] https://ko.wikipedia.org/wiki/%EC%84%A0%ED%98%95_%ED%9A%8C%EA%B7%80
[2] https://seanpark11.tistory.com/109
'Python > Data Analysis' 카테고리의 다른 글
인공신경망에서 그래디언트 손실 및 폭주 문제 해결 | 활성화 함수, 가중치 초기화 (2) | 2024.08.31 |
---|---|
PyTorch로 Binary Classifier 구현하기 | 로지스틱 회귀, 이진 분류 (0) | 2024.08.19 |
머신러닝 과정에서 손실함수와 최적화가 필요한 이유 (1) | 2024.08.17 |
[PyTorch] 파이토치 메서드로 텐서의 연산 수행하기 (0) | 2024.08.16 |
[PyTorch] PyTorch를 활용한 텐서 모양 바꾸기 (0) | 2024.08.09 |