부스트캠프 AI Tech 4기
PyTorch 소개
쉬엄쉬엄블로그
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는 실행 시점에서 그래프가 그려짐
- keras
- Computational Graph
- 연산의 과정을 그래프로 표현
- Define and Run
- TensorFlow
- 그래프를 먼저 정의 → 실행시점에 데이터 feed
- Define by Run (Dynamic Computational Graph, DCG)
- PyTorch
- 실행을 하면서 그래프를 생성하는 방식
- 느릴 것 같지만 그렇지 않음
- 연산의 과정을 그래프로 표현
- Static vs Dynamic Graphs
- Dynamic Graphs는 디버그에 장점을 가짐
- Dynamic Graphs는 디버그에 장점을 가짐
- WHy PyTorch
- Define by Run의 장점
- 즉시 확인 가능 → pythonic code
- 가장 큰 장점이라고 함
- GPU support, Good API and community
- 사용하기 편한 장점이 가장 큼
- TF는 production과 scalability의 장점
- Define by Run의 장점
- 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)에 따라 변화도를 자동으로 계산할 수 있다.
- 순전파 단계
- 요청된 연산을 수행하여 결과 텐서 계산
- DAG에 연산의 gradient function을 유지
- 역전파 단계
- DAG root에서 .backward()가 호출될 때 시작된다.
- 각 .grad_fn 으로부터 변화도 계산
- 각 텐서의 .grad 속성에 계산 결과를 쌓음
- 연쇄 법칙을 사용하여, 모든 잎(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
를 통해 매개변수를 고정할 수 있다.
- 매개변수의 변화도가 필요하지 않다는 것을 미리 알고 있으면, 신경망 모델의 일부 파라미터를 고정하여 autograd 연산량을 줄이고 성능 상의 이득을 얻을 수 있다.
출처: 부스트캠프 AI Tech 4기(NAVER Connect Foundation)