개인적으로 딥러닝을 공부하기 위해 여러가지 책과 논문들 그리고 강의 동영상들을 읽어보았지만 실제로 어떻게 하는가에 많은 의문이 들었던게 사실이다.

인터넷에 있는 예제를 그냥 돌려보는 것은 결과만을 보여줄 뿐 그 과정을 따라가기가 여렵고 특히 데이터 셋을 만드는 방법등은 잘 나와있지 않다. 그래서 어떻게 하면  CNN같은 딥러닝을 구현해볼까 하다가 

다음 사이트를 발견하였다. 

http://adilmoujahid.com/posts/2016/06/introduction-deep-learning-python-caffe/

Adil Moujahid라는 분이 작성한 블로그 포스트로 Caffe에 정의된 다양한 모델을 가지고 여러가지 개와 고양이 사진을 구분하는 과정을 자세히 설명하고 있다.

이 포스트는 원저자의 허락을 받고 일부 코드와 내용을 수정하여 올린것임을 밝힌다.

This post is originated from above article with slight modifications and my own translation under Adil Moujahid's kind permission.

------------------------------------------------------------------------------------------------------------------------------------------------------------------


이 글의 목적은 딥러닝을 실제로 수행하는 방법을 알려주기 위해 작성되었습니다. 이를 위해서 우리는 개와 고양이 이미지를 Convolutional Neural Network(CNN)이라 불리는 딥러닝 알고리즘을 가지고 클래시파이어(식별자)를 만들 것입니다.


이 글은 2개의 파트로 구성되어 있습니다. 첫번째는 딥러닝에 관한 핵심적인 컨셉 그리고 나머지는 실제 과정을 설명합니다.

실제 과정의 첫번째(4장)에서는 CNN을 처음부터 개발하여 개와 고양이 이미지 식별자를 만들 것입니다. 이를 위해서 약간의 파이썬 코드와 오픈소스 딥러닝 프레임웍으로 널리 사용되는 Caffe를 사용하여 식별자를 만듭니다. 우리의 식별자는 최대 97%의 정확도를 가지게 됩니다.


이 글을 다 읽으면 Convolutional Neural Network이 어떻게 동작하는지를 이해하고 코드를 작성하는 방법에 익숙해질 것입니다.


이 과정의 모든 소스코드 원본은 Github에서 다운로드 받을 수 있습니다.


1. 문제 정의


이 장에서 우리는 Kaggle의 데이터셋을 사용하게 됩니다. 이 데이터셋은 약 25,000장의 개와 고양이 이미지를 포함하고 있습니다.

우리의 목표는 개와 고양이를 구분하는 적절한 머신러닝 알고리즘을 만들어서 이전에 보지 못한 이미지를 식별하는 것입니다.


머신 러닝에서는 이러한 종류의 문제를 식별 문제(Classification)라고 부릅니다.

Kaggle 데이터셋에서 가져온 개와 고양이 샘플




2. 전통적인 머신러닝 대 딥러닝 식별 문제(Classification)


머신러닝 알고리즘을 통한 식별의 2단계:

 - 훈련(Train) 단계: 이미지와 각각의 라벨로 구성된 데이터셋을 사용하여 머신러닝 알고리즘을 훈련시킵니다.

 - 예측(Predict) 단계: 훈련된 모델을 사용하여 처음 보는 이미지에 적용할 라벨을 예측합니다.


이미지 식별 문제를 위한 훈련 단계는 2단계를 거칩니다:

 1. 특징점 추출: 이 단계는 도메인 지식(역자 주, 어떤 물체는 엣지가 많고 다른 물체는 둥그스름한게 많다라는 등의 지식)을 활용하여 머신러닝 알고리즘에서 사용할 특징점들을 찾아냅니다. HoG 와 SIFT는 이러한 영상 식별의 한 예 입니다.

 2. 모델 훈련(Model Training): 이 단계에서는 이미지의 특징점에서 만든 깨끗한 데이터 셋(역자 주, 가장 전형적이라 생각되는 어떤 대표 이미지 예를 들어 누구라도 개 또는 고양이임을 알 수 있는 사진 혹은 그림)을 활용하여 각각의 라벨을 붙여서 머신러닝 모델을 훈련합니다.


예측 단계에서는 동일한 특징점 추출 과정을 적용하여 새로운 이미지를 처리하고 이 특징점을 훈련된 머신러닝 알고리즘에 넣어서(Pass) 라벨을 예측합니다.

