Artificial Intelligence/Deep Learning

9. Convolutional networks

황수진 2024. 4. 16. 13:48

 

대학원 수업 'Deep Learning', 교재 'Understanding Deep Learning', 그리고 직접 찾아서 공부한 내용들을 토대로 작성하였습니다.

 

 

지금까진 deep neural network를 위한 supervised learning pipeline에 대해 알아봤는데 단순히 input에서 output으로 가는 single path에 대한 fully connected networks에 대해 고려했습니다.

 

 

이번 챕터부턴 sparse connections, shared weights, parallel processing path와 같은 특별한 network component에 알아보겟습니다. 이번 챕터에선 주로 image data에서 쓰이는 'convolutional layer'에 대해 소개하겠습니다. 

 

 

properties of images 

image는 매우 구조화된 data type입니다. 

1. high-dimensional

2. statistical relation between nearby image pixels 

fully connected network에선 "nearby"라는 개념이 없이ㅣ 모든 input끼리의 관계에 대해 동일하게 다룹니다. 

image의 특징 중 하나는 주변 pixel들끼리의 statistical relation이 있다는 점입니다. 즉, pixel 들끼리의 위치를 조금만 바꿔도 더이상 같은 image 표현이라고 볼 수 없습니다. 

3. stability of the interpretation under geometric transformations  

image는 기하학적으로 변형(rotation, flip 등등)을 해도 해석에 대한 안정성이 있습니다. 우리는 image에 그런 변형을 취해도 같은 그림이라는 것을 인식할 수 있기 때문입니다. 

 

fully connected modell은 모든 position에 대해 각각 tree를 의미하는 pixel의 pattern을 학습해야 합니다. 이건 당연히 비효율적입니다. 

 

convolutional layer는 각 local image region이 독립적으로 진행되고, 전체 image에 대해 공유하는 parameter를 사용합니다. 이는 fully connected layer보다 더 적은 parameter를 사용하고, 주변 pixel들 사이의 (spatial)부분적인 관계를 이용하고, 모든 position에서 pixel의 interpretation을 다시 학습할 필요가 없습니다. convolutional layer로 대부분 이루어져 있는 network는 'convolutional neural network' 혹은 CNN이라 불립니다. 

 

 

Invariance and equivariance 

<Invariant>

image는 transformation을 해도 안정적입니다. image의 function f[x] 는 f[t[x]]=f[x]를 만족하다면 'invariant' 하다고 볼 수 있습니다. 즉, transformation t[x]와 상관없이 f[x]의 output은 똑같이 나옵니다. 

(input이 달라져도 output이 같음)

어떤 사진에 있는 강아지를 인식하면 그 사진을 회전하도 강아지가 인식된다. 

 

<Equivariant>

f(x)와 transformation t(x) 사이의 관계가 f[t[x]]=t[f[x]] 이 식을 만족한다면 f(x)는 transformation t(x)에 equivariant하다고 볼 수 있습니다. image segmentation에 대한 network의 경우, network는 transformation에 대해 이 특징을 만족해야 합니다. 

만약 image가 변형하고, 회전하고, 뒤집히면, network f[x]는 변형된 것들도 같은 방식으로 segmentation이 동작해야 합니다. 

어떤 사진에 강아지를 segment하고 그걸 회전하는 것과 사진을 회전해도 강아지를 segment할 수 있다,

 

 

 

 

kernel size가 3인 1D convolution

각 output zi는 가장 가까운 3개의 input x(i-1),x(i),x(i+1)의 weighted sum이 됩니다. (w=[w1,w2,w3])

a) output z(2)는 z(2)=w(1)x(1)+w(2)x(2)+w(3)x(3) 입니다

b) ourput z(3)는 z(3)=w(1)x(2)+w(2)x(3)+w(3)x(4) 입니다

c) z(1) position의 값을 계산하기 위해선 x(0),x(1),x(2)가 필요합니다.  그러나 x의 first input은 x(1)이고 이런 경우엔, zero padding으로 해결할 수 있습니다. zero padding의 input value는 0이라고 가정합니다. 마지막 output도 비슷한 방법으로 계산할 수 있습니다.

d) zero padding을 두는 대신, input range에 맞춰 output을 계산할 수 있습니다. 이런 경우엔 output이 input보다 작아지게 됩니다. 

 

 

Convolutional networks for 1D inputs 

convolutional networks = series of convolutional layers (각 layer는 translation에 equivariant해야 함)

보통 translation에 대해 부분적인 invariance를 유발하는 'pooling mechanism'도 같이 사용합니다. 

image 에서 특정 패턴이나 개체가 조금 'translation'이 일어나도 해당 패턴이나 개체에 대한 특징이 pooling operation 결과에 영향을 크게 받지 않을 수 있기 때문입니다. 

 

