in-place 방식의 연산의 특징

  • in-place 방식은 메모리를 절약하며 Tensor의 값을 업데이트할 수 있는 연산
  • 추가적인 메모리 할당이 필요 없기 때문에 메모리 사용량을 줄일 수 있다는 장점이 있지만, autograd와의 호환성 측면에서 문제를 일으킬 수 있음

(예시) a.add_(b) f.sub_(e)




Tensor 산술 연산

더하기/빼기 연산

  • 크기가 동일한 두 Tensor의 더하기(빼기) 연산은 각 요소들을 더한(뺀) 값으로 출력
  • 크기가 다른 두 Tensor를 계산할 땐 크기가 더 큰 Tensor로 크기를 확장하여 요소들을 연산
# Tensor 더하기 연산
torch.add(a, b)

# in-place 방식의 더하기 연산
a.add_(b)

# Tensor 빼기 연산
torch.sub(f, e)

# in-place 방식의 빼기 연산
f.sub_(e)

스칼라곱 연산

  • 스칼라곱은 Tensor의 각 요소에 동일한 스칼라 값을 곱하는 연산을 의미
# 스칼라 i와 Tensor j를 스칼라곱
torch.mul(i, j)

요소별 곱셈(Hadamard product, Element wise product)/나눗셈 연산

  • 크기가 동일한 두 Tensor의 요소별 곱셈/나눗셈 연산은 각 요소들을 곱한(나눈) 값으로 출력
  • 크기가 다른 두 Tensor를 연산할 땐 크기가 더 큰 Tensor로 크기를 확장하여 요소들을 연산
# Tensor 요소별 곱셈
torch.mul(k, l)

# in-place 방식의 요소별 곱셈
k.mul_(l)

# Tensor 요소별 나눗셈
torch.div(o, p)

# in-place 방식의 요소별 나눗셈
o.div_(p)

비교 연산

  • Tensor의 요소들이 비교
  • 결과는 Boolean Tensor로 출력
# 요소들이 같은지 비교
torch.eq(v, w) #equal

# 요소들이 다른지 비교
torch.ne(v, w) #not equal

# v의 요소들이 w의 대응요소들보다 큰지 비교
torch.gt(v, w) #greater than

# v의 요소들이 w의 대응요소들보다 크거나 같은지 비교
torch.ge(v, w) #greater than or equal

# v의 요소들이 w의 대응요소들보다 작은지 비교
torch.lt(v, w) #less than

# v의 요소들이 w의 대응요소들보다 작거나 같은지 비교
torch.le(v, w) #less than or equal




Tensor 논리 연산

  • 논리곱(AND), 논리합(OR), 배타적 논리합(XOR)
# 논리곱(AND) 연산
# 입력된 신호가 모두 참일 때, 출력이 참이 되는 연산
torch.logical_and(x, y)

# 논리합(OR) 연산
# 입력된 신호 중 하나라도 참일 때, 출력이 참이 되는 연산
torch.logical_or(x, y)

# 배타적 논리합(XOR) 연산
# 입력된 신호가 하나만 참일 때, 출력이 참이 되는 연산
torch.logical_xor(x, y)




Tensor의 노름(Norm)

Ln 노름(Norm)

  • 1-D Tensor의 노름은 Vector가 원점에서 얼마나 떨어져 있는지를 의미함
  • 1-D Tensor의 노름은 Vector의 길이를 측정하는 방법으로 사용됨
  • 1-D Tensor의 노름에는 L1 노름, L2 노름, L∞ 노름 등 여러가지 유형의 노름이 존재함
  • 참고 자료

노름, 놈, 벡터의 길이, 벡터의 크기

Lp 노름에 대한 수학적 정의 - The p-norm in finite dimensions


L1 노름

  • L1 노름은 1-D Tensor에 포함된 요소의 절대값의 합으로 정의할 수 있음
  • L1 노름은 맨해튼 노름이라고도 불리며, 일차원 텐서에 포함된 요소의 절대값의 합으로 정의 가능
  • torch.norm(a, p=1)

L2 노름

  • L2 노름은 일차원 텐서에 포함된 요소의 제곱합의 제곱근으로 정의할 수 있음
  • 유클리드 공간에서 두 점 사이의 최단 거리를 측정하는 방법과 같다고 해서 유클리드 노름이라고 부름
  • torch.norm(a, p=2)

L∞ 노름

  • L∞ 노름은 일차원 텐서에 포함된 요소의 절대값 중 최대값으로 정의
  • torch.norm(a, p = float(‘inf’))




유사도 (Similarity)

유사도

  • 두 1-D Tensor(=Vector)가 얼마나 유사한지에 대한 측정값을 의미
  • 군집화(Clustering) 알고리즘에서 데이터들이 얼마나 유사한지를 판단하는
    중요한 기준으로 사용됨

