본문 바로가기

컴퓨터공학/python

[Numpy] Dot product, Matrix-vector Multiplication에 대해서

이번 글에서는 Dot product와 Multiplication에 대해서 알아보도록 하겠습니다. 

 

Index


1.Dot product

2.Matrix-vector Multiplication


1.Dot product

 

내적(Dot Product)이란,

두 벡터가 있을 때, 각 인덱스에 대응하는 원소별로 곱해준 뒤 총합을 수행해 하나의 스칼라 값으로 만들어 주는 연산을 의미합니다.

내적 연산은 그림_1(아다마르 곱,hadamard product)과 그림_2(dot_product)의 두가지 방법으로 구할 수 있습니다.

그림_1(hadamard product)
그림_2(dot_product)

Numpy에서는 dotproduct연산을 위해 numpy.dot(a,b)와 같은 API를 제공하고 있습니다. 

아래 예시를 통해 u와 v벡터의 연산을 알아보도록 하겠습니다. 

import numpy as np
u =np.random.uniform(0,5,(4,))
v =np.random.uniform(0,5,(4,))

sum_hadamard =np.sum(u*v)
np_dot = np.dot(u,v)

>>>print(f"sum_hadamard: {sum_hadamard.round(2)}")
sum_hadamard: 27.29

>>>print(f"np_dot: {np_dot.round(2)}")
np_dot: 27.29

ANN에서는 입력 데이터(x)와 가중치(w)의 곱을 위해 dot product를 아래와 같이 이용하고 있습니다. 

import numpy as np
x = np.random.uniform(0,5,(4,))

w = np.random.uniform(0,5,(4,))
b = np.random.uniform(0,5,(4,))

affine = np.dot(x,w) +b

activation = 1/(1 + np.exp(-affine))

 

2.Matrix-vector Multiplication

matmul()함수는 각각 마지막 두 인덱스에 상주하는 요소로서 행렬 스택처럼 배열을 broadcasting합니다.

반면numpy.dot()함수는 첫 번째 배열의 마지막 축과 두 번째 배열의 마지막 축에 대한 곱의 합으로 곱셈을 수행합니다.

matmul()과 numpy.dot함수의  또 다른 차이점은

matmul()함수가 스칼라 값으로 배열의 곱셈을 수행 할 수 없다는 것입니다.

 

import numpy as np
M = np.random.uniform(0,5,(3,4))
u = np.random.uniform(0,5,(4,))
mat_vec_mul = np.empty((3,))
for row_idx, row in enumerate(M):
	mat_vec_mul[row_idx] = np.dot(row,u)

np_matmul = np.matmul(M,u)
np_dot1 = np.dot(M,u)

print(f"mat_vec_mul: \n {mat_vec_mul.round(2),mat_vec_mul.shape}")
print(f"np_matmul: \n {np_matmul.round(2),np_matmul.shape}")

print(np_dot1.round(2))