1D convolution operation

우선 제일 간단한 1D data인 경우에 대해 알아봅시다.

1D에선, convolution은 input vector x를 output vector z로 변형시킵니다. 이 때 각 output z(i)는 주변 input들의 weighted sum이 됩니다. 모든 position에 같은 weight가 사용되고 이렇게 학습된 weight를 우리는 'convolution kernel/filter'라고 부릅니다. input이 결합될 때의 size를 'kernel size'라고 합니다. 

weighted sum of the previous, current, subsequent positions

이 때 vector w가 kernel이 돕니다.

앞서 언급했듯, convolution opertation은 'translation'에 대해 equivariant하기 때문에, input x를 translate하면, 그에 대응하는 output z는 같은 방식으로 translate됩니다. 

 

Padding 

그렇다면 output은 input i-1, i, i+1의 weighted sum인데 first output과 final output은 어떻게 계산해야 할까요?

방법1. 

input edge에 새로운 value를 갖고있는 padding을 하고 평소처럼 진행. 'zero padding'은 intput이 0인 경우.

방법2.

kernel이 input position의 범위를 넘어가면 그냥 output position을 무시하는 경우.

이 방법을 사용하면 input의 끝에 추가적은 정보를 줄 필요가 없어지지만, 'representation' size가 줄어들 수 밖에 없습니다. 

 

 

Stride, kernel size, and dilation

stride, kernel size, dilation

위에선 주변 3개의 input의 sum으로 output을 계산하는 경우만 살펴봤지만, stride, kernel size, dilation을 어떻게 설정하냐에 따라 매우 다양한 경우가 존재합니다. 

stride

: shift 할 때 간격 크기. stride 크기를 1에서 2로 바꾸면 당연히 output의 수도 절반으로 줄어듭니다. 

kernel size

: kernel size가 커지면 조금 더 넓은 범위의 값을 사용할 수 있습니다. 여기서 엉뚱한 위치의 정보를 사용하는 게 아닌, 여전히 현재 위치를 중심으로 정보를 얻는 건 동일합니다. 당연히 kernel size가 커지면 더 많은 weight가 필요하게 됩니다.

dilation

: 모든 정보를 얻는게 아닌 중간의 몇 element를 zero로 취급하는 방법입니다. 그렇게 되면 더 광범위하지만 많은 weight를 사용하지 않아도 됩니다. 이 때 weight들 간에 들어가는 'zero'의 갯수가 dilation rate이 됩니다.

 

 

 

Convolutional layers 

convolutional layer도 다른 layer와 마찬가지로 input를 합치고, bias를 더하고, activation function a[.]를 지나 계산됩니다. 

다음 식은 kernel size 3, stride 1, dilation rate 1에 대한 i번째 hidden unit h(i)에 대한 식입니다. 

x가 범위 넘어가면 0으로 취급

trainable parameters : bias, w1,w2,w3

 

<fully connected layer>

단순한 fully connected layer에 비해 convolutional layer가 갖고 있는 장점이 무엇이 있을까요?

만약 D개의 input x, D hidden units h 를 갖는다고 하면, fully conntected layer는 D^2와 +1 (bias)의 weight가 필요하게 됩니다. 

물론 fully connected layer에서 대부분의 weight를 0으로 설정하고 다른 weight가 동일하게 contrained 된 경우 convolutional layer와 동일하게 만들 수 있습니다. 

 

a) fully connected layer (weight matrix 6*6=36) 

c) convolutional layer with kernel size=3 (bias는 생략된 것). 이 때 생성되는 weight matrix는 fully connected layer의 special case라고 볼 수 있습니다. 대부분은 0, 나머지는 계속 반복. 

e) convolutional with kernel size=3, stride=2 

 

Channels 

보통 하나의 convolution로 하게 되면 정보가 불가피하게 손실될 수 있기 때문에, 여러 convolution을 나란히 진행합니다. 각 convolution은 각각의 'hidden variables(feature map/channel)의 set를 제공합니다. 

a,b는 kernel size=3에 zero padding 존재

첫번째 kernel을 통해 h1부터 h6까지 계산하게 됩니다. => first channel

두번째 kernel도 같은 방식으로 h7부터 h12까지 계산하게 됩니다. => second channel

 

만약, 들어오는 layer가 C(i) channel 을 갖고 있고 kernel size가 K라면, 각 output channel의 hidden unit은 모든 C(i) channel과 K kernel position을 weighted sum을 해 계산합니다. 이 때, weight matrix는 C(i)xK dimension에 bias 1이 추가됩니다. 만약 다음 layer에 C(o) channel이 있다면, 우리는 C(i)*C(o)*K weight와 bias가 필요합니다. 

 

 

