본문 바로가기
인공지능/ML, DL

[tensorflow] 텐서플로우 행렬 곱 연산 (성분곱, 내적, 외적)

by judy@ 2023. 6. 15.

행렬의 곱셈은 크게 성분 곱(Hadamard product), 내적(inner product) 그리고 외적(outer product)이 있다. 일반적인 행렬곱은 외적에 해당한다. 각각의 연산은 아래와 같이 A, B 행렬이 있을 때, 다음과 같이 계산될 수 있다.

맨 위부터, 성분곱, 내적, 외적 연산과 그 결과

위와 같은 행렬 곱 연산을 텐서플로우(tensorflow)로는 아래와 같이 나타낼 수 있다.  행렬의 곱 연산에 사용할 수 있는 함수는 크게 tf.matmul(), tf.multiply(), tf.tensordot() 세 개가 있다.

 

환경 정보

Tensorflow == 2.13.0rc1
import tensorflow as tf

위 코드로 모듈 임포트 후 실행함

 

1. Element-wise 곱 연산

성분 곱 연산 = Hadamard product 연산은 성분 간 곱셈을 수행하는 연산으로, 같은 dimension을 가지는 벡터 또는 행렬 간의 연산을 수행한다. tf.multiply()를 통해 성분 곱을 수행할 수 있다.

tf.multiply() 성분곱 연산 예시

 

A = [1, 0, 0]
B = [0, 1, 0]

tf.multiply(A, B)
<tf.Tensor: shape=(3,), dtype=int32, numpy=array([0, 0, 0], dtype=int32)>

 

2. 내적 연산(inner product)

아래 연산은 내적 연산으로 실질적으로는 ATB 연산이 수행된다. tensordot 함수는 axes를 꼭 입력해주어야 하며, 이 값이 1일 때만 내적 연산이 수행된다.

 

tf.tensordot(A, B, axes=1)

tf.tensordot() 내적 연산 예시

A = [1, 0, 0]
B = [0, 1, 0]

tf.tensordot(A, B, axes=1)
<tf.Tensor: shape=(), dtype=int32, numpy=0>

 

3. 외적 연산(outer product)

일반적인 행렬곱 연산에 해당하며, tensordot()의 axes를 0으로 주면 외적 연산을 수행한다.

tf.tensordot() 외적 연산 예시

A = [1, 0, 0]
B = [0, 1, 0]

tf.tensordot(A, B, 0)
<tf.Tensor: shape=(3, 3), dtype=int32, numpy=
array([[0, 1, 0],
       [0, 0, 0],
       [0, 0, 0]], dtype=int32)>

 

뿐만 아니라, A와 B를 행렬 형태로 표현해주면, tf.matmul() 연산자도 사용할 수 있다. 단 위와 같은 벡터 형태에서는 이 연산자를 사용할 수 없으니, 행렬 표현이 필수적이다.

 

tf.matmul() 외적 연산 예시

mat_A = [[1], [0], [0]]
mat_B = [[0, 1, 0]]

tf.matmul(mat_A, mat_B)
<tf.Tensor: shape=(3, 3), dtype=int32, numpy=
array([[0, 1, 0],
       [0, 0, 0],
       [0, 0, 0]], dtype=int32)>

 

끝!

반응형