본문 바로가기

딥러닝 프레임워크/PyTorch

PyTorch 기초 배워보기

출처: https://tutorials.pytorch.kr/beginner/pytorch_with_examples.html

 

예제로 배우는 파이토치(PyTorch) — PyTorch Tutorials 1.4.0 documentation

예제로 배우는 파이토치(PyTorch) Author: Justin Johnson번역: 박정환 이 튜토리얼에서는 PyTorch 의 핵심적인 개념을 예제를 통해 소개합니다. 본질적으로, PyTorch에는 2가지 주요한 특징이 있습니다: NumPy와 유사하지만 GPU 상에서 실행 가능한 N차원 Tensor 신경망을 구성하고 학습하는 과정에서의 자동 미분 완전히 연결된 ReLU 신경망을 예제로 사용할 것입니다. 이 신경망은 하나의 은닉층 (hidden layer

tutorials.pytorch.kr

PyTorch를 보면서 가장 큰 궁금증은 numpy와 비슷하지만 다르다는데 정확한 차이를 모르겠다는 것이다

1. PyTorch의 핵심 두가지

- NumPy와 유사하지만 GPU 상에서 실행 가능한 N차원 Tensor

- 신경망을 구성하고 학습하는 과정에서 자동 미분

NumPy는 훌륭한 프레임워크지만 GPU를 사용하여 수치 연산을 가속화할 순 없다. 현대의 심층 신경망에서 GPU는 종종 50배 또는 그 이상의 속도 향상을 제공하기 때문에 NumPy는 현대의 딥러닝에 충분치 않다.

-> GPU와 CPU의 차이는?

- CPU: 다양한 환경에서 작업을 빠르게 처리하기 위해서 ALU(Arithmetic logic unit)와 같은 실제 연산을 처리하는 부분의 구조가 복잡, 각종 제어 처리 기능이 많다. 그리고 가능한 적인 명령어로 복잡한 기능을 처리하고자 하기 때문에 명렁어 자체가 복잡

- GPU: 특화된 연산만을 처리하기 위해 제어 부분, 복잡한 구조 등을 과감히 버리고 단순한 다수의 ALU 존재. 그렇기 때문에 GPU 단독으로 작업 처리 불가능하며 CPU가 GPU 제어

CPU는 네 개의 큰 코어(ALU), GPU는 수많은 작은 코어를 가진다

GPU -> 여러 개의 작은 코어를 이용한 병렬 처리를 통해 많은 계산을 동시에 처리한다

 

2. PyTorch: Tensor란?

NumPy와는 달리 PyTorch Tensor는 GPU를 활용하여 수치 연산을 가속화할 수 있다. GPU에서 PyTorch Tensor를 실행하기 위해서는 단지 새로운 자료형으로 변환(Cast)해주기만 하면 된다

3. Autograd

자동미분을 사용하여 신경망에서 역전파 단계의 연산을 자동화

그래프의 Node는 Tensor이며, Edge는 입력 Tensor로부터 출력 Tensor를 만들어내는 함수

4. NN 모듈

PyTorch: nn

규모가 큰 신경망에서는 autograd 그 자체만으로는 low-level 일 수 있다.

신경망을 구성할 때 종종 연산을 여러 계층으로 배열하는 것으로 생각하게 되는데, 이 중 일부는 학습 도중 최적화가 될 학습 가능한 매개변수를 가지고 있다. PyTorch에서는 nn 패키지가 원초적 연산 그래프보다 더 높은 수준의 추상화(higer-level abstraction)를 제공하여 신경망을 구축하는데 있어 유용하게 한다.

모듈은 입력 Tensor를 받고 출력 Tensor를 계산하는 한편, 학습 가능한 매개변수를 포함하는 Tensor와 같은 내부 상태를 갖는다. 또한, nn 패키지는 신경망을 학습시킬 때 주로 사용하는 유용한 손실 함수들도 정의한다.

5. PyTorch: optim

앞에서는 (autograd에서 추적 기록을 피하기 위해 "torch.no_grad () 또는 ./data를 사용하여) 학습 가능한 매개변수를 갖는 Tesnor를 직접 보작하여 모델의 가중치를 갱신하였다. 이것은 확률적 경사 하강법(Stochastic gradient descent)과 같은 간단한 최적화 알고리즘에서는 크게 부담이 되지 않지만, 실제로 신경망을 학습할 때는 주로 AdaGrad, RMSProp, Adam 등과 같은 좀 더 정교한 Optimizer를 사용한다.

optim 패키지는 최적화 알고리즘의 아이디어를 추상화하고 일반적으로 사용하는 최적화 알고리즘의 구현화를 제공한다.

6. PyTorch: 사용자 정의 nn 모듈

가끔 기존 모듈의 순차적 구성보다 더 복잡한 모델을 구성해야 할 때가 있다. 이럴대는 nn.Module의 서버클래스 로 새 모듈울 정의하고, 입력 Tensor를 받아 다른 모듈 또는 Tensor의 autograd 연산을 사용하여 출력 Tensor를 생성하는 forward를 정의한다.

예제) 2-계층 신경망을 사용자 정의 Module의 서브클래스로 구현

# -*- coding: utf-8 -*-
import torch


class TwoLayerNet(torch.nn.Module):
    def __init__(self, D_in, H, D_out):
        """
        생성자에서 2개의 nn.Linear 모듈을 생성(Instantiate)하고, 멤버 변수로
        지정합니다.
        """
        super(TwoLayerNet, self).__init__()
        self.linear1 = torch.nn.Linear(D_in, H)
        self.linear2 = torch.nn.Linear(H, D_out)

    def forward(self, x):
        """
        순전파 함수에서는 입력 데이터의 Tensor를 받아서 출력 데이터의 Tensor를
        반환해야 합니다. Tensor 상의 임의의 연산자뿐만 아니라 생성자에서 정의한
        모듈을 사용할 수 있습니다.
        """
        h_relu = self.linear1(x).clamp(min=0)
        y_pred = self.linear2(h_relu)
        return y_pred


# N은 배치 크기이며, D_in은 입력의 차원입니다;
# H는 은닉 계층의 차원이며, D_out은 출력 차원입니다.
N, D_in, H, D_out = 64, 1000, 100, 10

# 입력과 출력을 저장하기 위해 무작위 값을 갖는 Tensor를 생성합니다.
x = torch.randn(N, D_in)
y = torch.randn(N, D_out)

# 앞에서 정의한 클래스를 생성(Instantiating)해서 모델을 구성합니다.
model = TwoLayerNet(D_in, H, D_out)

# 손실함수와 Optimizer를 만듭니다. SGD 생성자에서 model.parameters()를 호출하면
# 모델의 멤버인 2개의 nnLinear 모듈의 학습 가능한 매개변수들이 포함됩니다.
criterion = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)
for t in range(500):
    # 순전파 단계: 모델에 x를 전달하여 예상하는 y 값을 계산합니다.
    y_pred = model(x)

    # 손실을 계산하고 출력합니다.
    loss = criterion(y_pred, y)
    print(t, loss.item())

    # 변화도를 0으로 만들고, 역전파 단계를 수행하고, 가중치를 갱신합니다.
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

 

모듈 - > __init__ function, forward function 필수적