본문 바로가기

딥러닝,CNN,pytorch

딥러닝 활성화함수(Relu , Maxpool2d)

 

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()

        self.layer1 = torch.nn.Sequential(
            torch.nn.Conv2d(1, 8, kernel_size=3,stride=1,padding=1),
            torch.nn.ReLU(),
            torch.nn.MaxPool2d(2, 2)
        )

        self.layer2 = torch.nn.Sequential(
            torch.nn.Conv2d(8, 16, kernel_size=3, stride=1, padding=1),
            torch.nn.ReLU(),
            torch.nn.MaxPool2d(2, 2)
        )
        self.fc = torch.nn.Sequential(
            torch.nn.Linear(40000, 5),
            torch.nn.ReLU()
        )

3개의 층을 가진 모델이 존재한다.

Conv2d은 n*n개의 2D(이미지)형태의 인풋을 받아서 똑같은 크기의 n*n이미지를 8차원 , 16차원으로 확장시켜준다.

(커널사이즈가 3이고 stride가 1, 패딩ON 이기 때문에 output이 input과 똑같은 크기로 여러개의 차원으로 나옴)

(참조)

그리고 Linear층은 

이렇게 4만개의 W에 대해서 5개의 y를 유도하는 층이다.

 

그렇다면, 이러한 CNN ,LINEAR같은 층이 있는데 RELU나 MAXPOOL, sigmoid같은 활성화 함수를 사용하는 이유는 무엇일까??

그 이유는 선형 분류기의 한계를 극복하기 위함이나,

input size감소,

미분값이 0으로 수렴하는 현상(vanishing)을 막는 등

기존 신경망의 여러가지 단점을 보완하기 위함이다.

예를들면, 기존의 Linear층 같은 경우에는

이런 식으로 AND나 OR문제는 해결이 가능했지만 XOR문제는 해결이 불가능 했다. (3번째 그림에서 선을 그음으로  파란색과 빨간색을 구별할 수 있는가??)

그러므로, 선형인 분류기를 INPUT으로 넣어 비선형의 OUTPUT을 만들어줄 비선형 함수가 layer에 필요하게 된 것이다.

 

또한, 학습을 하던 중 미분값이 0에 가까워져서 학습이 아무런 효과가 없어지게되는  vanishing현상을 일으키기도 하는데 이러한 현상에 Relu함수가 도움을 줄 수 있다.  df/dw * 0.01 이 0에 지나치게 가까운 값을 곱하면서 학습하면 어떻게 되겠는가?? w=w-(df/dw*0.01) 을 하게 될텐데 뒤에 괄호부분이 거의 없는것이나 다름없게되서 w의 개선이 전혀 이루어지지 않게 될 것이다. 

 

또한, CNN레이어는 차원이 확대 됨으로써 여러개로 층을 쌓을경우 input이 굉장히 커지게 되는 상황이 발생하는데.이를 완화해주기 위해 Maxpool 이라는 중간층을 넣어주기도 한다.

 

일단 지금까지 사용한 함수는 Relu, Maxpool이므로 이 두가지를 설명해보겠다.

 

Relu함수는 이렇게 생긴 활성화 함수이다.

값이 0보다 작으면 0을출력하고 0보다크면 그대로 학습을 진행하게된다. 그러므로 의미없는 학습의 과정들이 생략되고 더 정확하게 학습을 할 수 있게 된다. x가 0보다 크면 미분값 1로 w를 갱신하고 0보다 작으면 w에대한 갱신을 하지 않는다. 그러므로 기울기가 0에 수렴하는 현상은 막을 수 있지만, weight를 잃는 문제점이 있기 때문에 이를 개선하기위한 Leaky ReLU가 등장하기도 하였다.

 

conv2d층에서 사용한 Maxpool2D(2,2)는 사실 그렇게 복잡한 함수는 아니다.

우리가 CNN으로 만든 이미지를 참고해서 2*2의 박스를 지정하고 2의 STRIDE를 지정한 것이다.

그러므로 2*2의 박스가 겹쳐지는 부분 없이 움직이면서 그중 가장 큰 값 1개만 찾아서 저장할텐데,

이 과정을 거치면 전체적인 크기가 1/4이 되버린다. 그러므로 100*100=10000의 이미지로 이루어진 INPUT을

50*50=2500으로 줄여버리는 효과를 가질 수 있는 것이다.

우리가 CNN에 INPUT으로는 (128, 1, 200, 200) 이렇게 넣지만 MAXPOOL을 하지 않으면

(128, 16, 200, 200) 이런식으로 정말 엄청나게 큰 INPUT이 생길수가 있다. 이는 층을 깊게만드는데 큰 걸림돌로 작용하고 속도나 자원측면에서 큰 문제를 야기하므로

이미지의 가장 밀도가 높은부분을 채택해서 전체적인 크기를 줄여주는데 이 MAXPOOL 함수를 이용하고는 한다.

 

이것 이외에도 활성화 함수의 종류는 굉장히 많다.

Maxout, tanh, ECS등 다양한 함수가 존재하고 시간이 있으면 다음에 조사해보고 포스팅하도록 하겠다.