하루 하루

경사하강법 with Pytorch. 본문

IT/Artificial intelligence

경사하강법 with Pytorch.

san_deul 2020. 5. 18. 12:44

1. 선형회귀분석 

주어진 데이터를 가장 잘 설명하는 직선을 찾는것

 

- simple linear regression : 독립변수가 하나인 경우 

- multivariate linear regression : 독립변수가 여러개 인 경우

 

단순선형회귀분석을 한다는 의미는 y 와 x라는 데이터가 주어졌을 때, y  = wx +b 라는 직선의 방정식에서 데이터를 가장 잘 표현하는 w와 b를 찾는다는 것과 동일합니다.

 

2. 평균제곱오차

주어진 x를 w와 b를 사용해 계산한 예측값 이 실제 값과 유사해야 의미가 있습니다. 

따라서, 여러 실제값과 예측값의 차이를 계산하는 방법들이 존재하고, 평균 제곱오차는 그 중에서도 많이 사용되는 방법입니다. 예측값 y ̂ 에서 y 를 빼 차이를 구하고 더합니다. 이 때, 차이가 -인 경우가 존재하기 때문에 제곱의 형태로 더하게 됩니다.

 

이는 loss function 혹은 cost function 이 되며 MSE를 최소로 하는 최적의 w,b를 찾아야 오차값이 제일 작은

데이터를 잘 설명하는 직선을 찾게 됩니다. 

여기서 MSE는 다음과 같이 w의 이차함수로 표현이 됩니다. 

 

따라서 미분값을 통해서 경사를 구하고 이를 통해 지속적으로 w을 업데이트를 하는 방식으로 오차값을 찾게 됩니다.

여기서 gradient 는 경사로 MSE, 즉 error 값을 미분한 값을 이야기하고, 

learging rate는 변수 w를 얼마나 update를 할 지를 결정하는 변수라고 할 수 있습니다.

예를 들어서 error 의 식이 다음과 같다면 

learning rate을 0.1로 하고, 경사하강법 적용할 경우 다음과 같이 전개됩니다.  

위와 같이 점점 w가 error의 최솟값으로 만드는 값으로 향하게 됩니다.

3. 경사하강법 with Pytorch

위와 같은 형태의 데이터가 존재한다고 한다고 가정할 때,  선형회귀모델을 적용하고, 경사하강법을 통해 모델을 최적화하고자 합니다.

이를 위해서는 필요한 라이브러리들을 우선 불러와야 합니다. 

 

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.init as init 
import matplotlib.pyplot as plt

 

import torch - 파이토치를 불러옴.

import torch.nn as nn - 신경망 모델을 불러온다. 여기서는 선형 변환함수를 사용할 것.

import torch.optim as optim - 경사하강알고리즘이 포함됨.

import torch.nn.init as init - tensor에 초기값을 주기위해 필요한 함수가 포함됨

import matplotlin.pyplot as plt  - 그래프로 시각화하기 위해 필요,

model= nn.Linear (1,1)

선형 모델을 생성합니다. 여기서 입력으로 들어오는 x 와 출력으로 나오는 y 의 특성의 개수가 모두 1이기 떄문에 (1,1)을 입력합니다.

loss_func =nn.L1Loss()

손실함수를 지정합니다.  여기서 torch.nn.L1Loss 로 손실함수를 지정하였습니다. 

pytorch의 손실함수에는 다음과 같은 함수들이 존재합니다.

https://pytorch.org/docs/stable/nn.html

1. torch.nn.L1Loss

2. torch.nn.MSELoss( )

3. torch.nn.CrossEntropyLoss() 

4. torch.nn.CTCLoss( )

5. torch.nn.NLLLoss( )

6. torch.nn.PoissonNLLLoss( )

7. torch.nn.KLDivLoss( )

8. torch.nn.BCELoss( )

9. torch.nn.BCEWithLogitsLoss( )

10. torch.nn.MarginRankingLoss( )

11. torch.nn.HingeEmbeddingLoss(  )

12. torch.nn.MultiLabelMarginLoss( )

13.torch.nn.MultiLabelMarginLoss( )

14. torch.nn.SoftMarginLoss( )

15. torch.nn.MultiLabelSoftMarginLoss( )

16. torch.nn.CosineEmbeddingLoss( )

17. torch.nn.MultiMarginLoss( )

18. torch.nn.MultiMarginLoss( ) 

 

optimizer = optim.SGD(model.parameters(),lr = 0.001)

 

최적화함수를 지정해줍니다. SGD 생성자에 model.parameters()를 호출하게 되면,  모델의 멤버인 2개의 nn.Linear 모듈의 학습 가능한 매개변수들이 포함되게 됩니다. 여기서 lr은 학습률로 0.001로 임의로 지정하였습니다. 

 

label = y_noise

목표값인 label를 y_noise로 지정합니다.

for i in range(num_epoch):
    optimizer.zero_grad() 
    output = model(x)
    loss = loss_func(output,label) 
    loss.backward()
    optimizer.step()

num_epoch ( 반복 횟수  ) 동안 위 코드가 반복됩니다.

opimizer.zero_grad( )는 이전 학습의 기울기를 지우고 최적화 함수를 초기화하는 함수입니다

output = model ( x ) 는 입력값 x를 model에 넣어 output ( 예측값 )를 구하는 함수 입니다.

loss = loss_func ( output, label ) 위에서 구한 output ( 예측값 ) 과 label (목표값, 실제값 )의 오차를 구합니다.

loss.backward ( ) 위에서 구한 손실함수의 기울기를 구합니다.

optimizer.step ( ) 구한 기울기를 이용해 모델의 변수를 업데이트합니다.

결과를 시각화하면 위와 같은 결과가 나오게 됩니다. 

 

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791162241899&orderClick=LEA&Kc=

 

파이토치 첫걸음

■ 페이스북이 주도하는 딥러닝 프레임워크 파이토치 ...

www.kyobobook.co.kr

 

 

Comments