[Deep Learning] Convolutional Neural Network (2)

2023. 5. 3. 21:00
🧑🏻‍💻용어 정리

Neural Networks
Feed-forward
Backpropagation
Convolutional Neural Network
stride
filter
kernel
topology
MLP
image
multi-channel
sparse connection
parameter sharing
AlexNet
VGGNet
ResNet
GoogLeNet
LeNet
transfer learning

 

 

지난 시간에는 Convolutional operation에 대해 다뤘습니다.

 

오늘은 CNN의 구조에 대해 살펴보겠습니다.

 

CNN Architecture

 

 

sparse connection

sparse connection concept를 봅시다.

 

 

위와 같이 dense connections를 우리가 지금까지 봐온 MLP라 볼 수도 있고, dense layer라고도 부릅니다.

 

또는 fully-connected라고도 많이 사용합니다.

 

그렇다면 Dense connections에서는 S3 하나를 만들어주기 위해서 모든 input이 연결되어 있는 상태입니다.

 

CNN은 위와 같습니다.

 

MLP에서 몇 개의 connection만 끊은 것이 CNN이지만,

 

오해하면 안 되는 것이, 몇 개로 선정된 것은 input image의 지역적 정보를 추출한 몇 개가 된다는 것입니다.

 

 

 

weight sharing

 

일단, weight sharing이나 parameter sharing이나 같은 이야기죠.

 

우선, MLP에서는 아래 그림에서 보면 25개의 connection이 전부 다 다른 weight를 가집니다.

 

그런데, 그 위의 CNN의 경우는 같은 weight가 계속해서 등장합니다.

 

MLP는 25개, 그리고 CNN은 서로 다른 3개의 weight를 연결시켜줍니다.

 

 

 

kernel

출처 : https://towardsdatascience.com/types-of-convolution-kernels-simplified-f040cb307c37

이 kernel이자 filter는 weight를 어떻게 연결시켜 놨느냐 그 차이입니다.

 

그런데 이것을 kernel이라고 부르는 이유는,

 

이미지 처리에서 기존부터 써오던 kernel이 있습니다.

 

그래서 그것에서 영향을 받은 부분이 있습니다. kernel을 이용해서 image의 특성을 추출하는 과정말이죠.

 

여기에 Backpropagation의 weight update 개념이 합해집니다.

 

그래서, 기존 학습 방법은 weight, 즉 kernel이 정해져있지 않습니다.

 

이 또한 update가 필요합니다.

 

 

 

Pooling

 

앞에서 살펴본 convolutional operation과 동등하게 중요한 것이 바로 pooling operation입니다.

 

 

이 pooling의 concept은 convolutional operation과 유사합니다.

 

convolutional operation은 좀 더 지역적으로 summary를 하자는 것이었죠.

 

이 pooling은 조금 더 직접적으로 summary를 하자는 concept입니다.

 

 

위 사진을 보면, stride 2로, 2 x 2의 filter로 max pooling을 하는 것입니다.

 

max pooling이라는 것은 그저, 이 filter 안에 들어온 값 중 가장 큰 값을 골라내는 것입니다.

 

 

절차는, convolutional operation 이후 activation을 위해 ReLU와 같은 것을 사용하고, 그 다음 pooling operation을 하는 방식입니다.

 

결국, max pooling은 가장 크게 activation된 값만 그 다음 단계로 넘겨주겠다는 것입니다.

 

사실 작게 activation 된 것은 우리가 representation을 결정함에 있어 크게 영향을 못 주기 때문입니다.

 

이렇게 함으로써, 조금 더 simple한 의미를 갖는 부분도 있고, Regularization 측면도 존재합니다.

 

 

결국 max pooling은 네모의 neighborhood에서 가장 큰 값을 취합니다.

 

그리고 다음과 같은 pooling의 종류가 있습니다.

 

-> Average pooling, L2 pooling, weighted average pooling, global average pooling, etc ..

 

위는 상황에 따라 문제에 따라 적용이 다르게 됩니다.

 

 

