선형 회귀( Linear-regression )

Uomnf97·2021년 5월 2일
0

Simple Linear regression

선형회귀 : 두 변수의 사이의 관계를 선형 관계로 직선으로 모델링 하는 기법.

여러 데이터 set을 이용해서 y= Wx * b( W= weight, b=Bias의 꼴로 나타낼 수 있도록 데이터를 학습함. 이 함수를 Hypothesis Function을 의미하고, 인공 신경망을 의미함.

Data Set: Train 와 Test data set 두개로 나뉨
TrainData:torch.FloatTensor() 함수를 활용해서 , x,y 변수를 넣어줌
Cost Function: 이것을 나타내는 함수를 손실함수(Compute Loss)라고 부르며, Measn Squared Error( MSE ) 방식을 정의를 내림. 평균을 계산할 때,torch.mean()이라는 함수를 통해서, 변수의 갯수와 덧셈 연산없이 값을 대입해 함수를 간단하게 만들 수 있음.

학습시: 학습시 torch.optim이라는 라이브러리를 사용함.
zero_grad()로 각 gradient를 초기화 해주고, back_ward로 계산을 해줌. 마지막으로 step()함수를 통해서 개선 시켜줌.


  • 완성된 y=x 선형 회귀 코드
# 데이터
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[1], [2], [3]])
# 모델 초기화
W = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# optimizer 설정
optimizer = optim.SGD([W, b], lr=0.01)

nb_epochs = 1000
for epoch in range(nb_epochs + 1):
    
    # H(x) 계산
    hypothesis = x_train * W + b
    
    # cost 계산
    cost = torch.mean((hypothesis - y_train) ** 2)

    # cost로 H(x) 개선
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()

    # 100번마다 로그 출력
    if epoch % 100 == 0:
        print('Epoch {:4d}/{} W: {:.3f}, b: {:.3f} Cost: {:.6f}'.format(
            epoch, nb_epochs, W.item(), b.item(), cost.item()
        ))

Gradient

Gradient : 경사하강법이라고 불리며, 경사가 가장 가파른 곳을 찾아서 한걸음씩 내려가는 방법

보다 빨리 손실함수를 최소화 하는 방식으로 최적화 시킬 수 있음. 더 적은 Epoch수로 원하는 결과를 도출 해낼 수 있음.

# 데이터
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[1], [2], [3]])
# 모델 초기화
W = torch.zeros(1)
# learning rate 설정
lr = 0.1

nb_epochs = 10
for epoch in range(nb_epochs + 1):
    
    # H(x) 계산
    hypothesis = x_train * W
    
    # cost gradient 계산
    cost = torch.mean((hypothesis - y_train) ** 2)
    gradient = torch.sum((W * x_train - y_train) * x_train)

    print('Epoch {:4d}/{} W: {:.3f}, Cost: {:.6f}'.format(
        epoch, nb_epochs, W.item(), cost.item()
    ))

    # cost gradient로 H(x) 개선
    W -= lr * gradient

Multivariate Regression

다중 선형 회귀 : 여러 독립 변수와 하나의 종속 변수 사이에 선형관계를 모델링 하는 기법.

복순의 정보가 있을 때, 어떻게 하나의 추측값을 계산할 수 있을지에 대한 해결방안임.
y = w1 x1 + w2 x2 + w3* x3 +b (w1,w2,w3: Weight, b: bias)
w의 갯수는 3,4, ... n개 가 될 수 있으며, 이러한 식을 Hypthesis Function라 부르며, 이 문제를 학습시킬 인공신경망이기도 하다.

Matmul: 앞서 언급했던 것과 같이, 무수하게 변수가 많아 질 수 잇기에 행렬곱으로 문제를 해결할 수 있고, 이 전 강의에서 배운 matmul()함수를 통해서 긴 hypothesis함수식을 줄여줄 수 있다.

  • cost function (MSE) gradient 동일, 다만 데이터 입력시 차원이 달라짐으로 입력시와 hypothesis함수 부분 등에서 차이를 보임

nn.Module: torch.nn이라는 라이브러리에 존재하며, nn.module을 torch 라이브러리에서 불러와 클래스를 상속해서 모델을 생성, 입력된 파라미터를 통해서, 해당 차원만큼의 매트릭스를 만들어줌. 이 모듈을 이용하면, hypothesis식을 세울때 , gradient계산등을 코드상 간략하게 나타내 줄 수 있음.
F.mes_loss: torch.nn.functional에서 제공하는 cost를 계산해주는 함수며, 쉽게 다른 loss와 교체 가능함. 디버깅에 용이

  • 최종 코드
# 데이터
x_train = torch.FloatTensor([[73, 80, 75],
                             [93, 88, 93],
                             [89, 91, 90],
                             [96, 98, 100],
                             [73, 66, 70]])
y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
# 모델 초기화
model = MultivariateLinearRegressionModel()
# optimizer 설정
#optimizer = optim.SGD(model.parameters(), lr=1e-5)
optimizer = optim.SGD([W, b], lr=1e-5)

nb_epochs = 20
for epoch in range(nb_epochs+1):
    
    # H(x) 계산
    prediction = model(x_train)
    
    # cost 계산
    cost = F.mse_loss(prediction, y_train)
    
    # cost로 H(x) 개선
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()
    
    # 20번마다 로그 출력
    print('Epoch {:4d}/{} Cost: {:.6f}'.format(
        epoch, nb_epochs, cost.item()
    ))

Loading Data

  • 대부분의 머신러닝에서 데이터셋은 적어도 수십만개의 데이터를 제공받음. 따라서 복잡한 머신러닝을 학습하려면, 매우 많은 양의 데이터가 필요함.
  • 문제점: 많은 양이 데이터를 한번에 학습시키는 것은 사실 상 불가능에 가까우며, 매우 느림.
  • 해결 방안: Minibatch로 데이터 일부분씩 나누어서 학습을 시킴
  • Minibatch

    장점: 빠르게 업데이트가 가능(많은 양의 데이터를 학습시킬 수 있음)
    단점: 모든 데이터 값을 활용하지 않았으므로, 손실함수가 기존과다르게 완만하게 줄어들지 않음.
  • MiniBatch를 만들기 위한 Python API

    DataSet: torch.util.data.Dataset 상속을 상속한 클래스를 이용.len()함수를 통해 데이터 셋의 총 데이터 수, getitem()함수를 통해 그 인ㄴ덱스에 해당하는 데이터를 반환함.
    DataLoader: torch.utils.data.DataLoader를 사용하여, batch size의 크기를 정해주고, shuffle을 통해 epoch마다 데이터를 섞어줌
profile
사회적 가치를 실현하는 프로그래머

0개의 댓글