ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 딥러닝의 개념
    최신 기술동향/인공지능 (AI) 2020. 7. 7. 10:52
    반응형

    Deep Learning은 Machine Learning 알고리즘의 한 종류다. 신경망 (Neural Network)라고도 불리는데, Deep Neural Network (DNN)은 신경망을 구성하는 Layer가 많아지는 구조로 이루어져있다. 아래 그림은 가장 기본적인 Neural Network의 예시인데, Input X가 Hidden-Layer 1과 Hidden-Layer 2로 들어가서 Output Y로 나오는 구조다. Hidden Layer를 보면, 이전 Layer의 output과 Hidden Layer의 Weight Maxtrix를 곱하고, 비선형함수 (Non-Linear Funcation)에 넣는다. 

     

    Neural Network의 예시

     여기서 '비선형함수'가 중요한 이유는 비선형 함수 없이 선형함수만으로 Hidden Layer를 구성하면, Layer를 몇 층을 쌓던 이는 1 layer로 줄여서 쓸 수 있는 간단한 형태만 설계가 가능하다. 예를 들어서, 2개의 Layer를 y= ax+b의 output이 다른 y=cx+d꼴로 들어가는 방식으로 구성하면, y=c(ax+b)+d = acx +bc +d 꼴 일차함수 형태로 돌아오게 된다. 따라서, 비 선형함수가 들어가야 하는데, 예전에는 아래와 같은 Sigmoid라는 함수를 썼다. 하지만, Neural Network의 Layer가 깊어지면서, update에 필요한 기울기가 줄어드는 Gradient Vanishing문제가 생겼다.

    Sigmoid 함수

    이를 방지하기 위해 Relu라는 새로운 비선형함수를 사용하게 되었고, Gradient Vanishing 문제를 매우 줄일 수 있었다.

    Relu 함수

     가장 기본적인 형태의 Deep Learning을 배웠다. Deep Learning 모델을 설계할 때, 몇 층으로 Deep Learning을 쌓아야하는지, 각 Hidden Layer에는 몇 개의 Unit을 배치해야하는지 등 모델의 다양한 parameter을 지정해줄 수 있는데, 이를 Hyper-Parameter라고 한다. 여기서 Hyper-parameter를 어떻게 설정해야 하는지 묻는다면, 정답은 없고, 문제에 따라서 잘 조절해야 한다는 매우 무책임한 대답이 돌아온다. 여러 논문들이나 글들을 찾아보면, 엄청 복잡한 문제가 아니면 대체로 3 Layer이내로 설정해도 무리없이 문제를 해결할 수 있다고 한다. 이런 Hyper-parameter를 어떻게 하는 것이 성능향상에 도움이 될지는, 다양한 Hyper-parameter로 설계하여 Cross-Validation (교차검증)을 하면서, 해당 data에 맞는 모델을 찾아나가야 한다. 이 때, Train의 성능만 좋고 Test set의 정확도는 낮은 Overfitting이 안 되도록 여러 모델을 시험해 보아야한다.

     

    - Overfitting

    Overfitting은 Dataset 중에 Train set에 모델이 너무 맞춰져버린 형태를 말한다. 우리가 AI를 사용하는 이유는 데이터를 기반으로 '학습'을 시킨 후에, 일반적인 데이터가 들어왔을 때 이를 예측 (Predict)하기 위함이다. 따라서, 우리가 원하는 성능은 학습할 때의 정확도가 아니라, 학습이 끝난 후에 문제를 맞추는 정확도다. Overfitting은 학습 데이터 하나 하나에 너무 치중한 나머지 일반적인 test set의 Predict하지 못하는 상태를 말한다. 이를 방지하기 위해서, 많이 사용되는 방법으로 Dropout이 있다.

     

    - Dropout

    용어에서 대략적으로 알아볼 수 있듯이, Train 과정에서 딥러닝을 구성하는 Hidden Layer 중에 몇 개를 Random하게 골라서 Drop (누락)시키는 방식이다. 이런 방식으로 overfitting을 상당 부분 줄일 수 있다.

     

     Neural Network의 성능향상을 위해 Cross-Validation이나 Dropout같이 다양한 방식들을 사용하고, Task에 따라서 CNN, RNN, LSTM, GRU 등 매우 다양한 Deep Learning Model을 사용하는데, 그때마다 각 Hidden Layer와 non-linear 함수를 직접 설계해야 하는 것일까? 다행히 Tensorflow, Keras, Pytorch 같은 다양한 프레임워크를  통해서 간단한 코드 사용으로도 딥러닝 모델 설계가 가능해졌다.

     특히, 딥러닝 자체가 'Layer'을 쌓는 구조다보니, 한 Layer씩 순차적으로 쌓는 형태로 함수를 구성할 수도 있고, 한 Layer의 Output을 다음 Layer의 Input으로 넣는 함수형 API를 사용할 수도 있다. 이에 대해서는 다음 글에서 Keras를 기준으로 설명하도록 한다.

    반응형

    댓글

Designed by Tistory.