DL/Voice

[Voice] CNN (Convolutional neural network) 간단 설명

moonzoo 2024. 3. 12. 01:33

0. 개요

CNN은 주로 이미지 데이터 처리에 강점을 가지고 있지만, 오디오 데이터의 스펙트로그램(시간에 따른 주파수의 분포를 시각화한 것)과 같은 형태로 전처리하면 음성 신호 분석에도 활용할 수 있습니다. 

 

CNN으로 음성 데이터 처리를 하기에 앞서 CNN은 무엇인지에 대해 정리하겠습니다.


 

1. CNN의 역사

  1. LeNet (1998)
    • Yann LeCun에 의해 제안되었습니다.
    • 초기 핸드쓴 문자 인식에 사용됐습니다.
    • CNN의 초기 모델로서 기초적인 컨볼루션 레이어와 풀링 레이어의 구조를 갖고 있습니다.
  2. AlexNet (2012)
    • 2012년 ImageNet Large Scale Visual Recognition Challenge에서 우승한 모델입니다.
    • 딥러닝의 인기를 불러일으키는 데 중요한 역할을 했습니다.
    • 여러 컨볼루션 레이어와 완전 연결 레이어, 드롭아웃 등을 사용했습니다.
  3. VGG (2014)
    • Oxford VGG 팀에 의해 제안되었습니다.
    • 3x3 컨볼루션의 반복 사용이 주요 특징입니다.
    • VGG16 및 VGG19 등의 다양한 버전이 있습니다.
  4. GoogLeNet / Inception (2014)
    • 인셉션 모듈이라는 복잡한 구조를 도입하여 파라미터 효율성을 개선했습니다.
    • 여러 버전의 인셉션 네트워크가 연속적으로 발표되었습니다.
  5. ResNet (Residual Network, 2015)
    • Microsoft Research에 의해 제안되었습니다.
    • 깊은 네트워크에서 발생할 수 있는 학습의 어려움을 극복하기 위해 "잔여 연결" 또는 "스킵 연결"을 도입했습니다.
    • 매우 깊은 네트워크 (예: ResNet-152)도 효과적으로 학습할 수 있게 되었습니다.
  6. DenseNet (2017)
    • 각 레이어의 출력이 그 다음 모든 레이어에 연결되는 밀집 연결 구조를 갖고 있습니다.
    • 특징 재사용과 그래디언트 흐름 개선의 장점이 있습니다.
  7. MobileNets (2017)
    • 경량화된 모델로, 모바일 기기 및 엣지 디바이스에서의 고속 및 고효율 실행을 목표로 합니다.
    • 깊이별 컨볼루션과 포인트별 컨볼루션을 사용하여 파라미터와 연산량을 크게 줄였습니다.
  8. EfficientNet (2019)
    • Compound Scaling 방법을 사용하여 네트워크의 깊이, 너비, 입력 해상도를 동시에 조절하는 방법을 제안했습니다.
    • 기존의 모델보다 더 적은 파라미터로도 뛰어난 성능을 달성했습니다.

2. CNN이란?

Convolutional Neural Networks의 약자로 딥러닝에서 주로 이미지, 영상 데이터를 처리할 때 쓰이며 이름에서 알수있다시피 Convolution이라는 전처리 작업이 들어가는 Neural Network 모델입니다.

 

기존의 DNN같은 경우엔 Fully-connected된 계층을 사용했지만, CNN은 Convolution layer(합성곱 계층)과 pooling layer(풀링 계층)이 추가되는 것이 특징입니다.

 

그림을 살펴보면 Convolution layer와 Pooling layer가 한세트로 묶여서 여러번 층을 구성한 것을 확인할 수 있으며, 마지막으로는 Fully connected layer로 Convolution/Pooling 프로세스의 결과를 취하여 이미지를 정의된 라벨로 분류하고 있습니다.

 

즉, CNN은 1. 합성곱을 통해 Feature map을 추출하는 Feature Extraction 단계와 2. FC Layer를 통해 이미지를 분류하는 Classfication 단계로 나뉩니다.

 

각 layer별 역할은 다음과 같습니다.

 

Convolution Layer

  • 이 레이어는 이미지의 2D 구조를 유지하며, 필터(또는 커널)를 사용하여 특징을 추출합니다.
  • 각 필터는 이미지의 특정한 부분에 반응하며, 이를 통해 생성된 특징 맵은 여전히 2D 형태를 유지합니다.

