[Pytorch 다시보기] - Pytorch Intro! 파이토치를 다시보자! 토치의 텐서에 대해서.

What is Pytorch and how does it differ from other deep learning frameworks like Tensorflow? - Pytorch와 Tensorflow는 무엇이 다를까?

 

 

Pytorch는 페이스북 AI 연구소에서 만들어진 오픈소스 머신러닝 라이브러리 입니다. Pytorch는 동적 계산 그래프(Dynamic Computation Graphs)의 강점을 기반으로 구축되었습니다. Pytorch의 기능과 편리한 Workflow 덕분에 연구원과 개발자 모두에게 인기가 높아졌습니다.

Dynamic Computation

정적 계산 그래프를 활용하는 Tensorflow와 달리 Pytorch는 동적 계산 기능을 제공합니다.

이를 통해 더 복잡한 아키텍처를 처리합니다. 또한 반복적이고 쉬운 Workflow를 사용할 수 있죠.

게다가, Pytorch의 Pythonic한 구성 요소와 자연스럽게 결합되어 더 직관적인 개발 경험을 제공합니다.

 

 

이미 Hugging face 혹은 Github 만 보더라도 Tensorflow보다 Pytorch로 모델링한 코드가 훨씬 많습니다.

 

 

Ease of Use

Pytorch는 Python과 매우 비슷한 인터페이스를 가지고 있고, 이는 기존에 파이썬을 다룰 수 있던 사람들에게 매우 편리하게 느껴집니다.

 

또한 GPU의 계산 능력을 활용하여 훈련 시간을 크게 단축하는 데 용이합니다. 그리고 원활한 다중 GPU 활용이 가능합니다. 그리고 Loop 및 조건문과 같은 Python 제어 구조를 통합하여 사용하기에 개발작 모델 동작을 정의하는 데 더 많은 유연성을 제공합니다.

 

Explain the concept of Tensors in PyTorch

PyTorch에서 텐서는 기본 구성 요소 역할을 하며 CPU, GPU, TPU와 같은 다양한 기기에서 효율적인 수치 계산을 가능하게 합니다.

개념적으로는 numpy.arrays와 유사하지만 하드웨어 가속의 이점이 있고, 딥러닝과 과학적 컴퓨팅을 위한 다양한 고급 기능을 제공합니다.

핵심 기능 - Core Features

자동 미분(Automatic Differentiation): 텐서는 수행된 연산을 추적하여 신경망의 **경사 하강(Greadient Descent)**과 같은 작업에 대한 즉각적인 미분을 허용합니다.

계산 그래프(Computational Graphs): 텐서에 대한 연산은 계산 그래프를 구성하여 데이터 흐름과 관련 경사를 추적할 수 있습니다.

장치 독립적(Device Agnosticism): 텐서는 최적의 계산을 위해 사용 가능한 하드웨어 리소스 간에 유연하게 이동할 수 있습니다.

유연한 메모리 관리(Flexible Memory Management): PyTorch는 메모리를 동적으로 관리하고 텐서는 계산 그래프를 인식하여 가비지 수집을 보다 효율적으로 만듭니다.

Unique Tensors

Float16, Float32, Float64: 텐서는 다양한 수치적 정밀도를 지원하며, 기본값은 32비트 부동 소수점입니다.

희소 텐서(Sparse Tensors): 이는 밀집 텐서와 매우 유사하지만 0이 많은 작업에 최적화되어 메모리와 계산을 모두 절약합니다.

양자화된 텐서(Quantized Tensors): 더 빠른 작업과 더 낮은 메모리 풋프린트(foot print)의 이점을 얻기 위해 정밀도를 낮춰야 하는 작업을 위해 특별히 설계되었습니다.

요소별 연산: PyTorch는 병렬 처리를 위해 설계되었으며 다양한 방식으로 적용할 수 있는 풍부한 요소별 연산 세트를 제공합니다.

사용 예시

Pytorch의 최신 버전에서는 자동 미분 기능이 탑재되어 있으며, 직접 텐서를 사용하는 것으로 변수 기능이 대체됩니다. requires_grad flag를 설정함으로써 어떤 텐서들이 기울기를 추적할지 지정할 수 있습니다.

 

torch.tensor → Pytorch의 Tensor를 생성합니다.

 

torch.tensor(3., requires_grad=True) 는 3.0 값을 가지는 새로운 텐서를 생성합니다. requires_grad=True 는 이후에 x와 y에 대해 미분(Gradient)을 계산하고자 하기 때문입니다.


이 옵션이 설정되면, PyTorch는 해당 텐서와 관련된 모든 연산을 기록하고, 연산 그래프(Computational Graph)를 생성하여, 이후 backward() 호출 시 기울기(Gradient)를 자동으로 계산합니다.

 

z.backward()는 z에 대한 역전파(Backpropagation)를 수행합니다. 역전파는 목표 변수(z)로부터 출발하여, 그 값에 영향을 미친 모든 텐서(x, y)의 기울기를 계산하는 과정입니다.

 

import torch

# Define tensors
x = torch.tensor(3., requires_grad=True)
y = torch.tensor(4., requires_grad=True)
z = 2*x*y + 3

# Visualize the graph
z.backward()
print(x.grad)
print(y.grad)


tensor(8.)
tensor(6.)

 

 

Summary

  • requires_grad=True 옵션을 통해, Tensor가 계산 그래프에서 미분 대상이 됨을 설정합니다.
  • 연산(2*x*y + 3)이 이루어지면, PyTorch는 이 계산 과정을 그래프 형태로 기록합니다.
  • z.backward()를 호출하면, 해당 결과 변수인 z에 대한 모든 연산 그래프를 통해 기울기를 계산하고, x.grad와 y.grad에 각 미분값을 저장합니다.
  • 이 기울기들은 이후 모델 학습 과정에서 파라미터 업데이트 등에 사용될 수 있습니다.
반응형