그리고, pooling에서의 Backpropagation은 index를 기억해뒀다가 뒤로 가는 식으로 진행됩니다.

 

 

 

 

 



 

 

밑 그림에 보면 convolution operation이 한 칸씩 이동했으므로 stride가 1이라 보면 되고,

 

downsampling은 pooling이라고 보시면 됩니다.

 

 

그리고 위 사진은 stride가 2인 것으로 보입니다.

 

 

 

 

zero padding은 무엇일까요?

 

우리가 convolutional operation을 한다는 것은, 위 layer로 갈 수록 Image의 size가 작아짐을 의미합니다.

 

그리고 여기에 pooling operation까지 하면 너무나 많은 downsampling이 일어날 것입니다.

 

이것은 조금만 지나도 matrix의 크기가 엄청나게 줄어들 것입니다.

 

 

그래서 이를 방지하기 위해서 가장 자리에 zero padding이라고 하는 technique를 써줍니다.

 

그래서 주변에 0을 둘러서 kernel이 0을 포함하여 돌게 됩니다.

 

 

 

 

 

이 architecture를 봅시다.

 

input인 256 x 256 x 3에서 convolution과 ReLU를 거치니 256 x 256 x 64가 되었습니다.

 

64 channel로 늘어났죠.

 

그 말은, 64개의 representations을 후보군으로 놓고, 위로 올라가면서 뭐가 더 적합한지 요약해보겠다는 것입니다.

 

pooling을 stride 4로 진행하여 1/4로 축약이 되었습니다.

 

channel은 그대로 입니다.

 

channel 단위로 pooling하는 경우도 있지만 이 경우는 그대로 입니다.

 

image가 조금 더 필요없는 부분은 버리고 중요한 부분만 남기는 식으로 진행되는 것이 보입니다.

 

 

그리고, convolutional operation과 ReLU를 거칩니다. 그런데 size가 똑같죠.

 

이 말은, zero-padding이 되어 있기 때문에 똑같이 나온 것으로 볼 수 있습니다.

 

그리고 또 pooling operation을 거쳐서 16 x 16 x 64의 size가 나옵니다.

 

그래서 이 convolutional 과정은, convolutional operation + ReLU + pooling operation이 이루어진 것입니다.

 

이렇게 보면, 이것은 feature map을 만드는 과정입니다.

 

이것은 feature extraction이라고도 하고, representation learning이라고도 합니다.

 

 

그 위의 16,384개의 nodes들을 가지는 부분을 봅시다.

 

그 전의 16 x 16 x 64의 nodes들을 vector로 쫙 펼치면 16,384개의 nodes들이 나옵니다.

 

이것을 flatten이라고 합니다.

 

 

vector화 해준 이유는, MLP를 돌려서 output을 1000개로 만들어주기 위해서입니다.

 

그리고 output class에서 1,000 class classificaiton하겠다는 의미입니다.

 

 

 

첫 예시를 보면,

 

앞 단계에서는 representation learning을 한 다음, 뒤 단계에서는 flatten을 통해서 vector화 시켜준 다음, MLP를 적용해서 classification을 해준 것입니다.

 

이 전체는 CNN입니다. convolutional layer가 하나라도 있으면, 우린 그걸 CNN이라고 부르기로 했으니 말입니다.

 

 

CNN이라는 모델 내에서, 하부 Layer에서는 convolutional operation 등을 통해서 representation을 찾아내고,

 

상부 Layer에서 classification할 때는, 다시 잘 알려진 classifier인 MLP를 도입하여 classification을 합니다.

 

이 첫 예시는 굉장히 올드한 방법이지만 default의 방식입니다.

 

 

 

두 번째 예시는, representation learning에서 pooling을 갑자기 3 x 3 x 64로 확 줄여버립니다.

 

이것을 또 reshape을 해서 576개를 만들고, 위에는 똑같이 MLP를 통해서 1,000 class classification을 합니다.

 

 

이것도 전통적인 방식으로, 하부에서는 Convolutional operation, 상부에서는 MLP를 이용한 classificaiton을 했습니다.

 

여기서 pooling을 확 줄여서 정보를 엄청나게 축약했습니다.

 

