Curriculum

클래스 커리큘럼

온라인 클래스는 원리와 컨셉을 탐구하는 전반부와, 실험과 엔지니어링을 탐구하는 중반부, 아키텍쳐 디자인과 응용을 탐구하는 후반부로 구성되어 있습니다. 챕터 별 커리큘럼은 아래와 같습니다.

Ⅰ. 인지와 표상

딥러닝은 인간의 인지를 재현하고자 하는 분야입니다. 얼핏 막연하고 뜬구름 잡는 목표처럼 느껴지기도 하는데요. 인지의 진화적 기원을 따져 보며 우리가 풀고자 하는 문제를 구체적이고 정량적인 형태로 정의합니다. 매우 단순한 알고리즘에서 출발하여 병렬 분산적 연산의 필연성을 이해하고, 딥러닝의 형태적 조건을 생각해 봅니다.

  • Perception and Representation
  • Invariance, Symmetry and Imagehash Algorithm
  • Parallel Distributed Processing and a History of Deep Learning
  • Inductive Bias as a Structure of Cognition

Ⅱ. 텐서와 차원

딥러닝에서 쓰이는 자료구조는 Tensor가 유일합니다. Tensor는 사실상 다차원 배열, 즉 배열로 이루어진 배열인데요. 일반적인 프로그래밍에서 사용하는 배열보다 그 중첩의 정도가 높아 다루기 어렵기로 악명높습니다. 이는 딥러닝에 어느 정도 익숙해진 사람들에게도 헷갈릴 수 있는 부분인데요. 가령 viewreshape, contiguous, permute, transpose와 같은 함수들의 차이를 정확하게 판단하지 못하는 경우가 많습니다. 결과적으로 조용하고 잡아내기 어려운 버그를 만들어낼 가능성이 크기 때문에, Tensor의 논리적 구조와 조작법을 정확히 이해하고 넘어가야 할 필요가 있어요.

이런 복잡성에 효과적으로 대응하기 위해 우리는 가장 먼저 einops의 문법을 배웁니다. einops는 기호와 기호들의 배열을 이용해 선언적인 텐서 조작을 가능케 해 주는 라이브러리인데요. 여러 Architecture를 구현하는데 반드시 필요한 현대적인 도구입니다. 차원을 섞고, 쪼개고, 재배열하는 규칙을 정확히 이해하여 이후 마주하게 될 높은 차원의 Tensor를 자신있게 다룰 수 있는 기반을 마련하게 되어요.

  • Tensors in torch
  • Declarative Tensor Manipulation with einops

Ⅲ. 연산과 시각

인지를 구현하기 위해 필요한 연산은 무엇일까요? 우리는 딥러닝의 근본적인 가정과 디자인 원칙들을 탐구하며, 이를 반영한 알고리즘을 고안하게 됩니다. 구체적으로는 Convolution이라는 연산 구조를 유도하게 되는데요. 그 과정에서 연산 이면의 발상과 중요성을 이해할 수 있어요.

Tensor의 조작이 복잡했던 것과 마찬가지로 Tensor 간의 연산 또한 짚고 넘어가야 할 필요가 있습니다. TensorTensor의 곱셈에서 발생할 수 있는 모호함을 이해하며, 이를 해소하기 위해 einsum 연산을 도입하게 됩니다.

  • Memory Layouts of Image Tensors
  • Einstein Summation
  • Locality and Stationarity
  • Linearity and Convolution

Ⅳ. 자료와 학습

모두가 알다시피 딥러닝 시스템은 데이터를 흡수하여 더 정교해지기 마련입니다. 데이터를 이용한다는 개념은 일견 직관적이지만, 지난 수백년간 쌓아 올려온 귀납 추론과 통계의 영역에 발을 들이겠다는 말이기도 합니다. 그런 상황에서 가장 중요한 키워드는 일반화인데요. 딥러닝 시스템이 경험하지 못했던 데이터를 가지고도 유용한 판단을 내릴 수 있는 속성을 의미합니다. 그런 놀라운 일을 가능하게 만드는 정보의 원천이 무엇인지 이해하며, 일반화의 종류와 이를 판단할 수 있는 정량적인 방법들을 탐구합니다.