맨해튼 유사도

  • 두 1-D Tensor 사이의 맨해튼 거리를 역수로 변환하여 계산한 값
  • 두 1-D Tensor 사이의 맨해튼 거리의 값이 작아질 수록 맨해튼 유사도의 값은 커짐
  • 맨해튼 유사도의 값은 1에 가까울수록 두 Tensor가 유사하다고 판단함
  • 맨해튼 거리 manhattan_distance = torch.norm(b – c, p = 1)
  • 맨해튼 유사도 1 / (1 + manhattan_distance)

유클리드 유사도

  • 두 1-D Tensor 사이의 유클리드 거리를 역수로 변환하여 계산한 값
  • 두 1-D Tensor 사이의 유클리드 거리의 값이 작아질수록 유클리드 유사도의 값은 커짐
  • 유클리드 유사도의 값은 1에 가까울수록 두 Tensor가 유사하다고 판단함
  • 유클리드 거리 euclidean_distance = torch.norm(b – c, p = 2)
  • 유클리드 유사도 1 / (1 + euclidean_distance)

코사인 유사도

  • 두 1-D Tensor 사이의 각도를 측정하여 계산한 값

  • 내적의 정규화?

  • 각도를 측정하여 두 Tensor의 유사도를 판단하기 때문에 코사인 유사도의 값이 1에 가까울 수록 두 Tensor가 유사하다고 판단함

    → 코사인 함수에서 라디안 값이 0일 때 함수의 값이 1이 되기 때문에 코사인 유사도의 값이 1에 가까울수록 두 텐서가 유사하다고 판단

  • 1-D Tensor(=Vector)의 내적(dot product 또는 inner product)을 활용하여 두 1-D Tensor 사이의 각도를 측정

  • cosine_similarity = torch.dot(b, c) / (torch.norm(b, p = 2) * (torch.norm(c, p = 2))




내적 (Inner Product)

  • 도트곱(Dot Product), 스칼라적(Scalar Product)로도 불림
  • 두 개의 벡터를 입력으로 취하고, 스칼라 값(길이, 거리 등의 단일 숫자)을 결과로 출력하는 연산
  • 두 벡터 간의 기하학적인 비교(특징, 유사성)에 대한 단일값으로 사용됨
  • 일반적으로 벡터의 같은 성분끼리 각각 곱하여 모두 합하는 방식으로 구할 수 있음

1-D Tensor의 내적

  • 두 1-D Tensor 사이의 관계를 하나의 0-D Tensor(=Scalar)로 변환하는 것으로, 이러한 변환은 두 1-DTensor의 유사성을 수량화할 수 있는 장점을 가짐
  • 일차원 텐서의 내적은 두 일차원 텐서 사이의 관계를 하나의 스칼라(0차원 텐서)로 변환하는 것으로, 이 변환을 통해 두 일차원 텐서 사이의 유사성을 수량화 할 수 있음
  • 1-D Tensor의 내적을 구하는 방법
  1. 두 1-D Tensor의 각 요소를 곱해서 더하는 방법 (일반적으로 사용되는 방법)
  2. 두 1-D Tensor의 길이를 곱하는 방법 (일차원 텐서의 내적을 활용해서 두 텐서 사이의 각도를 측정하는 것의 핵심)




2-D Tensor의 행렬 곱셈 연산

  • 2-D Tensor(=Matrix)의 행렬 곱셈은 두 행렬을 결합하여 새로운 행렬을 생성하는 연산
  • 2-D Tensor의 행렬 곱셈은 신경망 구현에 핵심이 되는 연산임
# Tensor D와 Tensor E의 행렬 곱셈 연산
D.matmul(E)
D.mm(E)
D @ E

torch.dot

  • 벡터의 내적만 지원. (numpy와는 다르게 행렬곱/행렬연산은 지원하지 않는다.)

torch.matmul

  • vector의 내적, 행렬의 연산 다 사용가능
  • broadcasting을 지원한다. (debugging에서 불리한 포인트)

torch.mm

  • 행렬의 곱셈만 지원. vector의 내적 불가능.
  • broadcasting을 지원하지 않는다. → Debug에서 유리하다.
  • 추가적으로, batch 차원까지 연산을 지원해주지는 않는다. 딱, 2차원 행렬끼리의 곱만 연산가능하다.
    • ex. (3, 4) @ (4, 10) = (3, 10)

torch.bmm

  • torch.mm과의 차이점은 mm은 2차원 행렬의 곱 연산만 지원하고,torch.bmm은 3차원 텐서의 곱 연산만 지원한다.ex. (10, 5, 3) @ (10, 3, 2) = (10, 5, 2)



'Study - AI > Torch & Tensor' 카테고리의 다른 글

이진 분류 알고리즘 & 배치(Batch)  (0) 2025.01.03
Tensor 생성 및 변환  (0) 2025.01.02
PyTorch & Tensor  (0) 2025.01.02