Data Science/Tensorflow2.0, Pytorch

pytorch) 선형회귀분석

HJChung 2020. 5. 29. 16:13

 

선형회귀분석이란?

주어진 데이터를 가장 잘 설명하는 직선 하나를 찾는 것, 즉 x와 y라는 데이터가 주어졌을 때 이 데이터의 관계를 가장 잘 나타내는 y = wx+b라는 직선의 방정식을 찾는 것입니다. 

 

가장 잘 설명한다?

어떤 직선의 방정식이 얼마나 잘 설명하는냐를 평가하는 척도로 사용하는 것으로 평균제곱오차(Mean Squared Error; MSE)가 있습니다.

MSE는 w와 b 중 w에 대한 오차를 나타낸 것으로 이를 L2 loss function이라고도 합니다. 

 

그렇다면 최적의 w를 찾아나가는 과정은?

대부분의 딥러닝 모델에서는 경사하강법을 사용한다. 아래에 경사하강 학습법에 대해 정리해 놓은 것을 참고할 수 있으며, 간단히 말하면 지속적으로 w를 업데이트함으로써 오차의 극소값을 찾는다는 것입니다. 

 

https://libertegrace.tistory.com/entry/2-%EA%B2%BD%EC%82%AC-%ED%95%98%EA%B0%95-%ED%95%99%EC%8A%B5%EB%B2%95-%EA%B2%BD%EC%82%AC-%ED%95%98%EA%B0%95-%ED%95%99%EC%8A%B5%EB%B2%95

 

2. 경사 하강 학습법 - 경사 하강 학습법

앞서 학습-최적화 이론-경사 하강 학습법 에 대한 개념을 이해하였으니, 수학적으로 어떻게 표현되는지를 알아보도록 하겠습니다. 1) 최적화 이론이란 다시 한번 자세히 살펴보면, 가능한 모든 �

libertegrace.tistory.com

 

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

 

파이토치(PyTorch)로 딥러닝하기: 60분만에 끝장내기 — PyTorch Tutorials 1.4.0 documentation

Shortcuts

tutorials.pytorch.kr

www.yes24.com/Product/Goods/73741253

 

파이토치 첫걸음

페이스북이 주도하는 딥러닝 프레임워크 파이토치 기초부터 스타일 트랜스퍼, 오토인코더, GAN 실전 기법까지 A to Z 딥러닝 구현 복잡도가 증가함에 따라 ‘파이써닉’하고 사용이 편리한 파이��

www.yes24.com