이것만 보고 뭐가 좋은지는 알 수 없습니다.

 

 

세 번째 예시 보겠습니다.

 

이것은 representation learning은 첫 번째 예시와 같습니다.

 

그런데 이것은 flatten 하지 않고, 갑자기 16 x 16 x 1,000으로 convolutional operation을 합니다.

 

갑자기 channel을 1,000으로 늘리죠.

 

그리고 average pooling을 통해서 1 x 1 x 1,000으로 만듭니다.

 

여기서 MLP classifier를 사용하지 않고, global average pooling을 했습니다.

 

그래서 scalar 값 하나로 만들어준 것입니다.

 

 

 

그래서 이 과정을 통해 1,000개 짜리 vector와도 같은 결과가 나오게 됩니다.

 

그래서, 여기서 softmax를 통해서 classification을 합니다.

 

그렇다면, 상단에서 MLP를 도입하지 않고, 끝까지 convolutional operation을 통해 끝까지 뽑아낸 것입니다.

 

이것이 더 최근의 방법입니다.

 

 

그리고 MLP를 사용하면 Convolutional operation 보다 훨씬 더 많은 weight를 사용하게 됩니다.

 

위 예시에서만 봐도 그렇습니다.

 

 

그럼 아래 그림을 통해 CNN의 Achivement를 좀 살펴봅시다.

 

 

AlexNet부터 시작하여 위 그림과 같이 있습니다.

 

오른쪽에 VGG가 가장 무거운 모델이지만 성능이 가장 좋은 것은 아닙니다.

 

더 좋은 효율을 내는 모델이 있습니다. 더 가벼워도 더 좋은 성능을 내는 것을 더 효율이 좋다고 합니다.

 

그리고 아래 다른 network를 살펴보겠습니다.

 

 

 



LeNet(1998)

 

위 network를 봅시다.

 

32 x 32에서 convolutional operations를 통해서 28 x 28 x 6로 channel을 6개로 늘립니다.

 

그리고, subsampling인 pooling을 통해서 채널 개수 유지하며 반으로 줄입니다. 14 x 14 x 6

 

다시 convolutional operation을 통해 size를 줄이고 feature map을 16개까지 늘립니다. 10 x 10 x 16

 

그리고 또 subsampling을 통해  5 x 5 x 16으로 줄었습니다.

 

 

그렇다면 마지막에는 5 x 5 x 16의 flatten 원소들이 존재하게 됩니다. full connection으로 가며 MLP를 취하는 것이니, flatten 되는 것이라 보면 됩니다.

 

이 400개의 원소를 MLP에 태워서 120, 84, 10으로 줄여나갑니다.

 

그리고 마지막에 softmax를 취합니다.

 

 

이것은 굉장히 simple한 CNN이라고 보시면 됩니다.

 

 

 

AlexNet(2012)

 

이것은, 224 x 224 x 3의 multi channel을 11 x 11 x 3의 kernel을 통해서 55 x 55 x 48로 만들고 쭉쭉 전개해 나갑니다.

 

매번 max pooling을 하는 것이 아닌, 할 때 있고 안 할 때 있습니다.

 

그리고, 마찬가지로 마지막에는 dense layer를 통해서, 즉 MLP를 통해서 classification을 했다고 보시면 되겠습니다.

 

 



VGGNet(2014)

 

먼저, size 유지하며 224 x 224 x 3에서 224 x 224 x 64로 convolutional operation을 통해 channel의 수를 늘렸습니다.

 

그리고 downsampling, 즉, pooling을 합니다.

 

그리고 convolution을 2번 하고 pooling, 다시 convolution을 3번하고 pooling, 또 convolution 3번, pooling 한 번, 또 반복 합니다.

 

convolution은 여러 번 하고, pooling은 convolutional operation 여러 번에 한 번 정도만 summarization을 위해 합니다.

 

 

그리고, 또, fully connection 후 마지막에 softmax를 통해 1,000 class classification하는 모델입니다.

 

