💡
Tensorflow와 Pytorch의 차이는 무엇일까?
✅ Computational graphs used 측면에서 다르다.
Pytorch는 Dyncamic computation graphs (DCG)를 사용하고,
Tensorflow는 Static graphs를 사용한다.
Computational graph란 연산의 과정을 그래프로 표현한 것이다.
notion image
 

Dyanamic Graph

  • 매 반복마다 연산 그래프가 새로 생성된다.
    • 훈련마다 조건부 코드를 작성할 수 있다.
    • 훈련 중에 모델에 새로운 층을 추가하거나 제거할 수 있다.
  • 가변 길이 시퀀스 처리에 유리해서 RNN은 Pytorch에서 구현하기 더 쉽다.
 

Computational Graph

  • 최적화 관점에서 유리하다.
    • 전체 구조를 미리 알기에 메모리 효율성을 최적화할 수 있다.
  • 한 번 정의되면 외부 플랫폼에서 독립적으로 실행할 수 있어서 이식성이 좋다.
    • 배포에 유리하다.
 
💡
PyTorch의 텐서와 numpy의 배열 간의 주요 차이점은 무엇인가?
✅ Tensor는 GPU를 지원한다. 또한 자동 미분, 동적 연산 그래프를 자동 구성한다.
GPU 지원으로 연산이 빠르며, 역전파를 수동 구현하지 않아도 돼서 편리하다.
 
💡
optimizer.zero_grad()를 안하면 어떤 일이 일어날까? 그리고 매 batch step마다 항상 필요할까?
✅ gradient가 계속 누적되어 잘못된 값으로 optimize 될 수 있다.
Pytorch는 기본적으로 gradient를 누적한다고 한다. 즉, loss.backward()를 하면 이전 step에서 계산된 gradient에 더하는 방식이다. optimizer.zero_grad()를 하지 않으면 gradient가 누적되어 잘못된 방향으로 업데이트가 일어난다.
그러면 애초에 누적되지 않도록 설계하면 되는거 아닌가?
  1. 메모리 부족 등의 이유로 작은 batch만 처리할 수 있을 때, 여러 번 forward + backward를 돌려서 gradient를 누적하고, 마지막에 한 번만 optimizer.step()을 호출해 큰 batch 효과를 내는 전략을 위해 pytorch는 기본적으로 누적을 제공한다고 한다.
  1. 설계자가 원하는 타이밍에 초기화할 수 있다.
 
💡
데이터의 크기가 너무 커서 메모리에 한번에 올릴 수가 없을 때, Dataset에서 어떻게 데이터를 불러와야 할까?
✅ Lazy Loading: 데이터를 Dataset 객체의 __getitem__에서 하나씩 그때그때 디스크에서 로드한다.
Dataset을 정의할 때 Lazy Loading을 사용하면 된다. 보통 __getitem__ 에서 파일을 그때그때 읽거나, 데이터를 배치 단위로 나눠서 저장하면 된다.