자연스럽게 우리는 더 많은 데이터를 다루게 되는데요. Huggingface 사의 datasets 라이브러리를 도입하여 다양한 데이터를 동일한 인터페이스로 제어하는 방법을 배우게 됩니다. 또한 하드웨어를 효과적으로 이용하기 위해서는 데이터를 한번에 묶어 처리하는 방법을 이해해야 하는데요. 그 일환으로 Batch 단위 연산을 구현하게 되어요.

  • Optimization and Training
  • Generalization and Learning from Experience
  • Huggingface datasets
  • Batching

Ⅴ. 비교와 대조

첫 단원에서부터 논해 왔던 Contrastive Learning을 본격적으로 완성하는 단원입니다. Contrastive LearningSimCLR라는 프레임워크를 골라 구현할텐데요. 컨셉은 간단하지만 정확하게 구현하려면 첫 난관이 될 수도 있는 부분입니다.

때문에 우리는 이를 여러 단계로 나누고, 각 단계 별 테스트 코드를 작성하며 천천히 진행하게 됩니다. 두 가지 버전의 코드를 작성하게 되는데요. 먼저 직관적인 버전의 코드를 작성하여 이를 테스트 코드로서 사용하고, 성능을 고려한 조금 더 난해한 버전의 코드를 검증하는데 사용합니다. 전형적인 딥러닝 코드의 구성 과정을 경험할 수 있는 시간이에요.

  • Augmentation with albumentations
  • Contrastive Learning
  • Cross Entropy and Cosinte Similarity
  • SimCLR and NT-XEnt Loss
  • Vectorization

Ⅵ. 실험과 기록

더 효과적인 Training을 도모하는 단원입니다. 소위 이야기하는 Gradient Descent라는 방법론을 처음으로 배우게 되는데요. Gradient Descent는 사실 어디서나 쉽게 배울 수 있는 개념이지만, Gradient라는 양에 대한 정확한 이해는 이루어지지 않는 것이 현실이기도 합니다. Gradient가 어떤 의미를 가지는 양이며, Training 과정에서 어떤 역할을 하는지 완전히 이해할 수 있는 시간입니다.

이후로는 torch의 추상화를 이용해 Training 파이프라인을 구축하게 되는데요. 이런 과정에서 발생할 수 있는 여러 문제들을 짚어내며 대응책을 고안해 봅니다. Gradient Descent를 추상화하는 optimizerscheduler를 도입하며 전형적인 torch 파이프라인을 작성하게 됩니다. 이러한 파이프라인의 중추가 되는 nn.Module 클래스의 내부 구현을 살펴보며 nn.Module이 어떤 방식으로 Parameter를 잡아낼 수 있는지, 그 원리를 이해하게 되어요.

딥러닝은 이론의 학문이 아닌 실험의 학문입니다. 때문에 실험의 변인과 결과를 철저히 관리해야 할 필요가 있는데요. 우리는 모든 Training 과정을 투명하게 관찰하고, 재현 가능한 형태로 구현하게 됩니다. 실험의 여러 Configurationomegaconf 라이브러리의 문법을 따라 yaml 파일의 형태로 기록하며, 실험 결과는 wandb 플랫폼에 기록하여 관찰하게 되어요.

  • Configuration Management with omegaconf
  • Experiment Tracking with wandb
  • Precise Definition of the Gradients
  • Scheduling Optimization Process
  • Clipping Gradients
  • Internal Structure of nn.Module
  • Continuous Integration

Ⅶ. 표준과 가속

지난 단원에서 만들었던 파이프라인은 딥러닝에서 항상 반복되는 경향이 있습니다. lightning 프레임워크를 사용하며 그러한 보일러 플레이트 코드를 한 단계 더 추상화하는 방법을 익혀요. lightning 사이드에서 제공하는 다양한 부가 기능들을 적용하며 보다 Feature-Rich한 파이프라인을 만들게 됩니다.

특히 가속 장치를 이용하는 법을 익히게 되는데요. 클라우드 상에서 고성능 GPU (A100)을 사용해 Training을 진행해 봅니다. 매끄러운 적용을 위해 파이프라인을 Containerize하여 진행하게 되어요. 그러한 과정에서 발생하는 병목 현상을 탐지하고, 이를 개선하기 위한 옵션들을 적용해 봅니다.

이렇게 파이프라인의 기능이 점점 늘어나며 그 Configuration 또한 복잡해지게 됩니다. 실험의 모든 변인들을 정밀하게 관리하는 것은 까다롭고, 사실은 포기하고 타협하게 되는 경우가 정말 많은데요. 우리는 타협하지 않고 한 발짝 더 나아갑니다. 이렇게 복잡한 Configuration Management 문제에 대응하기 위한 Facebookhydra라는 프레임워크를 사용하게 되어요. 파이프라인을 구성하는 다양한 부분들의 설정을 따로 만들어 조합하는 방식으로 대응합니다.

