Convolutional Networks 3/ Lec.09

2021. 1. 5. 18:50딥러닝 강의 정리

Gradient descent

이제 Backpropagation을 통한 gradient descent를 해보자. 제일 먼저 Loss를 정해야 한다. loss는 전에도 했듯이 전체 divergence의 평균이다.

그리고 weight update역시 gradient descent의 방법으로 loss값을 w로 미분한 것의 반대방향으로 w를 이동시키면 된다.

맨마지막 layer부터 backpropagation을 진행하는데 마지막은 MLP임으로 평소에 한던데로 하면 된다.

MLP의 첫번째 단부터가 방법이 약간 응용이 된다. 우선 MLP에서 첫번째 단은 map들을 flat하게 둔 것 일 뿐이다. 그렇다면 Convolution layer의 Backpropagation을 해보자. 우선 forward path는 아래와 같다.

현재 layer는 l이고 이전 layer(l-1)의 output인 Y(l-1)을 filter를 씌워서 Z(l)을 만들고 여기에 activation을 적용해 Y(l)을 생성한다. Y(l)에서 Z(l)은 각각이 같은 위치에서 일어남으로 바로 미분을 하면 된다. 이고 y(l)=f(z(l))임으로 아래와 같은 결과가 나온다.

하지만 그다음이 문제이다. 그다음은 각각의 position이 identical하게 z와 연결되지 않는다. 하나의 input이 여러개의 z에 영향을 주는 구조이다.

그래서 계산에 유의를 해야 한다. 우선 Y,Z그리고 w의 관계를 살펴보면 아래와 같다.

각각의 Y(l-1,m,x,y)에 w(m,n,x-x',y-y')가 weighted sum이 되어 z(l,n,x',y')이 되는 구조이다. 

여기서 임으로 아래와 같이 표현이 가능하다. 

여기서 n은 모든 z들이고 에서 z+=wY임으로 결국은 w만 남게 된다. 따라서 아래의 수실이 된다.

반대로 Div를 w에 대해 미분을 해보자. Y는 모든 z에 영향을 미쳤고 각각의 z에서는 일부분에만 영향을 미쳤다면 w는 반대로 하나의 z에만 영향을 미치지만 그 z의 전영역에 영향을 미친다.

따라서 아래와 같이 한 영역에서만 미분을 하면 된다.

위에서 수학적 내용은 굉장히 어려웠지만 이를 코드로 나타내면 굉장히 쉬워진다.

위와 같이 간단히 나타내지기 때문이다. 따라서 코드는 아래와 같다. 우선 Forward path이다.

l번째 layer에서의 backward는 아래와 같다.

Modification

위에서 y에대한 derivative는 아래와 같았다. 

그리고 동그라미 친 부분은 한 map에서 발생하는 일이다. 아래 그림을 보자.

Y의 위치는 고정시켜놓고 위의 식에 동그라미 부분을 진행해보려고 한다. 

x,y부분에 w(2,2)부분이 곱해지고 이 결과가 z(x-2,y-2)부분으로 들어간다. 

계속 진행하다보면 아래처럼 나온다. 

여기서 z를 보면 w를 뒤집은 모양인 것을 확인할 수 있다. 우선 아래의 식을 다시한번 보면

여기서 빨간색 박스부분이 의미하는 것은 결국 Div를 z로 미분한것과 w를 뒤집은 것을 요소별로 곱하면(convolution) y의 한부분에대한 Div의 미분 값을 구할 수 있다는 것이다.

위의 아이디어를 이용해서 아래와 같이 전체 Y에 대한 미분 값을 구할 수 있다. 

위의 과정을 계속 해나아가면

이런식으로 전체 y에대한 미분값을 구할 수 있는 것이다. 이것은 지금 z하나에 대해서 한 것이고 같은 방법으로 여러개의 필터가 있다면 아래처럼 하면 된다. 

우선 각w를 뒤집은 다음 z와의 convolution을 진행하면 된다. 

위의 과정에서

이렇게 범위를 벗어나는 부분이 존재하게 된다. 따라서 이부분만큼 padding을 해서 진행하면 된다. 

위에 방법에 대한 코드는 아래와 같다. 우선 w와 dz를 convolution 한뒤에 y의 component에 맞는 convolution값을 넣어주면 된다.

 

Pooling and DownSampling BackPropagation

pooling과 downsampling에 대한 BackPropagation을 보기전 derivative의 정의를 다시한번 생각해보면 derivative란 input의 변화량에 따른 output의 변화하는 정도이다. 하지만 max pooling은 input을 변화시키는 것이 아닌 단지 제일 큰 값을 뽑는 것이다. 그러므로 뽑힌 제일 큰 값에는 그 앞단에서 구한 derivative를 넣고 max pooling filter에서 안뽑힌 나머지는 0을 넣으면 된다. 이때문에 maxpooling 할때 argmax를 이용해 위치를 기억하는 것이다.

