딥러닝 프레임워크는 연구자나 엔지니어가 딥러닝 모델을 설계하고 학습시키기 위해 사용하는 소프트웨어 패키지
계산 그래프(computational graph)는 수학 연산을 노드와 엣지로 시각화하여 연산 과정을 트래킹하는 구조

문제점

Numpy
grad_b , grad_z 등 직접 계산) PyTorch
variable 을 사용해 requires_grad = True 설정만 해주면 자동으로 계산 그래프를 만들고, backward() 한 줄로 그래디언트를 자동 계산해줌 페이스북의 AI 연구소(FAIR)에서 개발한 딥러닝 프레임워크
특징
Tensor는 벡터(vector)나 행렬(matrix)을 일반화한 다차원 배열
왜 텐서를 사용할까 ?
- 딥 러닝 모델의 입력 데이터가 대부분 다차원이다 !
- 이미지 데이터 (batch, channel, height, width) = 4D 텐서
- 자연어 처리 (batch, sequence_length, embedding_dim) = 3D 텐서
→ PyTorch는 이런 데이터를 통일되게 처리하기 위해서 모든 데이터를 텐서로 표현한다.
차원에 따라 다음처럼 분류가 가능하다
PyTorch에서는 torch.Tensor 가 기본 데이터 구조임
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)
shape = (2, 3)
torch.rand(shape) # 0~1 사이의 랜덤 값
torch.ones(shape) # 모두 1
torch.zeros(shape) # 모두 0
tensor.shape : 텐서의 차원 정보 tensor.dtype : 데이터 타입 (예 : float32 , int64 ) tensor.device : CPU에 있는지, GPU에 있는지 print(f"Shape: {x_data.shape}, Data type: {x_data.dtype}, Device: {x_data.device}")
torch.matmul() x = torch.tensor([[1, 2], [3, 4]], dtype=torch.float32)
y = torch.tensor([[5, 6], [7, 8]], dtype=torch.float32)
z = x + y # 원소별 덧셈
matmul_result = x @ y # 행렬 곱
Autograd란 ?
requires_grad = True 설정시, PyTorch가 계산 그래프를 자동으로 생성하고 미분(gradient)를 자동 계산해준다. 
x.grad : out 을 x 에 대해 미분한 결과 backward() 호출 시 역전파 수행 추론 시 (모델 예측만 할 때)
- 학습(training) : 정답이 있는 데이터(label)로 모델을 학습시키는 과정
- 추론(inference) : 학습이 끝난 모델을 가지고 예측만 하는 과정
→ 추론을 할 때는 오직 forward 연산만 수행하고, 역전파는 하지 않기 때문에 gradient 계산이 필요 없다 !
학습이 아니라 추론(inference)만 할 경우 torch.no_grad() 로 감싸면 성능과 메모리 절약 가능

requires_grad = True 를 사용하지 않아도 되고, 계산 그래프도 만들지 않아서 훨씬 빠름