Convolutional networks and receptive fields 

network에서 hidden unit의 receptive field는 original input이 해당 unit으로 들어가는 구역입니다. 

첫번째 layer에 있는 hidden unit에선 3개의 input의 weighted sum이 들어가고,

두번째 layer에 있는 hideen unit에선 첫번째 layer의 가장 가까운 3개의 weighted sum이 들어갑니다. 즉 두번째 layer의 hidden unit에선 receptive field의 size는 5가 됩니다. 

이런 방식으로, unit의 receptive field는 계속 해서 증가하게 되고, input을 통해 들어오는 정보들은 점차 합쳐집니다.

 

 

MNIST-1D

input x : 40D vector

output f : 10D vector 

3 hidden layers 

- 1st layer : 15 channels, 3 kernel size, 2 stride(valid padding) => 19 spatial positions

- 2nd layer : 3 kernel size, 2stride (valid padding)

- 3rd layer : 4 spatial positions, 15 channels  (reshaped into size 60) 

 

 

이 그림을 보면 convolutional network에서 test error가 훨씬 낮다는 것을 알 수 있습니다

이유는 단순히 parameter의 갯수 차이가 아니고, convolutional architecture가 'superior inductive bias'를 갖기 때문이라고 책에서 소개합니다. (interpolates between the training data better) . 왜냐하면 우린 이미 이 구조에 prior knowledge를 넣었기 때문입니다. 

 

Convolutionall networks for 2D inputs 

지금까진 1D data에 대해서만 다뤄봤습니다. 그러나 보통 우리가 conv net으로 다루고자 하는 image는 2D data입니다. 

elements x(ij)로 구성된 2D input에 적용된 3X3 kernel은 어떤 layer의 hidden unit에 대해 위의 식처럼 계산합니다. 

 

 

 

w(mn)은 convolutional kernel의 entry가 됩니다.

이것은 단순히 3x3 input region의 weighted sum이 됩니다.

kernel은 각 position의 output을 구하기 위해서 수평,수직으로 동시에 2D input을 통해 translate됩니다. 

 

 

보통 input은 RGB image(3 channel)이 되고, 2D signal로 다뤄집니다.

3X3 kernel은 3X3X3 weight를 갖고, 3개의 input channel에 각각 3X3 position으로 적용됩니다. 이렇게 되면 같은 image와 같은 height과 width를 갖게 됩니다. 

 

만약 kernel size가 KxK이고, C(i) input channel이 있으면, 각 output channel은 C(i)xKxK의 weighted sum이 됩니다. 그리고 하나의 output C(o) output channel을 계산하기 위해, 우리는 C(i)xC(o)xKxK의 weight와 C(o) bias가 필요합니다. 

 

Downsampling and upsampling

Downsampling

dimension이 너무 커서 줄이고 싶을 때 우리는 몇몇 value만 뽑는 방식으로 dimension을 줄일 수 있습니다.

1. sub-sampling : sample every other position

2. max pooling : sample the maximum value

3. mean pooling (average pooling) : bilinear interpolation between the input values 

Upsampling 

반대로 dimension을 늘리고 싶을 땐 upsampling을 진행합니다

1. duplicating : duplicate each input

2. max unpooling : redistribute the values to the original positions

3. bilinear interpolation : average the inputs 

 

 

 

Changing the number of channels 

만약 추가적인 spatial pooling없이 하나의 hidden layer와 다음 layer 사이의 channel의 수를 바꾸고 싶다면 어떻게 해야할까요?

'parallel computation'을 통해 결합할 수 있다고 합니다.

 

그러기 위해, kernel size one인 convolution을 적용합니다.

output layer의 각각의 element는 같은 위치에서의 모든 channel의 weighted sum에 의해 계산됩니다.

이 과정을 우리가 원하는 만큼 output channel을 생성하도록 여러번 반복하면 됩니다. 

즉, 여기서 사용된 convolution weight는 1x1xC(i)xC(o)입니다. -> 1x1 convolution

 

 

 

Applications 

우리는 3개의 computer vision application을 통해 conv net에 대해 알아봤습니다. goal이 어떤 이미지를 이미 정해진 category 중 하나에 할당하는 image classifiation에 대해 convolutional network를 설명했습니다. 그 다음 우리는 object detection을 알아봤고, 이는 image에서 여러 object를 알아내고 그 주변의 bounding box를 알아내는 것입니다. 마지막으로 semantic segmentation에 대해 알아봤고 goal은 object 존재하는 각 pixel에 대해 label을 할당하는 것입니다.

 

Image classification

