Share           Pin It

데이터 분석 및 알고리즘 개발을 업으로 하면서 딥러닝 Deep learning은 늘 관심의 대상이었다. 하지만 알고리즘을 실제 구현해보거나 여러 라이브러리를 이용해서 실제 문제에 적용하는 것을 시도하지 않았기에 그런 의미에서 딥러닝에 문외한이라 할 수도 있다. 그럼에도 -- 빅데이터 기술을 어느 순간부터 결국 업에 적용했던 때와 같이 -- 딥러닝 기술도 언젠가는 내가 담당하는 업에 적용해야할 때가 올 것을 알았기에 알고리즘의 기본 지식을 공부하거나 딥러닝 발전의 주요 논문을 빼놓지는 않고 찾아보곤 했다. 딥러닝의 가능성이 일반에 알려지기 시작한 2013년도부터 계속 지켜봐왔기에 딥러닝 전문가는 아니지만 딥러닝의 발전 과정을 어느 정도 꿰뚫고 있다고 생각하기에 어떤 기술들이 현재의 딥러닝을 가능케했는지를 정리해보는 것이 의미가 있을 듯해서 글을 적는다. 일단 MLP 이전의 내용은 생략한다. 그리고 어플리케이션 특화된 기술 -- 예를 들어, Translation의 랭귀지 모델 등 -- 도 생략한다. 

0. 컴퓨팅 파워 (하드웨어)
아래에 여러 알고리즘이나 트릭을 소개하겠지만, 실제 딥러닝을 가능케했던 것은 결국 컴퓨팅 파워의 기하급수적인 증가에 있다고 본다. GPU/TPU로 대변되는 하드웨어의 발전뿐만 아니라, 딥러닝 시대 이전 시대인 빅데이터를 가능케한 그리고/그래서 현재 딥러닝에 무한한 떡밥을 제공하는 클라우드, 즉 값싼 스토리지의 대중화가 결국 딥러닝을 꽃피웠다고 생각한다. 아래에 소개할 다양한 알고리즘이나 대중화된 오픈소스/라이브러리 등의 소프트웨어 이전에 하드웨어 기술을 빼놓고 딥러닝의 성공을 얘기하는 것은 있을 수 없는 일이다.

1. Pre-taining
90년대 말이나 2000년대 초에 나온 오래된 Neural Network 책을 보면 히든 레이어의 수를 늘리면 더 강력해질 거라는 얘기는 계속 해왔다. 하지만 실제 또는 토이 문제를 해결하는 뉴럴넷은 히든레이어가 겨우 1개, 많아봤자 2개를 넘지 않았다. 데이터의 부재와 하드웨어 성능에도 문제가 있었지만 3개 이상의 히든레이어를 가진 네트워크를 제대로 학습시키는 것이 만만치가 않았다. 이론상으로는 완벽해도, 랜덤에서 시작해서 복잡한 네트워크를 최적화시키는 것이 만만치가 않다. 그렇게 뉴럴넷이 잊혀졌지만 프리트레이닝 방식으로 뉴럴넷을 초기화하는 방법이 소개되면서 딥러닝이라는 시대의 조류를 만들어냈다. (데이터와 하드웨어의 발전과 더해서) 대표적으로 정답세트가 필요없는 auto-encoder 방식이 도입되고, RBM이나 DBN을 이론적으로 풀어내면서 뉴럴넷 학습/최적화가 쉬워졌다. 임의의 초기화가 아니라 어느 정도 길들여진 초기화를 통해서 네트워크의 최적화가 엄청 빠르고 쉬워졌다.

