읽기일기

Learning PyTorch with Examples (3) – nn module

http://pytorch.org/tutorials/beginner/pytorch_with_examples.html#nn-module

Learning PyTorch with Examples

nn module

PyTorch: nn

계산 그래프와 autograd는 복잡한 연산을 처리하고 자동으로 그 미분을 해주는 매우 강력한 패러다임입니다. 하지만 거대한 신경망에서 autograd를 직접 쓰기에는 너무 저수준의 작업이 될 것입니다.

신경망을 만들 때 ,우리는 보통 계산들을 구성해서 으로 만들고 그 층들이 가지는 learnable paramters를 학습 중에 최적화하는 작업으로 생각합니다.

TensorFlow에서는 Keras, TensorFlow-Slim, TFLearn같은 패키지들이 계산 그래프들의 고수준 추상화를 제공하여 신경망을 만드는게 도움을 줍니다.

PyTorch에서는 nn패키지가 이러한 기능을 담당합니다. nn패키지는 신경망 층들과 거의 비슷한 모듈의 집합을 가지고 있습니다. 모듈은 입력 Variable을 받아 출력 Variable을 계산합니다. 거기에 learnable parameter를 나타내는 Variable 또한 내부 상태로 가지고 있습니다. nn패키지는 또한 신경망 학습에 자주 쓰이는 유용한 로스 함수도 가지고 있습니다.

아래 예제에서 nn패키지를 이용하여 우리의 2층 망을 구현해봅시다.

PyTorch: optim

지금까지는 우리 모델을 학습시킬 때, learnerable parameter의 Variable의 .data를 직접 변화시켜 파라미터를 업데이트 하였습니다. Stochastic gradient descent같이 간단한 최적화 알고리즘에서는 이것이 큰 부담이 되지는 않지만, 실제 신경망을 학습시킬 때 자주 쓰는 AdaGrad, RMSProp, Adam 등과 같은 최적화 기법에서는 부담이 될 수 있습니다.

PyTorch의 optim패키지는 최적화 알고리즘의 아이디어를 추상화하고, 자주 쓰이는 알고리즘의 구현을 제공하고 있습니다.

아래 예제에서 nn패키지가 모델을 정의하고, optim패키지가 제공하는 Adam 알고리즘을 이용하여 이 모델을 최적화 하는 코드를 보겠습니다.

PyTorch: Custom nn Modules

때로는 기존의 모듈을 이어붙인 것보다 더 복잡한 모델을 만들어 사용하고 싶을 때도 있습니다. 이런 경우, nn.Module을 상속받아 서브클래스를 만들고 forward을 정의하여 자신만의 모듈을 만들 수 있습니다. forward 안에서는 입력 Variable을 받아 다른 모듈과 다른 autograd 연산을 이용하여 출력 Variable을 만드는 역할을 합니다.

아래 예제에서는 2층 망을 custom Module 서브클래스로 구현해보겠습니다.

PyTorch: Control Flow + Weight Sharing

동적 그래프와 파라미터 공유에 대한 예제로써 이상한 모델을 하나 만들어보고자 합니다. Fully connected ReLU 망인데, 각 순전파 단계에서 1에서 4 사이의 랜덤 수를 선택하고, 같은 가중치를 여러번 재사용하는 은닉층을 이 수만큼 통과시킨 뒤, 최종 은닉 층을 계산하는 망입니다.

이 모델을 구현하기 위해 루프에는 Python의 흐름 제어 구문을, 가중치 공유에는 순전파 과정에서 같은 Module을 여러번 사용하는 방법을 이용하였습니다.

아래는 모듈 서브클래스를 이용하여 구현한 결과입니다.

 


Tags:
Add a Comment Trackback