[SK플래닛] ASAC 빅데이터전문가 11기 | 33일차

33일차는 딥러닝 구조를 조금 더 실제 설계 관점에서 본 날이었다. 전날에는 FNN, CNN, activation function 같은 용어를 큰 틀에서 봤다면, 이번에는 “입력층은 어떻게 정하고, 출력층은 무엇에 맞춰야 하고, CNN은 왜 이미지를 그냥 펼치지 않는가”를 중심으로 정리했다.

가장 크게 남은 건 신경망을 볼 때 항상 입력과 출력부터 생각해야 한다는 점이었다. 어떤 데이터를 넣고, 어떤 결과를 뽑고 싶은지가 정해져야 input layer와 output layer가 결정된다. hidden layer는 그 사이에서 어떤 방식으로 특징을 뽑을지 설계하는 영역이었다.

1. 신경망은 한 개 샘플 기준으로 생각해야 했다

신경망을 설계할 때는 전체 데이터셋보다 먼저 샘플 하나가 어떤 모양인지를 봐야 했다. 예를 들어 자동차 연비를 예측한다고 하면, 자동차 한 대가 하나의 샘플이고, 그 안에 배기량, 무게, 출력 같은 feature들이 들어간다. feature가 10개라면 input layer는 10개의 값을 받아야 한다.

샘플 1개
= feature 10개

input layer
= 입력 node 10개

output layer
= 연비 예측값 1개

회귀 문제라면 output은 보통 숫자 하나가 된다. 반대로 MNIST처럼 0~9 숫자를 분류한다면 output node는 10개가 필요하다. 이때 각 node는 0일 확률, 1일 확률, ..., 9일 확률을 담당하게 된다.

이 부분이 신경망 설계의 출발점이었다. input layer는 데이터 형태에 따라 정해지고, output layer는 문제 목적에 따라 정해진다. hidden layer는 그 사이를 어떻게 구성할지 결정하는 부분이었다.

2. 이미지를 FNN에 넣으면 공간 정보가 약해진다

이미지도 FNN에 넣을 수는 있다. 예를 들어 28×28 흑백 이미지는 픽셀이 784개이므로, 이를 1차원으로 펼쳐서 784개의 input node에 넣을 수 있다.

28 × 28 이미지
→ 784개 픽셀
→ 1D vector로 flatten
→ FNN input layer에 입력

문제는 이렇게 펼치면 이미지의 공간 구조가 약해진다는 점이었다. 원래 이미지에서는 위아래, 좌우 픽셀이 가까이 붙어 있어서 의미가 생긴다. 그런데 1D로 펼치면 각 픽셀이 독립적인 값처럼 처리되기 쉽다.

이미지는 픽셀 하나가 아니라 주변 영역과 함께 의미를 가진다. 예를 들어 세로선, 가로선, edge, 눈·코·입 같은 특징은 주변 픽셀의 패턴에서 나온다. 그래서 이미지를 다룰 때는 단순히 flatten해서 FNN에 넣는 것보다, 공간 구조를 유지하면서 특징을 뽑는 CNN이 더 자연스럽게 느껴졌다.

3. Convolution은 영역 단위 특징을 뽑는 방식이었다

CNN의 핵심은 convolution이었다. 전통적인 이미지 처리에서는 세로선, 가로선, blur, edge 같은 특징을 찾기 위해 filter를 사용했다. 이 filter를 이미지 위에 움직이면서 각 영역에 적용하면, 해당 특징이 어느 위치에서 강하게 나타나는지 확인할 수 있다.

이미지 일부 영역
× filter
→ 선형결합
→ 하나의 값

이 과정을 이미지 전체에 반복
→ Feature Map 생성

예를 들어 세로선 특징을 찾는 filter가 있다면, 이미지의 각 영역을 보면서 세로선이 강한 곳에서는 큰 값이 나오고, 그렇지 않은 곳에서는 작은 값이 나온다. 이 결과를 모아둔 것이 Feature Map이었다.

여기서 중요한 관점은 convolution도 결국 선형결합이라는 점이었다. 이미지의 작은 영역과 filter 값을 곱해서 더하는 구조이기 때문이다. 다만 Dense Layer처럼 모든 입력을 전부 연결하는 것이 아니라, filter가 지나가는 일부 영역에 대해서만 연결된다.

Dense Layer
= 모든 입력과 모든 출력이 연결

Convolution Layer
= 특정 영역의 픽셀만 선택적으로 연결
= 같은 filter를 이미지 전체에 반복 적용

이 구조 덕분에 CNN은 이미지의 공간적 특징을 살리면서도, 모든 픽셀을 완전 연결하는 것보다 효율적으로 특징을 추출할 수 있다.

4. CNN은 filter 값을 직접 학습한다

전통적인 이미지 처리에서는 사람이 세로선 filter, 가로선 filter, blur filter를 직접 정했다. 그런데 CNN에서는 이 filter 값 자체를 학습해야 할 weight로 본다. 즉 “이 이미지 문제를 잘 풀기 위해 어떤 filter가 필요한지”를 데이터로부터 찾아가는 것이다.

이 부분이 CNN이 인공신경망으로 연결되는 지점이었다. filter는 고정된 규칙이 아니라 학습되는 가중치가 되고, convolution layer는 이미지에서 필요한 특징을 자동으로 뽑는 역할을 한다.

전통 이미지 처리
= 사람이 filter를 설계

CNN
= filter 값을 데이터로 학습