2. ReLU (Recified Linear Unit)
전통적인 뉴럴넷은 히든레이어의 액티베이션을 위해서 주로 sigmoid나 tanh 함수를 사용했다. 수학적으로 좋은 성질 (미분 가능)을 갖고 있기 때문이다. 하지만 레이어의 개수가 증가함에 따라서 최종 아웃풋에서 발생한 loss를 앞쪽으로 제대로 전달하지 못하는 gradient vanishing 현상이 발생했다. 네트워크 구조는 엄청 딥하게 만들어놨지만 backprogation에서 가중치의 변동은 최종 1~2개의 레이어에서만 일어나고 앞쪽 레이어는 실질적으로 무용지물이 되는 현상이다. 이를 위해서 마이너스 영역은 0으로, 포지티브 영역은 y=x로 액티베이션하는 ReLU를 적용하면서 이 문제를 해결했다. 최근에는 마이너스 영역으로 무조건 0으로 치환하는 것도 바람직하지 않아서 y = -ax (a << 1.0)하는 것이 낫다는 연구도 있었고, 더 최근에는 y = x * sigmoid(x)로 바꾸면 더 낫다는 논문도 나왔다. (Step 함수의 수학적 불완전성을 보완한 것이 sigmoid 함수이듯이 같은 식으로 ReLU의 미분가능 버전으로 바뀐 것이 x * sigmoid(x)다. continuous & smooth --> 미분가능)

3. Batch Normalization/Re-normalization
뉴럴넷/딥러닝의 성능은 최적화에 좌우된다. 데이터와 알고리즘의 차원이 큰 경우에 최적화는 매우 불안정하다. 그래서 다양한 regularization 방식이 소개됐다. 가장 쉬운 방식으로 가중치의 절대값의 합을 최소화하는 L1이나 제곱의 합을 최소화하는 L2 regularization을 사용한다. 회귀모델에서는 잘 잘동하는데 딥러닝 구조에서는 이 또한 복잡하다. 그래서 초기 딥러닝에서 네트워크를 안정적으로 학습시키기 위해서 drop-out이라는 방식을 이용했다. 즉, 전체 네트워크에서 임의의 일부 노드를 의도적으로 비활성화시켜도 전체 성능이 떨어지지 않게 만드는 방식이다. 그런데 이 방식은 학습속도를 기하급수적으로 늦춘다는 치명적인 단점이 있다. 그러던 중, 히든 레이어의 액티베이션값을 노말라이제이션을 하면 드랑아웃 등의 별도의 레귤라이제이션없이 모델을 안정적으로 학습시킬 수 있다는 실험 결과가 있었고, 현재의 대부분의 네트워크에 이 기법이 기본적으로 적용돼있다. (더 최근에는 작은 규모 또는 non-iid 미니배치에서도 잘 작동하도록 개선한 re-normalization이 소개됨) 딥러닝/뉴럴넷의 기초가 되는 회귀분석 regression에서 모든 독립/종속변수는 Normal 분포를 따른다는 기본 가정이 있는데 (<-- 매우 중요한 속성임), 히든레이어를 노말라이제션하면서 모델을 안정시켜주는 것 같다.
** 사견을 더 하자면 (주제 넘은 얘기지만), 처음 딥러닝을 공부하는 분들은 인터넷에 올라온 동영상 강의 몇 개만 보고 예제 코드 구현/실행해보는 것만으로 마스터할 수 있다고 생각하는 듯한데, 우선 기초적인 것부터 차근차근 공부했으면 합니다. 미적분, 확통, 응선대, 최적화부터 다 공부하라는 것은 아니지만, 적어도 linear regression정도는 마스터하고 딥러닝을 논했으면 합니다. (딥러닝의 첫 강의가 대부분 회귀분석이기는 하지만...) 가끔 커뮤니티에 올라오는 질문을 보고 있자면 이건 딥러닝을 배우겠다는 건지 아니면 그냥 숟가락을 떠서 입에 넣어달라는 건지...

