본문 바로가기
CS231n

CS231n(5) Convolutional Neural Networks

by 민지기il 2024. 3. 5.

Activation Functions
activation 함수는 비선형성을 가해주는 매우 중요한 역할을 한다. 활성화 함수를 사용하지 않으면, 모든 층이 선형 변환만 수행하게 되어, 신경망이 여러 층을 쌓더라도 하나의 선형 변환으로 표현될 수 있다. 이러한 비선형성을 도입함으로써 신경망이 복잡한 함수를 모델링할 수 있게 된다.  layer에 활성화 함수가 없으면, w2(w1x+b)+b로 넘어가고 그냥 wx+b와 다름 없어지므로 single layer와 다름이 없다.
예를 들어 ReLu함를 쓰면 h1=ReLU(W1*x + b1), h2=ReLU(W2*h1 + b2) 하면서 점점 더 복잡한 비선형 함수를 학습할 수 있게 된다.

활성화 함수

 
1) Sigmoid function
넓은 범위의 숫자를 [0,1] 사이로 squash한다 
단점)
-뉴런이 포화되면(0또는 1에 가까운 값을 내는 뉴런) 기울 gradient를 삭제한다(vanishing gradient)
함수를 보면 가운데를 active region of sigmoid라 하고 양 끝을 saturated regime(포화지점)이라고 한다
w=local gradient x global gardient으로 구한다. back prop 과정이 이전의 기울기 값에 계속해서 local gradient를 곱해주는 식인데, global gradient가 saturated regime에서 거의 0이니 모두 0에 수렴해서 기울기 소실된다.
w가 update 될 수 없다.
-sigmoid 결과는 zero-centered가 아니다 이는 slow convergence 결과를 낳는다.
Neural Network은 층을 계속해서 쌓기 때문에 이전 노드의 ouput 값이 다음의 입력값이 되는데 계속해서 양수의 값만이 input되게 된다. 이게 문제가 되는 이유는 back prop 과정에서  dl/df * df/dwi로 w의 기울기를 구하는데 df/dwi를 알기 때문에 dl/df 부호를 따라가서 항상 양수 또는 음수이다. 이는 좌표평면 4사분면에서 w1을 x축, w2를 y축이라고 보았을 때, update가 초기 가중치 0에서 파란색 화살표가 best w라고 하자. 파란색 우하향 그래프를 지그재그로 따라가기 때문에 비효율적이다. 


-exp()는 compute하기 비싸다
따라서 거의 사용되지 않는다
 
2)tanh(x)
넓은 범위의 숫자를 [0,1] 사이로 squash한다 
zero-centered 되어 있다
단점)
여전히 뉴런이 포화되면(0또는 1에 가까운 값을 내는 뉴런) gradient를 삭제한다. (vanishing gradient)
 
3)ReLU (Rectified Linear Unit)
f(x) = max(0,x)로 계산한다
x가 0보다 큰 지점에서는 기울기가 1이라 saturated 되지 않고 sigmoid나 tanh보다 6배 빠른 연산 속도를 보인다
대체로 ReLU를 쓴다
단점)
-zero-centered가 아니다 왜냐) 모두 0 이상이니까
-x가 0보다 작을 때 gradient 값은 0이다 (df/dx 가 0이니까)
-dead ReLU: 

dead ReLU

data cloud는 training data라고 하자. active ReLU는 ReLU 함수가 반응하는 구간이고 dead ReLU는 ReLU함수가 반응하지 않고 죽어버리는 구간이다.
가중치 평면이 DATA CLOUD에서 멀리 떨어져 있는 경우, 어떤 입력 데이터에서도 activate 되는 경우가 존재하지 않고 dead ReLU가 발생할 수 있다. 이러면 activate가 일어나지 않고 backprop(오차 역전파)도 일어나지 않아 가중치도 update 되지 않는다.
activate가 되지 않는 경우는 2가지다. 초기화를 잘못한 경우와 learning rate가 지나치게 높은 경우이다. 
따라서 적절한 ReLU로 학습을 할 수 있어도 learning rate가 높아 weight update가 지나치게 커지면 가중치가 뛰어 ReLU가 데이터의 manifold(데이터가 있는 공간)를 벗어나게 된다. 이를 해결하기 위해 아주 작은 positive bias 값을 더해 초기화하기도 한다.
 
 
4)Leaky ReLU
f(x) = max(0.01x, x)
x가 0보다 작은 지점에서도 기울기를 가지기 때문에 x 값에 따라 saturate가 발생하는 일은 없 -> gradient가 죽지 않는다
PReLU: f(x) = max(ax, x) 이고 a 자체도 back-propagation을 통해 학습한다
ELU(Exponential Linear Units): 

 5) Maxout "Neuron"

parameter가 w1과 w2로 2개가 되었기 때문에 연산이 2배로 증가한다
 
CNN(Convolutional Neural Networks)
이미지 분류, 이미지 검색에 사용된다
FCL(Fully Connected Layer)

FC Layer는 32x32x3의 이미지를 늘려서 3072x1의 벡터 x(1차원)로 만들고 가중치 W와 내적을 하여 1개의 숫자를 1x10의 activation layer에 출력한다 여기서 10개의 neuron output을 만들어낸다.
 
Convolution Layer