그래서 CNN에서 filter 수가 많아지면 여러 종류의 특징을 뽑을 수 있다. 하나의 filter는 하나의 feature map을 만들고, 여러 filter를 사용하면 여러 feature map이 쌓인다. 결국 filter 개수는 출력 feature map의 channel 수와 연결된다.

5. Pooling은 특징맵을 대표값으로 줄이는 과정이었다

Convolution을 통해 feature map을 만들면, 그 결과를 그대로 쓰기보다 크기를 줄이는 과정이 들어간다. 이것이 pooling이었다. Pooling은 일정 영역을 하나의 값으로 대표하는 방식이다.

Max Pooling
= 영역 안에서 가장 큰 값 선택

Average Pooling
= 영역 안의 평균값 선택

예를 들어 2×2 영역을 하나의 값으로 줄이면, feature map의 가로·세로 크기가 줄어든다. 이렇게 하면 계산량을 줄이고, 너무 세세한 위치 변화나 노이즈에 덜 민감하게 만들 수 있다.

CNN의 흐름을 단순하게 정리하면 아래와 같았다.

이미지 입력
→ Convolution으로 특징 추출
→ Pooling으로 크기 축소
→ 다시 Convolution / Pooling 반복
→ Flatten
→ Dense Layer
→ 최종 출력

여기서 Flatten은 convolution과 pooling을 거쳐 나온 feature map을 1차원으로 펼쳐 Dense Layer에 전달하는 역할이었다. CNN 앞부분은 이미지 특징을 뽑는 단계이고, 뒷부분은 그 특징을 이용해 분류나 회귀를 수행하는 단계처럼 이해됐다.

6. Activation Function은 hidden layer와 output layer에서 역할이 달랐다

Activation Function도 다시 정리했다. hidden layer에서는 비선형성을 넣기 위해 activation function을 사용한다. 여러 층을 쌓아도 activation이 없다면 결국 선형결합의 반복에 가까워지기 때문에 복잡한 경계를 만들기 어렵다.

hidden layer에서는 ReLU 계열을 많이 사용한다고 했다. Sigmoid는 예전부터 사용됐지만 지수 계산이 들어가고, 양끝에서 gradient가 작아지는 문제가 있다. 반면 ReLU는 계산이 단순해서 빠르다.

Sigmoid
= 0~1 사이 값으로 압축
= gradient saturation 문제가 생길 수 있음

ReLU
= max(0, x)
= 계산이 빠름
= 딥러닝 hidden layer에서 많이 사용

Output layer에서는 문제 목적에 따라 activation이 달라졌다. 회귀는 값을 그대로 받아야 하므로 항등함수를 사용할 수 있고, 이진 분류는 sigmoid, 다중 클래스 분류는 softmax를 사용할 수 있다.

회귀
→ Identity

이진 분류
→ Sigmoid

다중 클래스 분류
→ Softmax

이 부분은 input/output 설계와 이어졌다. 출력층은 단순히 node 개수만 맞추는 것이 아니라, 어떤 activation을 써야 해석 가능한 결과가 되는지도 같이 정해야 했다.

7. 결국 설계는 input, hidden, output을 맞추는 과정이었다

이번 내용은 딥러닝 모델을 볼 때 무엇을 먼저 봐야 하는지 정리하는 데 도움이 됐다. 모델 구조를 보면 먼저 input이 어떤 형태인지 봐야 한다. 숫자 feature인지, 이미지인지, 텍스트인지에 따라 입력 처리 방식이 달라진다.

그다음은 output이다. 숫자 하나를 예측하는지, 여러 클래스 중 하나를 고르는지, 이미지나 텍스트를 생성하는지에 따라 output layer 설계가 달라진다. hidden layer는 그 사이에서 어떤 특징을 뽑고 어떤 함수 구조를 만들지 결정하는 부분이다.

Input
= 어떤 데이터를 넣을 것인가

Hidden
= 어떤 방식으로 특징을 뽑을 것인가

Output
= 어떤 형태의 결과를 낼 것인가

이 흐름으로 보니 CNN도 조금 덜 막연하게 느껴졌다. CNN은 이미지라는 입력의 구조를 살리기 위해 convolution과 pooling을 사용하고, 마지막에는 목적에 맞는 output layer로 연결하는 구조였다.

정리 ! 

33일차는 딥러닝 모델을 실제로 설계할 때 봐야 할 기준을 정리한 날이었다. 입력층은 데이터 한 샘플의 형태에 따라 결정되고, 출력층은 내가 풀려는 문제의 목적에 따라 결정된다. 은닉층은 그 사이에서 어떤 특징을 뽑을지 설계하는 영역이었다.

 

FNN은 이미지를 1D로 펼쳐 넣을 수 있지만, 그렇게 하면 이미지의 공간 구조가 약해진다. CNN은 이 한계를 보완하기 위해 filter를 이미지 위에 움직이며 영역 단위 특징을 추출하고, pooling으로 feature map을 줄인 뒤 flatten해서 최종 출력으로 연결한다.

 

또 activation function은 hidden layer에서는 비선형성을 만들고, output layer에서는 결과를 해석 가능한 형태로 바꾸는 역할을 했다. 회귀, 이진 분류, 다중 클래스 분류에 따라 출력층의 node 수와 activation function을 다르게 설계해야 한다는 점이 남았다.


33일차는 딥러닝 모델을 input, hidden, output 구조로 바라보고, CNN이 이미지의 공간 정보를 살리기 위해 convolution과 pooling을 사용하는 이유를 이해한 날이었다.