이번에는 파이토치를 사용해 더 어려운 문제를 해결하겠습니다. 파이토치가 제공하는 신경망을 활용합니다. 보스턴 집값 데이터는 원래 81개의 특징을 고려한 큰 데이터셋입니다. 우리는 사이킷런(scikit-learn)에서 정제한 14개 특징만을 사용합니다. 결과를 예측하는 데 사용되는 데이터 요소를 '특징(feature)'이라고 부릅니다. 모델은 특징에 가중치를 반영해 결과를 도출합니다. 이번에는 집값만을 예측하므로 출력은 하나입니다.

  1. 파이토치에서 모듈은 신경망을 구성하는 기본 객체입니다. 모듈에는 구성 요소를 정의하는 init() 함수와 순전파의 동작을 정의하는 forward() 함수가 있습니다.
  2. 간단한 신경망은 nn.Sequential, 복잡한 신경망은 nn.Module을 이용합니다.
  3. 회귀는 MSE, 분류는 CE 손실을 이용합니다. MSE(평균 제곱 오차)는 값의 차이를 제곱한 평균이고, CE(크로스 엔트로피)는 두 확률 분포의 차이입니다.
  4. 다중분류는 신경망의 입력을 여러 범주로 분류하는 알고리즘입니다.
  5. 피처는 신경망의 입력으로 들어오는 값으로 데이터가 갖고 있는 특징입니다. 말 그대로 특징으로도 부릅니다.
  6. 배치는 데이터셋의 일부로 신경망의 입력으로 들어가는 단위입니다. 에포크는 전체 데이터를 모두 한 번씩 사용했을 때의 단위입니다. 이터레이션은 하나의 에포크에 들어 있는 배치 수입니다.
  7. 최적화 알고리즘은 역전파된 기울기를 이용해 가중치를 수정합니다. Adam은 모멘텀과 RMSprop을 섞어놓은 가장 흔하게 사용되는 최적화 알고리즘입니다. 모멘텀은 기울기를 계산할 때 관성을 고려하는 것이고, RMSprop은 이동평균을 이용해 이전 기울기보다 현재의 기울기에 더 가중치를 두는 알고리즘입니다.

파이토치의 인공 신경망

파이토치는 딥러닝에 사용되는 대부분의 신경망을 torch.nn 모듈에 모아놨습니다. 앞에서 딥러닝은 신경망 층을 깊게 쌓아올린다고 말씀드렸는데, 파이토치도 여러 층을 쌓아서 딥러닝 모델을 만듭니다. 층(layer)은 nn.Module 객체를 상속받아 정의되고, 층이 쌓이면 딥러닝 모델이 완성됩니다. 프로그래밍 초보자라면 '객체를 상속받는다'는 말이 지금은 조금 어려울 수 있는데, 'nn.Module의 모든 구성요소를 복사해오는 거다'라고 생각하시면 됩니다. 부모의 재산을 자식이 그대로 물려받는 것처럼요.

3.2.3 모델 정의 및 학습하기

이번에 사용할 알고리즘은 선형회귀입니다. 선형회귀는 직선을 그리는 방식으로 미지의 값을 예측하는 가장 간단한 방법입니다. 회귀에 의해 얻은 결과를 실제 데이터와 비교해 오차를 줄여나가는 형식으로 학습합니다. 이때 오차의 제곱에 대한 평균을 취하는 평균 제곱 오차(Mean Square Error, MSE)를 사용합니다. 평균 제곱 오차를 사용하면 작은 오차와 큰 오차를 강하게 대비시킬 수 있어 유용합니다.

▼ 학습 루프

3.1절 '사인 함수 예측하기'에서는 직접 함수를 만들어 변수를 지정해줬지만, 이번에는 파이토치에서 제공하는 함수를 활용하겠습니다. torch.nn.Sequential() 객체에 모듈(여기서는 선형 회귀 모듈)을 집어넣어주면 파이토치가 알아서 순서대로 계산합니다. 선형 회귀 모델이므로 파이토치의 nn.Linear 모듈을 이용하면 됩니다. 다음 그림은 선형회귀에 이용할 다층 신경망, 즉 MLP 모델을 나타낸 그림입니다. MLP 층은 각 층의 뉴런이 다음 층의 모든 뉴런과 연결되어 있기 때문에 전연결층(fully connected layer, FC)이라고도 부릅니다.

▼ 선형회귀 MLP 모델

image.png

❶ 먼저 입력층에 입력 데이터가 들어옵니다.

❷ 입력 데이터는 은닉층의 입력으로 들어가 특징으로부터 정보를 추출합니다.