처음 써보는데 괜찮을지 모르겠으나 Object detection을 공부하기 위한 첫걸음 Resnet을 anlaysis 해보자.
그럼 시작해보도록 하자!!!!
Resnet thesis
: https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf
Resnet 참고 사이트
:https://towardsdatascience.com/understanding-and-visualizing-resnets-442284831be8
CNN 알고리즘은 정말 혁신이었다. 이를 통해 Deep Learning에서 많은 발전이 있었지만, leaning depth가 깊어지면 깊어질수록 performance degrades(성능 하락)가 발생했었다. 이 당시에 VGG16을 이용하여 학습을 하면 bottleneck(병목)현상이 발생하는 문제가 있었던 것이다. 즉, generalization capability(일반화 능력)을 상실하여 deep하게 학습할 수가 없었다.
이를 어떻게 해결해야 하지 고민하다보니 Resnet 이 나오게 되었다.
Resnet이 해결한 문제 중에 가장 유명한 것은 Vanishing Gradient이다. network가 깊어지면 기울기가 연쇄법칙을 통해 빠르게 0으로 수렴해버린다. 0이 되어 버리면 더 이상 학습을 하지 않는다. activation function인 Relu를 보자.
Relu function의 특성을보면 0이 되어버리는 순간 더 이상 학습을 진행할 수 없게 된다. 그럼 Resnet이 도대체 무슨 방법을 사용하여 Vanishing Gradient 를 해결했을까?
논문에서 Figure 2인 Residual learning의 Basic Block을 사용하여 해결하였다. Residual을 해석하면 '잔차'라고 해석이 된다. 이 Residual을 이용한 방식과 기본 방식이 어떤 차이가 있는지 확인해보자.
왼쪽의 그림은 우리가 익히 많이 보았던 평범한 CNN 구조이다. input x가 2개의 weight layer을 거쳐 output H(x)가 나오고 이 H(x)가 다음 layer의 input으로 적용되는 구조이다. 또한, 학습을 통해 최적의 H(x)얻는 것이 목표이므로 weight layer(convolution)의 파라미터는 최적의 H(x)를 내기 위해 그에 맞게 결정이 되어야 한다. 이건 많이 봤으니 이해가 될 거라 생각하는데, 문제는 오른쪽 Residual block을 이해하기 어렵다는 것이다.
무엇이 이해하기 어려울까?
1. H(x) = x가 되도록 학습시킨다.
2. (Network) Output F(x)는 0이 되도록 학습시킨다.
처음 공부할때, 이부분을 이해하기 힘들읍읍ㅇ..
머리는 이해되는데, 막상 글로 적으려니 어떻게 써야할지 어질어질.. ㅇ.ㅇ;;
1번과 2번은 말만 다르지 똑같은 말이다. 이를 식으로 써보면 H(x) = F(x) + x 가 나온다.
여기서 F(x) = 0 으로 mapping을 시킨다면 결국엔 H(x) = x를 학습하는 꼴이 되는 것이다.
이 F(x) = 0 으로 학습을 시키는 이유는 논문에서 그러한 방식이 좋다고 나와있다.
Resnet thesis) To the extreme, if an identity mapping were optimal, it would be easier to push the residual to zero than to fit an identity mapping by a stack of nonlinear layers
잔차를 0으로 학습시키는 것이 훨씬 쉽다고 얘기하고 있다. 여기서 잔차는 H(x) - x를 의미한다. 이 이유는 activation function인 Relu를 사용하여 F(x) = 특정 ID(number)로 mapping하는 것보다 0에 mapping하는 것이 훨씬 쉬우니 그런 것 같다.
이제 이 이후에 H(x) = F(x) + x = x (F(x) = 0)인 형식이고 이를 미분해도 H'(x) = F'(x) + 1 = 1이 남게 되어버려 vanishing Gradient도 해결할 수 있게 된다. 이는 모든 layer에서 적용이 된다.
이러한 방식을 identity shortcut connection이라 말하고 있다.
Resnet의 구조는 위의 34-layer residual을 보면 쉽게 이해된다.
위와 같은 구성을 갖는다 생각하고 실제로 도식화를 해보자.
논문에서 layer의 name을 각각 conv1, conv2_x, conv3_x, conv4_x, conv5_x로 써 두어서 각각의 단계를 도식화 해보았다.
그럼 각 layer들을 자세히 알아보자
Output size 구하는 공식은 CNN을 다시한번 훑어보도록 하자.
우선 알아야 할 것은 input_size에 zero padding을 3번을 하는데, 그 이유는 pytorch documentation에 들어가서 찾아보면 된다.
이 다음 순서에는 batch normalization으로 이어지는데
pytorch batch normalization https://pytorch.org/docs/stable/generated/torch.nn.BatchNorm2d.html
모든 layer에 다 수행하며, volume size(image size)랑은 상관관계가 없다.
잠시 이 글을 읽고 오자!
https://velog.io/@joon10266/Max-Pooling-%EB%8F%99%EC%9E%91-%EC%88%9C%EC%84%9C
Max pooling에 관한 내용인데, 읽고 나면 조금 더 이해하기 쉽다.
Max pooling을 하고 나면 Conv1의 과정은 모두 끝이 나고 논문에서 나온 표와 동일하게 output_size = (56, 56) Feature map들이 나오게 된다.
Conv1 과정은 대부분 CNN 구조와 동일하며, 다음 Conv2_x 부터 Resnet의 구조가 들어가게 된다.
본격적으로 Resnet이 어떻게 구성되어 있는지 도식화해서 알아보자.
위의 CNN과 거의 동일하다. 단, 여기서는 stride=2를 주는 것이 아니라 stride=1을 주어 input_size를 줄이지 않는다.
ouput_size가 줄지 않는 것에 주목하라. 그리고 Identity shortcut connection을 이용해 bypass하는 과정이다.
이제 Conv2_x의 마지막까지 왔다. Identity shortcut connection 빼고는 일반 CNN과 다를게 없다.
다음 Conv3_x 부분을 배우기 앞서 앞에 잠시 말했었던, Projection shortcut connection 을 상기하도록 하자. Projection shortcut connection은 1*1 convolution으로 동작시킨다.
Resnet 논문을 보게되면 dot layer representing the change of the dimensionality로 차원의 변화를 나타낸다고 한다. 이를 도식화 하면
Conv3_x 전체를 도식화하면
이러한 형태를 갖게 된다. 이는 Conv4_x에서도 동일하게 반복된다.이와 같은 구성을 갖고 있는 것은 Resnet-34이다. Resnet-34를 도식화하여 이해가 됬다면 Resnet-50을 따로 공부할 필요는 없다고 생각한다. 흘러가는 방식은 비슷하지만 1*1 convolution으로 차원을 줄이고 늘렸냐의 차이만 있다고 생각한다.
Resnet-34를 도식화하여 이해를 하다보니 Resnet-50을 굳이 파고 들지 않아도 저절로 이해가 되었다. 딥러닝을 공부한지 얼마 안되다보니 Resnet을 제대로 이해하는데 많은 시간이 걸렸다. 처음 논문을 보면서 낑낑대고 해석하고 찾아보고 Resnet network를 공부하면서 CNN에 대해서도 제대로 몰랐던 부분이 생겼고, 추가적인 공부가 계속해서 생기다 보니 예상했던 시간보다 오래걸렸다 ㅠㅠ. 그래도 제대로 이해했다고 볼 순 없지만 여러번 반복하면서 잘못된 부분을 수정해갈 예정이다.
누가 그러더라... 초보자는 하나의 논문을 여러번 읽고 분석하는 것이 좋다고..