Affine 계층
X = np.random.rand(2) # 입력
W = np.random.rand(2, 3) # 가중치
B = np.random.rand(3) # 편향
X.shape # (2,)
W.shape # (2, 3)
B.shape # (3,)
Y = np.dot(X, W) + B
X, W, B는 각각 shape이 (2,), (2, 3), (3,)인 다차원 배열
신경망의 순전파 때 수행하는 행렬의 내적을 기하학에서는 affine transform이라고 함
위 연산을 그래프로 표현하면 아래와 같다.
이제까지의 계산 그래프는 노드 사이에 '스칼라값'이 흘렀지만, 위는 '행렬'이 흐르고 있음.
행렬을 사용한 역전파도 행렬의 원소마다 전개해보면 스칼라값을 사용한 지금까지의 계산 그래프와 같은 순서로 생각할 수 있다.
위의 T는 전치행렬을 뜻함.
W의 shape이 (2, 3)이었다면 W의 전치행렬의 shape은 (3, 2)가 된다.
위를 보면
X와 𝝏L/𝝏X는 같은 shape
W와 𝝏L/𝝏W는 같은 shape
아래와 같이 행렬의 shape을 알 수 있다.
왜 행렬의 형상에 주의?
행렬의 내적에서는 대응하는 차원의 원소 수를 일치시켜야 하는데 이를 위해서는 아래의 식을 동원해야 할 수도 있음
예를 들어 ∂L/∂y의 shape이 (3,)이고 W의 형상이 (2, 3)일 때, ∂L/∂X의 형상이 (2, )가 되도록하는 L/∂y와 W의 내적을 생각해보면 자연스럽게 위의 식이 유도된다.
(전치되는 이유 : 각 요소의 연산을 선형대수화하는 과정에서 행렬의 shape이 결정되고 전치되는 것)
디테일한 내용은 아래 링크 참고해서 추후 정리 예정
http://taewan.kim/post/backpropagation_matrix_transpose/
https://choosunsick.github.io/post/neural_network_backward_3/
배치용 Affine 계층
배치사이즈 N만큼 묶어 순전파하는 경우를 생각
X의 입력 shape (2, ) => (N, 2)