Prologue
MLP에서 backward pass를 리뷰한 것을 활용해서 conv lyaer가 내부적으로는 어떻게 돌아가는지 알아보면 좋을 것 같다는 생각에서 시작했다. 레쓰고.
Forward pass
Conv layer에서는 기본적으로 이미지를 kenel의 크기만큼 submatrix로 쪼개서(물론 padding, strides를 고려해서) frobenius product
한다. 이전 글에서도 짚었듯이 크기가 같은 행렬 A, B가 있을 때 두 matrix를 frobenius product
연산한다고 하면 ⟨A,B⟩F=∑i∑jai,j⋅bi,j이렇게 표현한다. 예를 들어 이미지 X∈R3×3와, kernel W∈R2×2가 주어지고 padding=0, strides=1 일 때 X를 4가지 submatrix로 쪼갤 수 있다.
X=⎣⎢⎡X11X21X12X22⎦⎥⎤=⎣⎢⎢⎢⎢⎢⎡[x11x21x12x22][x21x31x22x32][x12x22x13x23][x22x32x23x33]⎦⎥⎥⎥⎥⎥⎤
이 때, 각 4개의 submatrix와 W를 frobenius product
하면 수식으로 이렇게 표현한다.
X⊛W=⎣⎢⎡⟨W,X11⟩F⟨W,X21⟩F⟨W,X12⟩F⟨W,X22⟩F⎦⎥⎤
정확히 conv layer에서 일어나는 연산과 일치한다. 편의를 위해 이 matrix는 F라고 이름 붙이고
F=[f11f21f12f22]이렇게 정의하자. 목표는 conv layer의 backpropagation이니까 일단 F를 다 풀어서 계산해놓는다.
f11=x11w11+x12w12+x21w21+x22w22f12=x12w11+x13w12+x22w21+x23w22f21=x21w11+x22w12+x31w21+x32w22f22=x22w11+x23w12+x32w21+x33w22
준비는 끝났다. 이제 계산할 일만 남았다.
Backward pass
MLP에서 일어나는 Backward pass와 똑같이 chain rule을 활용해서 계산하면 된다. 다만 차이는 scaler나 vector가 아니라 matrix로 연산해야 한다는 점이다.
Prep
Chain rule을 활용하기 위해 ∂F∂L, ∂X∂F, ∂W∂F 세 가지를 먼저 계산해줄거다.
∂F∂L=⎣⎢⎡∂f11∂L∂f21∂L∂f12∂L∂f22∂L⎦⎥⎤
∂W∂F=⎣⎢⎡∂w11∂F∂w21∂F∂w12∂F∂w22∂F⎦⎥⎤=⎣⎢⎢⎢⎢⎢⎡[x11x21x12x22][x21x31x22x32][x12x22x13x23][x22x32x23x33]⎦⎥⎥⎥⎥⎥⎤
∂X∂F=⎣⎢⎢⎢⎢⎢⎡∂x11∂F∂x21∂F∂x31∂F∂x12∂F∂x22∂F∂x32∂F∂x13∂F∂x23∂F∂x33∂F⎦⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡[w11000][w21w1100][0w2100][w120w110][w22w12w21w11][0w220w21][00w120][00w22w12][000w22]⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
Chain rule
전제는 forward pass 때 convolution했으므로 packward pass때도 convolution한다.
dL/dW
따지고 보면 ∂W∂F=[X11X21X12X22]가 성립한다. 생격을 좀더 이어가서 ∂W∂L는 X의 submatrix와 ∂F∂L를 frobenius product
하는 것과 같은 샘이 된다. 그러니까
∂W∂F⋅∂F∂L=⎣⎢⎡⟨∂F∂L,X11⟩F⟨∂F∂L,X21⟩F⟨∂F∂L,X12⟩F⟨∂F∂L,X22⟩F⎦⎥⎤
이 말과도 성립한다.
dL/dX
이것도 앞서 ∂W∂L를 연산한 것처럼 convolution을 활용한다.
∂X∂F⋅∂F∂L=⎣⎢⎢⎢⎢⎢⎡⟨∂F∂L,∂x11∂F⟩F⟨∂F∂L,∂x21∂F⟩F⟨∂F∂L,∂x31∂F⟩F⟨∂F∂L,∂x12∂F⟩F⟨∂F∂L,∂x22∂F⟩F⟨∂F∂L,∂x32∂F⟩F⟨∂F∂L,∂x13∂F⟩F⟨∂F∂L,∂x23∂F⟩F⟨∂F∂L,∂x33∂F⟩F⎦⎥⎥⎥⎥⎥⎤
이 문제는 ∂W∂L에서 그랬듯 기존 matrix를 바로 활용하기는 어려워보인다. 그럴 땐 일단 계산해보면 된다.
⎣⎢⎢⎢⎢⎢⎡∂f11∂Lw11∂f11∂Lw21+∂f21∂Lw11∂f21∂Lw21∂f11∂Lw12+∂f12∂Lw11∂f11∂Lw22+∂f12∂Lw21+∂f21∂Lw12+∂f22∂Lw11∂f21∂Lw22+∂f22∂Lw21∂f12∂Lw12∂f12∂Lw22+∂f22∂Lw12∂f22∂Lw22⎦⎥⎥⎥⎥⎥⎤
어렵지는 않지만 복잡하다
Epilogue
문제를 좀더 직관적으로 보려면 시각적으로 생각할 필요가 있다. ∂X∂F를 계산하면서 정중앙 matrix가 기존의 W를 180도 뒤집어 놓은 모양이라는 점을 눈치챘을 것이다. 이 점을 이용한다. 그 전에 ∂F∂L에 1만큼 padding하고 submatrix 9개로 나눠준다.
pad1(∂F∂L)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡[000∂f11∂L][00∂f11∂L∂f21∂L][00∂f21∂L0][0∂f11∂L0∂f12∂L][∂f11∂L∂f21∂L∂f12∂L∂f22∂L][∂f21∂L0∂f22∂L0][0∂f12∂L00][∂f12∂L∂f22∂L00][∂f22∂L000]⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤rot180(W)=[w22w12w21w11]
pad1(∂F∂L)의 submatrix 9개와 rot180(W)를 각각 frobenius product
하면 ∂W∂F를 계산하는 과정을 생략하고 구할 수 있다.