- 임베딩이란?(embedding)
사람이 사용하는 언어(자연어)를 컴퓨터가 이해할 수 있는 언어(숫자) 형태인 벡터(vector)로 변환한 결과 혹은 일련의 과정을 의미
• 단어 및 문장 간 관련성 계산
• 의미적 혹은 문법적 정보의 함축(예 왕-여왕, 교사-학생)
- 희소 표현 기반 임베딩(sparse representation)
희소 표현은 대부분의 값이 0으로 채워져 있는 경우로, 대표적으로 원-핫 인코딩이 있다.
● 결측치 확인(One-hot encoding)
원-핫 인코딩이란 주어진 텍스트를 숫자(벡터)로 변환해 주는 것이다.
다시 말해 단어 N개를 각각 N차원의 벡터로 표현하는 방식으로, 단어가 포함되어 있는 위치에 1을 넣고 나머지에는 0 값을 채운다.
예를 들어 딕셔너리에 [calm, fast, cat] 같은 값이 있다면 fast를 표현하는 벡터는 [0, 1, 0]이 된다.
하지만 원-핫 인코딩에는 치명적인 단점이 있다.
첫째, 수학적인 의미에서 원-핫 벡터들은 하나의 요소만 1 값을 갖고 나머지는 모두 0인 희소 벡터(sparse vector)를 갖는다.
이때 두 단어에 대한 벡터의 내적(inner product)을 구해 보면 0 값을 갖게 되므로 직교(orthogonal)를 이룬다.
즉, 단어끼리 관계성(유의어, 반의어) 없이 서로 독립적(independent)인 관계가 된다.
둘째, ‘차원의 저주(curse of dimensionality)’ 문제가 발생한다.
하나의 단어를 표현하는 데 말뭉치(corpus)에 있는 수만큼 차원이 존재하기 때문에 복잡해진다.
예를 들어 단어 10만 개를 포함한 데이터셋에 원-핫 인코딩 배열을 구성한다면 그 차원 개수는 10만 개가 되기 때문
- 횟수 기반 임베딩
횟수 기반은 단어가 출현한 빈도를 고려하여 임베딩하는 방법이다.
대표적으로 카운터 벡터와 TF-IDF가 있다.
● 카운터 벡터(Counter vector)
카운터 벡터는 문서 집합에서 단어를 토큰으로 생성하고 각 단어의 출현 빈도수를 이용하여 인코딩해서 벡터를 만드는 방법이다.
즉, 토크나이징과 벡터화가 동시에 가능한 방법입니다.
카운터 벡터는 사이킷런의 CountVectorizer()를 사용하여 코드로 구현할 수 있습니다.
CountVectorizer()는 다음 작업이 가능하다.
1. 문서를 토큰 리스트로 변환한다.
2. 각 문서에서 토큰의 출현 빈도를 센다.
3. 각 문서를 인코딩하고 벡터로 변환한다.
● TF-IDF(Term Frequency-Inverse Document Frequency)
TF-IDF는 정보 검색론(Information Retrieval, IR)에서 가중치를 구할 때 사용되는 알고리즘.
TF(Term Frequency, 단어 빈도) 는 문서 내에서 특정 단어가 출현한 빈도를 의미한다.
예를 들어 TF에 딥러닝과 신문기사라는 단어가 포함되어 있다고 가정하면, ‘신문기사’에서 ‘딥러닝’이라는 단어가 몇 번 등장했는지 의미한다.
즉, ‘신문기사’에서 ‘딥러닝’이라는 단어가 많이 등장한다면 이 기사는 딥러닝과 관련이 높다고 할 수 있으며, 다음 수식을 사용합니다.
이때 tft,d는 특정 문서 d에서 특정 단어 t의 등장 횟수를 의미한다.
IDF(Inverse Document Frequency)(역문서 빈도)를 이해하려면 DF(Document Frequency)(문서 빈도)에 대한 개념부터 이해해야 하는데,
DF는 한 단어가 전체 문서에서 얼마나 공통적으로 많이 등장하는지 나타내는 값이다.
즉, 특정 단어가 나타난 문서 개수라고 이해하면 된다..
dft = 특정 단어 t가 포함된 문서 개수
특정 단어 t가 모든 문서에 등장하는 일반적인 단어(예 a, the)라면, TF-IDF 가중치를 낮추어 줄 필요가 있다..
따라서 DF 값이 클수록 TF-IDF의 가중치 값을 낮추기 위해 DF 값에 역수를 취하는데, 이 값이 IDF이다.
역수를 취하면 전체 문서 개수가 많아질수록 IDF 값도 커지므로 IDF는 로그(log)를 취해야 한다.
이때 전체 문서에 특정 단어가 발생하는 빈도가 0이라면 분모가 0이 되는 상황이 발생한다.
이를 방지하고자 다음과 같이 분모에 1을 더해 주는 것을 스무딩(smoothing)이라고 한다.
TF-IDF는 다음 상황에서 사용한다.
• 키워드 검색을 기반으로 하는 검색 엔진
• 중요 키워드 분석
• 검색 엔진에서 검색 결과의 순위를 결정
- 예측 기반 임베딩
예측 기반 임베딩은 신경망 구조 혹은 모델을 이용하여 특정 문맥에서 어떤 단어가 나올지를 예측하면서 단어를 벡터로 만드는 방식이다.
● 워드투벡터 (Word2Vec)
워드투벡터는 신경망 알고리즘으로, 주어진 텍스트에서 텍스트의 각 단어마다 하나씩 일련의 벡터를 출력한다.
워드투벡터의 출력 벡터가 2차원 그래프에 표시될 때, 의미론적으로 유사한 단어의 벡터는 서로 가깝게 표현된다.
이때 ‘서로 가깝다’는 의미는 코사인 유사도를 이용하여 단어 간의 거리를 측정한 결과로 나타나는 관계성을 의미한다.
즉, 워드투벡터를 이용하면 특정 단어의 동의어를 찾을 수 있다.
워드투벡터가 수행되는 과정은 일정한 크기의 윈도우(window)로 분할된 텍스트를 신경망 입력으로 사용한다.
이때 모든 분할된 텍스트는 한 쌍의 대상 단어와 컨텍스트로 네트워크에 공급된다.
● CBOW(Cointiuous Bag Of Words)
CBOW는 단어를 여러 개 나열한 후 이와 관련된 단어를 추정하는 방식이다.
즉, 문장에서 등장하는 n개의 단어 열에서 다음에 등장할 단어를 예측한다.
예를 들어 “calm cat slept on the sofa”라는 문장이 있을 때, “calm cat on the sofa”라는 문맥이 주어지면 “slept”를 예측하는 것이 CBOW이다.
CBOW는 신경망 구조를 갖는다.
여기에서 각 문맥 단어를 은닉층으로 투사하는 가중치 행렬은 모든 단어에서 공통으로 사용된다.
CBOW 신경망에서 크기가 N인 은닉층을 가지고 있을 때, 은닉층 크기 N은 입력 텍스트를 임베딩한 벡터 크기이다.
다시 말해 다음 그림에서 은닉층 크기는 N=5이기 때문에 해당 CBOW를 수행한 후 벡터 크기는 5가 된다.
다음으로 입력층과 은닉층 사이의 가중치 W는 V×N 행렬이며, 은닉층에서 출력층 사이의 가중치 W′는 N×V 행렬입니다.
● Skip-gram
skip-gram 방식은 CBOW 방식과 반대로 특정한 단어에서 문맥이 될 수 있는 단어를 예측한다.
즉, skip-gram은 다음 그림과 같이 중심 단어에서 주변 단어를 예측하는 방식을 사용한다.
● 패스트텍스트(FastText)
패스트텍스트는 워드투벡터의 단점을 보완하고자 페이스북에서 개발한 임베딩 알고리즘이다.
기존 워드투벡터의 워드 임베딩 방식은 분산 표현(distributed representation)을 이용하여 단어의 분산 분포가 유사한 단어들에 비슷한 벡터 값을 할당하여 표현한다.
따라서 워드투벡터는 사전에 없는 단어에 대해서는 벡터 값을 얻을 수 없다.
또한, 워드투벡터는 자주 사용되지 않는 단어에 대해서는 학습이 불안정하다.
사전에 없는 단어에 벡터 값을 부여하는 방법
패스트텍스트는 주어진 문서의 각 단어를 n-그램(n-gram)으로 표현한다.
이때 n의 설정에 따라 단어의 분리 수준이 결정된다.
예를 들어 n을 3으로 설정(트라이그램(trigram))하면 ‘This is Deep Learning Book’은 This is Deep, is Deep Learning, Deep Learning Book으로 분리한 후 임베딩한다.
- 횟수 / 예측 기반 임베딩
앞서 살펴본 횟수 기반과 예측 기반의 단점을 보완하기 위한 임베딩 기법에는 대표적으로 글로브가 있다.
● 글로브(GloVe, Global Vectors for Word Representation)
글로브는 횟수 기반의 LSA(Latent Semantic Analysis, 잠재 의미 분석)와 예측 기반의 워드투벡터 단점을 보완하기 위한 모델이다.
글로브는 그 이름에서 유추할 수 있듯이 단어에 대한 글로벌 동시 발생 확률(global co-occurrence statistics) 정보를 포함하는 단어 임베딩 방법이다.
즉, 단어에 대한 통계 정보와 skip-gram을 합친 방식이라고 할 수 있다.
따라서 글로브를 사용하면 단어 간 관련성을 통계적 방법으로 표현해 준다.