Pytorch로 시작하는 딥러닝 입문(03-04 nn.Module로 구현하는 선형 회귀: 단순선형회귀, optimizer)

2024. 2. 14. 22:33딥러닝 모델: 파이토치

이전 챕터까지는 선형 회귀를 좀 더 직접적으로 이해하기 위해 가설, 비용 함수를 직접 정의하여 선형회귀모델을 구현하였으나 이번에는 파이토치에서 이미 구현되어 제공되고 있는 함수들을 불러오는 것으로 더 쉽게 선형회귀모델을 구현한다. 

 

파이토치에서는 선형 회귀 모델이 nn.Linear( )라는 함수로, 또 평균 제곱오차가 nn.functional.mse_loss( )라는 함수로 구현되어 있다. 

 

♣ 단순 선형 회귀 구현하기

1. 기본 도구 import하기

 

2. 데이터 선언하기

y=2x 라는 함수를 가정한다. 가중치 W는 2, 편차 b는 0이다. 모델이 이 W와 b를 잘 찾아낼 수 있어야 한다. 

 

 

3. 선형회귀모델 구현하기 

nn.Linear( )는 입력의 차원, 출력의 차원을 인수로 받는다.

 

단순 선형 회귀이므로 입력 차원(input_dim)과 출력 차원(output_dim)이 모두 1이다. 하나의 입력 x에 대해 하나의 출력 y를 가지는 것이다. model에는 가중치 W와 편향 b가 저장되어 있다. nn.Linear은 파이토치에서 선형 변환을 정의하는 데 사용하는 클래스로, 자동으로 가중치와 편향을 초기화한다. 이 값은 model.parameters( ) 함수를 사용하여 불러올 수 있다. 

 

출력된 두 개 값 중 첫 번째 값이 W이고 두 번째 값이 b이다. 두 값 모두 랜덤 초기화가 되어 있는 것이다. 또한 두 값 모두 학습 대상이므로 requires_grad = True가 설정되어 있다. 

 

 

4. 옵티마이저 정의하기

model.parameters( )를 사용하여 W와 b를 전달한다. 학습률은 0.01로 정한다.

 

경사하강법 SGD를 사용하고, learning rate를 이용하여 옵티마이저를 정의했다. 

 

 

5. 훈련하기 

전체 훈련 데이터에 대해 경사 하강법을 2000회 반복하여 훈련한다. model을 사용하지 않았을 때는 hypothesis를 직접 계산했으나 이제는 model을 사용하여 훈련데이터를 집어넣는다. model이 nn.Linear로 이루어져 있으므로 그 안에 가중치와 편향도 들어있다. 

 

F.mse_functional은 파이토치에서 제공하는 평균제곱오차함수이다. 이전에는 torch.mean((hypothesis - y_train)**2)를 사용하여 직접 계산했다. 학습이 완료되면 손실함수의 값이 매우 작아진다. 

 

optimizer를 초기화, backward pass, 업데이트하는 과정을 예전에는 이렇게 구현했다. 

 

<모델 사용 전>

 

 

<모델 사용 후이지만 torch.optim을 사용하기 전>

 

 

 

6. 최적화 확인하기

W와 b의 값이 최적화되었는지 확인한다. x에 임의의 값 4를 넣고 모델이 예측하는 y의 값을 확인해보자

함수(가설)이 y=2x 이므로 y값이 8에 가까우면  W와 b의 값이 어느 정도 최적화가 되었다고 볼 수 있다. 실제로 예측된 y값은 7.9989로 8에 매우 가깝다. 

 

학습 후의 W와 b를 출력하면 W의 값이 2에 가깝고, b의 값이 0에 가깝다는 것을 확인할 수 있다. 

 

 

7. 정리하기

- 입력 x로부터 예측된 y를 얻는 것을 forward 연산이라고 한다. 

- 학습 전, prediction = model(x_train)은 x_train으로부터 예측값을 리턴하므로 forward 연산이다. 

- 학습 후, pred_y = model(new_var)은 임의의 값 new_var로부터 예측값을 리턴하므로 forward 연산이다. 

- 학습 과정에서 손실 함수를 미분하여 기울기를 구하는 것을 backward 연산이라고 한다. 

- cost.backward( )는 비용함수로부터 기울기를 구하라는 의미이며 backward 연산이다.