Pooling Layer

  • 풀링 레이어는 컨볼루션 레이어에 의해 생성된 특징 맵의 크기를 줄입니다. 이는 이미지의 공간적 해상도를 감소시키지만, 여전히 2D 형태의 특징 맵을 유지합니다.
  • 대표적인 풀링 연산에는 Max Pooling과 Average Pooling이 있습니다.

평탄화 (Flattening):

  • 평탄화는 특징 맵을 1D 벡터로 변환하는 과정으로 이는 보통 Fully Connected Layer에 입력하기 전에 수행됩니다.
  • Keras와 같은 딥러닝 라이브러리에서는 **Flatten()**이라는 명령을 사용하여 이 변환을 수행할 수 있습니다.
  • 특징 맵의 모든 요소들이 일렬로 나열되어, Fully Connected Layer에서 처리될 수 있는 형태가 됩니다.

fc_3 (Fully Connected Layer):

  • 풀링 레이어로부터 나온 특징 맵을 평탄화(flattening)하여 1D 벡터로 변환한 후, 이 레이어에서 데이터에 대한 학습을 시작합니다.
  • 특징들을 결합하여 더 복잡한 패턴을 학습하며, 이미지 내의 고차원적인 관계를 식별하는 데 중요한 역할을 합니다.
  • ReLU 활성화 함수를 사용하여 비선형성을 추가하고, 모델이 복잡한 함수를 모델링할 수 있도록 합니다.

fc_4 (Fully Connected Layer):

  • 이 레이어는 일반적으로 분류 문제에서 최종 출력을 위한 레이어로 fc_3 레이어에서 학습된 고차원 특징을 기반으로 각 클래스에 대한 예측을 수행합니다.
  • 이 레이어는 드롭아웃(dropout) 기법을 포함하여 과적합(overfitting)을 방지하고 일반화 성능을 향상시킵니다.
  • 마지막 출력 레이어에는 보통 소프트맥스(softmax) 활성화 함수가 사용되어, 각 클래스에 속할 확률을 출력합니다.

 

Covolution Layer

이미지 처리에 CNN을 사용하는 이유는?

 

위 그림과 같이 3X3의 이미지 픽셀을 아래 그림과 같이 평탄화하여 단일 차원의 벡터로 변환하면 9개의 특성을 가진 노드가 되고, 이를 통해 Neural Network을 구성합니다. 그러나 이는 이는 각 픽셀을 하나의 특성으로 사용한 것으로 이미지의 지역정보를 포함하지 않습니다.

 

사람의 얼굴로 치면 귀는 어디에 있고, 입은 어디에 있는지 등의 위치정보가 중요한데, 이런 지역정보를 무시하고 위와 같이 한개의 벡터로 변환하여 Neural Network를 구성하면 지역정보를 반영할 수 없습니다. 이를 해결하고자 합성곱(Convolution) 연산을 사용하게됩니다.

 

합성곱 연산

합성곱 연산은 이미지의 작은 부분(지역적 영역)에 주목하여, 그 부분에서만 필터(커널)와 이미지의 요소별 곱셈을 통해 값을 계산합니다. 그리고 이 값을 합하여 특성 맵의 해당 위치에 값을 할당함으로써, 필터가 감지하는 특성이 해당 지역에서 얼마나 활성화되었는지를 나타내기 때문에 지역적 특성과 패턴을 포착할 수 있습니다.

 

 

위 그림 각 요소는 다음과 같습니다.

 

입력 이미지 (Image)

2차원 격자 또는 행렬로 표현되는 픽셀 값입니다. 여기서는 5x5 격자의 흑백 이미지로, 각 셀에는 0 또는 1의 값이 있으나, 컬러 이미지나 회색조(grayscale) 이미지에서는 픽셀 값이 더 다양한 범위를 가집니다.

 

필터 (Filter):

필터는 이미지의 특정 특징을 감지하는 데 사용되는 작은 2차원 격자로, 여기서는 3x3 크기입니다. 이 필터는 이미지를 통과하면서 특정 패턴을 감지하는 데 사용됩니다.

 

합성곱 특징 (Convolved Feature):

