이번 글에서는 Dot product와 Multiplication에 대해서 알아보도록 하겠습니다.
Index
1.Dot product
2.Matrix-vector Multiplication
1.Dot product
내적(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))