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-D Tensor의 각 요소를 곱해서 더하는 방법 (일반적으로 사용되는 방법)
- 두 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
- 벡터의 내적만 지원. (numpy와는 다르게 행렬곱/행렬연산은 지원하지 않는다.)
- vector의 내적, 행렬의 연산 다 사용가능
- broadcasting을 지원한다. (debugging에서 불리한 포인트)
- 행렬의 곱셈만 지원. vector의 내적 불가능.
- broadcasting을 지원하지 않는다. → Debug에서 유리하다.
- 추가적으로, batch 차원까지 연산을 지원해주지는 않는다. 딱, 2차원 행렬끼리의 곱만 연산가능하다.
- ex. (3, 4) @ (4, 10) = (3, 10)
- 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 |