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

댓글을 달아 주세요

Share           Pin It
지난 글에서 워드임베딩에 대한 생각을 정리하고 딥러닝과 결합해서 개인화 추천에 어떻게 적용할 것인가에 대한 간단한 스케치를 올렸습니다. (참고. 워드임베딩: http://bahnsville.tistory.com/1139, 개인화 추천: http://bahnsville.tistory.com/1141) 오늘은 그런 기술을 딥 개인화 시스템에 적용할 때 예상되는 문제점들에 대해서 생각나는대로 정리하려 합니다.

지난 글에 제시한 딥 개인화 아키텍쳐를 간단히 설명하면 다음과 같습니다.
  1. 텍스트, 이미지, 또는 웹로그 등의 유저 및 아이템 정보/이력에 포함된 개별 항목들을 워드임베딩 기술로 벡터화한다.
  2.  유저/아이템의 정보를 RNN이나 CNN 등으로 정형화된 벡터로 압축한다.
  3. 정형화된 유저벡터와 아이템벡터의 관계를 유저-아이템 interaction log로 학습한다.
  4. 학습된 Latent Vector로 유저-유저, 아이템-아이템, 유저-아이템의 연관도/유사도를 측정한다.
유저-아이템 행렬을 팩토라이즈하는 것이 가능하지만 그것보다 풍부한 유저/아이템 정보를 이용해서 바로 유저/아이템 벡터를 만들 수 있다면 1과 2는 하나의 과정으로 봐도 무관합니다.

위의 과정에서 3과 4는 통상의 ANN 학습방법이나 유사도 연산으로 쉽게 해결되는 부분입니다. 특히 3의 학습에 대한 아이디어는 지난 글에 간략히 언급했습니다. 하지만 1과 2의 Knowledge Representation은 오랫동안 고민했지만 쉽게 답이 나오지 않았습니다. 예전부터 워드임베딩 기술을 사용하면 될 것 같다는 막연한 생각을 가지고 있었지만 따로 공부하지 않아서 더이상 진도가 안 나갔는데, 최근 관련 분야를 공부하면서 가능성을 확인했습니다. 하지만 실제 문제에 적용하는 데는 여전히 해결해야할 장애물들이 많이 있습니다. 공부하면서 여러 힌트는 얻었지만 유저/아이템 벡터로 컨볼루셔한하는 실용적인 방법을 찾지 못했습니다. 워드임베딩 부분과 컨볼루션 부분을 나눠서 예상되는 문제를 정리합니다. 짧은 식견으로 떠오른 어려운 점들이지만 저보다 띄어난 분들은 별로 문제될 것이 없다고 보실 수도 있고 또 많은 연구자들이 관련된 해결책을 이미 내놓은 경우도 많습니다.

워드임베딩
기계학습이라는 것이 최초의 학습데이터로 모델을 만들어두면 영구적으로 사용할 수 있는 것이 아닙니다. 실제 운영하면서 새로 추가되는 데이터로 주기적으로 모델을 업데이트해줘야 합니다. 새로운 데이터가 추가될 때 모델의 구조가 바뀌지 않으면 단순히 (hyper-)파라메터들만 업데이트해주면 되겠지만, 워드임베딩의 경우 모델의 구조가 함께 바뀌기 때문에 전체 모델을 새롭게 빌딩하고 관련된 시스템 전체를 바꿔줘야 합니다. 새로운 텍스트에는 기존 학습 데이터에는 없던 신조어가 있습니다. 보통 OOV (out-of-vocabulary)라는 특수한 태그로 처리하지만, 데이터 양이 많아지면서 모든 신조어를 OOV로 처리할 수도 없고 중요한 신조어는 새롭게 사전에 추가해야 합니다. 기존 사전에 10,000개의 단어가 있었는데, 여기에 한개의 단어를 더 추가하는 것은 별 문제가 안 될 것 같지만, one-hot encoding에서 데이터 차원을 1만큼 증가시켜야 하고 그에 따라서 전체 가중치 W를 재계산해야 합니다.

일반적인 텍스트 문서 분석의 경우 몇달, 몇년치의 데이터를 모으더라도 추가되는 신조어의 수가 기존 사전 사이즈에 비해서 별로 크지 않아서 오랜 기간동안 OOV로 처리해도 시스템의 예측력에 큰 해를 주지 않습니다. 하지만 대형 쇼핑몰에서 상품을 추천해주는 경우라면 매년 추가되는 신상품의 수도 많을 뿐더러, 핫한 추천 대상이 돼야할 신상품을 사전에 추가하지 않을 수가 없습니다. 일반적인 텍스트 컨텐츠로 확대해서 유저의 검색쿼리나 방문했던 사이트를 기반으로 추천하겠다고 가정한다면, 매일 기존에 없던 수많은 새로운 패턴의 검색어가 등장하고 뉴스 기사만 하더라도 매일 수천건 이상이 새로 생깁니다. (새로운 문서 = 새로운 URL) 해외의 뉴스도 포함하고 블로그 등의 소셜미디어를 고려한다면 매일 추가되는 신종 아이템이 넘쳐납니다. 즉 사전 사이즈가 감당할 수 없을만큼 커지고, 그에 따라서 매번 모델을 새로 구축해야 합니다.

컴퓨팅 파워가 받쳐주더라도 학습 데이터를 무작정 누적해서 사용할 수도 없습니다. 오래된 것은 버리고 새로운 데이터로만 학습할 필요가 생깁니다. 신조어가 생기듯이 필요없어지는 단어가 생깁니다. 즉, 사전에서 빼주는 작업이 발생합니다. 사전의 구조가 바뀌면 당연히 모델을 새로 학습해야 합니다. 그리고 미리 정의된 사전이 아니라 매번 학습 데이터 (텍스트)에서 사전을 동적으로 구축하는 경우라면 모델 재구축은 필수입니다. 모델을 학습하는 것은 모델을 기반으로 예측하는 것에 비해서 리소스가 많이 들어가는 작업입니다. 그래서 재구축 주기를 너무 짧게 가져갈 수도 없습니다. 또 주기가 길어지면 OOV가 증가합니다. 상품이나 컨텐츠 추천에서는 OOV에 해당하는 신상이나 최신글이 가장 중요할텐데, 업데이트 주기를 기다리는 동안에는 유저의 프로필 (관심사)에 반영하지 못하는 어처구니없는 상황이 발생합니다.

그리고 이건 실제 작업해봐야 알겠지만, 사전 사이즈를 어느 수준까지 크게 가져가도 컴퓨팅이나 전체 시스템 성능에 영향을 주지 않을 것인가도 고민이 됩니다. 옥스포드 영어 사진에 약 17만건의 영단어가 등록돼있다고 합니다. 인터넷에서의 유저가 한 행동 이력으로 유저 프로파일을 만든다면 다양한 조합의 검색어, 접속했던 문서 (URL), 웹에서의 다양한 활동 등을 모두 사전에 추가한다면 세상의 모든 언어가 가진 단어의 수보다는 가늠할 수 없을만큼 훨씬 많아질텐데, 과연 그런 규모의 사전을 워드임베딩하는데 저비용으로 가능할까에 대한 의문도 듭니다. 여지껏 전체 웹 단위에서 상상을 펼쳤기 때문에 무모한 논쟁이기도 합니다. 각자 서비스 내에서의 추천/개인화를 위해서 데이터의 종류와 양을 잘 제한하면 이건 그저 기우일 뿐입니다. (학교에 있을 때는 웹 전체의 문서를 클러스터링해보고 싶다는 막연한 생각을 했었는데, 여전히 그런 버릇에서 못 벗어난 듯...)

사전에 색인된 단어 순서가 바뀌지 않고 상대적으로 적은 양의 신조어가 추가만 된다면 (또는 일부 불필요한 단어가 색인 순서는 그대로 둔 채 제외한다면) 가능한 기존의 워드임베딩 결과를 유지하면서 새로운 사전을 학습시킬 수 없을까에 대한 고민도 있습니다. 예를 들어, 원래 사전이 {A, B, C, D, E, F, G, H, I, J}로 총 10개의 단어로 구성됐는데, 신조어 K가 추가돼서 {A, B, ..., J, K}로 11개로 변경됐다고 가정합니다. 원래 사전에서 A는 [1 0 0 0 0 0 0 0 0 0]' (0이 9개)로 one-hot 인코딩으로 표현할 수 있고, 이를 워드임베딩했을 때 결과가 [0.7 0.5 0.9]가 된다면, 새로운 사전에서 A는 [1 0 0 0 0 0 0 0 0 0 0]' (0이 10개)로 표현하고 그 워드임베딩 결과가 기존의 [0.7 0.5 0.9]와 크게 다르지 않게 학습시킨다면 어느 정도의 신조어가 사전에 추가되더라고 굳이 기존의 모든 단어들을 재계산할 필요가 없어지고, 기존 단어들로만 구성된 유저/아이템 벡터는 별도 업데이트가 필요치 않을 수도 있겠다는 생각도 듭니다. 하지만, 어차피 신조어의 벡터를 구하기 위해서 전체 단어의 재학습 및 결과는 함께 진행되기 때문에 조금 불필요한 고민이었던 것 같습니다. 하지만 외부 환경이 조금 변경됐을 때 굳이 전체 시스템에 영향을 주지 않는 robust한 방법에 대한 고민은 여전히 필요합니다.

컨볼루션
지난 글에서 소개했던 Collobert의 논문을 보면서 처음에는 컨볼루션으로 유저 및 아이템 벡터를 쉽게 만들 수 있겠다는 생각을 했습니다. (참고 논문: http://www.jmlr.org/papers/volume12/collobert11a/collobert11a.pdf하지만 텍스트 문장에 적용했던 기술을 유저 및 아이템 프로파일에 그대로 적용하는 데는 문제가 있음을 바로 깨달았습니다. 텍스트 문장 (문서가 아님)은 보통 1~20단어로 구성돼있고, 많아봤자 100단어를 넘지 않습니다. 일단 단어의 개수가 많지 않고 개수의 분포도 (상대적으로) 일정하다고 볼 수 있습니다. 추천할 아이템 (컨텐츠)의 프로파일은 다소 길겠지만 길이에 제한이 있습니다. 하지만 유저 프로파일의 경우 쉽게 가늠이 되지 않습니다. (사용자가 입력한 검색쿼리, 접속한 URL 등을 모두 한 단어로 가정함) 두가지 포인트를 지적했는데, 프로파일의 길이가 길다는 것과 길이의 편차가 크다는 것입니다. 길이가 길더라도 편차가 적다면 복잡하더라도 하나의 scheme으로 압축할 수 있을텐데, 길이가 천차만별이면 고민이 깊어집니다. 큰 이미지라면 강제로 사이즈를 줄이고 원하는 비율로 crop해서 사용하면 되는데, 텍스트 문서는 이런 방식이 불가합니다.

앞의 논문에서는 인접한 단어 벡터 (워드임베딩)들을 컨볼루션하고, 컨볼루션된 것들 중에서 각 열의 최대값 (max-pooling)을 취합니다. 단어의 수가 별로 많지 않기 때문에 max-pooling을 하더라도 다양한 결과값이 만들어집니다. 하지만 단어가 많아지면 각 행의 max값들이 모두 비슷해질 가능성이 높아집니다. 예를 들어, [0 1] 사이의 랜덤 넘버 10개 중에서 max값은 1.0이 될 수도 있지만 0.7이나 0.8, 심지어 0.1도 될 가능성도 꽤 있습니다. 하지만, 10,000개의 랜덤 넘버 중에서 max값을 취하면 대부분 0.9 ~ 1.0이 될 것입니다. 문장 단위에서 convolution+max-pooling이 잘 동작하더라도 문서 (유저의 행동 이력) 단위에서는 불가능하다는 것입니다. 즉, 결과 유저 벡터들이 모두 유사해지고, 추천의 variance가 없어진다는 의미입니다. 문서의 길이가 길더라도 길이가 일정하면 동일한 조건으로 큰 컴볼루션 window 사이즈를 취하거나 여러 겹의 컴볼루션 레이어를 두는 식으로 해결책이 존재하겠지만, 길이가 일정하지 않으면... 어떤 논문을 보면 varying-size convolution filter를 사용하는 경우가 있어서 컨볼루션을 잘 설계하면 돌파구가 있을 듯도 합니다. (참고. https://arxiv.org/pdf/1604.06338.pdf) 부트스트랩하듯이 그냥 임의의 벡터를 선택해서 컨보루션 & 풀링하는 것도 생각해봤지만 이건 그냥 애초에 입력 데이터를 랜덤하게 선택해서 진행하는 것이 더 나을 것이고, 알고리즘의 일관성을 확보할 수가 없습니다. (역으로 짧은 입력 데이터를 임의로 확장하는 것도 별로...) Pooling층에서 같은 위치의 벡터 엘리먼트 sequence를 time series로 가정하고 wavelet (Fourier Transformation)으로 pooling하는 것도 가능하지 않을까?라는 생각도 듭니다.

유저의 행동 이력을 시간순으로 나열해서 RNN을 이용하는 방법도 생각해봤습니다. RNN이 CNN보다는 길이의 가변성에 더 유연합니다. 하지만 RNN도 문장이 아닌 문서 단위에서도 제대로 동작할지 의문이 듭니다. RNN은 개념적으로 이전까지의 결과 (이전의 모든 단어의 sum)과 현재 단어를 일종의 weighted sum하는 것입니다. (개념적으로 설명하면 그렇다는 것임) 이런 추론에 따르면 최신 행동 이력에 가중치를 부여하는 방식이라는 장점이 있지만, 역으로 과거 이력을 무시해버릴 가능성도 있어 보입니다. 예를 들어, 어떤 유저가 '제주도, 제주도 맛집, 제주도 펜션, ...., 제주도 항공권' 등의 키워드로 95회 검색하고 가장 마지막에 '포켓몬 고' 관련해서 5회 검색했다면 이 유저의 관심사가 제주도 여행보다 포켓몬 고로 표현될 가능성이 있습니다. 실제 RNN이 이런 식으로 작동하지 않겠지만, 통상의 RNN의 구조로 유추하면 그렇다는 것입니다. 최근 RNN에서 많이 사용하는 LSTM을 사용하면 또 다른 가능성이 있지 않을까라는 또 기대를 걸어봅니다. (LSTM을 설명한 번역글: http://whydsp.org/280) LSTM를 포함한 텍스트 또는 시퀀스 데이터를 위한 딥러닝 기술을 좀더 공부해봐야겠습니다. 아직 읽어보지는 않았지만 word2vec을 만든 Mikolov가 공저자로 참여한 논문 (http://cs.stanford.edu/~quocle/paragraph_vector.pdf)은 문장/문서의 paragraph vector를 만드는 걸 제안했고, Weinberger et al.은 feature를 hashing하는 방법도 소개했습니다 (https://arxiv.org/pdf/0902.2206.pdf). 여러 논문들을 훑어봤지만 아직 만족스럽지가 않습니다. 만족할 솔루션을 찾았다면 이런 글을 적지도 않았겠지만...

길이가 다소 일정한/제한적인 아이템 벡터보다는 가변적이고 긴 유저 벡터를 만드는 것이 고민이라고 적었습니다. 그런데 문제가 되는 유저는 전체 중에서 극히 일부 (10%미만?)에 해당하는 헤비 유저들 가능성이 큽니다. 이들 일부 유저 데이터만 제한하면 전체 시스템 측면에서는 이점이 있을 수 있습니다. 가장 쉬운 방법으로는 최근의 T기간 또는 N개의 최근 데이터만 사용할 수 있습니다. 추천에서는 최신 데이터에 대한 민감도가 중요하기에 쉽지만 괜찮은 방법입니다. 하지만 헤비유저의 과거 이력에 나타난 오래된 관심사를 반영하지 못할 수도 있다는 우려도 있지만, 오래된 관심사라면 최근 행동에도 반영됐을 가능성도 높고 또 고정 관심사와 연관된 새로운 행동을 통해서 빠르게 업데이트된다면 freshness를 고려하면 헤비유저의 반감이 적을 수도 있겠다는 생각이 듭니다. 그리고 만약 고정된/오래된 관심사라면 이 글에서 제시한 방법에 더해서 별도의 필터링을 위한 유저 관심사 (또는 성별, 연령과 같은 고정된 정보)를 구축해서 하이브리드/퓨젼으로 추천 및 필터링하는 것도 가능합니다.

랜덤 샘플링을 통해서 제한된 정보만 사용하는 것도 고려할 수 있습니다. 모든 물고기를 잡을 수 없다면 큰 물고기라도 잡아야 한다. (어차피 다양한 오프라인 테스트와 온라인 A/B 테스트를 통해서 generalization error가 적은 방식을 택하면 됩니다.) 앞서 소개한 Phan et al.의 논문에서 varying-size 컨볼루션 필터 방식 등을 더 고민해보면 좋은 해결책이 나오리라고 봅니다. 그리고, session이나 period (day-by-day)를 나눠서 별도의 컨볼루션을 만들고 그것들을 다시 컨볼루션해서 최종 벡터를 만들어내는 방식 (또는 세션 단위로 recurrent하는 방식)도 가능성이 있습니다. 또는 임베딩 벡터로 유사도 계산, 클러스터링, 및 topic modeling 등을 통해서 데이터를 축소하는 것도 좋은 접근법입니다. 작은 문제에서 은닉층을 2개 이상 가져가는 것도 버거웠던 시절이 있었지만 지금은 입력 데이터의 차원도 훨씬 커졌고 은닉층의 개수도 훨씬 많아져도 딥러닝을 성공하게 만든 breakthrough가 있었듯이, 이 문제/해결책도 좀 복잡해졌지만 조만간 깔끔하게 해결되리라 봅니다.

그리고, 저는 광고랭킹을 염두에 두고 가능한 유저의 모든 정보와 이력을 모아서 활용하겠다는 관점에서 생각하고 있지만, 특수한 서비스를 위한 추천이라면 데이터의 종류와 양이 충분히 다룰 수 있을만할 거라 봅니다. 광고에서는 유저가 어떤 서비스에서 어떤 활동을 했고 또 어떤 컨텐츠를 조회했는지 등의 모든 정보를 바탕으로 유저 프로파일을 만들어 활용하겠지만, 일반 쇼핑몰에서 상품을 추천하는 경우라면 기존의 CF 등에서 활용하는 수준의 유저별로 조회한 상품 목록만으로도 충분합니다. 자신이 속한 비즈니스 도메인 및 가용 데이터에 따라서 손쉬운 해결책이 존재하고, 이상의 고민이 불필요할 수도 있으니 새로운 접근법을 지나치게 거부할 필요가 없습니다. 서비스/비즈니스 도멘인을 한정하듯이 유저 정보의 종류를 한정하는 것도 방법이 될 수 있습니다. 유저가 검색한 쿼리만으로 유저벡터를 만들겠다거나, 개별서비스에서 정의한 카테고리 (공통의 카테고리일 필요는 없음)의 리스트만 활용하겠다거나, 긴글을 조회한 경우나 댓글 등의 조회 이상을 한 액션이뤄진 URL만을 대상으로 삼는다거나 등의 여러 제약 조건을 데이터를 한정할 수도 있습니다. 제가 이 글에 적었다고 해서 모든 방법이 유효하다는 것은 아닙니다. 단지 생각나는 것을 나열한 것입니다.

지금 바로 내 눈 앞에 보이지 않을 뿐이지 나와 비슷한 문제로 고민했던 수많은 연구/개발자들이 존재하고 있으니 일부는 이미 깔끔한 해결책을 찾아서 알려주고 있습니다. 미래는 이미 우리 곁에 와있지만 인식하지 못할 뿐이다라는 문구와 같이 많은 경우에 우리가 가진 문제의 해결책도 이미 누군가가 풀어놨는데 제대로 인지하지 못하고 있을 뿐입니다. 아직 검증하지도 않은 이런 아이디어를 글로 적는 것도 누군가에게 해결의 실마리를 줄 수 있지 않을까?라는 기대 때문이고, 이를 바탕으로 더 좋은 아이디어로 문제를 해결하고 그 과정과 결과를 논문이나 코드 등으로 공개한다면 조금은 더 좋은 세상이 되리라 기대합니다. 제 생각은 완벽한 해결책도 아니고 논의의 시작점도 아닙니다. 그저 이런 논의의 과정으로 더 많은 문제들의 해결책이 나왔으면 하는 바람일 뿐입니다. 그래서 때론 어리석은 생각도 적고 또 공개/공유하는 것입니다.

===
B: https://brunch.co.kr/@jejugrapher
F: https://www.facebook.com/unexperienced


댓글을 달아 주세요

Share           Pin It
워드임베딩과 팩토라제이션을 설명한 지난 글에서 http://bahnsville.tistory.com/1139 저는 그 기술들을 크고 다양한 데이터 기반의 개인화 추천 data-rich personalization에 적용하는 것에 관심있다고 밝혔습니다. 이번에는 어떻게 개인화 추천에 활용할 수 있을 것인가?에 대해서 아이디어 차원의 글을 적습니다. 좀 naive할 수도 있음을 미리 밝힙니다.

불가능한 것은 아니지만 word2vec같은 워드임베딩 기술이나 SVD, NMF같은 팩토라이제이션 기술을 바로 개인화 추천에 이용하는 데는 한계가 있습니다. 유저별로 조회했던 아이템을 시간순으로 나열하고, 아이템을 word/vocabulary로 가정해서 아이템의 벡터를 만들 수 있습니다. 아이템 벡터의 cosine 유사도를 구해서 관련 아이템을 찾아내는 식으로 아이템 기반의 개인화 추천에 이용할 수가 있습니다. 또는 유저-아이템 행렬을 바로 팩토라즈해서 유저간, 아이템간, 또는 유저-아이템간의 연관도를 측정해서 추천하는 방식이 (추천 알고리즘 중에서) MF방식으로 알려져있습니다. 단순히 유저-아이템 sequence 또는 co-occurrence를 이용해서 추천에 사용할 수 있지만, 한정된 정보를 이용하는 데서 오는 한계가 명확히 존재합니다.

아래 그림은 워드임베딩과 딥러닝 기술을 이용해서 개인화 추천에 어떻게 적용할지를 설명하는 모델입니다. 그림에는 표시하지 않았지만 레이어 사이에 여러 은닉층이 있을 수도 있습니다. 이 모델의 핵심은 사용자와 아이템의 정보를 수치 벡터로 우선 표현하고, 다시 공통의 Latent Vector로 만드는 것입니다. 그렇게 만들어진 LV를 이용해서 유저간, 아이템간, 또는 유저-아이템간의 연관성을 계산합니다. 

유저 및 아이템 정보를 같은 체계인 Latent 벡터로 표현하는 네트워크 모델

** OUV/OIV, CUV/CIV, LUV/LIV: Original/Compressed/Latent + User/Item + Vector

첫번째 단계는 일단 사용자의 정보와 활동 이력 User History나 아이템의 설명 Item Description을 숫자 벡터 Original Vector로 표현하고, 다시 정형화한 Compressed Vector로 정제하는 것입니다. 먼저 사용자 정보는 사용자의 성별이나 연령, 거주지 등의 부가정보나 서비스에서의 행동 이력 (검색쿼리, 봤던 글이나 사진, 댓글, 좋아요활동, 구매 등)을 포함합니다. 텍스트나 ID로 표현되는 정보는 워드임베딩 기술로 벡터화, 사진/이미지는 CNN으로 벡터화 (또는 이미지에서 객체를 인식한 후 워드임베딩할 수도...), 또는 다른 형태의 정보도 수치벡터화 합니다. 아이템 정보도 비슷한 과정으로 Origina Vector를 만듭니다. 단순히 짧은 광고나 상품정보 뿐만 아니라, 장문의 컨텐츠나 관련 이미지 등을 벡터로 만든다면 벡터의 길이가 천차만별일 것입니다. 그래서 모든 유저 벡터 또는 모든 아이템 벡터의 길이를 맞춰주기 위해서 Original Vector를 Compressed Vector로 정형화할 필요가 있습니다. 압축된 CUV나 CIV의 길이가 같을 필요는 없지만 data loss가 크지 않다면 같게 만들어주는 것이 좋고, CV는 수백차원 이상으로 적당히 길어도 무관합니다. 짧을수록 실시간 연산에 용이하겠지만 정보 손실 information loss는 감내해야 합니다. 유저의 이력에서 시간이 중요한 요소라면 RNN을 사용하는 것도 괜찮고, 그저 전체를 스냅샷처럼 요약하는 것이라면 CNN으로 압축하는 것도 고려할 수 있습니다. (참고. 텍스트 convolution 방법: http://www.jmlr.org/papers/volume12/collobert11a/collobert11a.pdf Compressed Vector/Layer를 Convolution Vector/Layer로 불러도 될 듯.)
솔질히 말씀드리면, 이 부분에 대해서 구체적으로 어떤 기술을 어떻게 사용하면 좋을지를 고민/연구하지 못했습니다. 어쨌든 비수치형 데이터인 유저 및 아이템 정보를 간결한 수치벡터 CV로 표현합니다. 이번 글은 다음 단계에 초점을 맞췄지만 대부분의 기계학습에서 인풋을 어떻게 잘 정의/표현하느냐 (knowledge representation)는 기계학습의 성패에 결정적인 부분입니다.

위에서 CUV와 CIV의 길이를 같게 만들었만, CUV와 CIV의 내적 또는 코사인 유사도로 유저-아이템의 관계를 파악할 수 없습니다. 각 CV는 unsupervised로 구축했기 때문에 서로 간의 (CV벡터의 각 엘리먼트 간의) 연관성이 없습니다. 유저-아이템 행렬을 MF한 경우라면 사용자벡터와 아이템벡터의 내적이 곧 사용자와 아이템의 관계를 암시하지만, 위의 관계에서는 그렇지 않습니다. 즉, 사용자와 아이템을 표현하는 벡터의 길이만 같지 벡터의 각 element를 이루는 구성요소/방식이 서로 다릅니다. Bi-linear regression 모델을 이용해서 모든 '유저x아이템'의 계수를 측정할 수도 있지만, 앞서 말했듯이 CV는 수백차원의 벡터이기 때문에 데이터 차원 폭발 dimension explosion이 발생합니다. CUV과 CIV가 각각 100차원이라 하더라도 10,000개의 계수를 예측해야하는 문제가 됩니다. (처음에 유저 및 아이템 벡터를 만들려고 생각했을 때는 bi-linear regression을 고려했었지만 차원 폭발 문제가 우려돼서 포기함) 그래서, CUV와 CIV를 같은 조건으로 표현한 Latent Vector로 만드는 것이 다음 단계입니다.

CV는 여느 차원축소 dimension reduction 기술이 그렇듯이 unsupervised로 만들면 됩니다. 단 새로운 정보가 들어왔을 때도 기존의 변환 구조/결과를 크게 훼손하면 안 됩니다. 비슷한 정보를 가진 사용자는 결과 CUV가 비슷해야 합니다. A라는 사용자의 현재 CUV와 며칠 후 (행동 이력이 조금 추가/변경된)의 CUV가 크게 달라지면 안 됩니다. 데이터가 업데이트되면서 CV가 달라지겠지만 일관적이어야 한다는 것입니다. 한편, CV를 LV로 만드는 것은 이미 확보한 유저-아이템 관계를 이용한 supervised 방식으로 학습시킵니다. 즉, 어떤 사용자 U가 아이템 I를 구매했다는 정보를 이용해서 U의 CV를 LV로 변환 encoding하고 그 LV를 다시 CIV로 변환 decoding한 결과가 I의 CV가 되도록 학습시킵니다. word2vec처럼 LV가 유일한 은닉층일 수도 있고, 통상의 auto-encoder처럼 은닉층이 여러 겹일 수도 있습니다. word2vec의 skip-gram에서 입력 단어 벡터는 CUV가 되고 출력 맥락(단어) 벡터는 CIV가 되는 형태, 또는 번역할 언어의 문장을 CUV로 보고 번역될 언어의 문장을 CIV로 가정했을 때는 번역 시스템의 구조와 같습니다. 유저-아이템 네트워크를 처음 생각했을 때 NMT (Neural Machine Translation)과 개념상 구조가 같다고 봤습니다. NMT의 구조는 auto-encoder나 word2vec의 그것도 개념적으로 같습니다. 앞의 설명에서는 CUV-LV-CIV 순으로 학습시켰지만, 역순(CIV-LV-CUV)으로도 함께 학습시켜서 유저와 아이템이 동일한 LV체계를 갖도록 학습시킵니다. 그래서 CUV와 CIV의 차원을 같게 만들어야 한다고 적었습니다. (굳이 따를 필요는 없음)

중간을 많이 생략했지만, 사용자의 정보 및 이력을 LUV로 만들고, 아이템의 정보를 LIV로 표현했다면 추천 및 개인화에 필요한 모든 것이 끝났습니다. LUV1과 LUV2의 유사도를 구하면 사용자 U1과 U2의 유사도가 나옵니다. 즉, 나와 비슷한 취향의 사용자를 바로 확인할 수 있습니다. 비슷하게 LIV1과 LIV2의 유사도를 구해서 유사 아이템도 구할 수 있습니다. (유저-유저 또는 아이템-아이템 유사도는 그냥 CV의 연산으로 처리해도 됨) LUV와 LIV을 같은 식으로 표현했기 때문에 LUV와 LIV의 유사도를 이용해서 유저에게 가장 적합한 아이템들을 바로 선별할 수 있습니다. 그리고 한 가지 더 장점이 있습니다. 이제껏 단순히 유저-아이템 관계라고 설명을 했지만, 종류가 다른 아이템을 한꺼번에 학습시킬 수가 있습니다. 즉, 사용자 U는 컨텐츠 C도 봤고 광고 A를 봤다면 U-C, U-A의 관계로 학습시켜서 C와 A의 유사도도 측정할 수 있습니다. (설명을 많이 생략했지만...) 그래서 컨텐츠 C가 노출되는 화면에 다른 종류의 컨텐츠인 광고 A를 함께 노출시켜줍니다. 기존에는 단순히 사용자 U가 어떤 페이지에 접속했을 때 'U'의 정보만 고려해서 컨텐츠 C의 추천과 광고 A의 노출이 독립적으로 이뤄졌는데, 새로운 scheme에서는 C와 A가 같은 공간에서 LV로 만들어져서 LVc와 LVa의 유사도를 계산해서 문맥(현재 보는 컨텐츠)에 맞는 광고나 관련 상품 등을 노출할 수 있습니다. (유저와 무관한 맥락 광고를 제공. 물론 사용자를 고려했을 때 효과가 더 높겠지만...)

학습 Training
위에서 설명한 프레임워크가 제대로 작동한다는 것을 증명하기 위해서 어쨌든 CV-LV-CV (CLC)로 이어지는 네트워크를 supervised 방법으로 학습시켜야 합니다. OV에서 CV로 차원을 축소해서 정형화하는 바른 방법은 존재한다고 일단 가정합니다. CLC 네트워크의 구조나 가중치W 업데이트 방법 등은 보통의 ANN (MLP, auto-encoder, word2vec 등)과 동일해서 별도의 설명은 생략합니다. 관건은 어떤 데이터로 학습시키느냐입니다. 번역에서는 번역할 문장과 (인간이 번역한) 정답 문장이 존재하기 때문에 입력층에 번역할 문장을 넣고 출력층에 정답문장을 넣어서 W를 업데이트합니다. 추천에서는 이런 매핑 관계는 결국 유저-아이템 간의 interaction 유무를 정답세트로 봐야합니다. 예를 들어, 유저 U가 컨텐츠 A, B, C를 조회했다면 (U, A), (U, B), (U, C) [그리고, (A, U), (B, U), (C, U)]를 학습데이터로 보는 것입니다. 기존의 추천에서 사용하던 유저-아이템 행렬과 동일한 데이터입니다.

하지만 우려되는 점은 도메인마다 어느 수준까지를 유저-아이템 사이에 관계가 있다고 볼 것인가입니다. 광고를 예로 들면, 사용자 U가 광고 A, B를 클릭해서 광고주 페이지로 이동했을 때, 그 중에서 광고 B와 연결된 상품만을 구매(전환발생)했습니다. 광고를 클릭한 것만으로도 유저-광고를 연결해도 되는가 아니면 전환이 발생한 B만이 U에게 유효한 광고인가의 문제가 있습니다. 몇 년전까지만해도 트래킹 이슈가 있어서 클릭을 광고의 주요 지표로 봤지만 최근에는 실제 전환을 더 중시하기 시작했고 또 그에 따라서 다양한 트래킹 업체들이 등장했습니다. 하지만 전환 데이터는 여전히 수집의 어렵고 또 실제 전환 발생 빈도가 낮아서 데이터 양이 부족한 경우가 많습니다. 정답세트가 부족하다면 아무리 우수한 모델이 있더라도 제대로 학습시키지 못해서 좋은 성능을 기대하기 어렵습니다. 역으로 클릭 정보는 다소 많이 있지만 어뷰징을 포함해서 실제 매핑 관계가 아닐 가능성이 높습니다. ... 현실적으로 클릭과 전환을 모두 정답 세트로 사용하는 것입니다. 전환이 발생했다는 것은 이전에 클릭이 존재한다는 의미입니다. 그래서 클릭은 가중치가 1이 되고, 전환은 (클릭 1 + 전환 1) 가중치가 2가 됩니다. 전환에 더 fit한 모델을 만들면서 부족한 부분은 클릭으로 어느 정도 커버하는 형태입니다.

(바라건대 제대로 작동한다고 가정하고...) 일반적인 상품이나 컨텐츠 추천에서는 위에서 설명한 방법이 별로 문제될 것이 없는데 (제대로 동작한다면), 제가 지금 맡고 있는 광고는 추천과 결이 조금 다릅니다. 추천에서는 그저 1등 또는 상위 N개의 아이템만 선별해서 순서에 맞게 노출시켜주면 되는데, 광고에서는 예상CTR (Clickthrough rate)를 계산해야 합니다. 유저-아이템의 연관도가 높을수록 pCTR이 높게 나옵니다. 이는 보통 광고는 ecpm (expected cost per mille) 순으로 랭킹하는데, ecpm = pCTR * BA (Bidding Amount)로 계산되기 때문입니다 (보통 CPC광고에 한함). 즉, 유저와 아이템 (광고)의 연관도가 높거나 광고주가 높은 값으로 광고기회를 구매한 광고를 우선 노출시켜줘서 광고 플랫폼의 기대 수익을 높이는 방식입니다. 그리고 보통 과금액을 정할 때 Dutch auction으로 알려진 second-price로 과금합니다. 그래서 정확한 기대 CTR을 예측하는 것이 광고 사업에서 매우 중요합니다. (기대수익 계산과 과금액 산정이 일반 추천과 조금 상이할 수 있음) 그런데 앞서 설명한 방식에서는 CTR 수치를 얻지 못해서 기존 광고 시스템과 어긋나는 부분이 있습니다. 그런데 CTR이 유저와 아이템 간의 연관도 (즉 순서와 정도)를 나타내는 지표라면, 그냥 Sim(LUV, LIV)를 CTR의 대체제로 사용해도 크게 문제될 소지가 없지 않을까?라는 확신이 강하게 듭니다.

요즘은 기-승-전-딥러닝입니다. 이미지 객체 인식, 음성 인식, 자연어처리 등의 분야에서 딥러닝이 괄목할만한 성과를 냈습니다. 세계의 어딘가에선 딥러닝을 이용한 추천 시스템도 개발해서 활용하고 있으리라 봅니다. 논문이나 연구결과를 별로 못 봤는데, 글을 적으면서 좀 찾아보니 논문이 전혀없는 것은 아닙니다. 기존의 여러 알고리즘을 딥러닝에 맞게 변형한 것이나 딥러닝의 구조에 입력층만 잘 끼워맞춘 것 등의 논문들이 눈에 띕니다. 제가 구상한 것과 비슷한 구조의 논문도 눈에 띕니다. (참고. https://arxiv.org/pdf/1701.04783.pdf CV를 만드는 것까지는 유사하나 유저와 아이템 관계를 학습하는 부분에서 상이함) 직접 구현해서 테스트해보기 전까지는... 학교 다니면서 ANN을 야매로 공부했고, 3년 전에 딥러닝을 주목했고, 2년 전에 서베이 수준에서 딥러닝을 공부했는데, 추천에 딥러닝을 활용하는 방안에 대한 고민은 있었지만 팀을 옮기고 생각의 발전이 별로 없었습니다. 올해는 다시 공부하는 해로 정하고 이것저것 훑어보면서 다시 오래된 고민을 정리하고 있습니다. 실마리는 거의 다 찾았고 이젠 구현해서 테스트만 해보면...

... 직접 코딩해서 테스트해보기가 참 싫다. 내가 프로그래밍을 조금만 더 좋아하고 소질이 있었더라면 세상이 약간은 더 바뀌지 않았을까? 이게 글의 결론은 아닌데...

===
B: https://brunch.co.kr/@jejugrapher
F: https://www.facebook.com/unexperienced


댓글을 달아 주세요

Share           Pin It
Word Embedding, Factorization, and Personalization
여러 가지 개념이 혼재돼있습니다. 단어의 원래 뜻과 다르게 해석한 여지가 있습니다. 이 글에서 설명한 것이 절대적으로 맞다고 생각하면 위험합니다. 저는 제게 필요한 것으로 아전인수격으로 정의, 사용했을 개연성이 높음을 미리 경고합니다. 한글화된 용어를 별로 좋아하지 않지만 필요에 따라서 (국내에서 통상적으로 사용하는 경우) 일부 용어는 한글화했습니다.

2017년은 나름 공부하는 해로 정하고 그동안 미뤄놨던 논문들을 읽기 시작했습니다. 벌써 4주차가 됐는데도 여전히 논문을 읽고 있으니 지금의 흐름은 나름 오래 갈 것 같습니다. 한동안은 업무에 필요하거나 주목받은 논문 한두편을 짧게 읽은 적은 있지만, 연구실에 있을 때처럼 그냥 손에 잡히는 논문이나 엮인 논문들을 계속 읽어가는 것은 참 오랜만입니다. 아무래도 딥러닝이나 AI와 관련된 논문들을 많이 읽고 또 오픈소스나 라이브러리를 내려받아서 실행해보는 것을 한동안 계속할 예정입니다.

최근에 관심있게 보고 있는 논문은 워드 임베딩 Word Embedding 관련 논문입니다. 더 구체적으로 2013년에 처음 소개된 후로 많은 연구자들과 개발자들의 주목을 받은 Word2Vec과 후속의 관련 논문들입니다. Word2Vec은 딥러닝 커뮤니티에서 자주 언급되는데, 학습 구조상으로 인공신경망 ANN을 닮았지만 엄밀히 딥러닝의 범주에 넣기에는 구조가 매우 간단합니다. 사전 (또는 vocabulary) 사이즈의 one-hot 인코딩을 인풋으로 받기 때문에 통상의 딥러닝의 인풋에 견줄만하지만 은닉층 hidden layer이 하나뿐인 매우 간단한 shallow 네트워크입니다. 그리고 인닉층의 activation function도 통상의 sigmoid나 ReLU 등의 비선형 함수가 아닌 그냥 선형함수를 사용하는 가장 심플한 MLP의 구조를 따르는, 그리고 딥러닝에서 pre-training에 많이 사용하는 auto-encoder를 많이 닮았습니다.

Word2Vec은 CBOW continuous bag of words나 skip-gram으로 학습을 하는데, 이것에 대한 자세한 설명은 생략합니다 (다음의 링크 참조). 그리고 word2vec의 메커니즘을 자세히 알고 싶은 분들은 word2vec을 처음 제안했던 Mikolov의 2013년 논문을 찾아보기 보다는 이후에 나왔던 Xin Rong의 'word2vec Parameter Learning Explained http://www-personal.umich.edu/~ronxin/pdf/w2vexp.pdf'를 찾아서 읽어볼 것을 권합니다. word2vec의 구조와 parameter update 방법/수식 등을 친절히 설명해놨습니다. (배경 지식없이 Mikolov의 논문을 보면 좀 욕 나옴.)

word2vec이 word embedding을 효과적으로 구현해서 많은 이들의 주목을 받은 후에, GloVe라는 알고리즘도 등장했습니다. (참고. GloVe: Global Vectors for Word Representation http://www-nlp.stanford.edu/pubs/glove.pdf) 자료를 찾아보면 GloVe가 단어를 벡터로 표현하는데 word2vec보다 낫다는 평도 있습니다. 일반적인 입장에서 볼 때 word2vec과 glove는 큰 차이는 없는 것같고, 필요하다면 둘 다 테스트해보고 자신의 문제에 더 맞는 것을 선택하면 됩니다. 이 둘이 어떤 차이가 있을까?를 조사하면서 'don't count, predict! http://www.aclweb.org/anthology/P14-1023'라는 논문을 읽었는데, 이 논문에서 word embedding 또는 word representation의 두가지 방식을 잘 설명해줍니다. (논문의 결론은 GloVe의 counting보다는 word2vec의 predictive가 더 낫다고...)

전통적으로 word embedding은 counting에 기반합니다. 보통 VSM vector space model로 알려진 N x M의 word-document matrix나 word co-occurrence를 표현한 N x N matrix를 만드는 것은 counting방식입니다. NM행렬은 문서로 단어를 표현하고, NN 행렬은 다른 단어로 단어를 벡터로 표현한 것입니다. 그런데, 이런 단어벡터는 보통 수십만 이상의 고차원으로 정의되기 때문에 데이터를 저장한다거나 벡터 연산을 하는데 실효성/실용성이 떨어집니다. 그래서 dimension reduction 기법을 사용해서 고차원 벡터의 의미를 최대한 유지하면서 저장공간도 줄이고 연산도 쉽게하는 저차원 벡터로 만듭니다. 그렇게 저차원의 단어 벡터가 통상 말하는 word embedding입니다.

저차원으로 줄이는 방식은 단어를 특정 카테고리로 매핑해서 카테고리 벡터로 표현하는 syntactic 방식이 생각하기에 가장 쉬운 방식일 듯합니다. 하지만 인위적으로 카테고리를 정하는 것이 만만치가 않고, 또 단어를 카테고리로 매핑하는 방식도 쉽다고는 말하기 어렵습니다. 물론 분류 classification 알고리즘을 사용하면 된다라고 설명하면 되지만... 서비스를 기획/개발하면서 카테고리 작업을 해보신 분들은 카테고리를 잘 정의하면 여러모로 좋다는 것은 잘 알지만, 그걸 깔끔하게 잘 만들기가 매우 어렵다는 것을 압니다. 처음에는 카테고리를 잘 정의했다고 생각하지만, 나중에 이상한 새로운 데이터가 출현했을 때 기존 카테고리와 맞지 않는 문제도 있고, 카테고리를 어느만큼 세밀하게 정의할 것인가 등의 많은 이슈들이 터져나옵니다.

Supervised 분류가 어렵다면, unsupervised를 고려할 수 있습니다. 그래서 클러스터 방식을 사용해서 군집화합니다. 그렇게 만들어진 클러스터1부터 클러스터c까지 매핑하면 c차원의 벡터를 만들 수 있습니다. 하지만, 클러스터 방식은 만들어진 벡터의 robustness에 의문이 생깁니다. 학습데이터가 바뀔 때마다 각각의 데이터가 다른 클러스터로 군집되면 같은 데이터가 다른 벡터로 표현될 수가 있다는 의미입니다. 그래서 기존의 클러스터 구조를 유지하면서 새로운 데이터를 수용할 수 있는 방식이 필요합니다. 그리고 클러스터는 분류와 개념상 더 비슷한/연결고리가 있는 것이라서 먼저 설명했지만, 가장 일반적인 방식은 PCA principle component analysis입니다. PCA는 행렬에서 고유값/고유벡터를 찾아서  분해하는 SVD singular value decomposition 메커니즘을 기본적으로 따릅니다. 이 SVD를 텍스트 마이닝에 바로 적용한 것이 보통 LSA/LSI Latent Semantic Analysis/Indexing입니다. PCA에서 principle과 SVD애서 singular,  LSA의 latent, 그리고 행렬의 eigen(고유)이 결국 같은 걸 의미합니다. 이를 통해서 고차원의 행렬을 저차원의 행렬들로 분해합니다.

SVD와 같이 행렬을 저차원으로 행렬의 곱으로 분해하는 것을 보통 matrix factoriztion이라고 합니다. 즉 행렬을 인수분해하는 것입니다. SVD는 3개의 행렬로 분해하지만, 최근에는 그냥 2개의 저차원 행렬로 분해하는 여러 방식도 많이 제안됐습니다. 대표적으로 Non-negative Matrix Factorization인데, 이는 원래 고차원 행렬과 저차원 행렬 모두 음수가 아닌 값으로 채워지도록 분해하기 때문에 붙여진 이름입니다. 어쨌든 NMF를 사용하면 고차원 행렬을 2개의 저차원 행렬의 곱으로 표현할 수 있습니다. Word-document matrix를 SVD로 인수분해하든 NMF로 인수분해하든 word 쪽의 저차원 매트릭스를 단어 벡터로 볼 수 있습니다. 이렇게 여러 가지 방법으로 저차원의 단어벡터를 만들 수 있습니다.

다시 counting vs predictve로 돌아가서, 이상에서 길게 설명한 word-document matrix 또는 word-co-occurrence matrix를 factorization하든 카테고리로 매핑하든 클러스터로 묶든 이런 co-occurrence 데이터로 단어벡터를 만드는 것이 counting 방식입니다. 반대로 word2vec은 알고 싶은 단어의 주변 context 단어들의 벡터로 표현하는 것이 predictive 방식입니다. 즉 컨텍스트로 의미를 유추/예측한다는 뜻입니다. 그런데, counting 방식에서 co-occurrence의 카운팅을 문서나 문장 단위가 아니라, word2vec처럼 로컬의 컨텍스트 단어로 window를 축소해서 계산한다면 counting방식이 predictve방식과 큰 차이가 날까?라는 의심이 듭니다. Co-occurrence를 카운팅할 때 global하게 볼 것인가 아니면 local로 볼 것인가의 차이인 듯도 한데... 실제 co-occurrence matrix를 로컬의 context만으로 표현할 수 있습니다. Window 사이즈를 어떻게 잡느냐에 따라서 로컬 정보만을 취할 수도 있고 글로벌 정보를 취할 수도 있습니다. 이건 k-NN에서 k의 값을 어떻게 잡느냐에 따라서 민감도가 달라지는 것과 크게 달라보이지 않습니다. 물론 연산방식이 달라서 결과가 다르게 나올 것 같지만, word2vec에서 사용하는 context만으로 co-occurrence를 구해서 MF든 GloVe든 구하면 결과가 얼마나 많이 다를지 살짝 의문이 듭니다.

... 제가 이런 고차원의 단어 벡터를 저차원의 단어 벡터로 표현하는 것에 관심을 가지는 것은 본격적으로 NLP나 텍스트 마이닝을 하겠다는 것보다는 예전부터 계속 해왔던 추천 그리고 광고랭킹에 이런 기술을 적용해서 효과를 낼 수 있다는 가능성 때문입니다. 단순히 사용자가 봤던 상품/컨텐츠 ID의 시퀀스를 word2vec이든 GloVe 알고리즘에 인풋으로 넣으면 상품/컨텐츠ID의 벡터가 나오고, 그 벡터의 유사도 계산을 통해서 관련상품 또는 관련 컨텐츠는 쉽게 추천해줄 수 있습니다. 기존에 사용하든 CF나 MF 방식도 결국 이걸 구현했던 것이니 별반 차이가 없습니다. 컨텐츠ID를 벡터로 표현해서 바로 적용하는 것도 있지만, 사용자의 벡터화를 통해서 개인화 추천에 바로 적용할 수도 있습니다. 첫째는 유사 사용자를 벡터 연산으로 바로 찾아낼 수도 있고, 사용자 벡터와 컨텐츠 벡터의 관계를 Neural Translation에서 사용한 것과 유사한 방식으로 찾아낼 수도 있습니다. 그리고, MF 추천 방식에서 원래 사용자 벡터와 컨텐츠 벡터의 곱으로 연관성을 측정했습니다.

현재 추천이나 광고랭킹 시스템이 고도화됐더라도 한 사용자의 모든 활동 이력을 raw data 수준으로 활용하는 곳은 별로 없다고 봅니다. 성별이나 연령, 또는 관심사 등으로 뭉뚱그려서 (앞서 설명한 카테고리 방식) 개인을 설명합니다. 그러다 보면 추정이 잘못된 경우도 빈번하고 카테고리에서 설명했듯이 개인의 히스토리가 온전히 카테고리로 매핑되지도 않습니다. 그리고 역으로 raw 데이터를 그대로 활용해서 추천에 이용하는 것이 가능하더라도 raw 데이터에는 outlier가 포함돼서 어느 정도는 데이터를 뭉게는 과정이 필요합니다. 사용자의 이력을 엄청나게 긴 벡터라고 생각한다면 이를 적절히 짧은 벡터로 만들 수 있다면 활용성은 무궁무진해집니다.

사람이든 객체든 그걸 설명하는 데이터를 앞으로 엄청나게 많아 질 것입니다. 하지만 데이터가 많아진다고 해서 그걸 모두 적절히 활용한다는 것은 아닙니다. 빅데이터라는 신드롬에 편승해서 데이터가 모이기만 하면 가치가 만들어지는 것 같은 신기루에 빠졌습니다. 하지만 모든 데이터는 적절히 관리돼고 또 처리될 수 있는 수준으로 압출돼야 비로소 가치적 행위로 이어집니다. 물론 고차원의 데이터를 그대로 활용할 수 있다면 문제가 없겠지만, 아직은 많은 곳에서는 적절한 양으로 요약해야 제대로 사용할 수 있습니다. 고차원의 데이터가 손실없이 저차원으로 표현된다면... 그런 측면에서 계속 word embedding 기술도 탐독했고 각종 factorization이나 dimension reduction 기술을 공부하고 있습니다. (하지만, 전 그걸 코드화하는 것에 참 부족해서... 그냥 늘 머리 속으로 공부만... 다행히 요즘은 오픈소스가 잘 돼있어서 직접 구현할 필요가 많이 줄어들었습니다. 하지만 가끔은 그걸 이용하는 게 더 귀찮을 때도... 최근 움직임 중 하나는 클라우드를 AIaaS로 활용하는 것도 있지만 좀 경계는해야 할 듯...)

오랫동안 여러 논문들을 읽으면서 여러 번 글을 적고 싶었지만 오늘 다양한 주제를 하나의 글로 만들었습니다. 여러 개념들이 일반적으로 통용되는 것과 다른 식으로 표현돼거나 또는 곡해한 부분이 있을 수 있습니다. 제 나름의 시각에서 해석한 것들이 많기 때문에, 이걸 원래 가지고 있던 의미를 다시 확인해보거나 자신의 문제나 시각에 맞도록 재해석하는 것이 필요합니다. 그것까지 제가 해줄 수는 없습니다. 물론 관련해서 도움을 요청한다면 또 다른 저의 시각에서 조언은 해줄 수는 있을지도...

word2vec을 다루는 많은 글들이 있습니다. 하지만 참 부족하다고 느꼈습니다. 단순히 word2vec의 결과로 벡터 연산을 할 수 있다느니 아니면 단순히 word2vec 오픈소스를 사용하는 방법만을 설명해놓은 중복된 정보가 너무 많습니다. 제가 늘 아쉬웠던 것은 실제 word2vec이 어떤 메커니즘/수식을 통해서 도출되는지였는데, 다행히 앞서 언급했던 논문 (word2vec explained)에서 많은 궁금증을 해결했습니다. 뿐만 아니라, word2vec을 통해서 단순히 단어의 벡터 연산 이상으로 어떤 곳에 어떻게 활용했는지를 정리한 글도 별로 보지 못했습니다. 인터넷이라는 공간이 긍정적인 면도 많지만, 때로는 너무 한쪽에 치우친 정보만이 넘쳐나는 공간이 돼는 듯도 해서 안타까움도 있습니다. 제가 많이 알지도 못하고 글재주도 부족하지만 조금은 다른 측면에서 글을 적으려는 이유도 이런 안타까움이 한몫했습니다.

다시 경고하지만, 제가 틀린 것을 적었을 수도 있습니다. 제가 이해한 것을 적은 것이니 잘못된 것은 걸러들으시고 또 알려주시면 감사하겠습니다.

===
B: https://brunch.co.kr/@jejugrapher
F: https://www.facebook.com/unexperienced


댓글을 달아 주세요

Share           Pin It
데이터 마이닝이나 머신러닝, 인공지능 AI 등에 관한 심도깊은 얘기는 다루지 않는다. 내가 그런 심도깊은 일을 하고 있지 않기 때문이기도 하거니와 그런 내용은 학교에서 정식으로 배우거나 많은 연구 논문을 읽으면서 터득해야할 영역이다. 개인적인 요청이 있다면 그걸 위해서 가이드해줄 수는 있지만 이 티스토리에서 그걸 해결해줄 수는 없다. 하지만 2017년에는 공부 좀 하기로 마음을 먹었으니 필요하면 특별한 주제에 맞춰서 또는 머신러닝 알고리즘의 전반적인 것에 대해서 종종 다루려 한다. 계획이 그렇다는 것이지 몇 번을 다룰지는...

최근이라 적고 작년 2016년에 가장 큰 이슈가 됐던 강화학습과 GAN (Generative Adversarial Networks)에 대한 소개 또는 개념적 이해를 돕기 위해서 글을 적는다. 남들이 이해하도록 돕는다기보다는 스스로 정리하고 넘어가고 싶었다.

알파고 AlphaGo가 이세돌 9단을 4대1로 꺾은 이후로 가장 떠오른 단어 또는 개념은 강화학습 Reinforcement learning이다. 물론 알파고가 딥러닝 Deep learning에 기반한 인공지능 AI Artificial Intelligence지만, 딥러닝이나 AI라는 단어는 그전부터 언론에도 많이 등장했었다. 단지 알파고 충격 전에는 이런 용어에 대한 소비 니즈가 없었기 때문에 일반인들은 무시했을 뿐이다. 다른 것보다 강화학습이 더욱더 부각됐다는 의미다.

그런데 강화학습이라는 게 전혀 새로운 개념이 아니다. 사실 기계학습 Machine learning이라 부르는 대부분의 알고리즘 (또는 학습법)은 강화학습에 기반을 두고 있다. 강화학습은 어떤 액션에 대한 반응에 따라서 그 액션의 정당성을 얻느냐 못 얻느냐가 판별하고, 정당성을 얻은 액션은 향후에도 계속 하도록 장려받도록 훈련받는 것이다. 애완견에서 '앉어'라고 말한 후에 개가 실제로 앉으면 '간식'을 준다. 처음에 개는 앉어 명령어와 간식 사이의 연관성을 모른다. '앉어' 명령어에 우연히 앉아서 간식을 얻었다면, 그리고 반복적으로 '앉어' 후에 간식을 계속 받아먹는다면 개는 '앉어'와 '간식' 사이의 인과성을 발견한다. '앉어' 명령어에 앉으면 간식을 얻는다를 학습한 것이다. '앉어'는 액션이고 '간식'은 리워드다. 역으로 어떤 액션을 피하게 하는 페널티도 비슷한 메커니즘이다.

기계학습에서는 이런 과정을 데이터로 한다. 특히 지도학습 Supervised learning이 그렇다. Y = f(X)에서 f() 함수 (또는 모델)을 유추할 때, 주어진 X에 대해서 정답 Y를 뱉어내면 f() 함수를 제대로 유추한 것이고 그렇지 못하면 해당 유추를 무시하면 된다. 정답 Y가 있는 많은 학습데이터 training data을 가지고 적절한 f() 함수의 형태나 파라메터를 얻어내는 과정이 보상과 벌로 애완견의 액션을 인지시키는 훈련 과정과 같고 이것이 강화학습이다. 기계학습이란 것이 학습데이터를 잘 설명하는 모델을 만드는 (또는 기계를 학습하는) 것이고, 즉 학습된 기계는 학습데이터에 따라 움직인다. 그래서 학습데이터로 기계를 학습시킨다는 모든 알고리즘이 강화학습이라고 볼 수가 있다. 특히 딥러닝의 기초가 되는 인공신경망 Artificial Neural Networks의 학습과정을 강화학습이라고 말하지만, 다른 기계학습을 강화학습이 아니라고 말하는 것은 좀 이상하다.
** 강화학습에 관해 더 자세한 것은 다음의 텍스트북을 참고하기 바란다. https://webdocs.cs.ualberta.ca/~sutton/book/bookdraft2016sep.pdf

강화학습이라는 것이 기계학습에서 일반적인 것이라면 왜 알파고 이후에 강화학습이 주목을 받은 것일까? 단순히 기계를 학습하는 방법보다는 기계를 학습시키는 정답세트를 얻는 전략적인 과정에서 비롯했다고 본다. 그래서 그냥 강화학습이라고 말하기보다는 자기강화 Self-reinforcement라는 용어를 쓰는 게 맞지 않나?라는 생각을 한다. 기계학습이 결정적으로 실패할 때는 적당히 많은 정답세트가 없을 때다. 아무리 이론적으로 뛰어난 알고리즘이더라도 그걸 학습시킬 데이터가 없다면 기계학습은 실패한다. 기계학습의 승패는 정답세트를 얻느냐의 여부에 달려있다. 알파고가 수십년동안 수집한 대국기보를 가지고 학습했다지만, 그것만으로 인간을 이길 전략을 완벽히 마스터하는 것은 사실상 불가능하다. 현재까지 학습한 것을 바탕으로 사람과 직접 대국하면서 전략을 시험해보고 전략을 수정할 수도 있겠지만, 그럴려면 시간도 많이 걸리고 탑랭크 바둑기사들이 불완전한 기계를 상대해줄 가능성도 낮다. 이 부분에서 딥마인드 DeepMind는 자기강화라는 훌륭한 전략을 사용했다.

알파고 이전에 딥마인드는 오래된 아타리 Atari라는 게임을 학습시키면서 (자기)강화전략을 선택했다. 랜덤이든 어떤 규칙에 따른 것이든 아타리게임의 커서cursor를 이리저리 수없이 많이 옮기면서 점수를 얻는 법을 터득해 나갔다. 즉, 커서를 적당히 옮겨서 떨어지는 볼을 되받아쳤더니 그 볼이 위로 올라가서 벽돌을 부수면서 점수를 얻고, 커서가 볼을 되받아치지 못했을 때는 게임이 끝나버린다. 이런 무수한 임의의 움직임을 통해서 볼을 위로 보내면 점수를 얻고 떨어뜨리면 점수를 얻지 못한다는 것을 학습하고, 커서를 유효하게 움직이는 방법을 터득한 것이다. 수많은 시행착오 끝에 사람보다 더 뛰어난 점수를 얻게 된 것이다. 게임의 최종 점수, 즉 목적 함수가 있었기에 가능한 방법이다. 같은 전략을 바둑에도 적용시켰다. 단 바둑에서는 고득점이 아니라 고승률을 얻도록 목적함수를 설정했다.

기본적으로 사람들의 기보를 통해서 합습한 알파고와 그것의 클론을 만들어서 둘 사이에 대국을 펼친다. 완벽한 계산에 따라서 움직일 수 없으니 적당히 임의의 움직임도 가지는 전략을 갖는다. 그 둘의 대국에서 승리한 쪽의 전략은 받아들이고 패한 전략은 약화시킨다. 그렇게 한번더 승리한 전략을 가진 새로운 알파고가 만들어진다. 새로운 알파고는 이전 버전과 다시 대국을 펼친다. 새 버전의 알파고도 여러 전략으로 자신과 싸워서 이기는 전략을 취하고 지는 전략은 버린다. 이런 과정을 수만번, 수십만번 반복하면서 이기는 또는 빈틈없는 전략을 찾아가는 과정이 (자기)강화학습과정이다. 사람과 직접 대국하지 않고 (정답세트 데이터가 없이) 바둑에서 이기는 전략을 찾아간 것이다. 알파고에서 자기강화의 개념을 빼버리고 단순히 강화학습이라고 설명하면 안된다는 걸 말하고 싶었다.
** 알파고의 강화학습은 알파고 논문을 보면... http://airesearch.com/wp-content/uploads/2016/01/deepmind-mastering-go.pdf

여담. (일반적인) 강화학습에서 초기값와 임의성은 전역최적화 Global optimization 때문에 매우 중요하다.

2016년도 초반에는 자기강화학습이 유명해졌다면 후반에는 GAN이라는 게 주목받았다. 2016년 12월에 열린 NIPS 학회에서 GAN이 튜토리얼로 소개됐는데, 앞서 설명한 알파고의 자기강화전략과는 또 다른 재미있는 전략으로 정답세트 없이 (또는 적은 정답세트로) 기계를 효과적으로 학습시키는 전략을 소개했다. GAN은 Generative Adversarial Networks의 약어인데, 각각이 중요한 의미를 가진다. 먼저 Network는 그냥 신경망이나 아니면 일반 모델정도로 이해해도 충분한 것 같다.

기계학습에서 Generative라는 용어가 등장하면 Discriminative라는 용어도 함께 등장한다. 이 두 용어의 개념을 여러 번 찾아보고 이해하려 했지만 논문을 읽을 때는 '아 이런 개념이었구나'라고 하다가 또 금새 '두개의 차이가 뭐지?'라고 하곤 했다. 모든 기계학습은 generative거나 discriminative다. 그냥 사전을 찾아보면 '생성적인'과 '식별하는'정도의 뜻을 가졌는데, 이것만으로 무슨 개념인지 이해하기 어렵다. 앞서 설명했듯이 기계학습은 주어진 데이터를 바탕으로 학습한다. Discriminative는 주어진 그 데이터의 현상만을 가지고 판별하는 것이라면, generative는 그 데이터 이면에 현재 이런 현상을 만든 이유 (또는 모델, 함수)가 있다고 가정하고 그 이유를 찾는 것이다. 설명이 좀 거시기하다. 예를 들어, 주어진 데이터만으로 'X > 5이면 Y = 1이고 X <= 5이면 Y = 0이다' 식으로 규칙 (바운더리)를 찾아내면 discriminative 방식이다. 하지만 generative는 X가 어떤 함수 -- 보통은 분포 distribution -- g(z)에 따라서 생성됐다고 가정하고 g(z)의 모형과 파라메터를 찾는 것이다. 클러스터링에서 가장 기본이 되는 k-means 알고리즘은 discriminative이고, 보통 gaussian 분포로 가정해서 EM expectation maximization 알고리즘으로 그 분포의 파라메터를 찾아가는 알고리즘은 generative다.
** GAN의 generative의 의미가 일반적으로 기계학습에서 사용하는 generative인지 여부는 좀 헷갈린다. (좀더 공부한 후에...)

마지막으로 adversarial이 GAN의 핵심이다. Adversarial은 반대의 또는 대립관계가 있는 등으로 해석할 수 있다. 알파고의 강화학습은 똑같은 목적을 가진 알파고와 알파고 클론 간의 경쟁을 통해서 더 나은 전략을 찾아가는 과정인데, GAN은 서로 다른 목적을 가진 기계끼리 경쟁하면서 더 나은 전략을 찾아가는 과정이다. 대표적으로 위조범G과 위작감별사D다. 예를 들어, 피카소의 그림은 매우 비싸게 팔린다. 만약 명화위조범이 피카소의 화풍으로 왁벽히 똑같은 그림을 그려서 그걸 피카소가 직접 그린 그림이라고 판매를 한다면 어떻게 될까? 반대편에서는 구입하기 전에 그 그림이 진품인지 위작이지를 알고 싶어할 것이다. 그래서 GAN은 위작을 만드는 generator G와 위작을 판별하는 discriminator D를 별도로 학습시켜서, G는 D를 속이도록 D는 G의 속임수를 찾아내도록 만드는 것이다. 자기강하학습에서는 자기 자신과 싸우면서 더 좋은 전략을 찾아가지만, GAN에서는 자신과 경쟁 관계가 있는 상대방과 경쟁하면서 전략을 향상시키는 것이다. 게임이론에서 말하는 내쉬평형을 찾는 일이라서 어렵다고 한다. 그리고 아직은 초기라서 연구하고 해결해야할 것들이 많고, 새로운 아이디어가 쏟아져나오고 있다고 한다.
** GAN에 대한 더 자세한 설명은 NIPS 2016 Tutorial 논문 참조: https://arxiv.org/abs/1701.00160

기계학습의 승패는 양질의 정답세트를 얻느냐 못 얻느냐에 달려있다. 하지만 양질의 정답세트를 얻는 것이 때로는 불가능하고 가능하더라도 리소스가 많이 들어간다. 그래서 제한된 학습데이터로 더 좋은 알고리즘을 만드는 것이 많은 연구자들의 목표였다. 아니면 비지도학습 unsupervised learning처럼 애초에 정답세트가 없이 제한된 범위 내에서 문제를 해결하려고 노력중이다. 중간에 semi-supervised learning이 존재해서 적은 양의 정답세트로 나름 괜찮게 작동하도록 학습시키는 방법도 있다. 하지만 결국 더 많은 정답세트를 이길 수는 없다. 그런 측면에서 알파고가 채택한 자기 자신과 싸우면서 더 좋은 전략을 찾아가는 방식이나 GAN이 채택한 경쟁 관계의 상반된 모델을 만들어서 전략을 수정해가는 방식이 참 흥미롭다.

강화학습이나 GAN까지는 아니더라도 부족한 정답세트를 극복하기 위한 다른 여러 방법들이 있다. Semi-supervised 중에 하나인 active learning (다른 의미로 사용되는 경우도 있음)도 일종의 앙상블 방법인데, 두개의 다른 learner가 서로 다른 결과를 예측하면 어느 예측이 맞는지 사람에게 확인받아서 모호한 케이스에 대해서 정답세트를 추가하는 방식이다. 위에서 설명한 것보다는 좀더 아날로그적인 방식이지만 액티브러닝을 소개받았을 때도 참 재미있다고 생각했었다. 일반적으로 두개의 classifier가 같은 답을 내놓으면 그게 정답이겠거니라고 생각하겠지만, 역으로 둘다 틀린 답변을 내놓았을 가능성도 있다. 그래서 둘이 다른 판정을 내린 사안에 대해서만 다시 슈퍼바이저 (인간)이 투입돼서 정답 여부를 가늠하는 겁니다. (처음 적을 때 이 문단은 없었지만, 함께 언급해도 괜찮을 것 같아서 추가함)

당장 내가 하고 있는 업무에서 자기강화방식이나 GAN방식을 사용할 수 있을지? 또는 어떻게 사용할 수 있을지는 아직 잘 모르겠다. 내가 앞으로 머신러닝 분야에서 더 깊은 연구를 하거나 새로운 알고리즘을 개발할 가능성은 낮지만, 다른 차원의 문제에서 이런 비슷한 전략으로 문제를 해결하는 실마리를 얻을 수 있지 않을까?라는 생각에서 좀 길게 글을 적었다.

===
B: https://brunch.co.kr/@jejugrapher
F: https://www.facebook.com/unexperienced


댓글을 달아 주세요

  1. Favicon of http://jyyang.tistory.com BlogIcon acon 2017.04.24 14:12 신고 Address Modify/Delete Reply

    흔히 기계학습에서는 Supervised Learning, Unsupervised Learning, Reinforcement Learning으로 나누는걸로 알고 있는데요, RL은 엄밀히 말하면 지도학습이나 비지도학습과는 다른 분류로 나눠야 하는 것 아닌가요?

    • Favicon of http://bahnsville.tistory.com BlogIcon Bahniesta 2017.04.24 15:20 신고 Address Modify/Delete

      일반적으로 RL을 별도의 분류로 보는 건 맞지만, 그냥 RL을 리워드(함수)도 결국 슈퍼바이즈드의 라벨과 큰 차이가 없을 수도 있습니다. 관점의 차입니다. 특히 말하고 싶었던 것은 강화 프로세스가 요즘 언급되는 RL만을 의미하는 것은 아니라는 것입니다.

Share           Pin It

팀 내에 공유했던 딥러닝 Deep Learning 발표자료를 공유합니다. 수식을 포함한 아주 상세한 내용을 다루지는 않고, 그저 개념적인 설명을 위한 자료입니다. 인공신경망 ANN의 기초적인 이해부터 다양한 애플리케이션에 적용된 DL의 구조를 보여주는 것이 목적입니다. 발표를 위한 자료라서 그저 슬라이드만으로는 이해가 부족할 수도 있습니다. 그저 참고용으로 활용하시기 바랍니다.



==

페이스북 페이지: https://www.facebook.com/unexperienced

댓글을 달아 주세요

Share           Pin It
요즘 IT 쪽에서 가장 뜨거운 이슈 중에 하나는 분명 딥러닝 Deep Learning 일 듯하다. 마치 몇 년 전에 빅데이터 Big Data 기술들이 처음 소개되고 성공 스토리들이 언론에 회자되던 때를 회상하게 만든다. 그러나 일반인들에게 딥러닝이 빅데이터만큼 쉽게 받아들려지고 확대될 수는 없을 것같다. 그 이유는 분명하다. 어렵기 때문이다. 물론 다양한 오픈소스가 만들어지고 최적화된 방법론이 소개되겠지만, 그걸로는 충분치가 않다. 소수의 선택된 자들 외에는 딥러닝은 그저 그림의 떡이다. 어렵기 때문이다. 빅데이터는 단편적인 기본 지식만 있어도 (실제 적용까지는 힘들더라도) 현상을 이해하기에 충분하지만, 딥러닝은 언론이나 컨퍼런스에 소개되는 내용만으로 이해하기란 거의 불가능하다.

최근에 몇 편의 논문이나 동영상 강의 자료를 탐독하면서 딥러닝이 어렵다는 것을 재확인했고, 그 어려움의 실체에 대해서 감을 조금 잡았다. 그래서 이 글을 적는다. 제목에 초보자라고 적었지만, 생판 초보자를 의미하지는 않는다. 아래에 제시된 분야 중에서 일부 분야에 조금 익숙한 또는 일부 분야에 덜 익숙한 사람을 초보자라고 부르겠다. 그렇지 않은 사람들은 이 글을 스킵할 것을 조언한다.

만약 딥러닝을 공부하고 개발하고 실무에 적용해야 하는 상황에 닥쳤다면 가장 현실적인 조언은 "피할 수 있으면 피하라. 만약 피할 수 없으면 포기하라"다. 때로는 딥러닝이 기존의 여러 AI 알고리즘보다 더 나은 성능을 보여주기도 하고 또는 사람들의 labor-intensive한 노력없이 괜찮을 성능을 보여주기 때문에 지금 딥러닝에 열광하는 것이다. 혹시 다른 대안 (딥러닝보다는 성능이 조금 떨어지거나 충분한 인력이 투입되어 노하우가 녹아있는 알고리즘이나 시스템)이 존재한다면, 굳이 딥러닝을 시도할 필요가 없다. 물론 더 큰 조직이나 더 똑똑한 무리들이 딥러닝으로 치고 나가면 미래에 격차가 더 벌어질 가능성도 충분하지만, 지금 조직에서 단지 몇 명이 딥러닝을 공부해서 적용한다고 해서 그들을 따라잡을 가능성은 크지가 않다. 너무 절망적인가? 그렇다면 나의 의도가 충분히 충족됐다고 본다.

언론에서 얘기하는 것 때문에 딥러닝에 관심을 가져서 구글로 Deep learning으로 검색해서 임의로 논문 한편을 골라서 읽어본다면 분명 처음에는 쉽게 이해하기 어려울 것이다. 초보자를 위해서 처음부터 끝까지 쉽고 상세하게 적은 그런 리뷰 논문이 아니라, 최근 어떤 분야에서 딥러닝으로 괄목할만한 성과를 이뤄냈다는 식의 10장 짜리 논문을 한 번에 이해하는 사람은 거의 없을 것같다. 최근 몇 편의 논문을 읽으면서 생각하기로 크게 두가지 이유 때문인 것같다. 첫번째는 뉴럴 네트워크 (보통 Neural Network, 즉 NN으로 표기하지만, 정식 명칭은 인공신경망 즉 Aritificial NN (ANN)이다)에 대한 이해가 부족하기 때문이고, 두번째는 딥러닝이 적용된 애플리케이션 분야에 대한 지식 부족 때문이다. 굳이 하나 더 추가하자면 대부분의 논문이나 강의가 영어로 돼있다는 점도 크게 작용한다.

일반인들이 ANN에 대한 기초 지식없이 단순히 딥러닝이 ANN을 확장했다고만 언급하고 그것을 모델링하고 최적화하기 위해서 사용된 방법을 간략히 소개만 하고 넘어가면 당연히 그 논문을 제대로 이해할 길이 없다. 그런데 ANN을 제대로 이해하기 위해서는 인체 내에서 벌어지는 뇌의 활동을 먼저 이해해야 하고, 그걸 실행가능한 형태의 (그래피컬) 모델을 그려낼 수 있어야 하고, 정보 전달 메커니즘인 로지스틱 회귀분석 (선형 회귀분석과 액티베이션)에 대한 이해가 필요하고, 가장 중요하게도 각종 파라메터를 최적화하는 방식을 이해해야지 딥러닝의 가장 기초인 MLP (Multi-Layer Perceptron)을 겨우 이해할 수 있다.

뇌과학자가 아닌 이상 뇌에서 의사결정을 위해서 뉴런들이 시그널을 전파하고 합쳐지고 리즈닝하는 것을 정확히 이해할 수 없다. 더욱이 뇌에 대해서 밝혀진 것은 여전히 극소수에 불과하다. 그런 후에 뉴런들 간의 인터렉션을 MLP든 아니면 다른 형태의 Network로 적절히 모델링해야 한다. 머신 러닝에서 가장 간단한 알고리즘이지만 선형회귀나 로직스틱회귀도 전공자가 아니면 외계어다. 본인도 최근에서야 ANN에서 사용되는 W 행열과 B(bias) 벡터, 그리고 sigmoid 액티베이션 함수가 선형회귀/로지스틱회귀 모델임을 자각했다. 그런데 ANN은 많은 수의 회귀모델의 앙상블 Ensemble이고, 딥러닝은 그런 ANN 및 다른 네트워크 아키텍쳐의 앙상블이다. 여기까지는 그래도 조금의 뇌지식이나 확률 지식만 가져도 개념적으로 쉽게 이해가 된다. 그러나 마지막으로 W와 B 등의 파라메터를 최적화하는 Back-propagation을 이해하려면 미적분에서부터 시작해서 네트워크 토폴로지에 따른 다양한 object 및 loss function을 정의하고,그에 따른 Gradient 기반의 최적화 방법을 이해해야 한다. 개념적으로는 쉽지만 수식이 좀 복잡해져서 포기하게될 가능성이 높다. 이정도의 최소한의 지식이 있으면 이제 가장 간단한 형태의 MLP ANN을 이해했다고 볼 수 있다. (구현 이슈도 있지만)

그리고 다른 글에서도 적었지만 딥러닝이 단순히 MLP에서 히든 레이어의 개수를 늘리거나 히든 노드의 개수를 늘리는 것이 아니다. 개념적으로는 그렇지만 더 다양한 형태의 아키텍쳐와 모델들이 합쳐져야 제대로된 딥러닝이 만들어진다. 예를들어, 주어진 데이터나 문제에 따라서 RBM이나 Belief network에 대한 이해가 필요하고, auto-encoder나 sparse coding 등도 이해할 필요가 있고, CNN (Convolution)이나 RNN (Recursive), Multi-moidal/tasking 등의 다양한 형태의 네트워크나 조합에 대한 이해가 필요하다.

ANN에 대해서 충분한 지식이 있는 이들도 딥러닝을 쉽게 이해하기 어려운 다른 이유는 딥러닝이 적용된 분야의 특수성 때문으로 생각한다. 현재까지 딥러닝이 가장 효과를 보여주는 분야는 일반적으로 AI에서 패턴인식 Pattern Recognition으로 알져진 분야다. 패턴인식은 단순히 매트릭스 형태의 수치데이터를 가공하는 데이터마이닝과는 차원이 다르다. 딥러닝의 초기에는 음성인식에서 두각을 나타냈고, 그 후에 자연어처리 NLP, 그리고 이미지처리 등에서 효과를 보여주고 있다. 그런데 이런 음성, NLP, 그리고 이미지/동영상 분야는 나름의 도메인 지식이 필요하고, 딥러닝 이전부터 활발히 연구됐던 다양한 알고리즘들이 존재한다. 그런데 딥러닝을 다룬 한편의 논문에서는 이런 응용분야의 백그라운드 지식에 대한 장황한 설명없이 단지 어떤 문제(예를들어, POS 태깅)에 딥러닝을 적용해서 기존에 가장 우수한 성능을 보여줬던 어떤 알고리즘보다 더 나은 성능을 보여줬다라고 결론을 내린다. 도메인 지식이 없는 사람에게 딥러닝 논문은 참 난관이다.

이런 저런 모든 배경 지식을 습득했다고 하더라도 문제는 이걸 구현하는 것도 이슈다. 물론 요즘은 다양한 오픈소스가 존재하기 때문에 그걸 이용할 수도 있다. 그러나 자신의 문제에 맞게 그런 오픈소스를 최적화하는 방법도 만만치가 않다. 많은 배경지식에 더해서 각 분야에 대한 많은 경험과 노가다가 있어야지 딥러닝을 제대로 활용할 수가 있다. 노가다에 대한 충분한 준비가 된 자라면 딥러닝에 도전하기 바란다.

길게 엄살을 적어놨지만, 앞으로 딥러닝에 더 관심을 가지고 다양한 분야에서 좋은 성과를 내기 위해서 딥러닝에 대한 더 깊은 이해가 필요하고, 그리기 위해서 필요한 기초 지식 트리를 설명하기 위해서 글을 적는다. 계속 공부하고 테스트해보면서 더 깊은 내용은 다음 기회에...

이전 글에서도 짧게 적었지만, 아무리 딥러닝이 어렵더라도 마치 많은 양의 데이터로 기계를 학습시키듯이 다양한 딥러닝 관련 글과 논문을 꾸준히 읽고 고민하다 보면 마치 ANN의 노드들 사이에 연결이 생기고 파라메터가 최적화되듯이 딥러닝에 대한 이해도 조금씩 누적되어 마스터하는 날이 올 수도 있다. 당장 어렵더라도 포기하지 말고 꾸준히 스스로를 학습시키기 바란다.

여담으로 딥러닝에 GPU가 좋은 컴퓨터가 필요하다고 하는데, 이는 네트워크의 파라메터를 최적화하기 위해서 크고 많은 수의 매트릭스/벡터 연산이 필요하기 때문이다. 즉, 이미지 시각화를 위해서 매트릭스 연산에 최적화된 GPU가 CPU보다는 딥러닝의 연산에 더 적합하다는 얘기다. 최근 비트코인을 채굴하기 위해서도 GPU가 많이 필요하다는 얘기를 들었는데, 비트코인 채굴을 위한 계산도 많은 수의 매트릭스 연산 때문인 듯하다.
 
P.S., NIPS 2014에 다녀온 후배의 후기를 봐도 현재 딥러닝이 얼마나 핫한 이슈인지를 알 수가 있습니다. (링크. 2014 NIPS 후기)

==
페이스북 페이지: https://www.facebook.com/unexperienced


댓글을 달아 주세요

Share           Pin It
최근 Deep Learning에 대한 관심이 뜨겁습니다. 딥러닝에 대한 얘기를 처음 들은 것은 작년 이맘 때였던 것같은데, 몇몇 기사들만 읽어볼 뿐 애써 외면했습니다. 처음에 딥러닝을 소개하는 두꺼운 논문을 한편 프린트해서 조금 읽어본 후에, 내가 관여해야할 것이 아니다라는 감을 잡고 깊이 파고 들지 않았습니다. 주변에서 공부를 시작하거나 실제 문제에 적용한 케이스도 봤지만 굳이 관여는 피했습니다. 그런데 차츰 내가 직면한 문제의 나름 해결책이 딥러닝이 아닐까?라는 생각을 하게 되면서 다시 관련된 논문을 찾아서 읽거나 온라인 강좌 비디오를 보기 시작했습니다. 이제 시작 단계지만 딥러닝에 대한 첫인상을 적어볼까 합니다.

처음 딥러닝을 알게된 시점에는 단순히 기존의 뉴럴네트워크의 단순 확장판, 즉 히든 레이어나 노드의 수를 적절히 늘려서 예측력을 높이는 정도 또는 패턴을 여러 단계로 나눠서 인식하는 정도로 이해했습니다. 한참 학교에 있던 2000년대 초반에도 뉴럴 네트워크(ANN, Artificial Neural Network)에 대한 관심은 높았지만, 특정 문제에서는 잘 적용되지만 모든 문제에서 가장 적합한 해결책이 아닌 경우가 많았습니다. 특히 히든 레이어나 노드 수가 증가하면 모델을 학습시키는데 시간도 오래 걸리고 또 학습된 모델의 정확도도 낮았던 걸로 기억합니다. (그래서 ANN이 더 발전하지 않겠구나라고 생각하고 더 깊이 공부하지 않았습니다. 물론 ANN을 제대로 이해하기 위해서 필요했던 기초 지식이 부족해서 한계에 부딪혔던 점도 있습니다. 그런데 약 10년의 시간이 흘러서 다시 ANN이 딥러닝이라는 이름으로 화려하게 부활했습니다.) 당시 컴퓨팅 파워로는 레이어나 노드를 무한정 늘릴 수가 없었습니다. 그런데 지금은 컴퓨팅 파워와 대용량의 학습 데이터 때문에 더 큰 네트워크를 학습시킬 수 있게 되서, ANN이 다시 각광받는구나 정도로 이해했습니다. 그런데 딥러닝은 단순한 ANN의 확장은 아닌 것같습니다. 

실제 ANN에서 히든 레이어나 노드의 수를 증가시키면 정확도가 올라가는 것은 맞습니다. 그러나 그 정확도는 트레이닝 오류를 낮추는 것이지, 테스트 에러 즉 비학습 데이터에 대한 정확도를 높이는 것이 아닙니다. 즉 레이어와 노드 수의 증가는 ANN의 오버피팅 문제만 일으킵니다. 그렇기 때문에 ANN을 단순히 확장한다고 해서 딥러닝이 될 수가 없습니다.

아직은 많은 사례를 보지 못했지만, 딥러닝의 네트워크와 ANN이 닮은 점은 인풋 레이어, 히든 레이어, 아웃풋 레이어로 구성된다 정도만 닮았습니다. 그리고 비선형성을 위해서 sigmodal이나 tanh 함수를 사용한다정도만 닮았습니다. 그래서 딥러닝을 ANN의 차기 버전이라고 말하는 것도 조금 아닌 것같고, 일반적인 모든 방법을 단순히 딥러닝이라고 부르는 것도 이치에 맞지 않은 것같습니다. 현재까지 나온 모든 딥러닝 방법론을 딥 아키텍쳐 또는 딥 네트워크 아키텍쳐라고 부르는 것이 더 맞을 듯합니다. 편하게 딥러닝이라고 부르지만, 네트워크가 예전보다 복잡해졌다는 공통점 외에 여러 방법론들의 결과물/네트워크의 형태상으로 공통점을 찾아보기가 힘듭니다. 그래서 그런 복잡한 모든 네트워크를 딥러닝이라고 퉁쳐서 부르면 개별 네트워크의 특징을 제대로 파악하는데 어려움이 따를 듯합니다. 그래서 딥 아키텍쳐라는 우산 아래 다양한 네트워크 패밀리들이 존재한다라고 이해하는 것이 좋을 듯합니다. (더 자세한 설명은 제 능력밖이고… 아직 제대로 정립하지 못했습니다. 모양도 제각각이고…)

그리고 현재 나온 딥러닝에 관한 논문이나 글들을 이해하기는 너무 어렵습니다. 첫째는 기본적인 ANN에 내포된 여러 방법론들에 대한 설명이 없거나 너무 빈약하게 설명하고 딥러닝의 구성에 대한 설명으로 바로 넘어가 버립니다. 더욱이 ANN을 이해하기 위해서 선행해서 알아야 하는 확률 모델이나 (로지스틱) 회귀모델 등에 대한 설명도 부실합니다. 기초적인 확률통계 및 머신러닝에 대한 지식이 없이 ANN을 이해하는 것도 무리가 있는데, ANN에 대한 설명도 부실한 상태로 딥러닝을 설명하는 경우가 많습니다. 그러니 처음 논문을 접하는 분들은 바로 포기해버리고 맙니다.

두번째는 현재까지 딥러닝이 성공한 애플리케이션은 음성인식이나 이미지 판독 등입니다. 현재 인터넷으로 검색되는 많은 논문이나 강좌는 음성인식에 초점을 맞춰서 설명하는 경우가 많습니다. 즉 음성인식이나 NLP 등에 대한 경험이 없는 사람들에게 딥러닝이 멀게만 느껴집니다. 딥러닝 논문 한편을 이해하기 위해서 일반적인 음성인식 문제에 대한 배경지식도 공부해야 하고 또 전통적인 음성인식 방법론 (HMM과 같은)을 다시 들쳐봐야 합니다. 그동안 인간들이 축적한 지식의 양과 종류가 너무 방대해서 이제 초보자들이 하나의 개념을 받아들이는데 장애물이 너무 많아진 것같습니다.

혹시 딥러닝을 공부해보겠다고 마음을 먹은 사람이라면 앞서 말했듯인 ANN에 대한 공부부터 시작하시고, 음성인식이나 이미지 프로세싱 등의 애플리케이션에 대한 배경지식을 습득할 것을 권합니다. 대학원을 다니면서 (음성인식 등의 애플리케이션은 그렇다치더라도) NN에 대한 공부를 등한시했던 것이 참 후회됩니다.

딥러닝 과련 논문을 읽으면서 ‘내가 지금 딥러닝 방식으로 딥러닝을 공부하고 있구나’라는 생각을 했습니다. 앞서 말했듯이 이론적인 배경도 빈약하고 응용 분야에 대한 지식도 부족하니 논문을 읽어도 제대로 이해하지도 못합니다. 그렇다고 해서 모르는 부분을 만날 때마다 참고 자료를 모두 찾아볼 수도 없는 노릇입니다. 그래서 일단은 많은 자료를 그냥 막 읽어보자라는 결심을 했습니다. 그렇게 많은 것들을 읽다보면 머신이 학습되듯이 제 뇌도 새로운 지식을 차츰 받아들이고 학습하고 재구성할 수 있으리라는 기대를 해봅니다. 딥러닝이 그렇듯이 unsupervised로 학습한다는 것은 참 어렵습니다. 머신러닝과 관련된 문제를 만날 때마다 조언을 구하던 그 친구의 부재가 더 크게 느껴집니다.

==
페이스북 페이지: https://www.facebook.com/unexperienced

댓글을 달아 주세요

  1. Favicon of http://jitwo.tistory.com BlogIcon jitwo 2015.11.23 18:00 신고 Address Modify/Delete Reply

    글을 참 잘 쓰시는 것 같습니다. 좋은 글 잘 읽고 갑니다.

Share           Pin It
그 날 이후로 인문학에 대한 화두는 대한민국 사회를 휩쓸고 있다. 인문학에 대한 긍정적 기대와 기성 세대의 인문학 팔이에 대한 회의가 겹쳐서 여전히 논쟁의 중심에 있다. 어쩌면 '중심에 있다'는 표현은 맞지 않는듯하다. 대한민국에서 공학이나 과학과 비슷하게 인문학도 논의의 중심에 놓인 적이 단 한번도 없다. 단지 조금 더 관심을 가졌기 때문에 중심으로 들어온 것처럼 보일 뿐, 여전히 변두리에 머물러 있다. 정치 또는 경제가 아니면 대한민국의 중심에 놓일 수가 없다. 간혹 스포츠가 중심에 놓인다. 그러나 그건 정치의 조작에 따른 왜곡된 현상일 뿐이다.

Canon | Canon PowerShot SD1100 IS | Pattern | 1/13sec | 0.00 EV | 11.6mm | ISO-250 | Off Compulsory | 2010:01:27 02:32:48그날


오랫동안 공학에 발을 담고 있는 나는 여전히 인문학에 대한 기대를 가지고 있다. 정확한 방법을 모를 뿐 뭔가 변화를 줄 수 있으리라 기대한다. 그러나 힐링이라는 말과 함께 기성세대들의 생명연장을 위한 지나친 인문학 마케팅은 여전히 경계한다.

그런데 인문학이란 무엇일까? 한자로 풀어보면 사람을 뜻하는 인, 글자/문자를 뜻하는 문, 그리고 배움을 뜻하는 학으로 이뤄졌다. 즉 사람과 글과 배움이다. 문자 그대로 사람에 관한 것이고, 글에 관한 것이고, 또 배움에 관한 것이다. 사람 글 배움... 

먼저 문이란 결국 글이다. 즉 글을 적는 능력, 글을 읽는 능력, 글을 해석하는 능력, 글을 응용하는 능력 등으로 볼 수 있다. 더 깊게 들어가면 생각하는 능력이다. 문을 영어로 표현하면 liter(al)정도로 표현할 수 있을 것같은데, 조금 의역하면 art로 표현될 것같다. (영어권에서도 liberal art라고 표현했지 않은가?) Art란 흔히 예술이라 표현하지만 기술을 뜻하기도 한다. 즉 예술과 기술은 같은 것이고 이는 모두 사람들이 인위적으로(artificial) 만든, 즉 natural의 반대 개념이다. 결국 문은 사람이 만드는 모든 것이다. 그래서 결국 문은 인에 포함된다.

학의 주체는 결국 사람이다. 배우지 않은/못하는 이는 사람이 아니다라는 말도 있다. 배움이란 사람이 가지는 기본 소양이고 사람을 사람으로 만들어주는 거다. 같은 결론으로 학도 인에 포함된다고 말하고 싶은 거다. 사람 그 자체가 인문학이고, 사람에 관한 것이 인문학이고, 사람이 만든 모든 것이 인문학이다. 그렇기에 인문학에 대한 이상 과열 현상이 진짜 이상하다.

결국 인문학에서 사람만 남았다. 사람 또는 사람에 대한 모든 것이 인문학이다. 인문학은 이래야 한다는 많은 주장들이 있지만 그 속에 사람이 없으면 그것은 인문학이 아니라는 말을 하고 싶은 거다. 내가 인문학에 기대하는 이유도 혹시나 사람에 대한 더 깊은 이해를 얻을 수 있으리라는 기대와 다시 사람의 가치를 되찾을 수 있으리라는 기대 때문이다. 역으로 인문학에 경계를 하는 이유도 다시 인간의 존엄성보다는 수단으로 만들어버리는 것이 아닌가라는 우려 때문이다. 잘 알려진 많은 인문학 마케터들은 인간이 목적이 아닌 수단으로 밖에 사용하지 않는다. 그래서 비판을 받는다. (그러나 여전히 잘 팔린다.)

인문학에 대한 무지 또는 오해가 인문학을 무용하게 만들지도 모르겠다는 생각이 든다. 인문학에 대한 무지가 아니라 사람에 대한 무지가 맞다. 사람에 대한 존중이 없이 인문학을 배우고 전파한다는 것은 자기 모순이다.

학문적으로는 오래 됐지만 그 효용이 끝났다라고 판단했던 알고리즘이 있다. 물론 일부 분야에서는 좋은 성능을 보여준다고 믿었지만 대부분의 영역에서 다른 더 나은 알고리즘으로 대체됐다고 판단했던 알고리즘이다. 바로 신경망이라 알려진 뉴럴네트워크, 더 정확히 말하면 인위적 뉴럴 네트워크 (Artifical Neural Network, ANN)이다. 이름에서 알 수 있듯이 인위적으로 사람의 신경망을 은유해서 만든 머신러닝 기법이다. 수식으로 깔끔하게 표현되지 못해서 비판을 받고 또 다른 대체제들보다 더 낫다고 볼 수 없기 때문에 자연스레 사장되고 있었다. 나도 그렇게 믿었다.

그러나 최근에 딥러닝 Deep Learning이라는 이름으로 새롭게 주목받고 있다. 뉴럴네트워크를 처음 제안했던 사람들의 꾸준한 연구와 그리고 구글이나 페이스북같이 충분한 컴퓨팅 파워와 데이터를 확보한 거대 인터넷 기업들이 적절한 사용처를 찾아내면서 다시 주목을 받고 있다. 최근에는 딥마인드라는 회사가 구글에 인수되면서 다시 주목을 받고 있다. 기술적으로 4세대 뉴럴네트워크인 Restricted Boltzmann Machine이 딥러닝이다. 그냥 그렇다는 거다. 어차피 대부분 관심이 없을테니 그냥 아는 척 한 거다.

어쨌든 딥러닝 또는 뉴럴네트워크의 성공 이면에는 결국 사람에 대한 이해를 바탕에 두고 있다. 사람의 신경망이 어떻게 작동할까?를 고민한 끝에 나온 모사가 뉴럴넷이기 때문이다. 뉴럴넷같은 소프트웨어/알고리즘 뿐만 아니라, 많은 로봇공학이 사람이나 동식물들의 움직임 또는 기능을 관찰해서 얻은 통찰에 바탕을 두고 있다. 물론 기계/로봇으로 동물을 그대로 모사할 수 없기 때문에 유기체와 다른 형태로 구현될 수 밖에 없다. 어쨌든 유기체의 기능을 이해함으로써 새로운 것 또는 더 나은 것을 얻고 있다.

인문학이 던지는 화두는 사람에 대한 본질에 대한 이해이고, 딥러닝이 던지는 것은 사람의 기능에 대한 이해다. 사람의 본질과 기능. 사람을 이해해야 한다. 어제 적은 '성공하는 서비스'에서 밝힌 AC도 결국 사람이다.

==
페이스북 페이지: https://www.facebook.com/unexperienced   


댓글을 달아 주세요