장면 1.
최근 카카오 광고 OBT를 시작하면서 'AI 기반의 광고 플랫폼'이라는 보도자료가 재생산됩니다. 광고 랭킹을 위해서 클러스터링, 베이지언 추론, 회귀분석, 톰슨샘플링 등의 다양한 머신러닝 기술을 활용하고 있지만, 일반인들이 생각하는 AI, 즉 딥러닝을 명시적으로 활용하고 있지는 않습니다. (참고. 카카오 AI 리포트글 참조 https://brunch.co.kr/@kakao-it/84) 그런데 저런 류의 기사들이 양산되는 것이 부담이 돼서 내년에는 본격적으로 다양한 분야에 딥러닝 기술을 적용할 계획입니다. 그래서 파트 내에 딥러닝 기술에 대한 공통된 지식이 필요하다고 판단했고, 강의/공유를 위한 자료를 미리 만들어두면 좋겠다고 결론지었습니다.
장면 2.
페이스북 등에 AI 관련 다양한 커뮤니티/페이지가 있습니다. 웬만하면 가입하고 싶지 않았지만 가끔 타임라인에 괜찮은 자료들이 공유되는 것을 보면서 유명한 한 페이지에 가입했습니다. 다양한 경험과 자료가 공유되는 가운데, 아주 기초적인 질문들이 끊임없이 올라오는 것을 목격했습니다. 저런 질문은 딥러닝에 대한 (고차원의) 이해가 부족하다기보다는 데이터 및 머신러닝에 대한 아주 기초적인 프랙티스의 부족이라는 느낌을 강하게 받습니다. AI 및 딥러닝을 활용이 예전보다 훨씬 쉬워졌지만, 데이터 분석이나 머신러닝 알고리즘에 대한 기본이 없이 소프트웨어 패키지를 사용하듯이 딥러닝 라이브러리를 사용하는 것은 바람직하지 않습니다. 그래서 딥러닝을 이루는 기본 유닛들에 대한 관계 및 설명이 필요하다는 결론에 이르렀습니다.
그래서 준비했습니다.
한줄 요약.
딥러닝 DeepLearning은 뉴럴네트워크 (Artificial Neural Network)의 확장이고, ANN은 Regression의 Ensemble이다.
** 저의 관점과 업무 연관성이 높은 내용이 많이 포함돼있습니다. 그래서 하단에 더 심플한 버전의 그림도 추가했습니다.
딥러닝 맵
그림에서 도형에 나름 의미를 두려했으나 명확하지는 않다. 하지만 사각형은 큰 개념, 타원은 하나로 묶을 수 있는 알고리즘 또는 서비스 군, 그리고 텍스트는 아주 상세한 사례나 구현물, 수식 또는 부가 설명을 의미한다. 선도 실선, 점선, 화살표 등이 필요하지만 임의로 모두 실선 처리했다. 그림의 복잡도를 가능한 없애기 위해서 멀리 떨어진 항목간 연결은 가급적 뺐고, 필요한 경우 부가적으로 항목을 다시 추가했다. (예를 들어, Ensemble은 별도의 개념으로 뽑았지만, Regularization 하위에 구체적인 방법에도 추가했다.) 볼드체는 지난 글에서 자세히 다뤘는데, 현재의 딥러닝을 가능케한 또는 현재 거의 기본이 되는 또는 가장 핫한 분야 등을 표시했다. (참조: http://bahnsville.tistory.com/1153)
딥러닝을 이해하기 위해서는 뉴럴넷을 알아야 하고, 뉴럴넷의 기본은 회귀모델이다. 신경망에서 신경전달물질을 다음 뉴런으로 전달할지 말지를 결정하는 activation은 0/1로 인코딩하는 step 함수를 사용하지만 수학적으로 아름답지 않기 때문에 흔히 sigmoid 함수를 사용한다. 그런데 선형회귀와 sigmoid의 결합은 분류문제에서 많이 활용되는 Logistic Regression이 된다. 회귀모델을 구축하기 위해서는 목적함수 (흔히 cost 또는 loss 함수라 함)을 정의하고, 목적함수를 최적화 (보통 최소화)하는 방법이 필요하다. 실수형 아웃풋에서는 보통 MSE 기반의 로스함수를, 카테고리 데이터에서는 CrossEntropy 기반의 로스함수를 주로 사용하지만, 문제/데이터에 따라서 다양한 함수를 정의할 수 있다. 최근 evolutionary 방식에 대한 재평가도 이뤄지지만, 보통은 Gradient, 즉 목적함수의 미분을 활용한 steepest descent 방식을 사용한다. 온라인 최적화를 위해서 SGD (Stochastic Gradient Descent)를 취하지만, 러닝 레이트를 잘 조절해서 더 빠른 또는 더 안정적인 최적화를 취하는 알고리즘을 많이 사용한다. Adam, AdaGrad, AdaDelta와 같이 Ada-X 류의 옵티마이저들이 러닝레이트 (에타)를 어떻게 동적으로 조정하느냐에 따라서 달라진다. (SGD를 제외하고는 대부분 비슷한 성능을 보임)
앞서 Step 함수와 Sigmoid 함수를 activiation 함수로 사용한다고 했는데, 문제/데이터에 따라서 더 다양한 함수를 사용할 수 있다. Sigmoid는 아웃풋이 0과 1 사이 값을 갖지만, 문제에 따럿 -1과 1 사이 값을 갖는 Tanh 함수를 사용할 수도 있고, 노말분포를 따르도록 Gaussian 함수를 사용할 수도 있다. 그리고 보통 카테고리를 판별하기 위해서 아웃풋 레이어에는 SoftMax를 많이 사용한다. 뒤에서 다시 언급하겠지만 ANN이 Deep해지고 sigmoid함수를 사용함으로써 loss의 gradient에 기반한 최적화가 어려워지는 vanishing 문제가 발생하는데, 이를 막기 위해서 ReLu (Rectified Linear Unit)을 히든 레이어에 흔히 사용한다. 최근에는 ReLu의 수학적 미를 더 가미한 ELU나 x * sigmoid 같은 함수가 더 좋은 결과를 낸다는 연구도 꾸준히 진행중이다.
도입부에서 ANN은 Regression의 앙상블 Ensemble이라 하였다. 앙상블은 보통 weak machine (또는 base classifier)들을 결합해서 더 나은/robust한 머신을 만드는 기법이다. 랜덤 샘플링 (Bootstrap)에 기반해서 수많은 독립된 classifier들을 수평적으로 결합하는 Bagging 방식과 이전 머신의 결과를 다음 머신의 인풋으로 하는 수직적인 결합하는 stacking 방식을 ANN이 활용하고 있다고 보면 된다. 참고로, 이전 머신의 성능을 보완하는 형태로 수평적 결합하는 Boosting 방식도 있지만, 현재 ANN에 적용되지는 않았다 (어떤 측면에서 layer가 stacking되는 것이 loss를 메꿔가는 과정이어서 boosting과 비슷해 보이기는 함). 머신을 스태킹함으로써 ANN이 deep해진다. 그래서 최종 아웃풋의 loss를 바탕으로 앞쪽 머신의 가중치를 조정하기 위해서 back-propagation이라는 기법을 사용하는데, 앞에서 언급했듯이 백프로파게이션 과정에서 loss의 영향도가 줄어드는 vanishing (explosion도 발생할 수 있으나 보통의 경우 vanishing이 발생함)이 발생하고, 이를 해결하기 위해서 흔히 ReLu 함수를 사용한다. 1
머신러닝을 통해서 학습된 classifier는 트레이닝 데이터에 종속될 수 밖에 없다. 우리가 해결해야하는 문제는 트레이닝 데이터 이외의 환경에서 좋은 성능을 보이는 것이다. 그래서 트레이닝 데이터 외에서 좋은 성능을 갖게 하기 위해서 다양한 Regularization 방식을 사용한다. 전통적으로 L1/L2 regularizer를 사용하지만, ANN에서는 좀더 휴리스틱 방식을 주로 사용한다. 임의적으로 네트워크의 노드를 비활성화해서 학습시키는 DropOut은 딥러닝 초기부터 많이 활용되고 있다. 그 외에도 인풋 데이터를 다양하게 변형하거나 노이즈를 추가하는 방식을 사용하기도 하고, validation 데이터를 이용해서 validation 에러가 커지는 시점에 학습을 종료하는 early stop 방식도 많이 활용된다. 그리고 현재는 히든레이어의 activation값을 정규화하는 Batch Normalization 방식이 사실상 기본으로 활용된다. 경우에 따라서 DropOut없이 BatchNorm만으로도 안정적인 네트워크를 만들어지기도 한다고 한다.
또 가장 중요한 것 중에 하나는 네트워크의 초기 가중치를 어떻게 줄 것이냐가 뉴럴넷의 성능 (학습속도 및 정확도 등)에 큰 영향을 준다. 보통 Random을 사용함으로써 글로벌 옵티마의 여지를 주지만, 역으로 학습속도가 느리고 최종 모델이 어떤 모습을 가질지 예측하기 어렵기도 하다. 그래서 semi-supervised에서 unlabeled 샘플로 classifier를 길들이고, labeled 샘플로 파인 튜닝하듯이 뉴럴넷의 가중치를 학습데이터를 사용하지 않고 미리 길들이는 pre-training 방식을 취한다. RBM, DBN과 같이 이론에 바탕해서 학습시키기도 하지만, Auto-encoder를 활용해서 하기도 한다. 보통 레이어를 한층씩 순차적으로 학습시키는 layer-wise 방식을 취한다.
ANN에 대한 대략적인 설명은 끝.
딥러닝에서 임베딩에 대한 연구가 중요하다. 딥러닝의 인풋으로 사용하기 위해서 임베딩도 필요하고, 다른 머신의 인풋으로 사용하기 위해서 딥러닝의 결과를 임베딩으로 활용하기도 한다. 참고로 임베딩은 정형/비정형 데이터를 (보통 일정한 크기의) 수치 벡터로 만들어주는 것이라고 보면 된다. 그래서 보통 Dimension Reduction 과정이기도 하다. 이런 임베딩 과정 (보통 represenation learning)이 어떤 면에서 PCA와 비슷해서 딥러닝을 unsupervised learing으로 불리기도 한다.
인풋 데이터의 종류에 따라서 특별한 네트워크가 흔히 사용된다. 일반적인 매트릭스 형태의 수치 데이터는 그냥 MLP (Multi-layer Perceptron)을 활용하면 되지만, text나 image 데이터는 수치 데이터로 표현하기 까다롭다. 그래서 text 데이터는 Word2Vec이나 “Glove같이 단어 단위에서 기본적인 임베딩 과정 후에 RNN (Recurrent NN)으로 학습하고, 최근에는 LSTM (Long Short Term Memory) 방식이 표준으로 자리 잡았다. 이미지 데이터는 인접 pixel의 데이터를 고려해서 수치화하는 convolution & pooling 과정을 거치는 CNN을 주로 활용한다. 딥러닝에서 비전 Vision이 가장 활발한 영역이기도 해서 기본 CNN을 발전시킨 AlexNet, VGG, GoogLeNet, ResNet 그리고 가장 최근에는 CapsNet과 같은 각종 XNet들이 연구되고 있다.
알파고 이후에 Reinforcement learning에 대한 관심도 높고, 데이터를 자동으로 생성하는 VAE나 GAN도 핫한 연구 주제이고, 또 네트워크의 선택 및 구성도 네트워크에 맡겨버리는 MoE (Mixture of Experts)에 대한 연구도 활발하다.
마지막으로 실제 구현에서 TensorFlow의 역할이 컸다고 본다. TF와 함께 Theano나 Torch 등도 많은 개선이 있었고, 더욱이 Keras는 TF나 Theano의 복잡도마저 추상화해줘서 더욱 쉽게 딥러닝을 활용할 수 있게 해줬다.
딥러닝맵 심플버전
=== Also in...
- Boosting은 보통 underfitting 상황에서 효과적인데, ANN의 일부 하위 네트워크들은 이미 overfit된 상황일 가능성이 높아서, 어떤 면에서 boosting이 효과를 반감시킬 수도 있음. [본문으로]