이는 필터를 적용한 후 생성된 출력입니다. 필터가 이미지 위를 이동하며 적용되는 각 위치에서, 필터와 이미지 격자의 요소별 곱(element-wise multiplication)을 계산하고, 그 결과의 합을 구하여 특징 맵의 해당 위치에 값을 할당합니다.

 

위 그림의 합성곱 연산의 구체적인 단계는 다음과 같습니다.

  • 필터를 이미지의 왼쪽 상단에 위치시킵니다.
  • 필터와 이미지 격자의 요소별 곱을 계산합니다.
  • 계산된 모든 값을 합하여, 이 합계가 결과 특징 맵의 현재 위치의 값이 됩니다.
  • 필터를 오른쪽으로 한 스트라이드(stride)만큼 이동시키고, 이 과정을 반복합니다.
  • 이미지 전체에 대해 이 연산을 수행하여, 최종적으로 완성된 특징 맵을 얻습니다.

그림 상에서 필터는 이미지의 첫 번째 3x3 구역에 적용되었고, 해당 요소별 곱의 합은 4입니다.

계산과정 : (1x1) + (1x0) + (1x1) + (0x0) + (1x1) + (1x0) + (0x1) + (1x0) + (1x1) = 4

 

합성곱 연산의 중요 요소는 다음과 같습니다.

  • 스트라이드(Strides):
    • 필터를 이미지 위에서 얼마나 멀리 이동시킬지 결정합니다. 스트라이드가 크면 특징 맵의 크기는 작아집니다.
  • 패딩(Padding):

 

  • 이미지 주변에 추가적인 픽셀(보통 0의 값을 가지는)을 덧붙여, 필터가 이미지의 가장자리 부분도 충분히 처리할 수 있도록 합니다. 이를 통해 특징 맵의 크기를 조절하거나, 입력 이미지의 크기를 유지할 수 있습니다.
  • 패딩을 적용하는 이유의 첫번째로, padding은 output의 크기를 조절할 수 있습니다. CNN의 특성상 여러 convolution layer를 거치게 되는데, 이러한 경우 output의 크기가 점점 작아지면서 특성 맵이 1x1 사이즈까지 줄어들게 되면 다음 layer에서 합성곱 연산을 진행할 수 없게 됩니다. 이런 이유로 padding을 적용하여 output의 크기를 유지하도록 해줍니다.
  • 패딩을 적용하는 이유의 두번째로, padding을 사용함으로써 가장자리의 데이터 손실을 줄일 수 있습니다. padding을 사용하지 않으면 convolution layer를 거칠 수록 데이터의 크기가 점점 작아지면서 가장자리의 정보가 점점 사라지게 됩니다. 따라서 padding을 사용해 input과 output의 크기를 맞추어 가장자리의 정보를 잃지 않도록 합니다.
  • 활성화 함수(Activation Function):
    • 합성곱 이후에 통과되는 비선형 함수로, 일반적으로 ReLU(Rectified Linear Unit)가 사용됩니다. 이는 모델이 비선형 문제를 해결할 수 있도록 돕습니다.

 

실제 Convolution 필터 예제

 

위 그림을 보면 알 수 있는 것은 Convoultion layer에서 학습을 통해 weight가 업데이트 되는 부분은 필터라는 것!

 

학습이 진행됨에 따라 필터는 이미지 내에서 가장 중요한 특징을 감지하는 데 필요한 최적의 패턴을 학습하게 됩니다.

따라서, 그림에서 볼 수 있는 필터의 패턴은 학습 과정을 통해 업데이트되어 입력 이미지의 유용한 특징을 더 잘 잡아낼 수 있게 됩니다.

 

Pooling Layer

Pooling layer, 또는 풀링 레이어는 컨볼루션 신경망(CNN)의 구조에서 주로 컨볼루션 레이어 뒤에 위치하며, 특징 맵의 차원을 축소하여 계산량을 줄이고, 과적합을 방지하며, 특징의 변이에 대한 강건성을 높이는 역할을 합니다.

 

 