이것이 무거운 이유는 fully connected layer가 복잡하기 때문에 여기서 weight가 굉장히 많이 필요합니다.

 

이 VGGnet은 굉장히 유명한 transfer learning 도구 입니다.

 

이 transfer learning은 무엇이냐하면,

 

이미 만든 사람들이 학습까지 시켜놓은 이 VGGnet을 가져와서 fine-tunning만 시켜서 사용하는 것을 의미합니다.

 

 

그런데, 그러한 모델은 있는 그대로 사용하는 게 좋습니다.

 

그래도, 원하는 task에 집어넣기 위해서는 밑에는 freeze 시켜놓고, 즉, fix 시켜 놓고 위에만 fine-tunning을 합니다.

 

다른 사람이 이미 학습시켜놓은 모델에 조금만 내 데이터에 맞게 바꾸는 것입니다.

 

이것을 transfer learning이라고 합니다. (전이학습)

 

 

 

그런데, 뒤쪽 fully connection 부분은 복잡하기 때문에 잘 학습시켜놓은 모델에 내가 어설프게 몇 개의 데이터로 fine-tunning을 시도하면 틀어질 수 있습니다.

 

어째튼 이 VGGNet은 transfer learning에 굉장히 많은 영향을 준 모델인 것은 자명합니다.

 

 

GoogLeNet(2014)

 

 

 

 

자, 이제 굉장히 복잡해졌습니다..

 

위 좌측 자료를 보면, convoltional operation, max pooling은 같은데, LocalRespNorm은 뭘까요?

 

Local Response Normalization입니다.

 

channel이 여러 개니까, channel의 같은 위치에 있는 pixel들 끼리 normalization을 해준다는 것입니다.

 

이 normalization을 해주는 이유는 너무 크게 activation 된 것에 의해 지배적인 영향을 받을 수 있기 때문에 이것을 방지하는 것입니다.

 

그리고 여기서 또 왼쪽 사진에서 오른쪽으로 이어져 갑니다. 그것을 짤라 놓은 것입니다.

 

하나로 합쳐지고 갈라지고를 반복하죠.

 

 

이 convolutional filter가 앞 부분 빼면 굉장히 simple합니다.

 

depth를 높게 쌓은 대신, 한 층 한 층의 convolutional filter는 굉장히 작은 filter로 구성되어 있습니다.

 

그럼 이 갈라지는 부분은 뭘까요?

 

 

이것을 inception module이라고 합니다.

 

여러 종류의 filter를 병행해서 사용하여 그 중에 가장 좋은 것을 택합니다.

 

 

 

지금 어던 convolutional filter가 이 상황에 좋은지 모르니, 4단계로 갈라져서 concatnate를 통해서 가장 좋은 쪽으로 어차피 backpropagation 중 weight가 update될 것입니다.

 

문제를 접할 때, 그 문제에 가장 좋은 filter 형태를 여기서 병렬적으로 본 다음, 가장 좋은 것을 선택합니다.

 

사실, 선택은 아닙니다.

 

가장 좋은 것이 학습되도록 하는 것입니다.

 

결국 더 잘 적용이 되는 filter들이 더 잘 update가 되는 것이겠죠.

 

 

그리고, 1 x 1 convolution을 통해 원본을 유지합니다. (Bottleneck layer)

 

1 x 1 convolution을 통해서 linear transform 수준의 연산을 합니다.

 

이것을 통해서 원본 유지하는 bottleneck layer를 둡니다.

 

이 layer가 깊어질 수록 원본을 계속해서 까먹게 됩니다.

 

그런데 이 1 x 1 convolution은 linear transform을 그대로 전달해주는 역할을 하게 되는 것이죠.

 

그래서, 다음 단계로 올라갔을 때, 수많은 convolutional operation으로 원본의 이미지가 많이 소실이 되었다면,

 

오히려 여기서 과거를 한 번 상기시켜 주는 것입니다.

 

그러면서 결과로 나오는 feature map들이 너무나 이상한 방향으로 가는 것을 방지해 주는 것입니다.

 

 

Bottleneck layer라고 부르는 이유는 정보를 축약했다가 다시 펼치기 때문입니다.

 

