CS/기계학습

[기계학습] CNN 기초

dbwls-log 2025. 6. 13. 01:50

Convolution Neural Network : CNN 

CNN 기원 

1959년 Hubel과 Wiesel은 동물의 시각 피질에 대한 연구에서 뉴런들이 시각 자극에 계층적으로 반응한다는 사실을 발견했다. 

 

일부 뉴런은 좁은 자극 영역에만 반응하고, 어떤 뉴런은 모양, 선, 에지같은 특징을 인식하며, 전체적으로는 시각 정보가 계층적으로 처리된다는 것을 알게되었다. 

 

이 원리가 CNN이 인간 시각 시스템을 모방하게 된 기반이다. 

 

 

시각 정보 처리 원리 

망막의 수용 필드는 하나의 뉴런이 감지할 수 있는 시야의 작은 영역을 의미한다. 

시각 정보가 망막 → 시신경 → 시상 → 시각 피질로 전달되고, 각 단계에서 더 복잡한 특징을 감지한다. 

 

NeLet-5의 구조와 합성곱 연산 

입력 이미지 → Conv Layer 1 → Pooling Layer 1 → Conv Layer 2 → Pooling Layer 2 → FC Layer 

 

Conv Layer는 필터(커널)를 사용하여 특징 추출을 하고, 특징맵을 생성한다. 

Pooling Layer는 특징을 압축하고,  FC Layer를 거치면 Flatten해서 분류가 되는 것이다. 

 

Convolution Layer 

커널이 이동하면서 입력값에 가중치를 곱한 후 합산하는 합성곱 연산을 수행한다. 

 

아래 예시 이미지는 3x3 커널이 입력 이미지에 슬라이딩하면서 각 위치에서 값을 곱하고 더해서 출력값을 계산하는 것이다. 

 

Pooling Layer 

Pooling은 보통 Max Pooling을 사용해서, 필터 안에서 가장 큰 값을 뽑아낸다. 

입력 크기를 줄이면서도 중요한 정보만 남기는 다운 샘플링을 진행하는 것이다. 

 

아래 예시 이미지는 여러개의 특징맵이 있는데, 여기서 각 2x2 영역에서 가장 큰 값을 선택해 새로운 맵을 만드는 과정이다. 

 

 

FC Layer & Softmax 

Conv와 Pooling이 끝나면 특징맵을 1차원 벡터로 펼치는 Flatten 작업을 수행한다. 

이렇게 펼친 1차원 벡터를 완전 연결층인 Dense Layer(FC Layer)에 넣는다. 

 

마지막엔 Softmax 함수로 각 클래스에 대한 확률 값을 계산한다. 

참고로 Softmax의 확률값의 합은 1이다. 

 

예를 들어 Softmax 확률값이 [0.7, 0.2, 0.1]이라면 첫번째 클래스일 확률이 70%라는 의미이다. 

 

 

Convolution Layer 

Convolution이란? 

Convolution이란 합성곱으로, 입력 값과 필터(커널)의 원소를 곱한 뒤 모두 더하는 선형 연산을 의미한다. 

 

u : kernel 

z : input 

s : output (feature map) 

 

1차원 입력 이미지일 때 

 

2차원 입력 이미지일 때 

 

 

 

Padding 

Padding이란 합성곱 전에 입력의 가장자리에 숫자를 추가해주는 것이다. 

zero padding은 가장자리에 0을 추가해주는 것인데, 나머지 숫자를 추가해주는 경우도 있다. 

 

padding이 없으면 Conv 층을 통과할 때마다 특징맵의 크기가 줄어드는데, padding을 추가해줌으로써 특징맵의 크기가 줄어드는 것을 방지할 수 있다. 

 

🔎 Padding을 사용하는 목적

1. 출력 크기를 유지

2. 가장자리 정보를 유지 

3. 중앙 정렬 가능 

 

 

 

Padding 적용 후 출력 크기 계산

N : 입력 크기  

P :  패딩 

F : 필터 크기 

S : Stride 

O : 출력 크기 

 

 

Bias 

Bias는 편향으로, 합성곱 연산 결과에 더해지는 학습 가능한 스칼라값을 의미한다. 

 

출력의 이동을 가능하게 해서 더 유연한 학습이 가능해진다. 

예를 들어, 이미지의 특징이 작을 경우 bias를 통해 임계점을 넘도록 보정해주는 것이다. 

 

컨볼루션 연산 결과에 바이어스 값을 더해주면 된다. 

 

Weight Sharing 

가중치 공유란 모든 뉴런이 같은 커널(필터)를 공유해서 사용하는 것이다. 

CNN은 가중치 공유를 하는데, 같은 커널을 여러 위치에 슬라이딩하면서 동일한 연산을 반복하는 것이다. 

 

