개인 study를 위한 자료입니다.
그러다보니 내용에 잘못된 점이 있습니다.

PyTorch tutorial 을 하면서, 이해한 내용을 정리를 하였습니다.

Summary

  1. torch.tensor - “N차원 배열 data” + “GPU” + “gradient”
    • N차원 배열 data를 저장하는 면에서, numpy.ndarray와 비슷합니다.
    • CPU/GPU device 이동을 지원합니다. to(device)
    • autograd를 지원합니다. 이를 통해, back propagation을 손쉽게 할 수 있습니다.
  2. torch.nn - Neural Networks을 정의합니다.
    • Module : Layer와 forward method를 포함하며, 주로 model를 새로 정의할때, parent class 로 사용합니다.
    • Parameter : Tensor의 subclass(wrapper)로, Module에서 학습을 위한 weight 관리를 용이하게 합니다. parameters() iterator 로 불러 올 수 있습니다.
    • functional : 활성화 함수, 손실 함수 등을 포함하는 모듈로 일반적으로 F import합니다. 또한 convolution과 linear layer와 같이, 저장 state를 가지는 layer의 non-statefule 버전 레이어도 포함되어 있습니다.
  3. torch.optim - backward() 단계에서, Parameter를 update하는 optimizer를 포함하는 module
  4. Dataset - dataset을 표현하기 위해 제공되는 __len____getitem__을 포함하는 abstract class.
  5. DataLoader - Dataset을 기반으로 데이터의 배치를 출력하는 iterator.

1. torch.Tensor

numpy.ndarray와 비슷하게 다차원 연산을 위한 기본 function들을 제공합니다.

그리고, PyTorch는 tensorautograd를 넣어 가장 중심이되는 class로 사용합니다.

  • 이전에는 torch.autograd.Variable이라는 tensor의 wrapper class가 있어, 여기서 operation hisotry를 저장했습니다. 하지만, autogradtensor에서 자동 지원되면서, 더 이상 지원하지 않습니다.)

torch.Tensor is the central class of the package.

tensor.requires_gradTrue로 하면, tensor를 사용한 연산과정을 기록(grad_fn)합니다. 그리고, 최종단 tensor에서 .backward()가 수행되면, gradient가 계산되어 tensor.grad에 저장되고, 이 값은, grad_fn에 기록된 연산을 타고, back propagation 이 진행됩니다. 예를 들어 아래와 같이 code를 작성한 경우 [2],

아래 그림과 같은 NN이 생성이 되며, zygard_fn에, 해당 tensor가 계산 되는 과정이 저장됩니다. z.backward()가 수행이되면, z.grand_fn에서 주어진 값들이 back propagation 되면서, x.grad, a.grad, b.grad가 자동 계산됩니다. 이 기능을 통해서, tensor 만으로도 model 작성과 학습이 가능합니다. backward() exmaple

2. torch.nn & torch.optim & Dataset & DataLoader

이 부분은 실제 예제를 통해서 이해하는게 좋습니다.[3]

torch.nn, torch.optim, Dataset 그리고 DataLoader없이 Tensor만을 이용해서, 아래와 같이 Linear regression을 model을 구현하고 학습할 수 있습니다.

1) nn.functional 사용

여기서, torch.nn.functional를 사용해서, log_softmax() + negative_log_likelihood()를 하나의 함수로 처리할 수 있습니다.

2) nn.Module 사용

학습의 대상이 되는 parameter와 Neural Networks model을 쉽게 관리하기 위하여, nn.Module을 사용합니다. nn.ModuleParameters()를 이용해서, model에 속해 있는 parameter에 대해서 아래와 같이 쉽게 관리 할 수 있습니다.

3) nn.Linear 사용

미리 정의된 Model들 을 사용해서, code를 리팩토링 할 수 있습니다. nn.Linear를 사용해서, self.weightsself.bias의 정의와 초기화 작업 그리고 xb @ self.weights + self.bias 계산을 대신 할 수 있습니다.

4) optim 사용

미리 구현된, optimization 알고리즘을 torch.optim을 이용하여 사용할 수 있습니다. 이를 통해, parameters를 step() method를 사용하 update할 수 있습니다.

5) Dataset & DataLoader 사용

구현을 하다보면, data를 load하고 자르고 섞는데 많은 code가 들어 갑니다. 이때, Dataset과 DataLoader를 사용하면 이 부분을 쉽게 구현할 수 있습니다. __len____getitem__를 가진 class는 Dataset으로 사용할 수 있습니다. 반대로 __len____getitem__만 만들면, customize된 Dataset을 정의할 수 있습니다. Tensor를 입력으로 받는 경우, 미리 정의된 TensorDataset를 사용할 수 있다. DataLoader는 batch 관리를 담당합니다. DatasetDataLoader를 사용하면 아래와 같이 코드가 훨씬 깔끔해 집니다.

6) 최종 code

torch.nn & torch.optim & Dataset & DataLoader를 사용하여, 아래와 같이 code를 refactoring 할 수 있습니다.

Reference