이 글에서는 카카오클라우드의 Kubeflow 환경에서 합성곱 신경망(CNN)을 구현하여 MNIST 데이터셋을 분류하는 과정을 다룰 것입니다. MNIST는 손으로 쓴 숫자 이미지 데이터셋으로, 머신러닝 분야에서 널리 사용되는 벤치마크 데이터셋입니다. 이미지 분류 문제를 해결하기 위해 다양한 방법론들이 오랫동안 연구되어 왔으며, 그 중 하나가 오늘 소개할 CNN입니다.
CNN에 대해 알아보기 전에, 이해하는데 도움을 드리기 위해서 퍼셉트론에서 CNN까지 발전하게된 흐름과 각 신경망의 장단점, MaxPooling, 활성화 함수 등 기본 구성 요소를 짚고 넘어가려고 합니다.
1. 퍼셉트론 (Perceptron)
퍼셉트론은 Frank Rosenblatt가 1957년에 개발한 가장 간단한 형태의 인공 신경망입니다. 퍼셉트론은 하나의 뉴런으로 구성되어 있으며, 입력값과 가중치를 곱한 후 이를 합산하여 활성화 함수를 통과시킵니다. 이후 임계값과 비교하여 출력을 결정합니다.
퍼셉트론은 선형적으로 구분 가능한 패턴을 분류할 수 있습니다. 하지만 XOR 연산과 같은 비선형 문제에는 적용할 수 없다는 한계가 있어 이후 다층 퍼셉트론이 개발되면서 이런 한계가 극복되었습니다.
2. 다층 퍼셉트론 (Multi-Layer Perceptron, MLP)
다층 퍼셉트론은 여러 개의 퍼셉트론을 여러 층으로 구성한 것입니다. 이는 입력층, 은닉층, 출력층으로 이루어져 있으며, 각 층은 이전 층의 출력을 입력으로 받아 가중치와 함께 선형 조합을 수행한 후 활성화 함수를 통과시킵니다. 다층 퍼셉트론은 복잡한 비선형 관계를 모델링할 수 있어서, 더욱 다양한 문제를 해결할 수 있습니다.
다층 퍼셉트론은 다양한 종류의 문제를 해결하는 데 유용하지만, 몇 가지 한계가 있습니다.
과적합(Overfitting): 다층 퍼셉트론은 매우 유연한 모델이기 때문에 학습 데이터에 과도하게 적합될 수 있습니다. 이는 모델이 학습 데이터에만 잘 작동하고 새로운 데이터에 대한 일반화 능력이 떨어지는 과적합 문제를 초래할 수 있습니다.
계산 비용과 시간: 다층 퍼셉트론은 많은 수의 은닉층과 뉴런을 포함할수록 학습에 필요한 계산 비용과 시간이 증가합니다. 특히 데이터가 크고 복잡한 경우에는 학습이 느려질 수 있습니다.
이러한 다층 퍼셉트론의 한계를 극복하기 위해 합성곱 신경망(Convolutional Neural Network, CNN)이 등장하였습니다. CNN은 이미지 처리와 컴퓨터 비전 분야에서 주로 사용되며, 다층 퍼셉트론의 일부 한계를 해결하는 데 기여합니다.
3. 합성곱 신경망 (Convolutional Neural Network, CNN)
합성곱 신경망은 이미지 처리와 컴퓨터 비전 분야에서 주로 사용되는 신경망 구조입니다. CNN은 입력 이미지와 필터(커널) 사이의 컨볼루션 연산을 사용하여 이미지의 특징을 추출합니다. 이후 풀링(pooling) 과정을 거쳐 특징 맵을 축소하고 중요한 정보를 강조합니다. CNN은 시각 데이터 처리에 적합한 구조로 설계되어 이미지 인식, 객체 탐지 등의 컴퓨터 비전 분야에서 뛰어난 성능을 보입니다. 따라서 CNN은 다층 퍼셉트론의 한계를 극복한 대표적인 심층 신경망 모델이라고 할 수 있습니다.
4. MaxPooling
MaxPooling은 CNN에서 사용되는 풀링 기법 중 하나입니다. 풀링은 특징맵(feature map)의 해상도를 낮추어 계산 복잡도를 줄이고 과적합을 방지합니다. MaxPooling은 주어진 영역에서 가장 큰 값을 선택하여 출력하는데, 특징의 위치 정보를 일부 보존하면서도 해상도를 낮추고, 작은 변화나 노이즈에 덜 민감해져서 이를 통해 특징을 더욱 강조하고 공간적인 크기를 줄여 연산량을 줄입니다.
5. 활성화 함수
활성화 함수는 인공 신경망에서 입력 신호의 가중치 합을 출력으로 변환하는 함수입니다. 이 함수는 신경망의 비선형성을 추가하고 복잡한 입력과 출력 간의 비선형 관계를 학습할 수 있습니다.
ReLU 함수 (Rectified Linear Unit)
이번 실습에서 CNN을 구현하는데 사용한 ReLU(Rectified Linear Unit) 함수는 인공 신경망에서 널리 사용되는 활성화 함수 중 하나입니다. 입력값이 양수인 경우에는 그 값을 그대로 출력하고, 음수인 경우에는 0을 출력합니다.
이 함수는 다음과 같이 수식으로 표현됩니다: ReLU(x)=max(0,x)
특징:
- 비선형성(Non-linearity): ReLU 함수는 비선형 함수입니다. 이는 신경망에 비선형성을 도입하여 복잡한 데이터의 비선형 관계를 모델링할 수 있게 해 줍니다.
- 계산 효율성: ReLU 함수는 단순한 형태로 연산이 간단하며, sigmoid나 tanh 함수와 같은 다른 활성화 함수보다 계산이 빠릅니다.
단점:
- dead ReLU: 입력값이 음수인 경우에는 출력이 항상 0이 되기 때문에 해당 뉴런이 학습 중에 다시 회복되지 않는 dead ReLU 문제가 발생할 수 있습니다. 이는 네트워크에서 뉴런의 일부가 학습 중에 비활성화되는 현상을 일으킬 수 있습니다.
ReLU 함수는 주로 은닉층에서 사용되며, 기울기 소실 문제를 완화하고 연산 속도를 높이는 데 효과적입니다. 그러나 Dead ReLU 문제에 대한 대안으로 Leaky ReLU나 Parametric ReLU와 같은 변형된 ReLU 함수가 사용될 수 있습니다.
이제 우리는 CNN을 구현하기 위한 이론적 배경을 갖추었습니다. 그렇다면 실제로 CNN을 구현하고 MNIST 데이터셋을 분류하는 실습을 진행해 보겠습니다. 이 실습에서는 카카오클라우드의 Kubeflow 환경을 사용할 것입니다.
Kubeflow는 머신러닝과 데이터 과학을 위한 오픈소스 플랫폼으로, Kubernetes 위에서 실행됩니다. Kubeflow를 사용하면 데이터 전처리, 모델 학습, 하이퍼파라미터 튜닝, 모델 서빙 등 머신러닝 워크플로우의 전 과정을 간편하게 관리할 수 있습니다. 또한, 다양한 머신러닝 프레임워크와 도구를 지원하므로 사용자는 선호하는 환경에서 작업할 수 있습니다.
카카오클라우드에서는 Kubeflow를 손쉽게 배포하고 사용할 수 있는 관리형 서비스를 제공합니다. 이를 통해 사용자는 인프라 관리에 대한 부담 없이 머신러닝에 집중할 수 있습니다. 또한, Katib와 같은 하이퍼파라미터 최적화 도구를 활용하여 모델 성능을 향상시킬 수 있습니다.
그럼 이제 카카오클라우드 Kubeflow 환경에서 CNN을 구현하고 MNIST 데이터셋을 분류하는 실습을 진행해 보겠습니다.
카카오클라우드 Kubeflow 환경에서 CNN을 구현하고 MNIST 데이터 분류하기
학습에 필요한 Hyperparameter를 정의하고 MNIST 데이터셋을 가져옵니다.
위에 설명드렸던 합성곱신경망 CNN, ReLU, MaxPooling을 활용한 구현입니다.
엄청 많은 양의 데이터는 아니지만 빠른 시간 내에 학습이 완료되었습니다!
분류모델이 정확도가 99.04% 로 나왔습니다.
이 실습을 통해 우리는 카카오클라우드 Kubeflow 환경에서 CNN을 구현하고 MNIST 데이터셋을 분류하는 과정을 경험해 보았습니다. Kubeflow를 사용함으로써 머신러닝 워크플로우를 효율적으로 관리할 수 있었고, 간단한 CNN 모델로도 99.04%라는 높은 정확도를 달성할 수 있었습니다.
향후 Katib와 같은 하이퍼파라미터 최적화 도구를 활용한다면 모델 성능을 더욱 향상시킬 수 있을 것입니다. 카카오클라우드의 Kubeflow 환경은 머신러닝 프로젝트를 수행하는 데 있어 강력하고 유용한 플랫폼임을 확인할 수 있었습니다. 여러분도 카카오클라우드 Kubeflow를 사용해 다양한 머신러닝 프로젝트에 도전해 보시기 바랍니다.
https://docs.kakaocloud.com/tutorial/machine-learning-ai/kubeflow-hyperparameter
댓글