ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PyTorchZerotoAll 내용정리] 05 Linear Regression in pytorch(pytorch Project 개발순서 익히기)
    ML&DL 이야기/Pytroch 2023. 8. 23. 15:20
    Pytorch Project Rhythm

    pytorch 사용시 개발 순서

    pytroch 모델을 개발하고 학습하는 사이클을 크게 위의 3단계를 거친다. 

    위에 1에 우선시 되는 단계도 있어서(강의에서도 간단히 언급하고 넘어감) 이를 토대로 정리하고 각 코드가 어떻게 대치되는지 확인해보자. 

    0. Data 다루기 

    dataset이 매우 간단한 경우, 실제로 이런 case는 존재하지 않는다

    torch.autograd.Variable는 2021.01.12 기준 1.7 version에서는 더 이상 사용되지 않습니다. 현재는 모든 tensor가 자동적으로 Variable의 성질을 가지기 때문에 굳이 사용할 필요가 없으나(즉, autograd 설정이 가능합니다) 과거 버전의 코드를 수행함에 있어 Variable을 사용하는 경우가 있습니다

    import torch 이후에 여러 패키지를 import하고, 이후 학습에 필요한 데이터를 불러온다. 

    위의 코드에서는 단순히 x_data, y_data를 tensor형태로 받아왔지만, 실제로 우리가 다룰 데이터들을 불러오기 위해서는 대다수 Dataset, Dataloader를 이용한다(csv파일을 변환하거나, data에서 y_data 즉, 정답데이터를 분리하거나 하는 작업들) 

    이에 대해서는 이후의 강의에서 다룬다. 

    1. Design Model

     Data가 준비되었다면 해당 Data를 학습시킬 모델을 불러오자. 

    모델은 크게 __init__부분, forward 부분으로 나누어진다(물론 모델의 형태에 따라서 reparameterization부분이나 endcoder, decoder등이 추가될 수는 있지만 이는 결국 forward부분이 점차 복잡해지는 형태라고 볼 수 있다)

    이번 예시코드에서는 매우 단순한 linear 모델의 형태로 모델을 구성한다. 

    경우에 따라서 init에서 forward함수까지 같이 정의하는 코드도 본적이 있지만 대다수는 분리해서 작성한다(https://tutorials.pytorch.kr/beginner/basics/buildmodel_tutorial.html , torch 공식문서에서도 분리해서 작성했다)

    __init__ 

    Class, 여기서는 Model을 초기화하기 위한 컨스컬터라고 불리는 함수로 인스턴스 생성과 관련해서 클래스 내의 데이터의 초기화를 실시하는 함수이다. 

    코드를 살펴보면

    super(Model, self).__init__()을 실행하는 것을 알 수 있는데, 이를 다른(python의 class)과 다르게  사용하는 이유는

    보통 모델들의 경우 torch.nn.Module를 상속받아 이용하는데 

    이이 nn.Module의 init을 사용하여 해당 모델의 변수를 초기화해주는 것이다. 

    nn.moudel의 init함수[출처: https://cnu-jinseop.tistory.com/185]

    이들 대다수는 class내의 함수로 접근하는 변수들이기에 정상적으로 사용하기 위해서는 이들을 초기화하고 사용해야하는 것이다. 

    추가로 super().__init__()과 super().__init(class_name, self)의 차이는 기능상으로는 없으며 단순히 현재 사용하는 클래스가 어떤 클래스인지 알려주는 용도로만 사용된다. 

    self.linear = nn.Linear(1,1)은 이후 모델의 인스턴스 속성으로 linear이라는 속성을 만들고 이것이 nn 모듈의 Linear(1,1)와 같음을 정의한다. 

    (1,1)은 input dimension과 ouput diemension이 1대1임을 알려준다(input1개 들어가고 ouput은 그에 맟추어 1개 나온다)

    forward(self, x)

    forward는 간단히 x를 입력으로 받아 y를 출력으로 하는 모델로 self.linear을 x가 통과하여 y가 나온다. 

    기존과 다르게 따로 w가 없는 이유는 우리가 nn모듈을 상속받아서 linear 모델을 사용하고 있기 때문이다. 

    모델에 따라 더 복잡하게 forward를 만들수도 있다. 

     

    2. Loss & Optimizer 

    Loss와 optimizer를 정하는 단계이다. 

    Loss의 경우 우리가 모델을 이후에 backpropagation을 통해 보정해 줄 때 사용핳는 수치이고, optimizer는 모델을 어떻게 학습시킬 것인지에 관한 것이다. 

    둘다 여러가지가 있는데 강의에서는 가장 대표적인 MSE와 SGD를 이용하였다(관련하여 추가 포스트를 작성할 예정)

     

    - pytorch가 제공하는 다양한 loss function에 관해

    https://pytorch.org/docs/stable/nn.html#loss-functions

     

    torch.nn — PyTorch 2.0 documentation

    Shortcuts

    pytorch.org

    loss Parameters에 관해
    size_average (bool, optional) – Default: True, 더 이상 사용X
    기본적으로(True) loss는 각 batch 관한 loss의 평균으로 계산된다. 즉, 배치의 size로 나누어 샘플 당 평균 손실을 효과적으로 계산한다. 
    만일 False 인 경우 각각 batch 내의 모든 샘플에 관한 loss의 sum으로 loss가 계산된다, 즉, 배치 크기로 loss를 정규화하지 않는다. 
    reduce (bool, optional) – Deprecated (see reduction), 더 이상 사용 X
    reduction (str, optional) – Default: mean reduction을 적용
    none, mean, sum이 있으며 
    none: 감소 적용 X, mean: sum of output divided by number of output, sum: sum of output

    loss == criteriion이다

    3. Training Cycle(forward, backward,  epoch..)

    이제 모델을 학습시킬 단계이다!

    training loop 위에서 정의된 변수, class를 모두 이용해 학습을 시키자

    모델을 순차적으로 학습시킨다. 

    이때 우선 epoch이라는 말이 나오는데 이는 sgd에서 흔히 정의되는 용어로 전체 dataset을 몇번 순회하는가에 관한 단어이다. 즉 위의 예시코드에서는 전체 dataset을 500번 순회한다는 의미이다. 

    이는 batch size와는 다른 용어로 batch size는 전체 dataset을 sgd에서 나누었을 때 한 dataset당(bacth) 몇개의 data가 들어있는지를 나타내는 용어이다. 

     

    이후 순차적으로 forwad, x를 모델에 통과시켜 y, output을 뽑고, 이후 loss를 계산한다. 

     

    마지막으로 backpropagation을 돌리는데, 이때 optimizer를 이요한다. 

    여기서 중요한것은 optimizer.zero_grad인데, 이것을 backward전에 안해주면 값이 이상하게 나온다. 

    TORCH.OPTIM.OPTIMIZER.ZERO_GRAD
    Optimizer.zero_grad(set_to_none=False)[source]Sets the gradients of all optimized torch.Tensor s to zero.
    한 루프에서 업데이트를 위해 loss.backward()를 호출하면 각 파라미터들의 .grad값에 변화도가 저장이 된다. 
    이후 다음 루프에서 zerp.gard를 사용하지 않고 학습을 시키면 저장된 값이 다음 루프의 업데이트에도 반영되어서 학습이 우리가 원하는 방향으로 이루어지지 않는다.

    4. Test

    Train이 끝나면 학습이 끝난 모델을 가지고 test를 시킨다. 해당 test 예시는 매우 간단하지만 test에도 꽤 많은 양의 data(0.3정도)를 사용하는 것이 일반적이다. 

     

Designed by Tistory.