하지만 mean pooling은 fitler에서 하나만 다음단으로 들어가는 것이 아닌 모두를 평균내서 들어감으로 그 앞단의 derivative가 backpropagation으로 mean pooling layer로 넘어올 때 그 값을 공평하게 나누어서 각각의 component로 들어가게 된다.

여기서 K제곱인 이유가 만일 filter의 크기가 K라면 그 안의 component의 수는 정사각형임으로 K*K개이기 때문이다. 

 

Transpose Convolution

우리는 지금까지 convolutoin의 다음 step은 map의 크기를 줄이는 것을 가정하고 네트워크를 설정하였다. 그렇다면 크기를 늘리는 것은 없을까? 아래의 1-D 모양을 보자

앞의 강의에서 1-D Convolution은 위와 같이 이루어지고 점점 map이 줄어드는 것을 확인 할 수 있다. 하지만 아래 네트워크처럼 구성하면

파란색 layer에서 오히려 1개의 bar가 3개의 bar로 늘어난 것을 확인할 수 있다. 이는 symmetric한 패턴을 기반으로 만든 것이다. 우리가 실제 scan하는 곳은 아래의 노란색 부분만이기 때문이다.

또한 위의 네트워크에서 서로다른 data를 입력으로 하는 부분인 빨간색 부분과 자신의 정보만을 입력으로 받는 파란색 부분은 서로 다른 뉴런으로 구성되어있다. scanning 하는 과정은 아래와 같다. 

위처럼 convolution의 output의 크기를 늘리는 것을 2-D에서도 사용해보면 아래 처럼 할 수 있다. 우선 output의 크기를 input의 정수배+1로 설정하는 것이 일반적이다.

위처럼 convolution을 하는데 필터를 그대로 output에 넣어버리는 방식이다. 위의 방식을 transpose convolution이라고 한다. 

 

Invariance

만약 꽃의 이미지의 유무를 파악하는데 우리가 훈련한 그림을 돌리거나 확대해서 test를 하면 꽃을 찾아낼 수 있을까? CNN은 사람처럼 꽃이라는 것을 알고 파악하는 것이 아니라 패턴을 기반으로 한 인식이기때문에 사진이 외곡되면 찾을 수 없을 것이다. 이를 위해 훈련시 애초에 shift한 것 또는 roate한 것을 만들어 훈련을 시키는데 그것이 아래 그림이다.

이런식으로 학습을 진행하면 계산량은 늘어나겠지만 점점 변화에도 대응할 수 있게 된다. 이때 Backpropagation할때 조심해야 하는데 이런 자체적인 shift나 rotate는 원본사진을 토대로 했기때문에 위의 그림에서 backpropagation을 멈추는 것이 아닌 rotate또는 shift한 사진과 원본사진과의 관계를 이용하여 원본에 대한 derivative를 구해야 한다.

 

Exact Location

위에서는 꽃의 존재의 유무를 파악하지 정확한 위치는 파악하지 못하였다. 이 방법은 output layer를 분리하는 방법으로 가능하다.

output1은 classification을 담당하고 2번째 output은 object를 둘러싸고 있는 box를 예상하는 방식이다. 이렇게 하면 divergence는 classification 결과의 corss-entrophy loss와 박스 위치에 대한 L2 loss의 합을 이용하면 된다. 이것을 Multi-task learning 이라고 한다. 다른 예로 pose estimation역시 하나는 사진에 사람이 있는지 그리고 다른 하나는 포즈를 14개의 점으로 나타낸 결과를 보여주는 것을 이용하면 된다.

 

Depth-wise convolutoin

우선 Depth-wise convolution을 보기전 일반적인 그동안 우리가 해왔던 convolution을 보면 아래와 같다.

M개의 필터가 M개의 output을 만드는 구조이다. 이때 필터의 크기를 K라고 하고 M개의 input 채널, N개의 output 채널이 있다고 하면 각각의 output에는 M*K*K크기의 3-D 필터가 생기게 된다. 그러한 output이 N개 있음으로 총 파라미터의 갯수는 N*M*K^2이다.

이와 반면 depth wise convonlution은 오직 한개의 세트의 필터를 가지고 있다. 그리고 계산 후에 이 필터들에 통째로 서로 다른 가중치를 곱해서 output을 만들어내는 구조이다.

이것은 총 2개의 stage로 구성된다. M개의 intput과 N개의 output이 있다고 하면 첫번째 stage에서는 서로 다른 K*K크기의 2D 필터가 만들어진다. 이때 만들어지는 채널의 갯수는 input 채널의 갯수와 같다. 그리고 두번째 stage에서는 M*1*1의 1D 필터를 사용한다. 이것을 앞의 stage에서 만들어진 2D 필터에 넣어서 계산하여 결과를 낸다. 이때 필요한 파라미터는 NM+MK^2개이다.NM은 첫번째 stage에서 만들어지는 것이고 MK^2는 두번째 stage에서 필요한 파라미터의 갯수이다. 

위에서 볼 수 있듯이 Depth wise가 더 필요한 파라미터의 수가 적다. 그리고 실제로 그 효과도 뒤떨어지지 않는다.