Pytorch로 시작하는 딥러닝 입문(03-03 다중선형회귀:Multivariable Linear regression)

2024. 2. 12. 11:57딥러닝 모델: 파이토치

앞서 배운 x가 1개인 선형 회귀를 단순선형회귀(Simple Linear Regression)이라고 한다. 

다수의 x로부터 y를 예측하는 다중선형회귀에 대해 이야기해보자. 

 

♣ 데이터

 

3개의 퀴즈 점수를 이용하여 최종 점수(Final)을 예측하는 모델을 만들려고 한다. 

독립변수 x가 3개이므로 수식으로 표현하면 아래와 같다. 

 

♣ 파이토치로 구현하기

1.  필요한 도구를 import하고 랜덤 시드 고정하기

 

2. 훈련 데이터 선언하기

단순선형회귀와 달리 x를 3개 선언한다. 

 

 

3. 가중치 w와 편향 b 선언하기

x가 3개이므로 가중치도 3개이다. 

 

 

4. 가설, 비용함수, 옵티마이저를 선언하고 경사하강법을 1000회 반복하기

 

 

 

♣ 벡터와 행렬 연산으로 바꾸기

x의 개수와 가중치의 수가 늘어나는 경우, 이를 일일히 선언하는 일은 매우 비효율적이다. 

이를 해결하기 위해 행렬 곱셈 연산(벡터의 내적)을 사용한다. 행렬의 곱셈 과정에서 이뤄지는 벡터 연산을 벡터의 내적(Dot Product)이라고 한다. 

위 그림은 행렬 곱셈 연산 과정에서 벡터의 내적으로 1×7 + 2×9 + 3 × 11 = 58 이 되는 과정을 보여준다. 

이 행렬 연산이 어떻게 가설과 연관이 되는지 알아보자. 

 

1. 벡터 연산으로 이해하기

위 식은 아래와 같이 두 벡터의 내적으로 표현할 수 있다. 

 

두 벡터를 각각 X와 W로 표현한다면 가설은 다음과 같이 나타낼 수 있다. 

 

원래의 x는 3개였지만 이제는 X와 W라는 두 개의 변수로 표현할 수 있다. 

 

♣ 행렬 연산으로 이해하기

훈련 데이터를 살펴보고, 벡터와 행렬 연산을 통해 가설을 표현해보자. 

전체 훈련 데이터의 개수를 셀 수 있는 1개의 단위를 샘플(sample)이라고 할 때, 현재 샘플의 수는 총 5개이다. 

각 샘플에서 y를 결정하게 하는 각각의 독립변수 x를 특성(feature)라고 한다. 각 샘플의 특성은 3개이다. 

 

이는 독립변수 x의 수가 (샘플의 수 × 특성의 수) = 15개임을 의미한다. 독립변수 x들을 (샘플의 수 × 특성의 수)의 크기를 가지는 하나의 행렬로 표현하고, 이 행렬을 X라고 해보자. 

여기에 가중치 w1, w2, w3를 원소로 하는 벡터를 W라 하고 이를 곱한다. 

위의 식은 결과적으로 다음과 같다. 

이 가설에 각 샘플에 더해지는 편향 b를 추가한다. 샘플 수만큼의 차원을 가지는 편향 벡터 B를 만들어 더한다. 

 

위의 식은 다음과 같다.

결과적으로 전체 훈련 데이터의 가설 연산을 3개의 변수(X, W, B)만으로 표현하였다. 이와 같이 벡터와 행렬 연산은 식을 간단하게 할 뿐 아니라 다수의 샘플의 병렬 연산이므로 속도에서도 이점을 가진다. 

 

이를 참고하여 파이토치로 구현해보자. 

 

 

♣ 행렬 연산을 고려하여 파이토치로 구현하기

 

이전에 x_train을 3개나 구현했던 것과 달리 이번에는 x_train 하나에 모든 샘플을 모두 선언했다. (5×3) 행렬 X를 선언한 것이다. 

 

x_train과 y_train의 크기(shape)를 출력해보자. 

이제 가중치 W와 편향 b를 선언한다. 

 

주목할 점은 가중치 W의 크기가 (3×1)인 벡터라는 점이다. 행렬의 곱셈이 성립하려면 곱셈의 좌측에 있는 행렬의 열의 크기와 우측에 있는 행렬의 행의 크기가 일치해야 한다. 현재 x_train 행렬의 크기는 (5 ×3)이며 W 벡터의 크기는 (3 ×1) 이므로 행렬과 벡터의 행렬곱이 가능하다. 행렬곱으로 가설을 선언하면 아래와 같다. 

 

가설을 행렬곱으로 간단히 정의하였기 때문에 x나 w의 개수에 따라 일일히 선언하지 않아도 된다. 이를 반영한 전체 코드는 다음과 같다.