선형회귀분석이란?
주어진 데이터를 가장 잘 설명하는 직선 하나를 찾는 것, 즉 x와 y라는 데이터가 주어졌을 때 이 데이터의 관계를 가장 잘 나타내는 y = wx+b라는 직선의 방정식을 찾는 것입니다.
가장 잘 설명한다?
어떤 직선의 방정식이 얼마나 잘 설명하는냐를 평가하는 척도로 사용하는 것으로 평균제곱오차(Mean Squared Error; MSE)가 있습니다.
MSE는 w와 b 중 w에 대한 오차를 나타낸 것으로 이를 L2 loss function이라고도 합니다.
그렇다면 최적의 w를 찾아나가는 과정은?
대부분의 딥러닝 모델에서는 경사하강법을 사용한다. 아래에 경사하강 학습법에 대해 정리해 놓은 것을 참고할 수 있으며, 간단히 말하면 지속적으로 w를 업데이트함으로써 오차의 극소값을 찾는다는 것입니다.
pytorch에서의 경사하강법 구현
import torch
x = torch.tensor(data[2.0, 3.0], required_grad = True) //1. 데이터의 기본 단위인 텐서 생성
//2. 연산그래프 생성
y = x*2
z = 2*t+3
//3. 목표값
target = torch.tensor([3.0, 4.0])
//4. loss function 생성
loss = torch.sum(torch.abs(z-target))
//5. 기울기 계산
loss.backward() #.backward() 를 사용하면 연산 그래프를 쭉 따라가면서 x에 대한 기울기를 계산한다.
선형회귀분석 모델을 만들어서 경사하강법으로 기울기를 계산하고 w, b를 업데이트 하는 전체 과정
#0. 모듈 불러오기
import torch
import torch.nn as nn #신경망 모델들이 있는 라이브러리
import torch.optim as optim #경사하강법 알고리즘이 있는 라이브러리
imoprt torch.nn.init as init #텐서에 초기값을 주기 위해 필요한 함수들이 있는 라이브러리
#1. hyperparameter설정, tensor 생성 및 noise추가
num_data = 1000
num_epoch = 500
x = init.uniform_(torch.Tensor(num_data, 1), -10, 10) #의미) x라는 변수에 [num_data, 1]모양의 tensor를 생성하는데, -10~10에서 균일하고 random하게 들어간다.
noise = init.uniform_(torch.Tensor(num_data, 1), std = 1)#의미) 표준편차 std가 1인 noise 생성
y = 2*x + 3
y_noise = 2*(x+noise) + 3
#3. 모델 및 loss function 생성
model = nn.Linear(in_features=1, out_features = 1) #의미) pythorch에서 선형회귀모델은 nn.Linear이며 들어오는 feature수, 결과로 나가는 feature수, 편차 사용여부를 인수로 받는다.
loss_func = nn.L1Loss()#아까 L2loss도 있었는데, L1loss는 절대값 차이의 평균으로 L2loss 와 함께 loss function으로 사용된다.
#4. 경사하강법이 적용된 최적화 함수 선언
#설명) 이전에는 .backward를 사용하여 경사하강법을 한다고 했는데, 해당 최적화 함수는 더 나아가 경사하강법을 적용하여 오차르 줄ㄹ이고 최적의 가중치와 편차를 근사할 수 있게한다.
optimizer = optim.SGD(model.parameters(), lr = 0.001)
#5. 학습진행
label = y_noise
for i in range(num_epoch):
optimizer.zero_grad()
output = model(x)
loss = loss_func(output,label)
loss.backward()
optimizer.step()#의미) 경사하강법 최적화 함수 optimizerdml .step()함수를 호출하여 인수로 들어갔던 model.parameters()에서 리턴되는 변수들의 기울기에 학습률 0.01을 곱하여 빼줌으로써 업데이트한다.
if i %10 == 0:
print(loss.data) #10개 마다 출력
param_list = list(model.parameters())
print(param_list[0].item(), param_list[1].item())
reference
https://tutorials.pytorch.kr/beginner/deep_learning_60min_blitz.html
www.yes24.com/Product/Goods/73741253
'Data Science > Tensorflow2.0, Pytorch' 카테고리의 다른 글
pytorch) 합성곱 신경망 (0) | 2020.06.18 |
---|---|
Learning Tensorflow) 4. 합성곱신경망 (0) | 2020.04.19 |
Learning Tensorflow) 1. 텐서플로의 기본 이해하기 (0) | 2020.04.05 |
10. Tensorflow2.0 Evaluating & Predicting (0) | 2020.03.27 |
8. Tensorflow2.0 Optimization & Training (Expert) (0) | 2020.03.27 |