Convolution Layer는 하나의 긴 vector로 만들지 않고 기존의 이미지의 구조를 유지하고 filter와의 공간적 내적을 통해 1개의 숫자를 출력한다.
즉 32x32x3의 입력 이미지에 5x5의 filter를 움직이면서 하나의 값을 추출한다. (32x32x3의 입력 이미지에서 3은 RGB 3채널을 뜻하고 depth라고 부른다.) 입력 이미지에 filter를 슬라이딩하여 내적을 구하는 것을 convolve한다고 한다
dot product를 하는데 이는 필터를 image 위로 overlay하고 필터의 각각의 요소와 multiplication을 수행하는 것을 말한다 
이 계산이 w^t*x + b이다 여기서 5^2 * 3 = 75이다

5x5 필터 6개로 6개 개별의 activation map을 얻는다

각 필터는 이미지로부터 1개의 특징을 추출하는데, CNN에서는 여러 개의 필터를 사용하므로 이미지로부터 여러 개(필터의 갯수)의 특징을 추출할 수 있다.
Convolution Layer에서는 filter의 가로와 세로의 크기는 5x5로 선택할 수 있지만 depth는 입력 이미지의 depth와 같아야 하므로 filter의 크기는 5x5x3이 된다.
 
32x32x3의 입력 이미지를 6개의 5x5x3 의 필터로 내적하여 28x28x6(필터의 개수가 6개이므로 depth가 6)의 activation map을 얻는다. 28x28x6의 activation map은 입력 이미지가 되어 10개의 5x5x6(입력 이미지의 depth가 6이므로 필터의 depth도 6)의 필터와 내적을 하고 24x24x10(필터의 개수가 10개이므로 depth가 10)의 activation map을 얻는다. 이 과정이 계속 반복된다

보폭의 크기가 3이면 결과값이 2.33이 나오므로 보폭이 3이면 activation map이 잘 동작하지 않는다.
이런 문제를 해결하기 위한 일반적인 방법은 입력 이미지에 zero padding을 하는 것이다.
즉 입력 이미지의 바깥에 0으로 이루어진 pixel을 붙여준다.

Q1 )32x32x3의 입력 이미지에 2개의 zero padding을 한 후, 10개의 5x5 필터를 보폭 1씩 슬라이딩하면 출력 이미지의 크기는 어떻게 될까?
(32+2*2 - 5)/1 +1 =32 이므로 각각의 필터에 대해 32x32일 것이다. 10개의 filter이므로 32 x 32 x 10이다
 
이를 일반화하면 다음과 같다. NxN의 입력 이미지에 P만큼 zero padding을 한 후, K개의 FxF의 필터를 stride만큼 슬라이딩하면
A=(N+2*P-F)/stride + 1 이 나오고, K개의 필터이므로 총 activation map의 크기는 AxAxK이다.
 
Q2) 이 layer의 parameter는 얼마일까?
각각의 filter는 5*5*3+1=76 param을 가진다
따라서 이 층에서 사용하는 총 파라미터의 수는 76*10 = 760이다
 

정리하자면 ConvNet에 필요한 하이퍼파라미터는 필터의 수인 K, 필터의 크기인 F, 보폭인 S, zero padding의 수인 P이다.
여기서 필터의 개수인 K는 일반적으로 2^n(32, 64, 128, 512)으로 정한다.
 
ConvNet
합성곱 신경망은 합성곱 연산을 사용하는 신경망 중 하나로서, 주로 음성 인식이나 시각적 이미지를 분석하는데 사용된다. 일반적인 신경망들이 이미지 데이터를 원본 그대로 1차원 신경망인 Fully-Connected layer(FC layer 혹은 Dense layer)에 입력되어 전체 특성을 학습하고 처리하는 데 반해, 합성곱 신경망은 FC layer를 거치기 전에 Convolution 및 Pooling과 같은 데이터의 주요 특징 벡터를 추출하는 과정을 거친 후 FC layer로 입력되게 된다.
 
Convolution layer: 작은 크기의 필터가 입력 이미지의 작은 부분을 슬라이딩하면서 내적하여 1개의 숫자를 얻는다. 그 후, 입력 이미지의 깊이와 같은 수의 필터가 입력 이미지의 같은 부분을 여러 번 내적하여 여러 개의 숫자를 얻는다. 이 숫자들이 모인 것이 activation map이다.
FC layer: 입력 이미지를 늘려서 가중치와 1번 내적하여 하나의 숫자를 얻는다.
 
ConvNet은 Convolutional Layer와 Pooling Layer라는 과정을 거치는 이는 Input Image의 주요 특징 벡터를 추출하는 과정이다. 이렇게 추출된 주요 특징 벡터들은 FC Layer를 거치며 1차원 벡터로 변환되고 마지막 Output layer에서 활성화 함수인 Softmax함수를 통해 각 해당 클래스의 확률로 출력된다.
 
Pooling: Convolution을 거쳐서 나온 activation maps이 있을 때, 이를 이루는 convolution layer을 resizing하여 새로운 layer를 얻는 것이다. 이때 max pooling과 average pooling 등이 쓰인다.
 

ConvNet의 구조
마지막 FC layer를 통과하여 이미지가 어떤 것인지 1개 숫자로 분류한 모습

CIFAR-10으로 실험: https://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html