4. LSTM와 ResNet
현재 딥러닝은 데이터의 디멘젼이 무척 큰 (때론 가변적인) 문제에 잘 적용되고 있다. 그런 문제로 자연어/문자열과 이미지 처리가 있다. 처음에는 문자열 데이터에 RNN을 적용하고 이미지 데이터에 CNN을 적용해서 문제를 해결했다. 하지만 문자열이 길어지거나 레이어가 깊어지면서 약점이 발견됐고, 이를 해결하기 위해서 LSTM과 ResNet이 소개됐고 현재는 거의 기본 방식으로 인식된다. (LSTM과 ResNet은 제대로 공부한 것이 아니어서 더 길게 설명하면 틀린 설명만 추가할 듯합니다.ㅠㅠ 알파고 제로 논문에서 ResNet을 사용한 걸 보고 이 글을 적기 시작했는데 역설적이게도 ResNet에 대해서 제일 모름.) 오리지널 인풋이나 이전 과정의 중간결과물을 재활용(?)해서 네트워크를 개선하는 것이 전혀 새로운 아이디어는 아니지만, LSTM과 ResNet은 이 방식으로 딥러닝의 성능 향상 및 여러 애플리케이션에서 성과를 내고 있다.

이상의 알고리즘이나 방법론은 딥러닝을 안정적으로 최적화시키거나 실제 문제에 더 적합한 구조를 만드는 것들에 관한 것인데, 다음은 딥러닝의 대중화에 기여한 것들에 관한 것이다.

5. Word2Vec W2V은 구조가 매우 단순해서 실제 딥러닝과는 거리가 멀지만, (특히) 일반 개발자들 중에서 딥러닝을 처음 접했던 분들이 처음/쉽게 접하면서 딥러닝의 세계로 이끌었다고 해도 관언이 아니다. 몇 년 전에 딥러닝을 한다는 개발자를 만나면 대부분 그저 W2V으로 어떤 문제를 풀고 있는 경우가 많았다. 형태상으로 유사하지만 W2V은 엄밀히 말해서 딥러닝은 아니다. W2V은 잘 알려졌듯이 데이터를 임베딩하는 방식이다. 고차원의 데이터, sparse한 데이터, 또는 비정형 특히 비수치 데이터를 정형의 수치 벡터로 바꿔주는 것을 임베딩이라고 이해하면 된다. 경우에 따라서 효과적인 데이터 차원 축소 방식을 제공하기도 한다. 그리고 이런 임베딩을 통해서 얻어진 수치벡터가 딥러닝의 인풋으로 활용되기 때문에 딥러닝과 무관하다고 말하기도 어렵다. 이후에 Glove 등의 다른 임베딩 방식의 발견에도 기여했다.

6. TensorFlow 2013년에 텐서플로우가 있었다면 제가 직접 다양한 딥러닝 알고리즘을 구현해서 여러 문제에 적용하는 것을 꾸준히 했을 거라는 생각이 든다. 개발에 익숙치 않은 개발자(??)에게 딥러닝의 모든 알고리즘을 직접 구현한다거나 일부 공개된 라이브러리를 제대로 활용하는 것이 쉬운 일이 아니다. 그래서 구현해서 적용해보는 건 포기하고, 그냥 이 동네에 기웃거리면서 어떻게 발전되는지만 지켜보고 있ㄴ...(ㅠㅠ) 텐서플로우 이전에도 Caffe나 Teano, Torch 등의 오픈 딥러닝 라이브러리가 있었지만 이 분야에 익숙한 전문가들을 위한 전유물이었다. 하지만 구글에서 텐서플로우를 오픈하면서 딥러닝이 좀더 일반인(?)에게로 저변이 확대됐다. 결과적으로 인공지능 (딥러닝)이 많은 부분에서 이젠 엔지니어링 분야로 넘어왔다고 봅니다.
(여담) 구글에 텐서플로우를 공개한 것은 하둡이나 하이브 등의 빅데이터 표준에서 밀렸던 과거가 있었기에 가능했다. 실제 맵리듀스나 빅테이블 등의 많은 빅데이터 개념들이 구글에서 나왔지만 그걸 모방한 하둡이 실질적인 표준이 됐다. 씨는 구글이 뿌렸지만 열매는 다른 기업들이 따먹은 것과 같았는데, 같은 실수를 인공지능 분야에서도 반복하지 않기 위해서 텐서플로우를 공개했고, 현재로써는 대중화에 성공했다고 본다.
추가 (2017.10.31) 갑자기 아이디어가 떠올라서 Python + Keras로 텐플을 이용중이다. 케라스 시퀀스 모델에 위에 설명한 개념들을 기계적으로 추가해서 Run하면 그만이다. 속도는 구조와 데이터가 커서 느리지만, 오늘 딥러닝을 처음 접한 사람도 바로 따라할 수 있다. 엔지니어링의 승리다.