이것을 통해 채널 수를 조작할 수도 있습니다. 채널 수만 늘리고 싶을 때,

 

2 x 2 같은 것을 하면 연산이 늘어나므로, Bottleneck layer를 사용하기도 합니다.

 

그래서 이 GoogLeNet은 병렬 처리에 Bottleneck layer로 이루어져 있다고 보시면 됩니다.

 

 

ResNet(2015)

이 ResNet은 원본을 까먹지 않는 것을 철저하게 지킵니다.

 

반복적으로 원본을 보여줍니다.

 

이것을 skip connection이라고 합니다.

 

 

 

왼쪽이 일반적인 plain net입니다.

 

그리고, 우측은 Residual net입니다.

 

왼쪽을 먼저 보면,

 

weight layer는 뭐가 됐든, convolutional operation이나 matmul이 됐든, 진행합니다.

 

그리고, activation하고,

 

이 연산을 두 번 거쳤을 때를 H(x)라고 합니다.

 

 

그리고 우측을 보면,

 

input x를 똑같이 연산을 거친 것을 F(x)라고 하고,

 

여기서, 이 연산들을 skip시키고 자기 자신인 identity를 이 skip connection을 통해서 보여주는 것이 x가 됩니다.

 

그래서 이 F(x)와 x를 합쳐서 H(x)라고 합니다.

 

이 x는 weight가 없습니다.

 

그러므로, 이 모델은 원본에 대해서 달라지는 부분만 학습을 하게 됩니다.

 

이 F(x)가 residual입니다. 한국어로 잔차입니다.

 

 

이 원본으로부터 달라지는 부분인 residual만 학습을 하겠다는 게 ResNet입니다.

 

원본을 까먹으니 이러한 network가 나오게 된 것입니다.

 

 

이것도 VGG와 같이 transfer learning의 강자입니다.

 



DenseNet(2016)

 

 

 

이 DenseNet을 살펴보면, 우리가 아는 convolutional operation과 pooling layer에 dense block이 중간 중간 들어갑니다.

 

위 standard connectivity가 그냥 쭉 연결이 되어 있는 형태입니다.

 

그리고 ResNet Connectivity는 element-wise feature summation을 통해 중간 중간에 더해주는 형태입니다.

 

DesnNet은 모든 과거의 것을 모든 경우의 수에 대해 다 보여줍니다.

 

이것은 element-wise operation이 아닌 concatenation operation을 합니다.

 

ResNet은 중간 중간에 원본의 것을 보여준다고 하면,

 

이 DenseNet은 과거의 있던 모든 feature map을 다 보여준다고 보시면 될 것 같습니다.

 

 

위 사진으로 봤을 때,

 

DenseNet은 과거의 있던 모든 feature map이 다 concatenation되어서 봅니다.

 

합산해서 보는 것이 아닌, 이전까지의 모든 feature map을 다 살펴본다고 이해하시면 되겠습니다.

 

 

 

이것은 과거의 feature를 다시 이용하기 때문에,

 

feature reuse의 특성을 가지고 있습니다.

 

그리고 뒤로 짧게 짧게 weight가 update되는 것이 아닌, 뒤로 한 번에 가는 connection도 보이므로,

 

Vanishing gradient를 피할 수도 있습니다.

 

 

아무리 ReLU를 통해 어느 정도 해결했다곤 하지만,

 

여전히 depth가 길어지며 gradient가 소실되는 데 부담이 있습니다.

 

 

 그리고 위 사진으로 봤을 때 depth를 볼 수 있습니다.

 

ResNet을 보면 엄청난 Depth를 보이는 것을 알 수 있습니다.

 

그래서 이 엄청난 Depth에도 불구하고 문제를 해결하기 위해선 vanishing gradient도 방지하고, 원본을 계속해서 기억하기 위해서

 

계속해서 skip connection이 필요한 것입니다.

 

 

depth를 최대한 많이 늘리고싶은데, 그에 따른 한계점들을 극복하기 위해서 이러한 역할들을 해준다고 보면 되겠습니다.

 

 

