본문 바로가기
Deep Learning/모두를 위한 cs231n

[모두를 위한 cs231n] Lecture 8 - Part4. PyTorch Framework

by Steve-Lee 2020. 5. 7.

PyTorch Framework

PyTorch Framework에 대한 모든 것을 알아보겠습니다

PyTorch에 대해 알아봅니다

안녕하세요 Steve-Lee입니다. Lecture 8 Part 4의 주제는 PyTorch Frame work입니다. PyTorch는 Face book에서 개발한 Deep Learning Framework로 최근에는 TensorFlow만큼의 인기를 얻고 있는 유용한 Framework입니다. PyTorch Framework 지금 시작하겠습니다.

모두를 위한 cs231n

더보기

모두를 위한 cs231n 😀

👉🏻 시작합니다! 🎈

모두를 위한 cs231n (feat. 모두의 딥러닝 & cs231n)


👉🏻 Neural Network 기초 📗
* Backpropagation
Lecture4. Backpropagation and Neural Network. 오차역전파에 대해서 알아보자😃


👉🏻 Training Neural Network Part I 📑

- Activation Function 파헤치기

Lecture 6. Activation Functions에 대해 알아보자 
Lecture 6. Activation Functions - ReLU함수의 모든 것

 

- Data Preprocessing

Lecture 6. Training Neural Network - Data Preprocessing

 

- Weight Initialization 

Lecture 6. Weight Initialization

 

- Batch Normalization
Lecture 6. Batch Normalization

 

👉🏻 Deep Learning CPU와 GPU ⚙️

Lecture 8 - Part1. Deep Learning 을 위한 CPU와 GPU


👉🏻 Deep Learning Framework ☕️
Lecture 8 - Part2. Deep Learning Framework

👉🏻 TensorFlow Fraemwork 🧱
Lecture 8 - Part3. TensorFlow Framework


👉🏻 
PyTorch Framework 🔥

Lecture 8 - Part3. PyTorch Framework

 

👉🏻 Generative Model

Lecture 13 - Part2. VAE(Variational AutoEncoder)

모두를 위한 cs231n 😀

👉🏻 시작합니다! 🎈

모두를 위한 cs231n (feat. 모두의 딥러닝 & cs231n)


👉🏻 Neural Network 기초 📗
* Backpropagation
Lecture4. Backpropagation and Neural Network. 오차역전파에 대해서 알아보자😃


👉🏻 Training Neural Network Part I 📑

- Activation Function 파헤치기

Lecture 6. Activation Functions에 대해 알아보자 
Lecture 6. Activation Functions - ReLU함수의 모든 것

 

- Data Preprocessing

Lecture 6. Training Neural Network - Data Preprocessing

 

- Weight Initialization 

Lecture 6. Weight Initialization

 

- Batch Normalization
Lecture 6. Batch Normalization

 

👉🏻 Deep Learning CPU와 GPU ⚙️

Lecture 8 - Part1. Deep Learning 을 위한 CPU와 GPU


👉🏻 Deep Learning Framework ☕️
Lecture 8 - Part2. Deep Learning Framework

👉🏻 TensorFlow Fraemwork 🧱
Lecture 8 - Part3. TensorFlow Framework


👉🏻 
PyTorch Framework 🔥

Lecture 8 - Part3. PyTorch Framework

 

👉🏻 Generative Model

Lecture 13 - Part2. VAE(Variational AutoEncoder)

 

모두를 위한 cs231n (feat. 모두의 딥러닝 & cs231n)

cs231n 시작합니다! 안녕하세요. Steve-Lee입니다. 작년 2학기 빅데이터 연합동아리 활동을 하면서 동기, 후배들과 함께 공부했었던 cs231n을 다시 시작하려고 합니다. 제가 공부하면서 느꼈던 점들과

deepinsight.tistory.com

 

연구용으로 가장 인기 있는PyTorchFramework 

최근 통계자료를 보면 연구분야에서 가장 많이 사용되는 것을 확인할 수 있습니다

위의 그래프는 Toward Data Science의 'Is PyTorch Catching TensorFlow?'포스팅에서 발췌해 왔습니다. 우선 그래프에서 50% 이상이 의미하는 것은 바로 PyTorch가 TensorFlow보다 top conference에서 더 많이 언급됐다는 것을 의미합니다. 얼핏 봐도 대부분의 conference에서 Research용으로는 PyTorch Framework를 사용하는 것을 보실 수 있습니다. 더 자세한 내용은 위의 포스팅을 참고하시길 바랍니다.

