Convoluational Layer Backpropagation
Numpy로 Deeplearing code를 구현하면서 공부한 내용입니다.
[github]
[blog]
위와 같은 예시에서 수식을 정리해보면
O=W∗X+b=(o11o21o12o22)o11o12o21o22=x11w11+x12w12+x13w13x21w21+x22w22+x23w23x31w31+x32w32+x33w33+b=x13w11+x14w12+x15w13x23w21+x24w22+x25w23x33w31+x34w32+x35w33+b=x31w11+x32w12+x33w13x41w21+x42w22+x43w23x51w31+x52w32+x53w33+b=x33w11+x34w12+x35w13x43w21+x44w22+x45w23x53w31+x54w32+x55w33+b
backward시 다음과 같은 gradient값이 앞선 Layer로부터 들어오게 된다.
∂O∂L=(∂o11∂L∂o21∂L∂o12∂L∂o22∂L)
backpropagation을 진행하기 위해서 다음 Layer로 전달해줘야할 gradient ∂X∂L와
weight, bias를 update하기 위한 ∂W∂L, ∂b∂L을 계산해야한다.
먼저 ∂X∂L의 xij에 대한 gradient matrix는 다음과 같이 표현된다.
∂X∂L=∂x11∂L∂x21∂L∂x31∂L∂x41∂L∂x51∂L∂x12∂L∂x22∂L∂x32∂L∂x42∂L∂x52∂L∂x13∂L∂x23∂L∂x33∂L∂x43∂L∂x53∂L∂x14∂L∂x24∂L∂x34∂L∂x44∂L∂x54∂L∂x15∂L∂x25∂L∂x35∂L∂x45∂L∂x55∂L
x_11에 대해서만 계산해보면 다음과 같이 gradient의 합으로 구성되어있다.
∂x11∂L=∂O∂L∂x11∂O=i,j=(1,1)∑(2,2)∂oij∂L∂x11∂oij=∂o11∂L∂x11∂o11+∂o12∂L∂x11∂o12+∂o21∂L∂x11∂o21+∂o22∂L∂x11∂o22=∂o11∂L⋅w11+∂o12∂L⋅0+∂o21∂L⋅0+∂o22∂L⋅0
다음 순서의 x에 대해서도 조금더 계산해보면
∂x12∂L∂x13∂L∂x14∂L∂x15∂L...=∂o11∂L⋅w12=∂o11∂L⋅w13+∂o12∂L⋅w11=∂o12∂L⋅w12=∂o12∂L⋅w13
계산되는 값들을 보면 forward 과정에서 convoluation했던 순서와 동일하게 같은 stride로 backporopagation에서도 weight와 gradient값으로 convolution 연산을 하고 있다.
Weight에 대한 gradient ∂W∂L 계산
∂W∂L를 matrix로 표현하면 다음과 같다.
∂W∂L=∂w11∂L∂w21∂L∂w31∂L∂w12∂L∂w22∂L∂w32∂L∂w13∂L∂w23∂L∂w33∂L
원소 w_11에 대한 gradient는 다음과 같이 계산된다.
∂w11∂L=∂O∂L∂w11∂O=i,j=(1,1)∑(2,2)∂oij∂L∂w11∂oij=∂o11∂L∂w11∂o11+∂o12∂L∂w11∂o12+∂o21∂L∂w11∂o21+∂o22∂L∂w11∂o22=∂o11∂L⋅x11+∂o12∂L⋅x13+∂o21∂L⋅x31+∂o22∂L⋅x33
계산된 gradient는 w_11와 forward convolution 과정에서 한번이라도 연관된 값과 앞선 Layer의 gradient값을 곱한 값의 합과 같다.
X에 대한 gradient를 계산할 때와 마찬가지로 forward의 동일한 순서와 stride를 가지는 convolution으로 weight gradient값이 계산된다.
Bias b에 대한 gradient ∂b∂L 계산
위에서 계산했던 W, X에 비해 bias의 gradient는 간단하게 다음과 같이 계산된다.
∂b∂L=∂O∂L∂b∂O=i,j=(1,1)∑(2,2)∂oij∂L∂b∂oij=∂o11∂L∂b∂o11+∂o12∂L∂b∂o12+∂o21∂L∂b∂o21+∂o22∂L∂b∂o22=∂o11∂L⋅1+∂o12∂L⋅1+∂o21∂L⋅1+∂o22∂L⋅1=i,j=(1,1)∑(2,2)∂oij∂L
모든 bias에 대한 ∂b∂oij이 1로 계산되므로 결국 들어온 gradient를 합한 값이 된다.
Reference