위는 classification 위주입니다.

 

 

아래는 objection detection에 대한 모델입니다.

 

 

위 단계 중 2번 단계에서 regional proposal이라는 것을 받습니다.

 

이 regional proposal을 통해서 위와 같이 오리가 어디 있는지 알고싶으면,

 

사진을 작은 단위로 나눠서 입력으로 주고 CNN 돌리는 것입니다.

 

 

전체 사진으로 하는 것보단, 작게 나누어서 하는 것이 더 효율적일 것입니다.

 

이 영역이 duck이라고 판정이 내려지면, 이 영역에 있는 것이 duck이구나라고 판정할 수 있는 것이죠.

 

 

2번에서 regional proposal을 받고, 3번에서 CNN을 통해서 feature를 추출합니다.

 

마지막에 classificaiton을 하고 regression도 합니다.

 

위 object detection에서 해당하는 bounding box의 위치를 조금 더 잘 측정하기 위해서 합니다.

 

 

bounding box는 x, y, width, height를 통해 그립니다.

 

이 R-CNN의 문제점은,

 

CNN의 역할은 feature 추출까지이고, Bounding box regression이나 classification은 다른 모델로도 가능했습니다.

 

이렇게 하니까 좀 귀찮아집니다.

 

 

 

그리고 나중에 나온 아래 모델이 있습니다.

 

Fast R-CNN

 

이 모델은 그냥 다 end-to-end로 넣었습니다.

 

RoI는 region of interest입니다.

 

이것 또한 convolution을 통해서 가서 Fully connected까지 가고, feature vector 만들어서 가는데,

 

bounding box와 softmax도 Neural Network 안에 싹 다 넣어둔 것입니다.

 

여기서 loss function이 두 개 나오겠지만, 전체 구조 안에서 다 학습될 수 있도록 합니다.

 

 

2단계인 것은 변함이 없습니다.

 

feature extraction 단계, bounding box estimation하면서 clssification 하는 단계입니다.

 

두 단계임은 변함이 없지만, 이것을 Neural Network 안에 묶어버리면서, Backpropagation 하나로 다 처리할 수 있게하는 특징이 있습니다.

 

 

YOLO(You Only Look Once)

 

 

이 YOLO라는 모델은 image에 grid를 설치하여 grid 마다 classification을 따로 합니다.

 

multi-class이니 class probability map도 색이 다 다릅니다.

 

그래서 이 class probability map과 bounding box + confidence와 조합을 하여 그렇게 찾아내게 됩니다.

 

이것이 YOLO라는 모델입니다.

 

 

 

Segmentation은 아래와 같이 Mask-RCNN이라는 것이 있는데요,

 

Mask RCNN for Image Segmentation

이것은 bounding box를 찾는 것이 아니라 bound를 그려주게 됩니다.

 

이 또한 Neural Network를 이용해서 Regional propasal을 합니다.

 

 

Explainable AI

 

그리고 이러한 class activation map이라는 알고리즘이 있습니다.

 

위와 같이 feature map을 합쳐서 불을 밝힙니다.

 

위와 같이 activation 된 데이터로 우리가 나중에 softmax를 통해 판단하게 되는 거죠.

 

그래서, activation map을 만들어서, 어디가 가장 밝게 빛나는지를 보고, 그것이 이 모델의 판단 근거이구나로 보는 것입니다.

 

왜 모델이 이런식으로 object detection을 했는지 모델이 알려줬으면 좋겠다는 것입니다.

 

 

Everything is Image

모든 raw data를 image로 변환하고 그것을 CNN으로 분석하는 구조도 나옵니다.

 

GASF를 통해 image로 만들어놓으면 CNN이 알아서 해주는 것입니다.

 

그리고 우측의 spectrogram과 같은 것을 많이 사용합니다.

 

이것은 1-D convolution이 되겠죠.

 

자, 이렇게 많은 종류의 CNN이 있습니다.

 

 

 

 

여러분의 이해에 도움이 되었으면 좋겠습니다.

 

감사합니다.

 

BELATED ARTICLES

more