본문 바로가기
NAVER Boostcamp AI Tech/주간학습정리

Day 3. Tensor 연산 및 심화

by suvii 2024. 8. 25.

Tensor들 간의 연결 : cat() 함수

b = torch.tensor([[0, 1], [2, 3]])
c = torch.tensor([[4, 5]])
  • dim = 0을 기준으로 b와 c 연결
    • d = torch.cat((b, c)) → d = [[0, 1], [2, 3], [4, 5]]
  • dim = 1을 기준으로 b와 c 연결
    • dim = 1을 기준으로 했을 때 b와 c의 크기가 다르므로 reshape 필요
    • e = torch.cat((b, c.reshape(2, 1), 1) → e = [[0, 1, 4], [2, 3, 5]]

Tensor의 크기 확장 : expand(), repeat() 메서드

  • expand() : 주어진 Tensor의 차원 중 일부의 크기가 1일 때, 해당 차원의 크기를 확장
    • f = torch.tensor([[1, 2, 3]]) → g = f.expand(4, 3)
    • [1, 2, 3] → [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
  • repeat() : 주어진 Tensor의 요소들을 반복하는 방식으로 크기를 확장
    • 일부 차원의 크기가 1이어야 한다는 제약은 없으나, 메모리 효율성이 떨어짐
    • h = torch.tensor([[1, 2], [3, 4]]) → i = h.repeat(2, 3)
    • [[1, 2], [3, 4]] → [[1, 2, 1, 2, 1, 2], [3, 4, 3, 4, 3, 4], [1, 2, 1, 2, 1, 2], [3, 4, 3, 4, 3, 4]]

Tensor의 산술연산

  • 더하기 연산
    • 함수 방식 : torch.add(a, b)
    • in-place 방식 : a.add_(b)
  • 빼기 연산
    • 함수 방식 : torch.sub(f, e)
    • in-place 방식 : f.sub_(e)
  • 곱하기 연산
    • 스칼라곱 연산 : torch.mul(i, j)
    • 요소별 곱하기 연산
      • 함수 방식 : torch.mul(k, l)
      • in-place 방식 : k.mul_(l)
  • 나누기 연산
    • 함수 방식 : torch.div(o, p)
    • in-place 방식 : o.div_(p)
  • 거듭제곱 연산
    • Tensor s의 각 요소들에 대해 n제곱 : torch.pow(s, n)
    • Tensor t의 요소들을 Tensor u의 대응요소들만큼 거듭제곱
      • 함수 방식 : torch.pow(t, u)
      • in-place 방식 : t.pow_(u)
  • 제곱근 연산
    • Tensor s의 각 요소들에 대한 n제곱근 : torch.pow(s, 1/n)
  • 크기가 다른 Tensor의 연산 → broadcasting
    • torch.add(c, d)
    • torch.sub(g, h)
    • torch.mul(m, n)
    • torch.div(q, r) → 부동소수점(.float()으로) 맞춰줘야함 !

Tensor의 비교연산 (Boolean Tensor로 출력)

  1. torch.eq() : equal
  2. torch.ne() : nonequal
  3. torch.gt() : greater than
  4. torch.ge() : greater than or equal
  5. torch.lt() : lower than
  6. torch.le() : lower than or equal

Tensor의 논리연산

  1. 논리곱(AND) : 입력된 신호가 모두 참일 때, 출력이 참이 되는 연산 → torch.logical_and(x, y)
  2. 논리합(OR) : 입력된 신호 중 하나라도 참일 때, 출력이 참이 되는 연산 → torch.logical_or(x, y)
  3. 배타적 논리합(XOR) : 입력된 신호가 하나만 참일 때, 출력이 참이 되는 연산 → torch.logical_xor(x, y)

 

Tensor의 노름

  • 1-D Tensor의 노름은 Vector가 원점에서 얼마나 떨어져 있는지를 의미한다.
  • L1 노름은 1-D Tensor에 포함된 요소의 절대값의 합으로 정의할 수 있다.
  • L2 노름은 1-D Tensor에 포함된 요소의 제곱합의 제곱근으로 정의할 수 있다.
  • L∞ 노름은 1-D Tensor에 포함된 요소의 절대값 중 최대값으로 정의할 수 있다.

유사도

유사도란 두 1-D Tensor(=Vector)가 얼마나 유사한지에 대한 측정값

→ 군집화(Clustering) 알고리즘에서 데이터들이 얼마나 유사한지를 판단하는 중요한 기준이 됨

이때 군집화란 비지도 학습의 한 형태로서, 유사한 데이터들을 그룹으로 묶는 기법

  • 맨해튼 유사도
    • 두 1-D Tensor 사이의 맨해튼 거리를 역수로 변환하여 계산한 값
      • 맨해튼 거리 계산 : manhattan_distance = torch.norm(b-c, p=1)
      • 맨해튼 유사도 계산 : 1 / (1 + manhattan_distance)
    • 맨해튼 유사도의 값이 1에 가까울수록 두 Tensor가 유사하다고 판단
  • 유클리드 유사도
    • 두 1-D Tensor 사이의 유클리드 거리를 역수로 변환하여 계산한 값
      • 유클리드 거리 계산 : euclidean_distance = torch.norm(b-c, p=2)
      • 유클리드 유사도 계산 : 1 / (1 + euclidean_distance)
    • 유클리드 유사도의 값이 1에 가까울수록 두 Tensor가 유사하다고 판단
  • 코사인 유사도
    • 두 1-D Tensor 사이의 각도를 측정하여 계산한 값
    • cosine_similarity = torch.dot(b, c) / (torch.norm(b, p = 2) * (torch.norm(c, p = 2))
    • 코사인 유사도의 값이 1에 가까울 수록 두 Tensor가 유사하다고 판단

2-D Tensor의 행렬 곱셈 연산

2-D Tensor(=Matrix)의 행렬 곱셈은 두 행렬을 결합하여 새로운 행렬을 생성하는 연산으로, 신경망 구현에 핵심이 되는 연산이다.

행렬 곱셈 연산의 코드 표현

D = torch.tensor([[1, 1, 3], [4, 5, 6], [7, 8, 9]])
E = torch.tensor([[1, 0], [1, -1], [2, 1]])

D.matmul(E) / D.mm(E) / D @ E

 

행렬 곱셈 연산의 활용

 
G = torch.tensor([[255, 114, 140], [39, 255, 46], [61, 29, 255]])
H = torch.tensor([[0, 0, 1], [0, 1, 0], [1, 0, 0]])

 

1. 흑백 이미지의 좌우로 대칭 이동

I = G @ H

2. 흑백 이미지의 상하로 대칭 이동

J = H @ G

 


행렬 H는 대칭 변환을 수행하는 특수한 행렬이다. 행렬 H를 행렬G의 오른쪽에서 곱할 때, 행렬 H는 행렬 G를 좌우 대칭으로 바꾼다. 행렬 H를 행렬G의 왼쪽에서 곱할 때, 행렬 H는 행렬 G를 상하 대칭으로 바꾼다.