개발일기

기초수학 - 텐서의 전치와 내적 본문

Deep Learning, Machine Learning/기초 수학

기초수학 - 텐서의 전치와 내적

Flashback 2024. 3. 24. 15:14
728x90
반응형

전치

0차원 스칼라가 전치하면 행벡터가 열벡터로, 열벡터가 행벡터로 바뀐다.

1차원 벡터가 전치하면 스칼라과 동일하게 행벡터가 열벡터로, 열벡터가 행벡터로 바뀐다.

2차원 행렬부터는 다르게 동작한다.

 

$ A = \begin{pmatrix}
x_{11} & x_{12} & x_{13} \\
x_{21} & x_{22} & x_{23} \\
x_{31} & x_{32} & x_{33} \\
\end{pmatrix}

A^T = \begin{pmatrix}
x_{11} & x_{21} & x_{31} \\
x_{12} & x_{22} & x_{32} \\
x_{13} & x_{23} & x_{33} \\
\end{pmatrix} $

 

행렬의 시작점과 끝점을 중심으로 대각선을 그린 후, 대각선을 중심으로 축을 뒤집으면 전치 행렬이 나타난다. 쉽게 보면 행이 열로 바뀌고 열이 행으로 바뀌는것이 전치이다.

Numpy 전치

import numpy as np

X = np.array([ [1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]]) # 3행 3열의 행렬 생성

print("X: \\n", X)
print("Transpose X: \\n", X.T)

"""
X: 
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
Transpose X: 
 [[1 4 7]
 [2 5 8]
 [3 6 9]]
"""

numpy에서 행렬 변수 뒤에 T를 붙이면 전치 행렬이 나타난다.

 

Pytorch 전치

import torch

X = torch.tensor([ [1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]]) # 3행 3열의 행렬 생성
print("X: \\n", X)
print("Transpose X: \\n", X.T)

"""
X: 
 tensor([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])
Transpose X: 
 tensor([[1, 4, 7],
        [2, 5, 8],
        [3, 6, 9]])
"""

Pytorch도 numpy와 동일하게 행렬 변수 뒤에 T를 붙이면 전치 행렬이 나타난다.

 

Tensorflow 전치

# Tensorflow Transpose
import tensorflow as tf

X = tf.Variable([ [1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]]) # 3행 3열의 행렬 생성
print("X: \\n", X)
print("Transpose X: \\n", tf.transpose(X))

"""
X: 
 <tf.Variable 'Variable:0' shape=(3, 3) dtype=int32, numpy=
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]], dtype=int32)>
Transpose X: 
 tf.Tensor(
[[1 4 7]
 [2 5 8]
 [3 6 9]], shape=(3, 3), dtype=int32)
"""

Tensorflow는 transpose() 메서드의 매개변수에 행렬 변수를 추가해야 전치 행렬이 나타난다.

 

내적

내적은 두 벡터에서 행렬에 상응하는 요소끼리 곱하고 총합으로 출력된 스칼라 값을 의미한다. 요소끼리 곱을 하기에 두 벡터의 크기는 같아야 한다.

$ x = (2, -5, 3) $

$ y = (4, 2, 6) $

$ 2*4 + (-5)2 + 36 = 8 + (-10) + 18 = 16 $

표기법: $ x\cdot y, x^Ty, <x, y> $

x와 y벡터의 각 요소들을 곱한값을 총합한 스칼라값이 내적값이다. 내적을 표시하는 방법은 3가지가 있다.

 

Numpy 내적

# 내적
import numpy as np

a = np.array([2, -5, 3])
b = np.array([4, 2, 6])

print("Inner Product: ", np.dot(a, b)) # 16

numpy에서는 두 벡터를 dot()메서드에 넣어주면 내적값을 계산할 수 있다.

 

Pytorch 내적

import torch

a = torch.tensor([2, -5, 3])
b = torch.tensor([4, 2, 6])

print("Inner Product: ", torch.dot(a, b)) # 16

pytorch는 numpy와 동일하게 dot()메서드에 두 벡터를 넣어주면 내적값이 출력된다.

 

Tensorflow 내적

# Inner Product Tensorflow
import tensorflow as tf

a = tf.Variable([2, -5, 3])
b = tf.Variable([4, 2, 6])

print(tf.reduce_sum(tf.multiply(a, b))) # <tf.Tensor: shape=(), dtype=int32, numpy=16>

multiply(): 각각의 행렬 요소를 곱해주는 함수다. 2는 4, -5는 2, 3은 6과 곱한다.

reduce_sum(): 총합을 계산하는 함수다. 결과값인 8, -10, 18은 더한다.

tensorflow는 pytorch와 numpy와는 다르게 multiply(), reduce_sum()을 사용하는 2가지의 다소 번거로운 과정을 거쳐야 내적을 구할 수 있다.

 


https://colab.research.google.com/drive/19uVZT0_esrEarmkFU2mpDupgWzkxOD9a?hl=ko#scrollTo=rlbDgDNR-XDC

 

텐서의 계산.ipynb

Colaboratory notebook

colab.research.google.com

 

728x90
반응형
Comments