딥러닝/파이토치

파이토치 04. 동적 계산 그래프(Dynamic Computational Graph)

jsmak 2025. 3. 30. 17:01

PyTorch의 동적 계산 그래프(Dynamic Computational Graph)는 연산이 수행될 때마다 그래프를 즉시 생성하고 바로 계산하는 방식입니다. 이를 Define-by-Run이라고도 합니다.

 

동적그래프의 개념

출처 : http://www.cs.cornell.edu/courses/cs5740/2017sp/lectures/04-nn-compgraph.pdf

 

동적그래프를 설명해놓은 내용인데 한글로 요약했습니다.

전체 내용은 원본 참고 바랍니다.

 

1. 계산 그래프(Computation Graph)에 대한 기본 개념과 구성 원리

 

노드 (Node) : 스칼라, 벡터, 행렬, 텐서 등 값 자체

엣지 (Edge) : 함수의 입력(인자), 데이터 의존성 

함수(연산) : 각 노드는 함수 값을 계산하며, 자신의 입력들(엣지)을 기반으로 값을 계산하고, 필요시 미분값도 계산 가능

 

수식 : y = xᵀAx + b·x + c

이 식은 여러 개의 기본 연산 (행렬 곱, 내적, 덧셈 등) 으로 분해됩니다.

각각의 연산이 노드로 표현되고, 입력과 출력을 연결하는 엣지로 그래프가 구성됩니다.

 

2. 알고리즘 (Algorithms)
   1) 그래프 구성 (Graph construction)

   2) 순전파 (Forward propagation)
      그래프를 위상 정렬(topological order)한 순서로 노드를 순회하며, 각 노드의 입력값들을 이용해 해당 노드의 값을 계산
      예측 값을 만들거나, 목표 출력(target output)과 비교해 오차(error)를 계산함

   3) 역전파 (Backward propagation)
      최종 목표 노드(goal node)부터 시작해 그래프를 역위상 정렬(reverse topological order)로 순회
      각 노드에 대해, 출력 값의 손실을 입력값들의 미분을 역으로 계산함
      즉, 출력값이 입력에 조금이라도 변화가 생겼을 때 얼마나 영향 받는지를 구함

 

3. The MLP (다층 퍼셉트론)


1) 구성요소
    x : 입력 벡터 
    W, b : 은닉층의 가중치와 편향
    h : 은닉층 출력
    V, a : 출력층의 가중치와 편향
    y : 최종 출력

2) 은닉층 계산
   h=tanh(Wx+b)
   → 입력 x를 가중치 행렬 W와 곱하고 편향 b를 더한 뒤, 활성화 함수인 tanh를 적용

3) 출력층 계산
   y=Vh+a
   → 은닉층 출력 h에 출력 가중치 V를 곱하고, 편향 a를 더해 최종 출력 y 생성

 

4. 두 가지 소프트웨어 모델 (Two Software Models)
1) 정적 선언 (Static Declaration)
   1단계: 아키텍처(모델 구조)를 정의
          → 때때로 루프, 조건문 같은 제한된 흐름 제어를 포함함
   2단계: 해당 아키텍처에 데이터를 넣어 학습 또는 예측 수행

2) 동적 선언 (Dynamic Declaration)
   연산이 수행될 때 자동으로 그래프가 생성됨
   → operator overloading 등을 통해 실행과 동시에 그래프 구성

 

5. 계층적 구조 (Hierarchical Structure)
그림에 대한 ChatGTP의 해석입니다.
자연어는 단순한 시퀀스가 아닌 트리 형태의 계층적 구조를 가지고 있고, 모델도 이를 방영할 수 있어야합니다.
이를 위해 동적 계산 그래프가 적합하며, 구조에 따라 유연하게 구성할 수 있습니다.

 

단어(Words) → 구(Phrase) → 문장(Sentence) → 문단(Document)

 

 

6. 정적 선언 (Static Declaration)
1) 장점 (Pros)
   오프라인 최적화 및 스케줄링 가능, 실행 전에 전체 그래프 구조가 정해지므로 최적화가 쉬움
   연산 종류에 제한이 있기 때문에 하드웨어 지원이 더 우수함 (특히 GPU/TPU 등)

2) 단점 (Cons)
   구조화된 데이터 처리에 불편함
   예: 시퀀스, 가변 길이 입력 등 단순하지 않은 구조의 데이터를 다루기 어려움
   실질적으로 새로운 프로그래밍 언어를 배워야 함
   즉, “계산 그래프 언어”로 프로그램을 작성해야 함

