본문 바로가기
파이썬 프로그래밍/딥러닝과 수학

4. 벡터 입력에 대한 합성함수 표현

by Majestyblue 2021. 12. 29.

 벡터 입력에 대한 합성함수와 도함수 표현을 알아보자.

벡터를 행렬로 표현하여 곱셈, 합성함수와 도함수를 어떻게 표현할 것인지 알아볼 것이다.

 

1. 벡터의 곱 연산

벡터 입력에 대해 다음과 같은 출력을 가정해 보자.(딥러닝에서 본 것 같지 않나요?)

입력 X와 상수값 W
X와 W의 행렬 곱으로 정의한 함수 g(X, W), 결과는 스칼라값

 

이를 파이썬 코드로 표현해보면 다음과 같다.

import numpy as np

X = np.array([[1, 2, 3]])
W = np.array([[3],
              [2],
              [1]])
print('x.shape', X.shape)
print('w.shape', W.shape)

def matmul_forward(X, W):
    return np.dot(X, W)

print('matmul_forward ', matmul_forward(X, W))

 

행렬의 곱셈을 복습해보자.

출처 : https://mathbang.net/562

이 그림이 행렬 곱셈을 가장 잘 설명한 것 같다.

'행렬'의 의미를 생각해보면 행 - 가로 , 열(렬) - 세로 를 의미한다.

행렬의 곱셈에서는 교환법칙(a×b = b×a)가 성립하지 않는다. 다시 말해 행렬에서는 (a×b ≠ b×a)이다.

 

곱셈 순서이다.

1. A행렬의 열, B행렬의 행의 수가 일치하는지 확인해야 한다.

   -> A(m×k) × B(k×n) 으로 일치한다.

2. A행렬의 행, B행렬의 열이 곱셈 행렬의 행렬이 된다.

   -> A(m×k) × B(k×n) = AB(m×n)

 

즉, 일치하는 수를 '소거' 시키면서 곱셈해주고 나머지를 앞뒤로 결합하는 느낌으로 계산한다.

 

결과는 다음과 같다.

X(1, 3) × W(3, 1) = XW(1, 1) 의 행렬이 계산되었고 실제 계산해 보면 1×3 + 2×2 + 3×1 = 10 이다.

 

 

 

2. 벡터함수와 합성함수

벡터함수를 sigmoid 함수에 통과하는 합성함수( f(X, W) )를 정의할 것이다.

sigmoid 함수 정의
합성함수 f(X, W)의 정의

 

파이썬 코드로 표현하면 다음과 같다.

import numpy as np

x = np.array([[1, 2, 3]])
w = np.array([[3],
              [2],
              [1]])

def matmul_forward(X, W):
    return np.dot(X, W)

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def matrix_sigmoid(X, W, func_list):
    f1 = func_list[0] # matmul
    f2 = func_list[1] # sigmoid
    
    F1 = f1(X, W)
    F2 = f2(F1)
    return F2

list_func = [matmul_forward, sigmoid]

print('matrix_sigmoid', matrix_sigmoid(x, w, list_func))

결과를 출력하면 [[0.9999546]] 이다.

 

sigmoid 함수 그래프

sigmoid 함수는

x가 양의 값일 때 1에 수렴

x = 0일 때 0.5,

x가 음의 값일 때 0에 수렴

 

따라서 sigmoid(10) 값은 1에 가까워진다. 즉 출력 결과는 합당하다고 볼 수 있다.