이 글은 자연어 처리를 공부하며 정리한 연습노트입니다. 틀린 내용을 발견하시면 알려주세요!

아래 내용은 주로 <한국어 임베딩>, 텐서플로우 공식 홈페이지에서 가져왔다는 것을 밝혀둡니다. 




임베딩(embedding)

자연어 처리(Natural Language Processing)를 하기 위해서는 비정형 데이터인 텍스트를 컴퓨터가 인식할 수 있는 정형 데이터로 바꿔줘야 한다. 이를 위해 인코딩(encoding)이라고 한다.



Quora


인코딩은 텍스트를 컴퓨터가 이해할 수 있는 정수의 나열, 즉 벡터로 바꾸는 것을 뜻한다. 기계학습 모델은 입력값(input)을 벡터로 받기 때문에 기계학습 알고리즘을 사용해 자연어 처리 태스크를 하고 싶다면 당연히 인코딩부터 시작해야 한다.

한 줄 정리 : 
임베딩이란?  텍스트를 토큰화하고, 각 토큰을 연속 벡터 공간(Continuous vector space)에 투영하는 것

자연어 처리에서 원하는 것은 텍스트를 마냥 숫자로 바꾸는 게 아니다. 텍스트가 담고 있는 정보, 즉 그 의미가 잘 담기도록 벡터화 하는 것이다. 보다 직관적으로 이야기하자면 텍스트를 공간 상의 한 점인 벡터로 표현했을 때 의미가 유사한 단어들이 가까이 있고 유사하지 않은 단어들은 멀리 있게끔 벡터화 해야 한다. 

인코딩부터 차근차근 살펴보자. 



원-핫 인코딩


가장 간단한 워드 임베딩 방법은 one-hot encoding이다. 너무 간단해서 현업에서는 잘 사용되지 않지만, 개념 이해에 도움이 된다. 

예를 들어, The cat sat on the mat 라는 문장을 원-핫 인코딩 하면 다음과 같이 된다. 

출처 : 텐서플로우 홈페이지


문장을 쪼개 ( = 토크나이제이션) 단어장을 만들고, 중복되지 않는 인덱스로 바꿔 단어의 인덱스 위치에 있는 값은 1, 나머지는 0으로 구성하는 방법이다. 

원-핫 인코딩으로 벡터화 하면 0이 많은, spartse vector가 만들어져 벡터에 들어 있는 정보값이 적을 뿐더러(벡터의 밀도가 낮음) 매우 비효율적이다. 

또 다른 단점은 모든 토큰 간의 거리가 같다는 것이다. 우리가 원하는 것은 의미가 유사하면 공간 상에서 가까이에 위치하도록 벡터화 하는 것인데, 원-핫 인코딩으로는 이같은 단어간 관계를 표현할 수 없다. 

정수 인코딩 (Encode each word with a unique number)


원-핫 인코딩의 한계를 극복하는 또 다른 인코딩 방법이 각 단어에 고유 번호를 부여해 인코딩 하는 방법이다. 원-핫 인코딩 방법보다 밀도가 높은 벡터를 만들 수 있지만, 두 가지 단점이 있다.

  • 정수 인코딩이 단어 사이의 관계를 캡처하지 못함. 
  • 기계학습 모델이 해석하기 어려움

원-핫 인코딩과 정수 인코딩은 텍스트를 벡터로 바꿔주기는 하지만, 그 의미를 벡터 공간 상에 효과적으로 나타내주지 못하기 때문에 인코딩에서 한 단계 나아간 임베딩(embedding)이 필요하다. 

워드 임베딩 (word embedding)


즉 유사한 단어는 유사한 인코딩을 갖도록 하는 것은 통틀어 '워드 임베딩(word embedding, table look up)'이라고 한다. 

읽어볼 글 : 정민수님의 미디엄 - 자연어처리(NLP) 13일차 (Word2Vec)

자연어 처리 분야에서 임베딩이라는 개념이 본격적으로 사용되기 시작한 것은 요슈야 벤지오(Yoshua Bengio) 연구 팀이 2003년 A Neural Probabilistic Language Model 페이퍼를 발표하고 나서부터이다. 


이렇게 벡터화 하면  단어/문장 간 관련도 계산, 의미적/문법적 정보 함축, 전이 학습(임베딩을 다른 딥러닝 모델의 입력값으로 쓰는 기법) 등을 할 수 있다. 또 벡터는 공간 상의 한 점으로 표현 가능하기 때문에, 벡터화한 말뭉치를 그래프 위에 표현할 수 있고 사칙연산도 가능하다. 임베딩 품질이 좋아야 자연어 처리를 제대로 할 수 있기 때문에 임베딩은 매우 중요하다.





워드 임베딩은 유사한 단어가 유사한 인코딩을 갖는 효율적이고 밀도 높은 벡터로 표현하는 방법을 제공한다. 

임베딩 기법 중 대표적인 기법이 구글이 만든 Word2Vec이다. 구글 연구 팀은 2013년 Efficient Estimation of Word Representation in Vector Space를 통해 Word2Vec을 처음 제안했는데 자연어 처리 공부를 하다보면 반드시 나오는 기법으로, 단어 수준 임베딩 모델이다(2017년 이전까지 대부분 임베딩 기법들이 거의 단어 수준 모델이었다). Word2Vec이 개선된 버전으로는 FastText가 있다.



2018년부터는 문장 수준 임베딩 기법들이 주목받기 시작했는데, 그 전환점은 2018년 초 발표된 ELMo(Embeddings from Language Models, 논문)이다. ELMo는 2018년 제안된 새로운 워드 임베딩 방법론으로, 사전에 훈련된 언어 모델을 사용한다는 점이 특징이다. BERT(Bidirectional Encoder Representations from Transformer), GPT(Generative Pre-Training) 등이 문장 수준 임베딩 기법에 속한다.

또 ELMo 모델이 제안된 이후 엔드투엔드 모델(예, seq2seq)을 주로 사용하던 것이 프리트레인(pretrain)과 파인 튜닝(fine tuning) 방식으로 발전하고 있다.





임베딩 기법이 나온 지 얼마 안 된 초기, 대부분 말뭉치 통계량을 직접 활용했다. 가령, 잠재 의미 분석(Latent Semantic Analysis) 기법이 그렇다. 잠재적 의미 분석이란 단어 사용 빈도 등 말뭉치의 통계량 정보가 들어 있는 커다란 행렬에 특이값 분해(Singular Value Decomposition) 등 수학적 기법을 적용해 행렬에 속한 벡터들의 차원을 축소하는 방법이다.

임베딩을 만들 때 사용되는 통계 정보는 크게 세 가지다.

(1) corpus에 어떤 단어가 많이 쓰이는가
(2) 단어가 어떤 순서로 등장하는가
(3) corpus에 어떤 단어가 같이 나타났는가

출처 : <한국어 임베딩>


통계량 사용 시기를 지나 2003년 Neural Probabilistic Language Model이 발표된 이후부터 뉴럴 네트워크 기반 임베딩 기법들이 주목받고 있다. 또 2000년대 중반 이후로는 자연어 처리 분야에서도 딥러닝 모델이 주목받고 있다.