예) Torch, Theano, TensorFlow (v1.x)

 

7. 동적 선언 (Dynamic Declaration)
1) 장점 (Pros)
   라이브러리가 사용자 친화적이다. 사용자가 기존에 익숙한 방식으로 프로그래밍 가능

   순전파 계산을 자신이 좋아하는 프로그래밍 언어로 작성할 수 있음
   예: 파이썬의 반복문, 조건문, 알고리즘 등을 그대로 활용 가능

   그래프 구성과 계산을 동시에 수행할 수 있음
   코드가 실행되는 흐름대로 그래프가 생성됨 (define-by-run)

2) 단점 (Cons)
   그래프를 미리 알 수 없기 때문에 그래프 최적화 부족함 (사전 최적화 어려움)

   정적인 연산만 수행하는 경우, 오히려 불필요한 오버헤드가 생길 수 있음
   즉, 정적 구조에는 효율이 떨어질 수 있음

예) Chainer, DyNet, 대부분의 자동 미분(autodiff) 라이브러리, PyTorch

 

8. 동적 구조? (Dynamic Structure?)
언어에는 계층적 구조(hierarchical structure)가 존재한다
  . 우리는 신경망이 그 계층 구조를 반영하도록 만들고 싶을 수 있다
  . 계층적 구조는 당신이 좋아하는 프로그래밍 언어에서의 전통적인 흐름 제어 메커니즘으로 가장 쉽게 처리할 수 있다.

조합적 알고리즘 (combinatorial algorithms, 예: 동적 프로그래밍)
  . 독립성을 활용하면 거대한 연산 공간에 대해 효율적으로 계산할 수 있다.

 

다음은 파이토치의 동적 계산 그래프에 대한 설명을 살펴보겠습니다.

원본은 아래 사이트를 참고하시기 바랍니다.

동적 계산 그래프의 일부 설명을 번역하였습니다.

 

출처 : https://pypi.org/project/torch/ 

 

torch

Tensors and Dynamic neural networks in Python with strong GPU acceleration

pypi.org

 

동적 신경망: 테이프 기반 자동 그래디언트

PyTorch는 신경망을 구축하는 독특한 방식을 가지고 있습니다.
바로 테이프 레코더를 사용하고 재생하는 방식입니다.
TensorFlow, Theano, Caffe, CNTK와 같은 대부분의 프레임워크는 세상을 정적으로 봅니다.
즉, 신경망을 한 번 구성하면 그 구조를 계속해서 재사용해야 하며,
네트워크의 동작 방식을 바꾸려면 처음부터 다시 시작해야 합니다.

PyTorch는 역방향 자동 미분(reverse-mode auto-differentiation)이라는 기술을 사용합니다.
이를 통해 지연이나 오버헤드 없이 네트워크의 동작 방식을 임의로 변경할 수 있습니다.

이러한 접근은 여러 연구 논문과 torch-autograd, autograd, Chainer 등 현재 및 과거의 작업들에서 영감을 받았습니다.
이 기술은 PyTorch만의 독점 기술은 아니지만, 현존하는 가장 빠른 구현 중 하나입니다.
당신이 미친(?) 연구를 한다면, PyTorch는 최고의 속도와 유연성을 제공해줄 것입니다.

https://pypi-camo.freetls.fastly.net/360dc3e00cca046f73204c87f117feefe993580f/68747470733a2f2f6769746875622e636f6d2f7079746f7263682f7079746f7263682f7261772f6d61696e2f646f63732f736f757263652f5f7374617469632f696d672f64796e616d69635f67726170682e676966

* 테이프 기반 자동 미분 : 연산을 수행할 때마다 기록(테이프처럼)하고, 역전파 시 이를 재생하여 그래디언트 계산

 

 

마지막으로 참조 사이트

https://towardsdatascience.com/computational-graphs-in-pytorch-and-tensorflow-c25cc40bdcd1/ 

 

Computational graphs in PyTorch and TensorFlow | Towards Data Science

In this article, I explain about static vs dynamic computational graphs and how to construct them in PyTorch and TensorFlow.

towardsdatascience.com

Tensorflow 1.0은 정적 그래프만 지원했지만 Tensorflow 2.0은 동적그래프를 지원합니다.

위 사이트에서 Tensorflow의  동작도 확인 할 수 있습니다.

https://towardsdatascience.com/wp-content/uploads/2021/01/04UHwQnsmUjyD7VtW.gif