이처럼 2017년 부터 현재까지 연구에서 가장 활발하게 사용되고 있는 PyTorch Framework에 대해 하나하나 살펴보겠습니다. 어떤 특징을 가지고 있으며 Tensor Flow와 비교했을 때 어떤 장. 단점이 있는지 알아보겠습니다. 그러면 시작하겠습니다.

 

PyTorch Framework의 세 가지 추상화 레벨 정의

우선 PyTorch Framework에 대해 간략히 짚고 넘어가 보도록 하겠습니다.

PyTorch Framework에 대해 이해하기 위해서는 세 가지 명시적 추상화 수준(Three explicit levels of abstraction)에 대해 숙지해야 합니다. Tensor, Variable, Module에 대한 각각의 특징을 살펴보겠습니다.

  • Tensor

    • Tensor는 Interative ndarray입니다. Tensor Flow의 Numpy array와 같은 역할을 합니다
    • 한 가지 다른 점은 GPU에서도 동작합니다
  • Variable

    • 계산 그래프(Computational Graph)를 구성하는 노드(Node)라고 기억하시면 됩니다
    • 데이터와 기울기(gradient)를 저장합니다
  • Module

    • Module 객체를 이용해서 Neural Net Layer를 구성할 수 있습니다
    • state와 학습 가능한 weight를 저장할 수도 있다고 합니다

 

위의 개념만으로는 완전히 이해하기 힘들다고 생각합니다. 아래의 예제들을 통해 하나하나 살펴보도록 하겠습니다.

PyTorch의 torch.Tensor 클래스, Function 클래스, Autograd 패키지에 대해 더 많은 정보를 알고 싶으시다면 여기을 참고해주세요.

 

PyTorch의 Tensor, Variable, Module을 TensorFlow와 비교해보겠습니다.

  • PyTorch의 Tensor는 TensofFlow의 Numpy array와 같은 역할입니다
  • Variable은 TensorFlow의 Tensor, Variable, Placeholder와 같은 역할입니다
  • Module은 TensorFlow의 TFSlim, TFLearn과 같습니다

 

PyTorch에 대해 한 가지 명심해야 할 점은 PyTorch가 고수준의 추상화를 이미 내장하고 있다는 것입니다. 이게 무슨 말일까요??🤨

바로 Module 객체를 떠올리면 됩니다. Module 객체는 고수준의 추상화를 내장하고 있기 때문에 TensorFlow처럼 어떤 모듈을 선택할지 고민할 필요가 없습니다. 고민 없이 Module 객체만 사용하면 됩니다. (뒤에서 예제를 통해 살펴보겠습니다.)

또한 PyTorch의 Tensor는 GPU 가속이 가능하며 고민 없이 Module 객체를 사용하면 된다고 합니다. 비슷하면서도 다르지만 개인적으로는 Torch를 사용하는 게 편하다고 생각합니다. 다음으로는 실제 Torch로 작성된 코드를 통해 학습과정을 살펴보도록 하겠습니다.

 

PyTorch Implementation

PyTorch로 구현된 code를 통해 모델 학습별 단계를 살펴보도록 하겠습니다.

  • 2-Layer Net with PyTorch Tensor
  • 2-Layer Net with PyTorch Autograd
  • Define New Autograd Function
  • 2-Layer Net with PyTorch nn
  • PyTorch nn: Define new Modules

하나씩 살펴보겠습니다.

2-Layer Net with PyTorch Tensor

우선 PyTorch Tensor를 사용해서 two-layer net을 구성해보도록합니다. 먼저 Tensor 객체를 사용해 구현한 예제부터 살펴보겠습니다. 한 슬라이드로 요약하면 다음과 같습니다. 