7. Reinforcement Learning과 GAN 현재 가장 핫한 분야는 강화학습과 GAN일 거다. 인공지능 기술을 진짜 인공지능이 되도록 만들어주는 기술이라해도 과언이 아니다. 인공지능을 지능이라 부르기 위해서는 알고리즘이 ‘스스로 적응’할 수 있어야할텐데, 강화학습과 GAN이 가능하게 해주고 있다고 본다. 개인 소견으로 딥러닝이 인공지능의 끝은 아니라고 생각하지만, 어쨌든 현재로썬 강화학습과 GAN의 등장으로 딥러닝이 진짜 인공지능답게 만들어지고 있다고 본다.
(여담) 보통 강화학습을 supuervised와 unsupervised와 별개의 새로운 카테고리에 넣어서 설명하는데, 저의 개인적 의견은 강화학습을 supervised 하위에 넣는 게 맞다고 본다. 처음부터 결과를 알고 있는 supervised와는 달리 결과에 따른 리워드 (win/lose, 점수)가 나중에 평가된다는 점이 다소 다르지만 리워드 자체는 일종의 슈퍼바이저라고 보는 게 맞을 듯하다는 생각에서다. (사견이니 무시해도 된다.)

개발자들이 딥러닝을 쉽게 접급하게 해준 것은 Word2Vec, 일반인들이 딥러닝/AI에 관심을 갖게 만든 것은 강화학습을 이용한 AlphaGo (Atari가 먼저지만, 임팩트 면에서), 일반인들이 (그나마) 쉽게 딥러닝을 공부하고 다룰 수 있게 해준 것은 TensorFlow, 우리 실생활의 문제들에 딥러닝이 적용될 수 있게 해준 것은 LSTM (ResNet은 정확도를 높인..), 그리고 딥러닝을 더욱 인공지능처럼 만든 것은 강화학습과 GAN. ... 일런 것을 가능케해준 여러 지속적인 개선들... 뉴턴은 거인의 어깨 위에 섰기 때문에 조금 더 멀리 볼 수 있었다고 말했지만, 거인은 난쟁이들이 쌓아놓은 무수한 모래 성이 있었기에 그 위에 설 수 있었던 것 같다. 최근 10년, 대부분은 최근 3~4년 내에 일어난 사건들... 빠르다. (물론 LSTM과 같이 20년 전에 제안돼서 지금 꽃을 피우는 기술도 있다.)

설명이 부족하거나 일부 틀린 내용이 있을 수도 있습니다. 좀더 면밀히 공부해서 제대로 수정/보강하도록 노력하겠습니다.

이걸 그냥 적당히 슬라이드로 만들어서 전문가인양 모르는 사람들한테 약이나 팔고 다닐까? 하지만 어려운 기술에 대한 연성의 (쉬운이 아닌) 자료는 아무에게도 도움이 되지 않는다는 걸 깨달았습니다. 일부 약장수를 제외하곤...

** 딥러닝이 지금 인공지능을 이끌고 있지만, 인공지능의 미래가 딥러닝에 있다고는 생각지 않습니다.

=== Also in...

F: https://www.facebook.com/unexperienced

댓글을 달아 주세요