같은 가중치를 공유하면 모델의 파라미터 수가 감소하며, 같은 특징을 어디서든 잘 찾아내는 일반화 성능도 향상시킬 수 있다. 

 

아래 그림처럼 아무리 입력이 커져도 커널은 한 세트만 학습하면 된다.

왼쪽은 다 다른 가중치를 사용하는데, 오른쪽은 CNN처럼 같은 가중치를 사용한다.  

 

Multiple Kernels : Multiple Feature Maps 

하나의 커널만 쓰면 하나의 특징만 뽑을 수 있는데 이는 너무 제한적이라는 단점이 있다. 

그래서 CNN은 여러개의 커널을 동시에 적용하여 더 다양한 특징을 뽑아낼 수 있도록 한다. 

 

다양한 시점에서 특징 추출이 가능하고, 하나는 수직 경계, 또 다른 하나는 수평 경계를 감지하는 효과가 있다. 

 

 

 

CNN의 커널은 사람이 정해주는 것이 아니라, 학습 데이터로부터 학습되는 것이다. 

즉, 학습을 통해 자동으로 최적의 필터가 만들어지는 것이다! 

 

예를 들어 7x7 크기의 커널을 64개를 사용한다고 해보자. 

그럼 (7x7+1) x 64 = 3200개의 파라미터를 사용해야한다. 

(여기서 +1을 해주는 이유는 bias를 포함하기 때문) 

 

커널의 값은 역전파를 통해 조정된다. 

경계, 질감, 패턴 등 다양한 특징을 자동으로 학습하는 것이다. 

 

 

CNN의 특징 : invariable features 

CNN은 특징의 위치가 달라져도 감지가 가능하다. 

즉, 위치 불변성을 가지고 있다.

 

같은 커널이 슬라이딩하며 전체 입력을 동일한 방식으로 검사하기 때문에 shift, scale, deform 상태에도 반응이 가능한 것이다. 

 

예를 들어, 입력이 오른쪽으로 이동을 해도 특징맵은 같은 값을 출력한다. 

 

Stride : Down Sampling 

Stride란 커널이 입력 위를 움직일 때 몇 칸씩 건너뛸지를 의미한다. 

보통 stride는 1로 설정이 되어있는데, 1이면 한 칸씩 이동하고, 2면 2칸씩 건너뛰는 것이다. 

 

입력 크기를 줄이는 효과가 있다. 

2D 이미지를 기준으로, stride가 k이면 특징맵 크기는 약 1/k²가 된다. 

 

Tensor 에 CNN 적용 

CNN은 2D 이미지 뿐만 아니라 3D 텐서에도 적용이 가능하다. 

 

예를 들어 RGB 이미지는 R채널, G채널, B채널 총 3채널로 이루어진 3차원 텐서이다. 

입력 RGB 3채널에 각각 대응되는 커널을 곱하고 더해서 한개의 특징값을 생성한다. 

아래처럼 각 채널별로 커널과 곱하고 그 결과를 더해서 최종 출력을 하면 된다. 

 

3차원 구조 데이터에 적용 

다차원 데이터를 처리하는 구조는 아래와 같다. 

 

일단 다중 채널일 경우에 RGB처럼 3채널 입력 데이터를 받으면 커널도 3채널을 입력 받아야 한다. 

즉, 입력 이미지의 채널과 커널의 채널이 동일해야 한다. 

 

영상이나 MRI 등 일반 이미지보다 더 고차원 데이터 (4D 텐서 등)도 가능하다. 

 

출력 크기도 계산할 수 있다. 

 

이를 사용하여 입력 크기를 추론할 수도 있다.

 

 

CNN 구조 

 

 Pooling Layer 

Pooling 이란 ? 

Pooling은 특징맵에서 가장 중요한 정보만 뽑고 나머지는 버리는 연산을 의미한다. 

차원 축소와 정보 요약을 목적으로 수행한다. 

 

Pooling의 종류 

Max Pooling : 최댓값 풀링 

각 영역에서 가장 큰 값을 하나만 뽑는다. 

강한 특징을 보존하기 위해 사용되며 날카로운 특징을 유지시킨다. 

 

 

Average Pooling : 평균 풀링 

각 영역의 평균값을 취한다. 

부드러운 정보 요약을 위해 사용된다. 

 

Pooling을 사용하는 이유 

1. 파라미터 수 감소하고, 뉴런 수가 줄어들게 되고, 이는 학습 속도가 빨라지고 과적합을 방지할 수 있다. 

 

2. 계산량 감소하여 하드웨어 부담이 줄어든다. (실시간 처리에 유리) 

 

3. Max Pooling은 가장 강한 특징만 남기는데, 이는 잡음에 강하고 위치 변화에도 견딜 수 있다는 뜻이다. 

 

 

