반응형

선형 회귀를 Pytorch로 구현하겠습니다.

 

이 글을 보시기 전에 아래 링크를 보시는 것을 추천드립니다.

 

https://coding-yoon.tistory.com/50?category=825914

 

[딥러닝] 선형 회귀(Linear Regression)

지도 학습에는 대표적으로 세가지가 있습니다. 1. 선형 회귀 ( Linear Regression ) : 3월 : 60점, 6월 : 70점, 9월 : 80점이라면, 12월은 몇 점일까? 2. 이진 분류 ( Binary Classification ) : [0, 1], [True, F..

coding-yoon.tistory.com

최대한 선형 회귀식처럼 보기 쉽게끔 코딩하였습니다.

 

아래 코딩과 비교하면서 봐보세요.

 

# 선형 회귀
import torch
import torch.nn as nn  # 선형회귀를 불러오기 위한 라이브러리
import torch.optim as optim  # 경사하강법를 불러오기 위한 라이브러리
import torch.nn.init as init  # 텐서의 초기값을 구하기 위한 라이브러리

data = 1000  # 몇 개의 데이터를 만들 것인가...
epoch = 500  # 몇 번을 거쳐 돌릴 것인가... ( = 데이터 전체를 학습에 한 번 사용하는 주기 )
W = 4  # weight ( = 기울기 )
b = 5  # bias  ( = 절편 )

x = init.uniform_(torch.Tensor(data, 1), -10, 10)  # Input data
y = W * x + b  # Output data

model = nn.Linear(1, 1)  # 선형회귀 모델 ( Input 특성의 수, 결과로 나오는 특성의 수 )
cost_function = nn.MSELoss()  # MSE : 제곱의 평균 ( = Mean of squares )

# optim : 최적화 함수 ( = optimizer)
# SGD : 경사하강법 ( = stochastic gradient descent )
# model.parameters() : model 의 parameter(w, b) 를 전달
# lr : 학습률 ( = learning rate )
optimizer = optim.SGD(model.parameters(), lr=0.01)

for i in range(epoch):
    optimizer.zero_grad()  # 처음엔 gradient 값이 없기 때문에 0으로 초기화
    H_x = model(x)  # hypothesis
    loss = cost_function(H_x, y)  # cost(=loss) 구하기

    loss.backward()  # W, b에 대한 기울기 계산
    optimizer.step()  # optimizer 호출, 경사하강법을 사용하여 업테이트

    # 10번 씩 수행하면 cost 출력
    if i % 10 == 0:
        print("Cost(=loss) :", loss.item())

result = list(model.parameters())
print("W :", result[0].item())
print("b :", result[1].item())

 

# 결과
Cost(=loss) : 814.8699340820312
Cost(=loss) : 12.195707321166992
Cost(=loss) : 8.143980026245117
Cost(=loss) : 5.438344955444336
Cost(=loss) : 3.6315879821777344
Cost(=loss) : 2.4250807762145996
Cost(=loss) : 1.6194065809249878
Cost(=loss) : 1.081398606300354
Cost(=loss) : 0.7221314907073975
Cost(=loss) : 0.4822206497192383
Cost(=loss) : 0.3220142424106598
Cost(=loss) : 0.21503257751464844
Cost(=loss) : 0.14359332621097565
Cost(=loss) : 0.09588787704706192
Cost(=loss) : 0.06403134018182755
Cost(=loss) : 0.042758237570524216
Cost(=loss) : 0.02855268307030201
Cost(=loss) : 0.01906675659120083
Cost(=loss) : 0.012732233852148056
Cost(=loss) : 0.008502312004566193
Cost(=loss) : 0.005677602719515562
Cost(=loss) : 0.003791437717154622
Cost(=loss) : 0.0025317480321973562
Cost(=loss) : 0.001690658857114613
Cost(=loss) : 0.001128957374021411
Cost(=loss) : 0.0007538488134741783
Cost(=loss) : 0.0005033717607147992
Cost(=loss) : 0.0003361686831340194
Cost(=loss) : 0.00022449734387919307
Cost(=loss) : 0.0001499166974099353
Cost(=loss) : 0.00010010885307565331
Cost(=loss) : 6.684719119220972e-05
Cost(=loss) : 4.463006553123705e-05
Cost(=loss) : 2.9802462449879386e-05
Cost(=loss) : 1.990168311749585e-05
Cost(=loss) : 1.3289816706674173e-05
Cost(=loss) : 8.872347279975656e-06
Cost(=loss) : 5.9264275478199124e-06
Cost(=loss) : 3.959625701099867e-06
Cost(=loss) : 2.6436666757945204e-06
Cost(=loss) : 1.766238597156189e-06
Cost(=loss) : 1.1812345519501832e-06
Cost(=loss) : 7.882306931605854e-07
Cost(=loss) : 5.261869091555127e-07
Cost(=loss) : 3.516942399528489e-07
Cost(=loss) : 2.3484382438709872e-07
Cost(=loss) : 1.5710433842741622e-07
Cost(=loss) : 1.0491751822883089e-07
Cost(=loss) : 6.964684473587113e-08
Cost(=loss) : 4.667232644806063e-08
W : 3.9999990463256836
b : 4.999824047088623

Process finished with exit code 0

 

아래 결과를 자세히 보시면 중간까지는 cost의 값이 굉장히 작다가 후반부에 cost의 값이 증가하는 것을 확인할 수 있습니다. 

 

모델링을 할 때 유의사항 중 epoch를 무조건 많이 준다하여, 학습이 잘되는 것이 아닙니다.

 

데이터 처리, 모델링, epoch 등을 모두 적절하게 적용하여야 합니다.

728x90
반응형
반응형

지도 학습에는 대표적으로 세가지가 있습니다.

 

1. 선형 회귀 ( Linear Regression ) : 3월 : 60점, 6월 : 70점, 9월 : 80점이라면, 12월은 몇 점일까?

 

2. 이진 분류 ( Binary Classification ) : [0, 1], [True, False], [개, 고양이]

 

3. 다중 분류 ( Multi classification ) : [A, B, C, D], [개, 고양이, 사슴, 곰] ...

 

 

< Linear Regression >

 

지도 학습 중 가장 대표격인 선형 회귀에 대해 먼저 알아보겠습니다. 

 

입력

X = [1, 2, 3, 4]

 

출력

Y = [3, 5, 7, 9]

 

이라면 과연 X=5일 때, Y의 값은?

 

사람은 쉽게 Y의 값이 11임을 금방 알 수 있습니다. 

 

그렇다면 기계는 어떻게 Y의 값을 알아낼 수 있을까요?

 

 

 

 

 

 

 

 

 

1. 가설 ( hypothesis ) : 초기의 값을 정해준다. 

기계는 처음엔 아무 것도 모르는 상태이므로 

 

처음엔 H(x)라는 초기 가설을 세우게 됩니다. 

 

W, b에 임의의 값이 들어가 H(x)의 값을 정합니다.

 

H(x)는 기계가 생각한 답인 Y'입니다. 

 

하지만 당연히 처음부터 답이 될 수는 없습니다.

 

 

2. Cost Fucntion ( = Loss Fucntion ) : 정답과 얼마나 틀린지 알려준다.

 

기계가 H(x)라는 가설을 세웠으니, 정답과 얼마나 같은지 비교합니다. 

 

비교를 하기 위해 사용하는 방법이 제곱의 평균(mean Mean of squares) 입니다.

 

정답과 얼마나 다른지 알려면 |H(x) - Y| 하면 되는데 왜 제곱을 하였을까요? 

 

제곱을 한 이유는

 

1. 틀렸을 때, 패널티 값을 좀 더 크게 하기위해

 

2. 컴퓨터 내부에서 절댓값보다 제곱의 속도가 더 빠르기 때문입니다. 

 

 

 

 

 

3. Cost의 값을 줄이기. 정답에 최대한 가깝게!

 

2번에서 Cost(W, b)를 구하였습니다. 

 

학습은 Cost( = loss)를 줄이는 것이 목표입니다.

 

학생으로 표현하게 되면,  문제 풀기 -> 채점 -> 오답정리로 볼 수 있습니다. 

 

기계는 채점을 했으니, 오답정리 ( 가장 최적의 W, b를 구하기 )를 하면 됩니다.

 

Cost( = loss)를 줄이기 위해 많이 사용하는 방법이 경사 하강법( Gradient Descent ) 입니다.

Gradient Descent

 

* 편미분 : 다변수 함수의 특정 변수를 제외한 나머지 변수를 상수로 생각하여 미분하는 것

 

Cost(W, b)는 이차함수 두 개를 볼 수 있습니다. 

 

1. 이차함수

▶ W ( = 기울기 )에 대한 이차함수

b ( = 절편 )에 대한 이차함수

 

2. 편미분

▶ W에 대한 이차함수를  W에 대해서 편미분한 값(기울기)이 0이 되는 지점이 정답입니다.

▶ b에 대한 이차함수를 b에 편미분에 대해서 편미분한 값(기울기)이 0이 되는 지점이 정답입니다.

 

3. Update

만약, 기울기가 0이 되지 않았다면, 0이 될 때까지 계속해서 반복합니다.

 

Learning rate란, 최적의 w값을 찾아가기위해서 비용함수를 w에 대해서 편미분해준 것에학습률이라고 합니다.

 

아직까진 정답은 없으며, Learning rate를 크게 해주면 아래의 그림보다 더 많이 움직일 것이며, 

 

작게 해주면, 아래의 그림보다 조금 움직일 것입니다. 많은 사람들이 0.0001로 사용합니다. 

 

Update : 기울기가 음수라면 오른쪽으로, 양수라면 왼쪽으로 업데이트

 

정리하자면, 문제 풀기 -> 채점 -> 오답정리로 볼 수 있습니다. 

 

수식적인 부분에서는 제가 자세히 풀지 않은 이유는

 

수학을 잘 못하는 것도 있지만, 

 

이미 많은 라이브러리들이 이러한 수식들을 제공하고 있고, 사용하면 되기 때문입니다. 

 

주마다 큰 흐름을 이해할 수 있게끔 하나씩 글을 올리도록 하겠습니다. 

728x90
반응형

+ Recent posts