본문 바로가기
인공지능/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)>

     

    끝!

    반응형