더보기
CS231n 강의 홈페이지: https://cs231n.stanford.edu/
CS231n Spring 2017 유튜브 강의 영상: https://www.youtube.com/watch?v=vT1JzLTH4G4&list=PLC1qU-LWwrF64f4QKQT-Vg5Wr4qEE1Zxk
강의 슬라이드 & 한글 자막: https://github.com/visionNoob/CS231N_17_KOR_SUB
PyTorch
Three Levels of Abstraction
- Tensor
- 다차원 배열로 Numpy의 배열과 유사
- GPU에서 연산 수행 가능
- Variable
- 그래프의 노드로 볼 수 있으며 autograd을 통해 그래디언트를 계산하는 데 사용됨
- 이 기능을 통해 역전파를 쉽게 구현 가능
- Module
- 신경망을 구성하는 블록
- 신경망을 정의하고 다양한 계층을 쌓아 모델을 설계할 수 있음
Tensors
- 2-layer 네트워크 예제
- 랜덤 텐서 선언
- forward pass
- backward pass & update
- GPU에서 실행
- 데이터 타입을 FloatTensor에서 cuda.FloatTensor로 변경
- 파이토치 텐서를 쉽게 생각하면 Numpy + GPU라고 볼 수 있음
nn
- Basics
- 파이토치에서는 nn 패키지가 텐서플로우의 Keras나 TF.Learn과 같은 high-level wrappers를 제공
- Keras와 유사한 방식으로 Linear / ReLU 레이어를 모델 시퀀스에 추가
- 2-layer 네트워크 예제
- 모델 정의
- nn 패키지에서 제공하는 Linear, ReLU, MSELoss를 이용하여 모델 및 손실함수 정의
- forward pass
- 데이터를 모델에 입력하여 예측 결과를 얻고 loss 계산
- backward pass & update
- loss.backward를 호출하면 자동으로 그래디언트가 계산됨
- 명시적으로 gradient descent step을 수행하여 모델을 업데이트
- 모델 정의
optim
- Basics
- 파이토치에서도 텐서플로우와 마찬가지로 가중치 업데이트 과정을 추상화하는 optimizer operations를 제공
- Adam과 같은 최적화 알고리즘을 쉽게 사용 가능
- 2-layer 네트워크 예제
- Optimizer 객체 구성
- Optimizer 객체를 구성하는 것은 모델에게 최적화할 파라미터를 지정하는 것과 같음
- 또한 학습률과 같은 하이퍼파라미터를 설정해야 함
- update
- 앞서 명시적으로 gradient descent를 수행하여 파라미터를 업데이트했던 것과 달리 optimizer.step()을 호출하면 설정된 최적화 알고리즘에 따라 모델의 파라미터가 자동적으로 업데이트됨
- Optimizer 객체 구성
Define new Modules
- Basics
- 일반적으로 파이토치를 사용할 때 전체 네트워크 모델을 nn module 클래스로 작성
- Module은 일종의 네트워크 레이어로 다른 모듈을 포함할 수 있으며 학습 가능한 가중치도 포함될 수 있음
- 2-layer 네트워크 예제
- 클래스 생성자에서 linear1과 linear2라는 두 개의 module objects가 선언되어 클래스 안에 저장됨
- forward pass에서는 정의된 모듈과 autograd 연산을 사용하여 네트워크 출력을 계산
DataLoader
- Basics
- 학습 시 미니배치를 가져오는 작업을 멀티스레딩으로 효율적으로 처리
- 데이터셋을 감싸는 일종의 추상화 객체를 제공
- 2-layer 네트워크 예제
- DataLoader 객체를 순회하면서 매 반복마다 데이터의 미니배치를 적절하게 반환
- 내부적으로 data shuffling과 multithreaded dataloading 같은 작업을 자동으로 관리
Pretrained Models
- torchvision을 통해 사전학습된 모델을 쉽게 사용 가능
Static vs Dynamic Graphs
- 텐서플로우는 하나의 고정된 그래프(static graph)를 구성하여 이를 반복적으로 재사용 하는 반면, 파이토치는 매번 forward pass 마다 새로운 그래프를 구성하는 동적 그래프(dynamic graph) 방식
- 이에 따라 다음과 같은 4가지 측면에서 각각의 장단점이 존재
Optimization
- TensorFlow (easy)
- 한 번 생성된 그래프가 학습 시 반복적으로 사용되므로, 연산을 합치거나 재배열하여 최적화 가능
- 초기 최적화 작업은 시간이 걸리지만, 최적화된 그래프를 여러 번 사용할 수 있어 효율적
- 예를 들어 Conv와 ReLU 연산을 합쳐서 실행 성능을 높이는 방법을 고려할 수 있음
- PyTorch (hard)
- 매번 그래프를 새로 구성해야 하므로 반복적으로 사용되는 최적화된 그래프가 없음
Serialization
- TensorFlow (easy)
- 그래프가 고정적이므로, 메모리에 있는 네트워크 구조를 파일 형태로 저장할 수 있음
- 이를 통해 원본 코드 없이도 그래프를 불러올 수 있으며 Python에서 학습한 모델을 C++ 환경에서 쉽게 사용 가능
- PyTorch (hard)
- 그래프 구성과 실행이 얽혀 있기 때문에, 모델을 재사용하려면 항상 원본 코드가 필요함. 이로 인해 그래프의 직렬화가 더 복잡
Conditional Operations (조건부 연산)
- TensorFlow (hard)
- 그래프를 미리 구성해야 하므로 모든 가능한 control flow를 미리 고려해야 함
- 이를 위해 tf.cond와 같은 특수한 TensorFlow 연산자를 사용하여 그래프 내에 조건부 연산을 명시적으로 정의해야 함
- PyTorch (easy)
- 파이썬의 일반적인 if문을 사용하여 조건부 연산을 쉽게 구현할 수 있음
- 매번 새로운 그래프를 생성하기 때문에 조건에 따라 적절한 연산을 수행하는 그래프를 쉽게 만들 수 있음
Loops (반복 연산)
- TensorFlow (hard)
- 앞선 조건부 연산과 마찬가지로 그래프를 미리 구성해야 그래프에 명시적으로 루프를 넣어줘야 함
- 이를 위해 tf.fold1과 같은 특수한 TensorFlow 연산자를 사용하여 루프를 구현
- PyTorch (easy)
- 마찬가지로 파이썬의 일반적인 for 루프를 사용하여 반복 연산을 쉽게 구현할 수 있음
- 데이터의 시퀀스 길이에 관계없이 적절한 루프를 통해 그래프를 생성할 수 있으며 이로 인해 코드 작성이 간편하고 명확
결론적으로 텐서플로우는 정적 그래프를 사용하기 때문에 그래프의 전체 흐름(조건부 연산, 반복문, 모든 데이터 구조 등)을 특수한 연산자를 통해 미리 정의해야 하고, 이로 인해 파이썬의 명령어들을 같이 활용할 여지가 별로 없음
Dynamic Graph Application
- 필요성
- 동적 그래프는 입력 데이터에 따라 computational graph가 동적으로 변해야 하는 상황에서 유용 (주로 RNN)
- 사례
- Image Captioning
- 이미지 캡셔닝 작업에서 생성하려는 캡션은 시퀀스의 형태를 가지는데, 이는 입력 데이터에 따라 달라질 수 있음. 문장의 길이에 따라 computational graph가 커지거나 작아지기 때문에 동적 그래프가 유용
- NLP
- 문장을 파싱할 때, 데이터에 따라 트리나 그래프 등 다양한 구조를 가질 수 있음. 이러한 유동적인 네트워크를 구성하려면, 파이토치를 사용하면 파이썬의 기본 control flow만으로도 충분히 구현 가능
- Visual Question Answering
- VQS(Visual Question Answering)를 다루는 Neuromodule 연구에서 예를 들어, "고양이의 색은?"이라는 질문을 던지면, 이 질문에 맞는 네트워크를 구성해 답을 도출. 질문에 따라 네트워크가 다르게 구성되기 때문에 동적 그래프가 유용
- Image Captioning
'CS231n' 카테고리의 다른 글
[CS231n] Lecture 10 | Recurrent Neural Networks (2) | 2024.09.05 |
---|---|
[CS231n] Lecture 9 | CNN Architectures (0) | 2024.08.26 |
[CS231n] Lecture 7 | Training Neural Networks II (0) | 2024.08.13 |
[CS231n] Lecture 6 | Training Neural Networks I (0) | 2024.08.08 |
[CS231n] Lecture 5 | Convolutional Neural Networks (0) | 2024.07.30 |