이전에도 배웠던 Neural Network를 PyTorch Tensor를 통해 구현할 수 있게 되었습니다. 앞에서 우리는 Tensor는 numpy의 배열과 같은 연산을 수행하는 것이라고 배웠습니다. 기존에 Numpy arrary로 구현했던 Network를 Tensor를 사용해서 구현한 것입니다. 위의 슬라이드의 내용이 이해가 신다면 아래의 설명은 pass 하셔도 좋습니다.

  • Step 1. Create random tensors for data and weight
    • data와 weight를 random 하게 생성해주는 단계입니다
  • Step2. Forward pass
    • Forward pass를 통해 prediction값과 loss값을 계산해줍니다
  • Step 3. Backward pass
    • 앞서 계산한 값을 통해 gradient를 계산해줍니다
  • Step 4. weight 업데이트
    • 가중치를 업데이트해줍니다
  • GPU 연산
    • 이 코드를 GPU에서 실행시키려면 data type만 조금 변경해주면 됩니다
    • GPU 연산을 위해 tensor를 cuda datatype로 cast 해줍니다
    • PyTorch의 Tensor는 numpy와 비슷하지만 GPU 연산이 가능합니다

 

앞으로 살펴볼 코드 스크립트는 대부분 이런 학습의 흐름을 가지고 있습니다. 

Tensor생성 -> Forward -> Backward -> Weight Update

 

2-Layer Net with PyTorch Autograd

다음은 Variable에 대해 알아보도록 하겠습니다. 

PyTorch의 Variable은 Computational graph의 노드라고 생각하시면 됩니다. Variable은 Computational Graph를 만들고 이를 통해 gradient를 자동으로 계산하는 등의 목적으로 이용합니다.

PyTorch의 Tensor와 Variables은 같은 API를 공유합니다.

한편 Tensor로 동작하는 모든 코드는 variable로도 만들 수 있습니다. 그렇게 되면 Computational Graph를 만들게 됩니다. 따라서 variable을 선언할 때 해당 variable에 대한 gradient를 계산할 것인지를 지정해 줄 수 있습니다. 위의 슬라이드에서 빨간색 박스 영역은 data에 대해서 gradient를 계산을 원치 않는다고 명시한 것입니다. 반대로 파란 박스 영역에서는 requires_grad=True로 명시하여 gradient를 계산할 수 있습니다. 

설명이 조금 어려운 것 같아서 첨언하도록 하겠습니다. Autograd의 의미는 자동(Auto) 미분(grad)입니다. 즉 기존에 forward pass, backward pass를 일일이 구현해야 했던 어려움을 이 패키지를 통해 손쉽게 해결할 수 있게 되었습니다.

Autograd Package는 자동 미분(automatic differenciation)을 위해 기록 기반의 시스템(tape based system)을 사용합니다. forward pass에서 모든 연산을 계산하고 backward pass에서 연산을 가져온다고 이해하시면 좋을 것 같습니다. 

Forward pass를 보면 Tensor를 사용했을 때와 완전히 같은 코드입니다.(앞서 말한 같은 API를 공유하기 때문입니다.) backward pass에서는 loss.backward() 호출만으로 gradient가 알아서 반환됩니다.

 

weight update를 위한 방법으로는 w1.grad.data값을 이용해 가중치를 업데이트할 수 있습니다.

gradient가 자동으로 계산된다는 것 이외에는 Numpy와 아주 유사합니다.

(Tensor생성 대신)Variable -> Forward -> Backward -> Weight Update

 

Define New Autograd Function

PyTorch에서는 사용자의 목적에 맞는 새로운 Autograd Function을 정의할 수 있다. 이때 Tensor operation을 이용해서 forward/backward만 구현하면 Computational Graph에 넣을 수 있게 됩니다.

위의 슬라이드와 같이 구현한 ReLU Function을 Computational Graph에 사용할 수 있게 됩니다. 다행인 점은(?) 대부분의 이런 함수들이 이미 구현되어있다는 것입니다. 따라서 우리의 필요와 목적에 맞는 함수를 불러오면 됩니다. 

 

2-Layer Net with PyTorch nn

Tensor Flow의 경우 Keras나 TF.Learn과 같은 라이브러리가 Higher level API를 제공해 주었습니다. PyTorch에서는 Higher level API를 'nn package'가 담당합니다. nn package는 high level wrapper를 제공해줍니다. 

뿐만 아니라 Tensor Flow와 같이 PyTorch도 optimizer operation을 제공합니다.

Sequence Layer로 모델 정의 -> Forward -> Backward -> Weight Update

