본문 바로가기
Python/Deep Learning

[PyTorch] 텐서 연산

by 좌우지간에 2025. 2. 6.

PyTorch 텐서 연산 이해하기: 학습 정리 및 예제

최근 PyTorch를 이용하여 텐서(tensor) 생성 및 연산에 대해 학습하면서 다양한 예제를 직접 실행해 보았습니다. 이번 포스팅에서는 스칼라, 벡터, 행렬 곱셈, 그리고 다차원 텐서 연산의 기본 개념과 함께 실습 예제를 정리하여 소개합니다.


1. 텐서 기본 개념

  • 스칼라 텐서
    하나의 값으로 이루어진 텐서입니다. 예를 들어, 아래와 같이 생성할 수 있습니다.
  • scalar = torch.tensor(44)
  • 벡터(1차원 텐서)
    여러 개의 숫자로 이루어진 1차원 텐서로, 다음과 같이 생성할 수 있습니다.
  • vector = torch.tensor([1, 2, 3, 4])

2. 행렬(2차원 텐서) 및 행렬 곱셈

행렬 곱셈은 두 행렬의 연산을 수행할 때, 앞 행렬의 열 개수와 뒷 행렬의 행 개수가 동일해야 합니다.

예제:

m1 = torch.tensor([[2, 3, 4], [4, 5, 6]])    # 2×3 행렬
m2 = torch.tensor([[2, 3], [4, 5], [6, 7]])  # 3×2 행렬

# 행렬 곱셈 (2x3 * 3x2 = 2x2)
print(f'2x3 * 3x2 = {m1 @ m2}')
print(f'{(m1 @ m2).shape}차원')

위 연산은 m1 @ m2를 실행하여 2×2 행렬을 결과로 출력합니다.

 

만약 두 행렬의 크기가 맞지 않는 경우(예: 2×3과 2×3), 에러가 발생하게 됩니다. 이를 해결하기 위해 전치(transpose)를 사용하여 차원을 맞추어야 합니다.

# 3x2 * 3x2>>에러발생
m3 = torch.tensor([[2, 3], [4, 5], [6, 7]])
print(f'2x3 * 2x3 = {m3@m3}')


--------------------------------------------
m3 = torch.tensor([[2, 3], [4, 5], [6, 7]])
m4 = m3.T #전치해서 3x2로 만들어줌(행과 열을 바꿔줌)
print(m3.shape)
print(m4.shape)
# 3x2 * 2x3 = 3x3
print(f'3x2 * 2x3 = {m3@m4}')
print(f'{(m3@m4).shape}차원')

3. 벡터 연산의 주의사항

벡터 간의 덧셈이나 뺄셈은 두 벡터의 길이가 동일할 때만 가능합니다.
길이가 다른 벡터 간 연산을 시도하면 에러가 발생합니다.

예제:

v1 = torch.tensor([1, 2, 3])
v3 = torch.tensor([6, 7, 8])
print(f'v1 + v3 = {v1 + v3}')

길이가 다른 벡터 예시:

v2 = torch.tensor([4, 5])
# 다음 연산은 오류 발생: 서로 길이가 다르기 때문
print(f'v1 + v2 = {v1 + v2}')

4. 다차원 텐서(3D 텐서) 곱셈

3차원 이상의 텐서의 행렬 곱셈은 마지막 두 차원에 대해 적용되며, 그 앞의 차원은 브로드캐스팅 규칙에 따라 처리됩니다.

예제:

import torch

tensor_3d_c = torch.randn(3, 4, 2)
tensor_3d_d = torch.randn(3, 2, 5)

# 각 "높이"별로 (4x2) * (2x5) 행렬 곱셈을 수행하여 최종 결과는 3x4x5 텐서가 됩니다.
result = tensor_3d_c @ tensor_3d_d
print(f'3x4x2 * 3x2x5 = {result}')
print(f'{result.shape}차원')

🔍 브로드캐스팅 적용 방식

  • tensor_3d_c의 크기: (3, 4, 2)
  • tensor_3d_d의 크기: (3, 2, 5)
  • 연산 결과(result): (3, 4, 5)

이 연산에서 PyTorch는 마지막 두 차원(4×2와 2×5) 을 기준으로 행렬 곱셈을 수행하고, 첫 번째 차원인 3은 그대로 유지됩니다. 즉, 각 배치(3개)에 대해 독립적으로 행렬 곱셈이 수행됩니다.

만약 두 텐서가 배치 크기가 다르면 브로드캐스팅 규칙에 따라 PyTorch가 자동으로 크기를 맞춰 연산을 수행할 수도 있습니다.

예시: 만약 tensor_3d_c가 (1, 4, 2), tensor_3d_d가 (3, 2, 5)라면, PyTorch는 tensor_3d_c를 (3, 4, 2)로 브로드캐스트하여 연산을 수행합니다.