L1 regularity 는 분류/예측 성능은 유지하면서 모델의 coefficients 를 최대한 sparse 하게 만듭니다. PyTorch 를 이용하여 L1 regularity 를 부여하는 방법을 살펴봅니다. 이는 custom cost function 을 구현하는 내용이기도 합니다.
(Gensim) Word2Vec 의 최소 빈도수 설정
Word2Vec 을 학습 할 때, 학습할 단어의 최소 빈도수를 설정해야 합니다. 그리고 Gensim 의 Word2Vec 은 단어 빈도수에 편향성이 있습니다. 빈도수가 작은 단어들이 제대로 학습되지 않기 때문에 최소 빈도수를 잘 설정해야 합니다. 이번 포스트에서는 실제로 infrequent words 가 어떻게 학습되는지 살펴보고, 적절한 최소 빈도수 설정을 위한 경험적 방법에 대해서도 논의합니다.
Hidden Markov Model 기반 품사 판별기의 decode 함수
Part of Speech tagging 과 같은 sequential labeling 을 위하여 Hidden Markov Model (HMM), Conditional Random Field (CRF), 혹은 Recurrent Neural Network (RNN) 이 이용될 수 있습니다. 이러한 sequential labeling 알고리즘은 주어진 sequence 에 대한 적합성 (score, probability) 을 할 수 있으며 이를 evaluation 이라 합니다. 그리고 품사 판별이나 형태소 분석에서 evaluation 은 주어진 문장에 대한 단어, 품사열이 주어졌다고 가정할 때 이용할 수 있는 방법입니다. 이전 포스트에서는 HMM 기반 품사 판별기의 구조와 장단점, 그리고 evaluation 에 대하여 다뤘습니다. 이번 포스트에서는 문장이 주어졌을 때 단어, 품사열 후보를 만들고, 적합한 후보를 선정하는 과정까지 살펴봅니다.
n-gram extraction
문장이나 문서를 bag-of-words model 로 나타낼 때 일반적으로 unigram 이 이용됩니다. 그런데 문서 분류 문제에서는 unigram 보다 bigram 이 정보력이 더 좋습니다. Bigram 은 연속된 두 개의 단어를 하나의 단어로 이용하는 것입니다. 그리고 연속된 n 개의 단어를 하나의 단어로 이용하는 것을 n-gram 이라 합니다. 그러나 데이터에 등장하는 모든 n-grams 를 이용하면 bag-of-words model 의 차원이 기하급수적으로 커집니다. 이번 포스트에서는 유의미한 n-grams 을 추출하는 방법에 대하여 다뤄봅니다.
FastText, Word representation using subword
Word2Vec 과 같은 word embedding 은 distributed representation 을 이용하여 의미가 비슷한 단어를 비슷한 벡터값으로 표현합니다. 그러나 Word2Vec 역시 모르는 단어 (out of vocabulary) 에 대해서는 word representation vector 를 얻을 수 없습니다. 더하여, Word2Vec 은 infrequent words 에 대하여 학습이 불안한 특징도 있습니다. FastText 는 이를 보완하기 위하여 개발된 word representation 입니다. FastText 는 typo 와 같은 노이즈에 강하며, 새로운 단어에 대해서는 형태적 유사성을 고려한 word representation 을 얻습니다.
Spherical k-means for document clustering
k-means 는 빠르고 값싼 메모리 비용 때문에 대량의 문서 군집화에 적합한 방법입니다. scikit-learn 의 k-means 는 Euclidean distance 를 이용합니다. 그러나 고차원 벡터인 문서 군집화 과정에서는 문서 간 거리 척도의 정의가 매우 중요합니다. Bag-of-words model 처럼 sparse vector 로 표현되는 고차원 데이터에 대해서는 Euclidean distance 보다 Cosine distance 를 사용하는 것이 좋습니다. 그리고 Cosine distance 를 이용하는 k-means 를 Spherical k-means 라 합니다. 이번 포스트에서는 왜 문서 군집화에 Cosine distance 를 이용해야 하는지에 대하여 알아보고, Spherical k-means + fast initializer + clustering labeling 기능을 제공하는 패키지에 대해 알아봅니다.
Embedding for Word Visualization (LLE, ISOMAP, MDS, t-SNE)
머신 러닝의 많은 알고리즘들은 정보를 고차원 공간의 벡터 형태로 저장합니다. 이 공간은 수백 혹은 수십만 차원이 될 수 있기 때문에 공간을 그대로 이해하기 어렵습니다. 이러한 문제를 해결하기 위하여 고차원 공간을 2 차원으로 압축하여 시각화하는 임베딩 방법들이 이용될 수 있습니다. 이전 포스트에서 다뤘던 t-SNE 는 가장 많이 이용되는 벡터 시각화 임베딩 방법 중 하나입니다. t-SNE 이전에도 고차원 공간을 이해하기 위한 방법론들이 존재하였습니다. 이번 포스트에서는 이전에 대표적으로 이용되었던 Multi-Dimensional Scaling (MDS), Locally Linear Embedding (LLE), ISOMAP 에 대하여 알아봅니다. 더하여 위 세 알고리즘과 t-SNE 를 이용하여 term - document matrix 를 임베딩한 결과를 비교합니다.
t-Stochastic Neighbor Embedding (t-SNE) 와 perplexity
t-Stochastic Nearest Neighbor (t-SNE) 는 vector visualization 을 위하여 자주 이용되는 알고리즘입니다. t-SNE 는 고차원의 벡터로 표현되는 데이터 간의 neighbor structure 를 보존하는 2 차원의 embedding vector 를 학습함으로써, 고차원의 데이터를 2 차원의 지도로 표현합니다. t-SNE 는 벡터 시각화를 위한 다른 알고리즘들보다 안정적인 임베딩 학습 결과를 보여줍니다. 이는 t-SNE 가 데이터 간 거리를 stochastic probability 로 변환하여 임베딩에 이용하기 때문입니다. 그리고 이 stochastic probability 는 perplexiy 에 의하여 조절됩니다. 이번 포스트에서는 t-SNE 가 어떻게 안정적인 임베딩 학습 결과를 보일 수 있는지에 대한 원리를 살펴보고, perplexity 의 역할에 대해서도 알아봅니다.
pyLDAvis 를 이용한 k-means 학습 결과 시각화하기
k-means 는 문서 군집화에 이용될 수 있는 대표적인 군집화 알고리즘입니다. 빠른 학습 속도와 안정성 때문에 문서 군집화에 유용하지만, 군집화 학습 결과를 해석하기 위한 방법들은 거의 없습니다. 한 가지 방법으로 이전의 포스트에서 군집화 학습 결과를 이용하여 자동으로 군집 레이블링을 하는 방법을 소개하였습니다. 군집 레이블링은 한 군집에 대한 해석력을 제공합니다. 그렇기 때문에 이 방법 만으로는 군집 간의 유사성과 차이를 이해하기는 어렵습니다. pyLDAvis 는 토픽 모델링에 이용되는 LDA 모델의 학습 결과를 시각화하는 Python 라이브러리입니다. 이전의 pyLDAvis 포스트에서 LDA 는 일종의 단어 수준의 군집화라는 이야기를 하였습니다. LDA 와 k-means 는 비슷한 점이 많기 때문에 pyLDAvis 를 이용하면 k-means 의 학습 결과를 손쉽게 시각화 할 수 있습니다.
pyLDAvis 를 이용한 Latent Dirichlet Allocation 시각화하기
LDAvis 는 토픽 모델링에 자주 이용되는 Latent Dirichlet Allocation (LDA) 모델의 학습 결과를 시각적으로 표현하는 라이브러리입니다. LDA 는 문서 집합으로부터 토픽 벡터를 학습합니다. 토픽 벡터는 단어로 구성된 확률 벡터, 입니다. 토픽 로부터 단어 가 발생할 확률을 학습합니다. 토픽 벡터는 bag-of-words model 처럼 고차원 벡터이기 때문에 여러 토픽 간의 관계를 파악하기가 어렵습니다. 또한 각 토픽의 키워드를 인식하기 어렵습니다. LDAvis 는 차원 축소 방법인 Principal Component Analysis (PCA) 와 키워드 추출 방법을 이용하여 토픽 간의 관계와 토픽 키워드를 손쉽게 이해할 수 있도록 도와줍니다. 이번 포스트에서는 Python 라이브러리인 gensim 을 이용하여 LDA 모델을 학습하고, LDAvis 의 Python wrapper 인 pyLDAvis 를 이용하여 시각화를 하는 과정을 살펴봅니다.