머신러닝의 단계



전통적인 머신러닝 기법과 딥러닝 알고리즘의 가장 큰 차이점은 특징점을 찾는 과정입니다. 전통적인 머신러닝 알고리즘은 우리가 각각의 특징점들을 직접 만들어야만 합니다. 반대로 딥러닝 알고리즘에서는 알고리즘 스스로 그러한 특징점을 찾아갑니다. 특징점 추출은 어렵고 시간을 잡아먹으며 특히 도메인 지식이 많이 필요합니다. 딥러닝의 가장 큰 장점은 머신러닝에 비해 특징점을 찾는데 기울이는 노력이 적거나 거의 없게 된다는 점입니다.


3. 딥러닝의 핵심


 딥러닝은 여러 처리 레이어를 포함하는 인공 신경망(Artificial Neural Network)의 클래스를 의미합니다. ANN의 개념은 수십년간 존재해왔지만 2000년대 중반 Geoffrey Hinton이 뚫기 전까지 ANN 구조를 깊게 훈련하는(Training Deep)시도는 번번히 실패해왔습니다. 알고리즘적인 혁신 뿐만 아니라 GPU 성능의 급격한 발전, 그리고 엄청나게 큰 데이터들이 쌓이면서 딥러닝은 급격한 발전을 이룩합니다.


3.1 인공 신경망(ANNs)


인공 신경망(ANNs)은 새포생물학적인 신경망으로부터 착안한 머신 러닝의 조합입니다.


인공신경망 대 생물 신경망


생물학적 신경은 인간의 뇌를 구성하는 가장 핵심적인 부분입니다. 하나의 신경은 1개의 새포, 수상돌기(Dentrites) 그리고 축색돌기(Axon)로 이루어져있습니다.

신경 세포가 처리한 정보는 전기신호를 통해 다른 신경에 전달됩니다. 각각의 신경은 수상돌기를 통해 신호를 입력받고 다시 축색돌기로 출력합니다. 축색돌기는 시냅스를 통해 연결된 다른 새포의 수상돌기로 뻩어나갑니다.


신경이 작동하는 가장 단순한 모델은 다음과 같습니다: 각각의 시냅스는 학습이 가능한 강도를 가지고 있고 그것의 강도를 조절하여 신경간의 영향을 제어합니다. 수상돌기는 그것의 총합이 목표 신경의 몸체에 전달할 신호를 가지고 있습니다. 만약 최종 합이 어떤 임계값을 넘는다면 신경은 활성화되고 축색돌기를 통해 자극을 전달합니다. [1]


인공 신경은 생물학적 신경으로부터 영감을 얻어 위에 서술한 모델을 컴퓨터화된 방식으로 구체화하였습니다. 하나의 인공 신경은 각각 특정한 정도(Weight)를 가진 유한한 숫자의 입력과 하나의 활성화 함수(전달함수라 불리기도 하는)로 구성되어 있습니다. 신경의 출력은 결국 이러한 입력의 총합이 이 활성화 함수를 거쳐서 나온 결과입니다. 인공 신경은 서로 연결되어 있어서 인공 신경망을 구성합니다.



Feedforward 신경망


피드포워드 신경망은 인공 신경망의 가장 간단한 구조입니다.

이 네트워크에는 3가지 종류의 레이어가 있습니다: 입력 레이어(단), 은닉(Hidden) 단 그리고 출력단 입니다. 이 네트워크 안에서 데이터는 입력단으로부터 들어가서 은닉단을 거쳐 출력 노드로 나갑니다.


아래는 완전 연결된 2개의 은닉단을 포함하는 피드포워드 신경망을 나타내고 있습니다. "완전 연결"이라는 말은 각각의 노드들이 다음 노드들과 모두 연결되어 있음을 의미합니다.


은닉단의 갯수와 그것의 크기만이 유일한 독립(변경되는) 변수입니다. 이론적으로 은닉단이 크고 깊을수록 더욱 복잡한 패턴을 모델링할 수 있다고 알려져 있습니다.


활성화 함수


