Computer Science/기계학습 (Machine Learning)

[머신러닝/ML] ConvNet

gxxgsta 2023. 7. 26. 15:49
반응형
SMALL

ConvNet

우리가 지금껏 학습한 network는

forward network 또는 fully network라고도 한다.

또, 입력이 여러 개인 경우 하나로 합치고

하나의 출력으로 만들어 낼 수 있는데

이는 Convolutional Neural Network의 기본적인 아이디어이다.

 

Convolutional Neural Network의 기본 아이디어는

고양이 실험으로부터 왔다.

고양이에게 어떠한 그림을 보여주었을 때 그림의 일부를 보고

뉴런의 일부만 반응한다는 사실을 깨닫게 되었다.

이는 입력을 일부만 받아오게 된다는 의미로 받아들이고

이러한 아이디어를 발전해 나가게 된다.

 

입력으로 들어온 왼쪽의 이미지를 작게 조각내고 각 조각을 입력으로 넣는다.

이때 작은 조각들은 convolution layer라고 한다.

convolution layer와 ReLU layer를 넣고 중간중간 POOL layer도 넣는다.

이후 그림에 labeling을 하기 위해 fully connect nerual network를 구성하여

softmax classifier을 뒤에 붙임으로서 수행하여 준다.

 

Convolution layer

convolution layer는 filter를 통해 만들어진다.

filter는 우리가 지금껏 학습하였던 weight와 비슷한 역할로

이미지 파일을 조각으로 쪼개어 해당 조각에 Wx + b를 대입한다.

W의 형태에 따라 하나의 숫자로 결과가 나타나게 된다.

즉, filter는 입력된 이미지의 조각을 어떠한 숫자로 만드는 역할이다.

그렇다면 6*6 크기인 이미지에 3*3 크기의 filter로 결과는 어떨까.

상하좌우로 한 칸씩 filter가 움직이므로 총 4*4크기의 output이 나온다.

이때 상하좌우로 한 칸씩 움직이는데,

filter를 옮길 때 얼마나 옮길지를 나타내는 것을 stride라고 하고,

위의 경우에서는 stride = 1인 경우이다.

 

이러한 계산을 바탕으로 우리는 하나의 식을 뽑아낼 수 있다.

입력 이미지의 가로세로 크기가 N, 필터의 가로세로 크기가 F일 때,

결과값의 크기는 ( N - F ) / stride + 1이다.

위의 식을 통해 stride값을 조정할 수도 있다.

 

하지만 위와 같은 방법으로 filtering를 진행하면 한 가지의 단점이 생긴다.

바로 이미지의 크기가 점점 작아지는 것이다.

이러한 문제를 해결하기 위하여 padding라는 것을 도입한다.

이미지의 테두리를 0으로 두르는 것이다.

이렇게 padding을 설정하면 좋은 점은

1. 이미지의 크기를 유지할 수 있으며

2. 이미지의 모서리(또는 꼭지점)를 쉽게 찾아낼 수 있다.

7*7의 이미지에 padding을 넣고, 3*3의 filter를 사용한 결과는

마찬가지로 7*7의 결과가 나타난다.

이미지의 결과값의 수는 filter의 개수에 dependent하다.

 

Max Pooling

위에서 Convolution Nerual Network의 구조를 보여주었을 때

POOL layer가 존재한다고 하였다.

이 pooling layer는 sampling라고도 한다.

sampling은 큰 이미지를 작게 압축하는 것이다.

이러한 sampling은 각 layer별로 진행하고,

sampling된 레이어들을 모아 합친 다음

다음 단계로 넘기는 과정을 pooling라고 한다.

 

위는 pooling이 진행된 모습이다.

이때 Max Pooling을 사용하는데, Max Pooling이란

해당 filter에 들어온 값 중 최댓값을 가져다 옮기는 것이다.

CNN 활용

1998년 LeCun 교수에 의해 손글씨를 인식하는 CNN이 만들어졌다.

비교적 간단한 형식으로 구성되어 있다.

 

다음은 AlexNet이다. ImageNet이라는 경진대회에서 주목 받았다.

이 모델은 입력 이미지가 굉장히 큰 것을 확인 할 수 있다.

위의 과정을 거치는데 꽤나 깊고 복잡한 연산이다.

하지만 자세히 들여다 보면 모두 우리가 학습한 내용임을 알 수 있다.

또한 최근에는 layer 중간에 위치하는

Normalization은 잘 쓰이지 않는다고 한다.

 

GoogLeNet은 지금껏 우리가 학습한 것과 조금은 다르게 생겼다.

여러 개로 나뉘었다가 합쳐지는 부분이 많다.

우리는 이를 inception module이라고 한다.

 

ResNet은 레이어를 무려 152개를 사용하였다.

레이어의 개수가 많아지면 학습이 어려워진다는 것을 알 수 있을 것이다.

우리가 아무리 값을 조정을 잘 해도 어려움이 존재한다.

이러한 문제를 어떻게 해결할 수 있을까?

ResNet은 위 그림과 같이 layer를 몇 개 건너뛰고 학습하는 방법을 선택하였다.

위 그림을 자세히 들여다보면 아래와 같은 모습이다.

이렇게 layer를 몇 개 건너뛴다면 레이어의 깊이가 아무리 깊어도 연산이 간단해진다.

반응형
LIST