지금 시점에선 hydra를 이용하는 것이 가장 트렌디한 방식이나, 사실 이 마저도 번거롭고 최적의 방식은 아닐 수 있는데요. 그렇게 느껴지는 수강생들을 위해 선택적으로 hydra-zen이라는 비주류 도구를 도입해 Configuration Management 문제를 완전히 자동화하여 해결하는 방법까지 다루게 됩니다.

  • Reducing Boilerplates with lightning
  • Trainer and Callback
  • GPU Acceleration
  • Profiling torch Pipeline
  • Docker and Containerization
  • Training on GPU Cloud
  • Advanced Configuration Management with hydra
  • Automating Configuration Management with hydra-zen

Ⅷ. 조합과 추상

여태껏 다루어 왔던 연산 구조는 딥러닝이라 부르기엔 얕은 구조였습니다. 이런 구조를 확장해야 할 필요성에 대해 논하며, 연산 구조를 중첩해 나가는 방법을 탐구하게 되는데요. 이러한 과정은 녹록지 않으며 많은 실패로 이어지게 됩니다. 그러한 실패의 원인을 분석하며 해결책을 고안해봅니다. 결국 그러한 해결책들이 사실은 현대적 딥러닝 연산 구조의 근본을 이루는 요소들이라는 사실을 이해하게 되어요.

그렇게 연산 구조를 중첩해 나가는 과정은 사실 딥러닝에선 전형적인 방식이기에 추상화를 할 여지가 많습니다. 그러나 뚜렷한 정석이 있는건 아닌데요. EinMix라는 실험적인 구현체를 적용해 봅니다. 앞 단원들에서 다루었던 einopseinsum 등의 연산과 유사한 문법을 가지고 있어요. EinMix를 활용하여 Mixer라는 첨단 아키텍처를 손쉽게, 까다로운 Tensor 조작 없이도 구현해 나가는 과정을 경험하게 됩니다.

  • Stacking Modules
  • Advanced einops (EinMix)
  • Superposition of Representations
  • Typing Tensors with jaxtyping and beartype
  • Normalization Techniques
  • Global Communication and Mixers

Ⅸ.주의와 집중

AttentionTransformer를 탐구하는 시간입니다. 현 시점의 사실상 표준 아키텍처인데요. Transformer를 바닥부터 구현해보며 논리와 정보의 Routing을 이해해 봅니다. 사실 우리가 Transformer를 바닥부터 구현해야 할 일은 잘 없습니다만, Transformer의 중추라 할 수 있는 Attention으로 정보를 다루는 방식에는 익숙해져야 할 필요가 있습니다. Transformer의 시대가 저문다 해도 Attention은 존속할 것이기 때문이죠.

앞 단원에서 Tensor의 조작과 연산, Vectorization에 익숙해졌다면 Attention의 구현은 쉬운데요. 논리를 몇 단계로 나누어 Vectorization을 차근히 해 나가며 가장 깔끔한 Attention, 정확히는 Multi Head Attention의 구현체를 만들게 됩니다.

다만 Transformer는 위치 정보를 인식하지 못한다는 치명적인 단점이 있는데요. Transformer에 위치 정보를 주입하는 두 가지 방법에 대해 탐구해 봅니다. Swin, Focal 등 연산 구조를 뜯어 고치는 방식과 Position Encoding 등을 통해 직접적으로 알려주는 방식이 있죠. 또한 Transformer가 처음 제안된 이래 많은 구조적 개선이 있었는데요. 그 중 Parallel Layer와 같은 핵심적인 개선을 직접 구현해보며 성능 개선을 관찰해봅니다.

  • Attention Mechanism
  • Vectorization of Multi-Head Attention
  • Transformers
  • Specializaed Vision Transformers (Swin, Focal)
  • Position Embeddings
  • Relative Position Encodings
  • Parallel Layers and Modern Transformers

Ⅹ. 응용과 확장

Multi-GPU 환경에서 대규모 데이터 셋을 활용한 Training을 수행합니다. 마지막으로 만들었던 최적의 아키텍처를 선택하여 학습시키게 되는데요. 과연 이렇게 만든 시스템이 시각 인지를 해결할 수 있을까요?

  • Parallelism
  • Multi-GPU Training
  • Pulling Checkpoints from Model Registry
  • Inference