CNN의 기본구조 

Building Block 

CNN는 아래 순서로 구성이 된다. 

 

1. Conv Layer : 특징 추출을 수행한다. 

2. 활성화 함수 : 비선형성을 적용한다.

3. Pooling Layer : 차원 축소 및 정보 압축을 수행한다. 

 

이렇게 3가지가 묶여 하나의 블록이 되고, 이런 블록을 여러개 층층이 쌓아 깊은 신경망을 만든다. 

 

입력 데이터에 커널을 적용하여 여러 개의 특징 맵을 생성한다. 

그 후 활성화 함수를 적용하고 풀링을 진행한 뒤 다음 층에 전달하는 것이다. 

 

LeNet-5 구조 

MNIST 숫자 데이터인 28x28 크기의 흑백 이미지를 입력한다. 

총 5개의 층으로 구성 되어있으며, C-P-C-P-C 구조로 구성되어 있다. 

 

이렇게 5개의 층을 거친 후에  FC와 Softmax를 거쳐 분류를 수행 한다. 

 

 

입력 데이터 

크기 1x28x28 (채널 x 높이 x 너비) 

채널이 1인 이유는 흑백이미지이기 때문이다. 

 

Conv1 

필터 6개, 크기는 5x5, stride 1, padding 2

출력 크기 공식을 이용해서 출력 크기를 계산해보면 (28+2x2-5)/1+1 = 28이다. 

 

따라서 출력은 필터가 6개이기 때문에 채널 수가 6인 6x28x28이 되는 것이다. 

 

Pool1 

Average Pooling(2x2)을 사용하고 stride 2, 필터 크기 2x2이다. 

출력 크기는 28/2=14이다. 

 

따라서 출력은 앞에 구했던 채널 수 6을 활용하여 6x14x14가 되는 것이다. 

 

Conv2 

필터 수는 16, 크기는 5x5, stride 1, padding 0이다. 

출력 크기 공식을 사용하여 출력 특징맵 크기를 구해보면 (14-5)/1+1=10이다. 

 

따라서 출력은 필터 수가 16이므로 16채널인 16x10x10이 되는 것이다. 

 

Pool2 

2x2로 풀링을 진행하며  stride 2로 진행한다. 

출력 크기는 10/2인 5이다. 

 

따라서 출력은 앞에 구했던 채널 수 16을 활용하여 16x5x5가 된다. 

 

Conv3 

필터는 120개, 크기는 5x5, stride 1, padding 0이다. 

입력 데이터의 크기가 5x5이므로 전체 영역에 한번만 Conv를 수행하면 된다. 

따라서 출력 크기는 5-5+1=1이다. 

 

따라서 출력은 120x1x1이 되는 것이다. 

 

FC 

입력 120, 출력은 84이고, 비선형 함수(활성함수 - ReLU, tanh 등)를 사용한다. 

 

Softmax 

입력은 84, 출력은 10(클래스가 10개임)이다. 

argmax를 통해 예측 클래스를 결정한다.  

 

(Dense MLP) DMLP vs CNN 

❌ DMLP의 한계

DMLP는 모든 뉴런이 완전히 연결된 구조이다. 

모든 뉴런이 완벽하게 연결되어 있기 때문에 입력 크기가 다른 데이터가 들어오면 계산이 불가능하다. 

예를 들어 28x28 이미지와 32x32 이미지는 같은 DMLP로 처리가 불가한 것이다. 

 

 

CNN의 장점 

CNN은 입력 크기가 달라도 처리가 가능하다. 

커널의 크기나 stride를 조절해서 특징맵의 크기를 맞출 수 있기 때문이다. 

예를 들어 stride=2로 하여 특징맵의 크기를 반으로 줄이는 것이다. 

 

즉, CNN은 유연하게 크기 조정이 가능하여 다양한 해상도의 입력 데이터를 다룰 수 있다. 

 

 

시각 피질의 계층적 구조

CNN은 생물학적 뇌 구조에서 영감을 받아 만들어진 모델이다. 

아래 그림처럼 CNN도 계층별로 점점 복잡한 특징을 학습한다. 

 

오른쪽 그림을 보면 아래에서 위로 갈수록 수용야의 크기가 커지는 것을 볼 수 있는데, 이는 V1에서는 국소적 특징, IT에서는 전체적인 특징을 파악한다는 것이다. 

 

 

응용 분야 

- 이미지 분류 

이미지 전체가 무엇인지를 분류한다. 

 

- 물체 위치 찾기 

이미지 안에서 하나의 물체의 위치와 정체를 찾는다. 

 

- 객체 탐지 

이미지 속 여러 개의 물체 각각의 위치와 클래스를 찾는다. 

 

- 이미지 캡셔닝 

이미지를 보고 문장으로 설명을 생성한다.