가중치 업데이트 부분을 추상화시켜 Adam과 같은 알고리즘을 더 쉽게 쓸 수 있게 되었습니다.

이런 식으로 optimizer 객체를 구성해 놓는 것은 모델에게 파라미터를 optimize 하고 싶다고 말해주는 것입니다. gradient를 계산하고 난 뒤에 optimizer.step()을 호출하게 되면 모델 파라미터가 업데이트됩니다.

 

PyTorch nn: Define new Modules

You can define your own Modules using autograd!

PyTorch를 사용할 때 아주 흔하게 접하게 되는 것은 바로 나만의 nn module을 정의하는 것입니다. 전체 네트워크 모델이 정의되어 있는 class를 nn module class로 작성해야만 합니다.

Module일종의 네트워크 레이어라고 생각하면 됩니다. 다른 Module이 포함될 수도 있고 학습 가능한 가중치도 포함될 수 있습니다.

2-Lyaer Net 코드를 다시 한번 보겠습니다. nn module class로 작성되어 있는 코드입니다. 이 클래스의 생성자를 보면 linear1과 linear2가 선언되어 있습니다. 두 개의 object를 클래스 안에 저장하고 있는 것입니다. 

즉 하나의 모듈 안에 자식 모듈 2개(linear1과 linear2)를 저장하는 것입니다.

forward pass에서는 앞서 정의한 모듈도 사용할 수 있고 다양한 autograd도 사용할 수 있습니다.

뒷 부분의 코드는 앞선 예제들과 크게 다르지 않습니다. optimizer를 구성하고 반복문을 돌면서 데이터를 넣어주고 backward로 gradient를 구합니다. 그리고 step으로 가중치 값들을 update 해줍니다.

이 예제가 PyTorch로 학습을 하는 가장 일반적인 패턴입니다. 모델을 구성하는 클래스를 구성하고 반복문을 돌면서 모델을 업데이트하는 것입니다.

 

PyTorch DataLoader

한편...PyTorch에서 제공하는 dataloader가 아주 유용합니다. dataloader는 mini-batch를 관리해줍니다. 학습 도중 Disk에서 mini-batch를 가져오는 일련의 작업들을 알아서 관리해줍니다. 이처럼 dataloader는 dataset을 wrapping 하는 일종의 추상화 객체를 제공해줍니다. 

실제로 데이터를 이용하고자 할 때 데이터를 어떤 방식으로 읽을 것인지를 명시하는 dataset class만 작성해 준다면 이 class를 dataloader로 wrapping 시켜서 학습을 시킬 수 있습니다.

dataloader 객체를 순환하면서 매 반복 시마다 데이터의 mini-batch를 적절하게 반환시켜줍니다. 내부적으로는 data shuffling이나 multithreaded dataloading과 같은 것들을 알아서 관리해준다고 합니다.(multithreaded dataloading이라...)

 

PyTorch: Pretrained Models

PyTorch를 통해 사전 학습된 모델의 가중치를 다운로드할 수 있습니다. Torch를 통해 아주 쉽게 사용이 가능합니다. 단 2017년 강의자료이다 보니 최신 동향은 다시 한번 찾아봐야 할 것 같습니다.

PyTorch: Visdom

PyTorch는 Tensorboard와 유사하게 Loss에 대한 통계 같은 것들을 시각화해주는 패키지를 제공해줍니다.

 

포스팅이 너무나도 길어졌습니다...ㅎㅎ TLDR;이지만 끝까지 읽어주셔서 감사합니다!

Static Graph와 Dynamic Graph에 대한 비교는 짚고 넘어가야 하기에 부작이 하나 늘 수도 있을 것 같습니다ㅎㅎ.

이상으로 Steve-Lee였습니다. 감사합니다!

 

 

[모두를 위한 cs231n] Lecture 8 - Part1. Deep Learning 을 위한 CPU와 GPU

안녕하세요 Steve-Lee입니다. Lecture 8 Part 1. Deep Learning을 위한 CPU와 GPU 지금 바로 시작합니다! 모두를 위한 cs231n 모두를 위한 cs231n 😀 👉🏻 시작합니다! 🎈 [Deep Learning/03. 모두를 위한 cs231n..

deepinsight.tistory.com

 

Reference: 

  • cs231n Lecture8. Deep  Learning Software

댓글