대부분의 method에서 input image를 standard size로 변형합니다. typical system에서 network에 들어가는 input x가 224x224 RGB image이고, output은 1000개의 class에 대한 probability distribution입니다. 이 task엔 class의 수도 많고 상당한 variation을 나타내기 때문에 어렵습니다. 2012년에 나온 AlexNet은 이 task에서 성능이 잘 나온 첫번째 convolutional network입니다. ReLU activation을 갖는 8개의 hidden layer로 이루어져 있고, 앞의 5개의 layer는 convolutional layer이고 나머지는 fully connected layer입니다. network는 맨 처음 96 channel을 만들기 위해 stride가 4이고, size가 11x11인 kernel을 이용해 input을 downsampling합니다. 그 다음 256 channel을 만들기 위해 5x4 kernel을 적용하기 전에 max pooling layer을 이용해 downsample합니다. 여기서 convolutional layer가 3개 더 있고 각 kernel size는 3x3입니다. 결과적으로 256 channel의 13x13 representation이 나옵니다. 마지막 max-pooling layer는 6x6 representation을 가진 256 channel에서 length가 9216인 vector로 resize되고, 각각 4096,4096,1000 hidden unit을 갖는 3개의 fully connected layer를 통과합니다. 마지막 layer는 softmax function을 통과하면서 output은 1000개의 class에 대한 probability distribution이 나옵니다. 완전한 network는 ~60 million parameter를 포함하고 대부분은 fully connected layer에 포함됩니다.

dataset size는 (1) spatial transformation이나 (2) modifications of the input intensities를 사용해 2048 factor에 의해 증강됩니다. test time에선, 5개의 다른 cropped , mirrored 버전의 image을 network에 실행시키고, 그들의 예측은 평균이 됩니다. system은 momentum coefficient가 0.9인 SGD와 batch size가 128을 사용해 학습됩니다. fully connected layer에 dropout이 적용되고, L2 regularizer도 사용됐습니다. 

 

 

VGG netwoirk

AlexNet과 같은 scale. 이 network는 convolutional layer과 max pooling operation의 연속으로 이루어져 있고, representation의 spatial scale은 점점 감소하지만, channel의 수는 점점 증가합니다. 마지막 convolutional operation이후의 hidden layer는 1D vector로 resized되고 3개의 fully connected layer를 지납니다. 

 

 

Object detection

object detection의 goal은 image에서 여러 object를 검출하고 localize하는 것입니다. conv기반의 초기 method는 YOLO로, YOLO의 input은 448x448 RGB image입니다. 이는 24개의 convolutional layer를 지나고 max pooling을 통해 representation은 감소하지만, 와중에 channel의 수는 증가합니다. (VGG와 비슷) 

마지막 convolutional layer의 size는 7x7이고 1024개의 channel을 가집니다. 이는 vector로 reshape되고 fully connected layer는 4096 value로 mapping됩니다. 

YOLO object detection

 

 

Semantic segmentation

semantic segmentation의 goal은 각 pixel에 label을 할당합니다. input은 224x224 RGB image이고 output은 224x224x21 array를 갖습니다. 이는 각 position에 대해 21개의 가능한 class의 probability를 포함합니다. 

 

 

 

Summary

convolutional layer에서, 각 hidden unit은 주변 input의 weighted sum를 함으로써 계산됩니다. 이 때 bias는 더해지고, activation function도 적용됩니다.

weight와 bias는 모든 spatial position에 대해 동일하고, 그래서 fully connected network에 비해 더 적은 parameter를 갖습니다. 또한 parameter의 수가 input image size에 의해 증가되는 일도 없습니다.

information을 잃는 것을 방지하기 위해, 또다른 weight와 bias에 의해 반복되고 각 spatial position에 여러 channel이 생성됩니다.

전형적인 conv net은 사이즈가 2배로 작아지는 (downsample) layer에 의해 겹겹이 쌓아져 있습니다. network가 진행되는 동안, spatial dimension은 보통 2배로 줄어들고, channel의 수는 2배로 증가합니다. network의 마지막 부분에선, 1개 이상의 fully connected llayer가 있고 이는 전체 input으로부터 정보를 합치고 원하는 output을 도출합니다. output이 image라면, mirrord "decoder"는 original size로 다시 upsample합니다.

convolutional layer의 translational equivariance는 useful inductive bias를 유발하고 이는 fully connected netowkr에 관련된 image-based task에 대한 성능을 증가시킵니다. 

Image classification 성능은 network가 깊어질수록 향상됨을 알 수 있었습니다.

그러나 무한히 network의 depth를 늘린다고 해서 성능이 계속 좋아지는 것은 아닙니다. 특정 깊이 이후엔 system이 train하기 어려워집니다. 이것이 다음 장의 주제인 'residual connection'의 motivation이 됩니다.