데이터과학 유망주의 매일 글쓰기 — 57 일차
K-Nearest Neighbor
# KNN, #BOW, #Word2Vec
오늘 한일:
오늘은 K-Nearest Neighbor(KNN)라는 개념에 대해 학습했다. 이전에 섹션 2에서 자발적으로 이에 대한 블로그를 써 보았는데, 실질적으로 활용할 기회를 오늘 얻게되었다.
오늘 과정은 텍스트를 벡터화 시켜, 이를 KNN에 학습시키고 이를 통해 새로운 텍스트 데이터가 얼마나 기존 데이터와 비슷한지 예측을 하는 것이었다.
일단 Bag-of-words(BOW)모델은 단어의 빈도만 고려하는 모델이고, 가장 기본적인 기법이다. 문서를 가장 작은 단위로 쪼개고, 각 단위의 빈도를 기반으로 벡터화한다. 행은 문서이며, 열은 각 단어로 나타낸다. 빈도수를 측정하여 CountVectorizer를 이용하거나, TF-IDF값을 TfidfVectortizer로 구하여 벡터화할 수 있다. 벡터화는 Python에서 sklearn과 spacy 패키지를 활용할 수 있다.
BOW를 이용해 Document Term Matrices (DTM, 문서-단어행렬)을 만들 수 있다. 단어의 빈도수를 카운트 한 값을 나타내거나, 단어가 있는지 이진(binary)수로 표현할 수 도 있으며, 이전에 언급했던 Term-Frequency Inverse-Document (TF-IDF) 값으로 나타낼 수 있다.
또한 cosine similarity, 즉 코사인 유사도를 이용해서 텍스트의 유사함을 결정하는 Brute Force한 방법이 있다. 두 벡터화된 텍스트의 코사인 값을 이용하여 구한다. 두 벡터가 같을 수록 1에 가까우며, 수직이면 0, 서로 반대될 수록 -1에 가깝다.
KNN은 목표 쿼리 텍스트와 가장 가까운 상위 K개의 데이터를 찾아, 이들의 유사성을 기반으로 분류하는 머신러닝 기법이다. 이 KNN은 K-D Tree나, 여기서 더 발전된 Ball Tree를 사용할 수 있다. 전자는 Cartesian 축을 기준으로 벡터를 나누지만, 후자는 Ball Tree는 nesting hyper-spheres라는 형태를 기준으로 나눈다고 한다. 트리를 구성할 때 치르는 비용이 높지만, 구조화된 데이터나 높은 차원의 데이터에 효율적이라고 한다.
Word2Vec은 단어를 임베딩(embedding)하는 방법인데, 바로 이전 섹션의 프로젝트에서 트윗이 어느 유저에게 더 언급될 가능성이 높은지 예측을 할 때 사용했던 방법이다. 벡터화할 때 문맥정보를 포함한다는 큰 장점이 있다. 예를 들어, think와 deliberate, consider등의 단어가 있다고 하면, 이들을 비슷한 의미로 보고 고려하여 벡터화를 한다는 의미가 된다.
임베딩이란 텍스트형태의 언어를 컴퓨터가 처리할 수 있는 수학적 형태로 바꾸는 것을 말한다. 2013년 구글 연구팀이 개발하여, 지금까지 가장 널리쓰이는 자연어 처리 기법이다.
임베딩의 방법으로는 skip-gram과 CBOW등 두 모델이 있다. 분포가설(Distributional Hypothesis)은 비록 의미는 다를지라도, 비슷한 문맥을 가진 단어들의 존재를 고려한다는 강점이있다.
- I think of you every night
- I consider myself as a warrior each day
여기서 think와 consider, every night과 each day는 서로 비슷한 의미를 가진다고 할 수 있다. 문맥상 상당히 비슷한 의미를 지니기 때문이다.
Skip-Gram은 신경망(Neural Networks)를 활용하는 방법인데, 기본적으로 1차원의 입력 벡터가 있고, 각 벡터가 Hidden Layer의 신경에 연결되어, 다시 각 신경은 Output Layer의 신경들에 연결된다. 이를 통해 Softmax Classifier를 이용해 각 신경이 가장높은 확률로 구분한 정보를 신뢰도와 함께 출력하는 방식이다.
예측할 타깃 단어가 think라고 하면, “I”와 “of”를 주변 문맥단어로 여기고 학습한다. 이런식으로 하나의 타깃을 예측할때, 그 주변 단어들을 같이 학습하여 문맥을 배우는 꽤 똑똑한 모델이라 할 수 있다.
앞으로 할일:
오늘은 그렇게 숟하게 들어왔던 KNN의 실체에 대해 어느 정도 파악할 수 있는 시간이었다. 배울수록 인간의 언어를 컴퓨터가 학습한다는 것이 정말 쉽지 않은 일임을 느꼈다. 정해진 규칙대로만 행동하는 컴퓨터가 변칙적인 인간의 언어를 완벽히 학습한다는 것은 어찌보면 불가능하게 보인다. 하지만, 구글 어시스턴트, 아마존 AI 스피커 등의 성능을 보면, 정말 생각보다 이 분야의 기술이 매우 많이 발전했음을 실감한다. 영화 <Her>처럼 인간만큼 섬세한 인공지능을 만드는 것도 불가능한 것은 아닌 것처럼 보인다.
오늘 정말 표면적으로 KNN의 개념을 건드리기는 했지만, 상당히 복잡하면서도 이해할 것이 많은 개념인 만큼 앞으로도 공부가 필요하다는 생각이든다. KNN을 하기 위해 정말 많은 과정에서의 개념들이 있는 만큼, 이들을 시간을 가지고 충분히 학습하고 싶다는 생각이들었다. 아직 미개척 분야라, 알려진 것보다 알려지지 않은, 발견해야할 것들이 천지인 분야다. 하지만, 그만큼 이 분야에서 가능성과 기회가 많다는 뜻 아닐까? 그렇게 생각하며, 앞으로 내게 남겨진 무한한 배움의 세계에 감사하다.
참조:
(1) https://cdn.analyticsvidhya.com/wp-content/uploads/2018/03/knn3.png