쉬엄쉬엄블로그 2023. 5. 10. 11:56
728x90

Introduction to PyTorch

  • AI 분야의 리더 프레임워크
    • PyTorch와 TensorFlow
  • keras, TensorFlow, PyTorch
    • keras
      • keras는 껍데기(wrapper)
      • high-level API
      • 유저가 TF나 Pytorch를 사용하기 편하게 만들어 줌
    • 미분하기 위해서 backward-propagation을 해야 하는데 그러기 위해서 먼저 현재 데이터들을 그래프로 표현해야 함
    • 이 그래프를 어떻게 표현하느냐가 TensorFlow와 PyTorch의 차이를 가름
    • Tensorflow는 static하게 그래프를 그린 다음에 실행 시점에 backward-propagation이 일어남
    • PyTorch는 실행 시점에서 그래프가 그려짐
  • Computational Graph
    • 연산의 과정을 그래프로 표현
    • Define and Run
      • TensorFlow
      • 그래프를 먼저 정의 → 실행시점에 데이터 feed
    • Define by Run (Dynamic Computational Graph, DCG)
      • PyTorch
      • 실행을 하면서 그래프를 생성하는 방식
      • 느릴 것 같지만 그렇지 않음
  • Static vs Dynamic Graphs
    • Dynamic Graphs는 디버그에 장점을 가짐
  • WHy PyTorch
    • Define by Run의 장점
      • 즉시 확인 가능 → pythonic code
      • 가장 큰 장점이라고 함
    • GPU support, Good API and community
    • 사용하기 편한 장점이 가장 큼
    • TF는 production과 scalability의 장점
  • PyTorch
    • Numpy + AutoGrad + Function(deep learning)
    • Numpy 구조를 가지는 Tensor 객체로 array 표현
    • 자동미분을 지원하여 DL 연산을 지원
      • 자동미분을 지원하는 것이 딥러닝 프레임워크에서 가장 중요한 영역
    • 다양한 형태의 DL을 지원하는 함수와 모델을 지원함
  • Autograd란?
    • 참고 : https://tutorials.pytorch.kr/beginner/blitz/autograd_tutorial.html
    • torch.autograd는 신경망 학습을 지원하는 PyTorch의 자동 미분 엔진
      • 일반적으로 벡터-야코비안 곱을 계산하는 엔진
    • 미분
      • 텐서의 모든 연산들을 추적하고 .backward()를 호출할 때 변화도들을 계산하여 이를 각 텐서의 .grad 속성(attribute)에 저장
    • 연산 그래프
      • autograd는 데이터(텐서) 및 실행된 모든 연산들(및 연산 결과가 새로운 텐서인 경우도 포함하여)의 기록을 Function 객체로 구성된 방향성 비순환 그래프(DAG: Directed Acyclic Graph)에 저장(keep)한다.
      • 이 방향성 비순환 그래프(DAG)의 잎(leave)은 입력 텐서이고, 뿌리(root)는 결과 텐서이다.
      • 이 그래프를 뿌리에서부터 잎까지 추적하면 연쇄 법칙(chain rule)에 따라 변화도를 자동으로 계산할 수 있다.
      • 순전파 단계
        1. 요청된 연산을 수행하여 결과 텐서 계산
        2. DAG에 연산의 gradient function을 유지
      • 역전파 단계
        • DAG root에서 .backward()가 호출될 때 시작된다.
        1. 각 .grad_fn 으로부터 변화도 계산
        2. 각 텐서의 .grad 속성에 계산 결과를 쌓음
        3. 연쇄 법칙을 사용하여, 모든 잎(leaf) 텐서들까지 전파(propagate)
      • 다음은 위 예제의 DAG를 시각적으로 표현한 그림
        • 그래프에서 화살표는 순전파 단계의 방향을 나타낸다.
        • 노드(node)들은 순전파 단계에서의 각 연산들에 대한 역전파 함수들을 나타낸다.
        • 파란색 잎(leaf) 노드(node)는 잎(leaf) 텐서들을 나타낸다.
    • 매개변수 고정하기(freeze parameter)
      • 매개변수의 변화도가 필요하지 않다는 것을 미리 알고 있으면, 신경망 모델의 일부 파라미터를 고정하여 autograd 연산량을 줄이고 성능 상의 이득을 얻을 수 있다.
      from torch import nn, optim 
      model = resnet18(weights=ResNet18_Weights.DEFAULT) 
      
      # 신경망의 모든 매개변수를 고정합니다 
      for param in model.parameters(): 
          param.requires_grad = False 
      
      model.fc = nn.Linear(512, 10) 
      
      # 분류기만 최적화합니다. 
      optimizer = optim.SGD(model.parameters(), lr=1e-2, momentum=0.9)
      • requires_grad = False를 통해 매개변수를 고정할 수 있다.

출처: 부스트캠프 AI Tech 4기(NAVER Connect Foundation)