본문 바로가기
AI Naver boost camp/[Week 01] Pytorch

선형 회귀 (Linear Regression) _ 2 - 경사하강법, 데이터 표준화

by AI-BT 2024. 8. 8.
728x90
반응형

경사하강법

지난 블로그에서 손실함수 (Loss funtion)은

손실함수는 실제값(target)과 예측값(y) 간의 차이를 수치적으로 측정하는 함수 

라고 언급 했습니다.

 

1. 경사하강법이란??

모델의 손실함수 값을 최소화하기 위해 사용하는 최적화 알고리즘 입니다.

경사하강법은 현재의 모델 파라미터(예: 가중치, 편향)에서

손실 함수의 기울기(경사)를 계산하고,

이 기울기의 반대 방향으로 파라미터를 조금씩 업데이트해 나가는 방식으로 작동한다.

이렇게 하면 손실 함수의 값이 점차 줄어들면서,

최종적으로 최솟값(최적의 파라미터)에 도달할 수 있게 됩니다.

단계별 설명

  1. 초기화: 모델의 파라미터를 임의의 값으로 설정
  2. 기울기 계산: 손실 함수의 기울기를 계산
  3. 업데이트: 기울기의 반대 방향으로 파라미터를 조정
  4. 반복: 위 과정을 반복하여 손실 함수를 최소화.

경사하강법은 손실 함수의 기울기를 따라 점진적으로 최적점을 찾아가는 방법으로,

머신러닝 모델을 학습시키는 데 핵심적인 역할을 한다.

 

상세내용은 아래 블로그 참고

2022.02.20 - [AI] - 2. 인공지능은 학습을 어떻게 할까?

 

2. 확률적 경사하강법

경사하강법은

손실 함수의 기울기를 전체 데이터셋을 사용해 계산하며,

이를 통해 모든 데이터 포인트에 대해 한 번에 손실 함수의 기울기를 구한 다음,

그 기울기를 따라 파라미터를 업데이트한다.

이는 수렴 경로가 부드럽고 일정하지만, 대규모 데이터셋에서는 계산 비용이 큽니다

 

확률적 경사하강법은

매번 하나의 데이터 포인트 또는 작은 미니배치를 사용해 손실 함수의 기울기를 계산하고 파라미터를 업데이트 한다.

각 데이터 포인트에 대해 기울기를 계산하고, 자주 파라미터를 업데이트 하며,

이는 빠른 학습과 지역 최솟값을 피하는 데 유리하지만, 수렴 경로가 불규칙 하다.

 

 


데이터 표준화

데이터를 일정한 범위와 분포로 변환하는 과정 이다.

 

1. 모델 학습의 효율성 향상

데이터셋의 각 특성(feature)들이 서로 다른 범위(예: 나이,수입)를 가질 경우, 모델이 특정 특성에 치우쳐 학습될 수 있다. 표준화를 통해 모든 특성을 비슷한 범위(평균 0, 표준편차 1)로 맞추면, 모델이 모든 특성을 균형 있게 학습할 수 있다.

 

2. 경사하강법의 수렴 속도 개선

경사하강법을 사용하는 경우, 표준화를 통해 특성들의 스케일을 맞추면 기울기가 일정하게 유지되므로,

최적화 과정에서 모델이 더 빠르고 안정적으로 수렴할 수 있다.


선형 모델 학습

import pandas as pd
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt

# 데이터 로드
data = pd.read_csv(
    '/StudentsPerformance.csv')
print(data.head())

# 간단한 전처리: 점수들을 float로 변환
data['math score'] = data['math score'].astype(float)
data['reading score'] = data['reading score'].astype(float)
data['writing score'] = data['writing score'].astype(float)

# feature와 target 설정 (여기서는 'math score'와 'reading score' 사용)
x = data[['math score']].values
y = data[['reading score']].values

# NumPy 배열을 PyTorch tensor로 변환
x = torch.tensor(x, dtype=torch.float32)
y = torch.tensor(y, dtype=torch.float32)

# 선형 회귀 모델 정의
class LinearRegressionModel(nn.Module):
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(1, 1)

    def forward(self, x):
        return self.linear(x)


# 모델, 손실 함수, 옵티마이저 초기화
model = LinearRegressionModel()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 학습
num_epochs = 1000
for epoch in range(num_epochs):
    # 예측 계산
    outputs = model(x)
    loss = criterion(outputs, y)

    # 기울기 초기화, 역전파, 가중치 업데이트
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if (epoch+1) % 100 == 0:
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

# 학습된 모델을 사용한 예측
predicted = model(x).detach().numpy()

# 데이터와 예측값 시각화
plt.scatter(x.numpy(), y.numpy(), label='Original Data')
plt.plot(x.numpy(), predicted, label='Fitted Line', color='r')
plt.legend()
plt.xlabel('Math Score')
plt.ylabel('Reading Score')
plt.title('Math Score vs Reading Score')
plt.show()
728x90
반응형

댓글