Pooling Layer의 주요 기능

  1. 차원 축소(Dimensionality Reduction): 풀링 레이어는 입력으로 들어오는 특징 맵의 공간적 크기를 줄입니다. 이는 각 풀링 연산 후에 맵의 가로 및 세로 차원이 감소함을 의미합니다.
  2. 과적합 방지(Prevent Overfitting): 풀링을 통해 모델이 훈련 데이터의 노이즈에 덜 민감하게 되며, 결과적으로 모델의 일반화 능력이 향상됩니다.
  3. 특징 강화(Feature Reinforcement): 풀링 연산은 중요한 특징을 유지하면서 불필요한 정보를 제거합니다. 이로 인해 모델이 중요한 특징에 집중할 수 있게 됩니다.
  4. 변이에 대한 강건성(Increased Robustness to Variations): 소량의 이동, 회전 및 스케일링에 대한 이미지의 변화에도 중요한 특징을 인식할 수 있습니다.

Pooling Layer의 유형

  1. 최대 풀링(Max Pooling): 각 풀링 윈도우에서 최댓값을 선택하여 출력으로 사용합니다. 이 방식은 특징 맵 내에서 가장 두드러진 특징을 강조하는 효과가 있습니다.
  2. 평균 풀링(Average Pooling): 풀링 윈도우 내의 모든 값의 평균을 계산하여 출력으로 사용합니다. 이는 특징 맵의 일반적인 특성을 요약하여 전달합니다.
  3. 전역 풀링(Global Pooling): 전체 특징 맵에 대해 단일 통계치(보통 최댓값 또는 평균)를 계산합니다. 이는 각 특징 맵을 하나의 숫자로 요약하여 전체 특징에 대한 글로벌한 정보를 제공합니다.

Pooling Layer의 작동 방식

  • 일반적으로 풀링 윈도우(예: 2x2)는 정해진 스트라이드(보통 윈도우 크기와 같음)에 따라 특징 맵을 스캔합니다.
  • 각 윈도우에서 연산(최댓값 또는 평균)을 수행한 후, 해당 결과를 새로운 축소된 특징 맵의 셀로 저장합니다.
  • 이 과정은 특징 맵의 모든 위치에서 수행되며, 최종적으로 크기가 줄어든 새로운 특징 맵이 생성됩니다.

풀링 레이어는 모델의 계산 복잡성을 줄이는 동시에 중요한 특징을 강조하고, 입력 데이터가 변화에도 강건한 모델을 만드는 데 중요한 역할을 합니다.


3. 음성 데이터는 어떻게 처리하는가?

  1. 스펙토그램 생성:
    • 원시 오디오 신호로부터 스펙토그램 또는 멜 스펙토그램을 생성합니다.
  2. 컨볼루션 필터 적용:
    • 생성된 스펙토그램에 다양한 컨볼루션 필터(커널)를 적용합니다. 이 필터들은 시간과 주파수 축에 걸쳐 지역적인 특징을 감지합니다. 예를 들어, 특정 주파수 범위에서의 에너지 변화나 특정 시간 동안의 주파수 패턴 등을 감지할 수 있습니다.
  3. 특징 맵 생성:
    • 각 필터의 계산 결과로 특징 맵이 생성됩니다. 이 맵은 필터가 감지한 특징을 나타내며, 음성 데이터의 중요한 정보를 포함합니다.
  4. 활성화 함수 적용:
    • 컨볼루션 연산 후, 활성화 함수(주로 ReLU)를 적용하여 비선형 특성을 추가합니다.
  5. 풀링 연산 수행:
    • Max Pooling 또는 Average Pooling을 사용하여, 시간 또는 주파수 축을 따라 특징 맵을 다운샘플링합니다. 이는 더 넓은 영역의 특징을 포착하고, 데이터의 차원을 줄이며, 과적합을 방지하는 데 도움을 줍니다.
  6. Fully connected layer:
    • 최종적으로, 특징 맵을 평탄화하고 하나 이상의 완전 연결 레이어를 통과시켜 최종 분류 또는 회귀를 수행합니다.

음성 데이터에 대한 합성곱 연산의 목적은 음성의 다양한 특징을 자동으로 학습하고, 이를 기반으로 음성 인식, 감정 분석, 화자 인식 등의 작업을 수행하기 위함입니다. 이 과정은 신호의 기본 주파수 특성뿐만 아니라, 시간에 걸친 동적 변화도 포착할 수 있어, 음성 데이터 처리에 매우 효과적입니다.

 


4. 마치며...

CNN으로 음성 데이터 처리를 하기 전, CNN이 무엇인지에 대해 자세하게 알아봤습니다.

 

다음은 음성 데이터를 1D Convolution으로 어떻게 처리하는지에 대해 정리하도록 하겠습니다.