활성화 함수는 입력의 가중합(Weighted sum)을 인공 신경에 전달하는 역할을 합니다. 이러한 함수는 데이터의 복잡한 패턴을 수치화하기 위해 비선형 함수여야 합니다. 가장 널리 사용되는 활성화 함수는 Sigmoid, Tanh 그리고 ReLU입니다. 그중에서 ReLU는 딥러닝 신경망에서 가장 많이 사용됩니다.

 



인공 신경망 훈련하기


훈련 단계의 목표는 망의 가중치를 학습하는 것입니다. 우리는 인공 신경망을 훈련하기 위해 2개의 요소가 필요합니다:

 - 훈련 데이터(Training data): 이미지 식별에 있어서 훈련 데이터는 여러 이미지들과 각 이미지에 해당하는 라벨을 포함합니다.

 - 손실 함수(Loss function): 예측한 값의 부정확한 정도를 측정하는 함수


위에 언급한 두가지 요소만 있으면 우리는 역전파(Backpropagation)와 경사하강법(Gradient descent)이라 불리는 알고리즘을 사용하여 인공신경망(ANN)을 훈련하게 됩니다. 역전파에 대해 자세히 알고 싶다면 다음을 참조하기 바랍니다.


3.2 합성곱 신경망(Convolutional Neural Networks) (CNN 혹은 ConvNets)


 합성곱 신경망은 특수한 형태의 Feed-forward 망입니다. 이 모델은 시신경이 동작하는 방식을 모사하기 위해 만들어졌습니다. CNN은 영상 인식에 매우 잘 동작합니다. CNN은 신경망으로 하여금 특정한 영상의 특징을 수치화할 수 있도록 하는 합성곱 레이어와 풀링(Pooling)레이어를 가지고 있습니다.


합성곱 레이어


이 레이어는 필터의 엔트리와 입력 이미지를 dot product 한 계산을 통해 이미지를 구조적으로 잘라낼 수 있는 학습 가능한 여러개의 필터로 구성되어 있습니다. 필터는 입력 이미지의 최대 깊이만큼 확장되어야 합니다. 예를들어 크기가 32x32인 칼라 이미지에 크기가 5x5인 필터를 적용하고자 한다면 3개의 컬러 채널(적색, 녹색, 청색)을 커버하기 위해서 이 필터의 깊이는 반드시 3이 되어야 합니다.(5x5x3) 이러한 필터는 이미지에서 유사한 구조를 발견할 때 활성화 될 것입니다.


풀링 레이어


풀링이란 비선형 다운 샘플링(Down sampling)의 형태를 취합니다. 풀링 단의 목표는 이미지의 공간적 크기를 점진적으로 줄여서 신경망의 변수, 연산 량을 줄여서 오버 피팅을 제어할 수 있도록 하는 것입니다. 풀링을 구성하는 것에는 여러가지 함수가 있지만 맥스풀링(Max pooling)이 가장 널리 사용됩니다. 풀링은 보통 stride가 2인 2x2크기의 필터를 각 깊이에 적용하게 됩니다. 크기가 2x2이고 stride가 2인 풀링단은 입력 영상을 원래 크기의 1/4로 줄입니다.[2]



합성곱 신경망 아키텍쳐


합성곱 신경망의 가장 기본적인 구조는 입력단(이미지)으로부터 시작하여 일련의 합성곱 레이어와 풀링 레이어로 이어지고 완전 연결된 레이어로 끝납니다. 합성곱 레이어는 보통 한개의 ReLU 활성함수 순서로 되어있습니다.


합성곱, 풀링 그리고 ReLU 레이어는 학습 가능한 특징점 추출기 역할을 하고 완전 연결된 레이어는 하나의 머신러닝 식별자 역할을 한다. 특히 신경망의 초기 단계는 이미지의 일반적인 패턴을 수치화 하고 후반에서는 이미지의 세부적인 디테일을 수치화합니다


합성곱 레이어와 완전 연결된 레이어에서만 가중치(Weights)가 있음을 유의하세요. 이 가중치들은 훈련 단계에서 학습됩니다.


합성곱 신경망 아키텍쳐의 한 예.


다음은 실제로 합성곱 신경망을 만들어서 개와 고양이를 구분하는 식별자를 만드는 과정으로 이어집니다.


 >> 다음: Caffe 와 Python을 사용하여 딥러닝으로 개와 고양이 구분하기[2]

References

  1. CS231n - Neural Networks Part 1: Setting up the Architecture
  2. Wikipedia - Convolutional Neural Network


+ Recent posts