Ustage Day 8
in 네이버 부스트 캠프 on Main Course
CNN에 대한 설명을 진행한다.
부스트 캠프 8일차 학습 요약
- 행사 : Git 특강, 멘토링
- 학습 : Convolution은 무엇인가?, Modern CNN, Computer Vision Applications
- 피어 세션
목차
1. Convolution은 무엇인가?
1-1. Convolution
- 두 개의 함수를 잘 합쳐주는 혹은 Operator를 의미한다.
1-2. 2D Convolution의 의미
- Blur, Emboss, Outline 등의 의미가 될 수 있다.
- Filter의 Channel과 Image의 Channel은 같다.
- 결과의 Channel이 1이 아니라면 결과의 Channel 수 만큼의 Filter가 활용된 것이다.
1-3. Convolutional Neural Network의 구성
- Convolution Layer, Pooling Layer, Fully Connected Layer로 구성되어 있다.
- Convolution & Pooling Layer : Feature Extraction (정보 추출)
- Fully Connected Layer : Decision Making (분류, 회귀 등의 우리가 원하는 출력을 얻게 해준다.)
- 내가 학습시켜야 하는 Parameter의 숫자가 늘어나면 늘어날수록 학습이 어렵고 Generalization Performance가 떨어진다는 것으로 알려져 있다.
- Layer 별로 몇 개의 Parameter로 이루어져 있고, 전체 Parameter의 숫자가 몇 개인지에 대하여 항상 잘 파악하고 있는 것이 중요하다.
1-4. Concept of Notation
- Stride
- Kernel을 몇 칸 마다 적용할 것인가.
- Padding
- 기존의 Input의 테두리에 Padding을 해줘서 가장자리에 대한 정보를 유지할 수 있도록 한다.
- Parameter
- Kernel size * Input Channel * Output Channel
- Stride, Padding은 Parameter 수와는 무관하다.
- Convolution Network에서는 Kernel이 모두 동일하게 적용되기 떄문에 Parameter의 수가 Fully Connected Layer에 비해 적다.
- Fully Connected Layer를 줄이고 Convolution Network를 깊게 쌓음으로서 전체 Parameter의 수를 줄이는 것이 트렌드이다.
1-5. 1x1 Convolution
- Dimension Reduction (Channel의 수를 줄일 수 있다.)
- Convolution Network를 깊게 쌓으면서 동시에 Parameter 수를 줄일 수 있다.
- Bottleneck Architecture
2. Modern CNN
- Network의 Depth는 깊어가고 Parameter의 수는 점점 줄어드는 추세이다.
- 5개의 Network들의 주요 아이디어와 구조에 대하여 배운다.
- AlexNet
- VGGNet
- GooLeNet
- ResNet
- DenseNet
2-1. AlexNet
- 11x11 Kernel을 활용한다. But, Parameter 입장에서 11x11을 활용하는 것은 좋은 선택이 아니다. -> VGG를 통해 알 수 있다.
- 11x11 Kernel을 활용하면 볼 수 있는 영역이 넓어지지만 Parameter의 수가 많이 커진다.
- 5개의 Convolutional Layers, 3개의 Dense Layers로 구성되어 있다.
- Key Ideas
- ReLU Activation 활용
- Linear Model들이 가지고 있는 좋은 성질들을 가지고 있다.
- 최적화하기 쉽다.
- Generalization이 좋다.
- Gradient Vanishing 문제를 극복한다.
- 2개의 GPU 활용
- Overlapping Pooling
- Data Augmentation
- Dropout
- ReLU Activation 활용
2-2. VGGNet
- 3x3 Kernel만을 활용하였다.
- 3x3 Kernel을 두 번 활용하는 것과 5x5를 한 번 활용하는 것은 Receptive Field가 같다. 즉, 층은 깊어지면서 Parameter의 수가 동일하므로 더 좋은 효과를 거둘 수 있다.
- 요즘 트렌드는 7x7 Kernel을 벗어나지 않는다.
- 1x1 Convolution for Fully Connected Layer(중요한 것은 아니다.)
- Dropout(p=0.5)
- Layer의 개수에 따라 VGG16, VGG19라고 불린다.
2-3. GoogLeNet
- 1x1 Convolution Net을 중간중간에 잘 활용하여, 어떻게 하면 전체적인 Parameter의 수를 줄일 수 있을 지에 대하여 알 수 있다.
- Inception Block을 활용한 Network-in-Network
- Inception Block은 다음과 같다.
- Inception Block을 활용함으로서 Parameter의 수를 줄일 수 있다.
- 1x1 Convolution은 Channel-wise 차원 축소를 해준다.
2-4. ResNet
- Parameter의 수가 많으면 Overfitting이 일어날 수 있다.
- Network가 깊어진다고 해서 학습을 더 잘 시키는 것만은 아니다.
- Residual Connection(Identity Map)을 추가하게 된다.
- ResNet을 활용하게 깊게 쌓을수록 학습이 더 잘 된다.
- Short Cut의 값을 더하기 위해서는 차원이 같아야한다. 이 때, 차원을 맞춰주기 위해서 1x1 Convolution을 활용하는데, 요즘에는 많이 사용하지는 않는다.
- Batch Normalization이 Convolution 뒤에 일어난다.(논란이 많다.)
- Bottleneck Architecture
- Conv 앞단과 뒷단에 1x1 Conv를 활용한다.
- 이렇게 해서 궁극적으로 우리가 원하는 Output Dimension을 만들 수 있다.
2-5. DenseNet
- ResNet이 원래 것과 ShortCut을 + 했다면, DenseNet은 원래 것과 ShortCut을 Concatenation([,]) 한 것이다.
- Channel이 커짐에 따라 Convolution Feature Map의 크기 역시 기하급수적으로 커진다.
- 중간 중간에 Convolution을 활용하여 Parameter의 수를 줄여준다.
- Dense Block으로 키운 후에 1x1 Conv를 활용해 줄여주고를 반복한다.
- Dense Block
- 각 Layer를 지나는 모든 레이어에 Feature Map을 Concate한다.
- Channel의 수가 기하급수적으로 커진다.
- Transition Block
- Batchnorm -> 1x1 Conv -> 2x2 AvgPooling
- 차원 축소
- Network를 만들어서 무언가를 해야겠다고 한다면, 보통 ResNet 혹은 DenseNet 구조를 활용한다면 웬만큼의 성능은 잘 나온다.
2-6. Summary
- VGG : Repeated 3x3 Block
- GoogLeNet : 1x1 Convolution
- ResNet : Skip-Connection
- DenseNet : Concatenation
3. Semantic Segmentation
- 자율주행에 사용된다.
- 이미지로 해결하는 문제에서는 Semantic Segmentation을 잘 활용하는 것이 매우매우 중요하다.
3-1. Fully Convolutional Network
- ‘Dense Layer를 없애고 싶다.’에서 출발하였으며, 이를 활용하여 Dense Layer를 없앨 수 있다.
Dense Layer를 활용하나, Fully Convolutional Network를 사용하나 Input과 Output은 동일하다. Parameter가 정확히 일치한다.
- Prameter, Network, Output 전부 똑같은데 Semantic Segmentation 관점에서 왜 Dense Layer를 사용하지 않고 Fully Convolutional Network를 사용하는가?
- Convolution의 경우 Input image의 크기와 상관없이 Kernel이 동일하게 찍기 때문에, Resulting Special Dimension만 같이 커지지 여전히 동작시킬 수 있다.(Dense의 경우 이미지가 너무 커지게되면 동작시킬 수 없을 수 있다.)
- Convolutionalization을 하게 되면, 이미지가 커짐에 따라 분류만 했던 것도 Semantic Segmentation을 할 수 있게 된다.
- Fully Convolutional Network(FCN)은 어떠한 input size에 대해서도 작동할 수 있다.
- Output Dimension은 줄어든다. (Coarse Output을 Dense Pixel로 바꿔줘야한다. -> 늘리는 방법이 필요하다.)
3-2. Deconvolution(Conv Transpose)
- 쉽게 이야기하자면 Convolution의 역연산(하지만 실제로 Convolution의 역연산을 구할수는 없다.)
- Dimension을 키워주게 된다.
3-3. Detection
- Bounding Box를 찾는 것이다.
R-CNN
- Extract Region Proposals (크기에 상관없이 일단 Bounding Box를 뽑는다.)
- Compute CNN Features (Bounding Box를 똑같은 크기로 맞춰서 CNN을 실행한다.)
- Classify Region (각 Boudning Box에 대하여 라벨을 추출한다.)
SPPNet
- R-CNN의 문제 -> 이미지 안에서 Bounding Box를 N개를 뽑으면 N개의 이미지 혹은 팻치를 전부 CNN에 통과시켜야 한다. 즉, N개가 모두 Conv Net을 통과해야지 하나의 이미지가 돌어가게 된다.
- 한 이미지에서 CNN을 한 번만 통과하면 추출할 수 있도록 하자.
- Image에서 Bounding Box를 뽑고 이미지 전체에 대해서 Convolution Feature Map을 만든 후, Bounding Box에 위치하는 Convolution Feature Map의 Tensor를 긁어온다. 이 Tensor를 뽑아오는 것만으로도 Region 별로 진행하기 때문에 R-CNN에 비해 훨씬 빠르다.
Fast R-CNN
- SPPNet과 비슷한 아이디어 활용
- Bounding Box를 미리 몇 개 꺼내온다.
- Convolutional Feature Map을 한 번 얻는다.
- 각 Region에 대하여 Fixed Length Feature를 ROI Pooling을 통해 뽑느다.
- Neural Network를 통해서 내가 얻은 Bounding Box를 어떻게 움직이면 좋을지를, 그리고 Label을 찾게 된다.
Faster R-CNN
- Image를 통해서 Bounding Box를 뽑아내는 Region Proposal 역시 학습하자.
- Region Proposal Network + Fast R-CNN
- Region Proposal Network(RPN)
- 이미지가 있을 때, 이 이미지의 특정 영역(Patch)이 Bounding Box로서의 의미가 있을 지 없을지를 찾아준다. 어떤 의미인지는 모른다.
- Anchor Box : 미리 정해놓은 Bounding Box의 크기 -> 대충 이러한 크기의 Object가 이 이미지 속에 들어있다는 것을 알고 있어야 한다.
- K개의 템플릿들을 미리 만들어 놓고, 얼마나 바뀔지를 찾고 궁극적으로 템플릿을 미리 고정해놓는 것이 RPN의 가장 큰 특징이다.
- Fully Convolution Network가 사용된다.
YOLO
- 어느 정도 잘 작동하며, 앞서 등장한 모델들 보다 훨씬 빠르다.
- Resion Proposal에 대한 Step이 없기 떄문에 한 번에 한다. (Object의 위치와 그게 무엇이 의미하는지를 한 번에 알아낸다.)
- Anchor Box가 없다.
- 과정
- 이미지가 들어오게 되면 이를 SxS Grid로 나눈다.
- 이 이미지 안에, 우리가 찾고 싶은 물체의 중앙이 있고, 그 중앙이 Grid 안에 들어가면 그 Grid Cell이 해당 물체에 대한 Bounding Box와 그 해당 물체가 무엇인지를 같이 예측해준다.
- 각 Cell은 B개의 Bounding Box를 예측하게 된다.
- 각 Bounding Box의 x,y,w,h를 찾아주고 그 Bounding Box가 실제로 쓸모있는지 없는지(Box Probability)를 찾아준다.
- 그와 동시에, 각각의 SxS Grid가 이 Grid Cell에 속하는 중점에 있는 Object가 어떤 Class인지를 예측하게 된다.
- SXSX(B*5+C)
4. 피어 세션
4-1. [이전 질문 리뷰]
ViT(Visual Transformer): 금일(21210811) 19시 멘토링 시간에 질문하기로 함. 각 Patch를 차원이 줄여진 잠재 벡터(latent vector)로 볼 수 있는가? MNIST dataset 사용 기준 각 (4,4)의 크기의 Patch 49개가 생성된다.
4-2. [금일 질문 목록]:
CNN 수강 관련 질문 Dense layer를 잘 이해하지 못하겠다. Fully Connected Layer과 같은 것. Dense layer의 가중치 또한 학습이 진행되는가? 에러에 따라 모든 (Conv, FCN)의 가중치들의 학습이 진행된다. Convolution 연산에서 가중치의 차원은 (kernel_W, kernel_H, in_channel, out_channel)과 같다. 그렇다면 in_channel 기준으로 같은 값으로 연산이 진행되는지(Broadcasting) 또는 각 in_channel마다 다른 값을 가지는지 궁금하다. 강의에서 학습할 가중치의 개수가 “kernel_W * kernel_H * in_channel * out_channel” 이라고 설명한 것으로 미루어 보아, 각각 다른 in_channel 가중치는 각각 다른 값을 가질 것이라고 생각된다. e.g. in_channel 기준 각각 다른 가중치의 값은 다음과 같다. (parameter[0,0,:,0])
4-3. [선택과제 3번 살펴보기]
Mixture_density_Network_문제 일대일 대응이 아닌 그래프에 대해 회귀(근사)를 어떻게 할 것인가? 위 식에서 변수 y의 의미 가우시안 분포의 변수로 생각됨. 또한 위의 식은 x, y축이 서로 바뀐 것으로 생각됨. 과제 설명 중 MSELoss(Mean Squared Error Loss)를 사용하지 못한다고 했다. 이에 관한 질문. 로그 우도(Log Likelihood)를 사용하려고 한 것 같다. Gumbel softmax sampling에 대해 알고싶다.
4-4. [ViT 관련 추가 질문]
Q, K, V 가 각각 의미하는 것이 무엇일까? 단어와의 연관성, cosine 유사도 관련 설명 진행함
5. 8일차 후기
Git 특강을 통해서 Git에 대한 전반적인 활용도에 대하여 알게 되었고, 이를 활용한 협업 방법을 배울 수 있었다. 그동안 혼자서 공부하고 혼자서 정리하는 습관이 들여져 있었지만 함께하는 것에 서툴었기 때문에 정말 정말 소중한 강의였고 이를 바탕으로 Git에 조금 더 익숙해지고 협업에도 입문을 해보고 싶다.
더불어, CNN에 대한 내용을 배움으로서 CV에 대한 흥미가 조금은 더 올라갔던 것 같다. 사실, 이전에도 CNN에 대한 내용을 공부했지만 벽에 부딪힌 감이 있었는데 이번 강의를 통해서 어느 정도 이해할 수 있었고 조금 더 보충을 한다면 어느 정도의 감을 가지고 앞으로의 강의 및 프로젝트에 임할 수 있을 것이라고 생각한다.
6. 해야할 일
- Dense Layer가 Mulilayer Perceptron과 똑같은가?
- 꼭 Dense Layer를 사용해야하는가?
- Overlapping Pooling?
- Receptive Field란?
- ResNet은 기존의 정보를 함께 활용하는 기법인건가?
- Further Question : 수업에서 다룬 Modern CNN Network의 일부는, Pytorch 라이브러리 내에서 Pre-trained 모델로 지원한다. Pytorch를 통해 어떻게 불러올 수 있을까?(https://pytorch.org/vision/stable/models.html 참고)
- Dense Layer를 활용하나, Fully Convolutional Network를 사용하나 Input과 Output은 동일하다. Parameter가 정확히 일치한다. -> 완전히 똑같은가?
- Fully Convolutional Network에 대한 보충
- Fast R-CNN : ‘각 Region에 대하여 Fixed Length Feature를 ROI Pooling을 통해 뽑느다.’은 무슨말?