Books/한국어 임베딩

[Books] 한국어 임베딩 시작하기

언킴 2022. 3. 5. 20:22
반응형

이기창님께서 작성하신 한국어 임베딩을 정리 및 요약했습니다.

 

 

한국어 임베딩은 한국어 자연어 처리를 하는 것에 있어 바이블과 같은 책이라고 말할 수 있다. 본 책의 내용을 간략하게 설명하고 본인의 스타일대로 추가 작성할 것이다. 일단 시작하기에 앞서 환경 설정 부터 진행할 것인데, 본인은 도커 환경에 컨테이너를 설치한 후 로컬 호스트에 연결시켜서 사용할 것이다. 

 

$ docker pull ratsgo/embedding-cpu

docker run -it --rm --name ko_embedding \
-p 8888:8888 -v C:\[local directory]\:/notebook/embedding \
ratsgo/embedding-cpu:latest

로컬 호스트의 포트와 컨테이너의 포트를 연결시켜 준 후 주소창에 localhost:8888 로 접근하면 로컬 컴퓨터 디렉터리에 볼륨시켜 주피터 환경에서 접근이 가능하다. 업로드된 코드를 가지고 오고 싶을 땐 git clone을 통해 가지고 올 수 있다. 윈도우 환경의 경우 CLI 에서 git clone 명령어가 실해되지 않기 때문에 깃$^{\mathsf{Git}}$을 가져오고 싶을 땐 git bash를 설치해서 다음과 같은 코드를 입력하면 된다. 

 

git clone https://github.com/ratsgo/embedding.git

이로써 환경 구축은 끝났다. 본 글에서는 한국어 임베딩의 전체적인 내용을 기록하는 것이 아니라, 지극히 개인적인 기준으로 필요하다고 생각하는 부분을 정리하는 것이므로, 전체 내용을 공부하고 싶다면 교재를 구입해 읽어보는 것을 추천한다. 한국어 자연어 처리를 공부하는 사람이라면 정독을 하는 것을 추천한다. 

 

 

임베딩이란?

자연어 처리에서 임베딩(embedding)은 사람이 쓰는 자연어를 기계가 이해할 수 있는 숫자의 나열인 벡터(vector)로 변화한 결과 혹은 그 일련의 과정 전체를 의미한다. 우리가 생각할 수 있는 가장 간단한 임베딩은 TF-IDF와 같은 단어의 빈도를 그대로 사용하는 것이다. 아래와 같은 빈도표를 Term-Document Matrix라고 부른다. 행$^{\mathsf{row}}$은 단어, 열$^{\mathsf{column}}$은 문서에 대응한다. 문서는 하나의 문장이 될수도 있고, 영화의 리뷰가 될수도 있다(본인이 사용하는 데이터의 도메인에 따라 다르다).

 

임베딩은 다음과 같은 역할을 수행할 수 있다. 

  • 단어/문장 간 관련도 계산
  • 의미적/문법적 정보 함축
  • 전이 학습

 

단어/문장 간 관련도 계산

앞선 Term-Document Matrix는 가장 간단한 형태의 임베딩이다. 실제 현업에서는 보다 복잡한 형태의 임베딩을 사용한다. 각 단어들을 임의의 차원으로 할당하게 되면 단어 간 유사도$^\mathsf{similarity}$를 계산할 수 있게 된다. 벡터 간 유사도를 계산하는 방법 중 가장 간단한 방법은 코사인 유사도(Cosine similariry)다. 

 

임베딩을 수행한 후 벡터 공간을 시각화할 수 있는데, t-SNE라는 차원 축소 기법으로 시각화할 수 있는데, t-SNE는 매니폴드 학습의 하나로, 높튼 차원의 데이터를 축소시켜 시각화하는 기법 중 하나이며, 비선형 구조를 가진 데이터의 경우 다른 차원 축소 기법들 보다 시각화할 때 성능이 더 좋다.  PCA가 Linear한 mapping이라면 t-SNE는 non-linear한 mapping이다.

 

의미/문법 정보 함축

임베딩은 벡터이기 때문에 사칙연산이 가능하다. 단어 간 덧셈/뺄셈을 통해 단어들 사이의 관계를 확인할 수 있다. 임베딩은 아래와 같은 연산이 가능하다. 

 

  • 아들 - 딸 + 소녀 = 소년
  • king - man + woman = queen

 

아주 흥미로운 내용이다. 추후 자연어처리가 아닌 컴퓨터비전 분야에서도 이와 비슷한 맥락을 사용한다. GAN을 통해 썬글라스를 착용한 남자 이미지에서 남자를 빼고, 여자 이미지를 더해주면 썬글라쓰를 낀 여자 이미지가 출력된다. 

 

전이학습

전이 학습(transfer learning)은 기존에 많은 코퍼스$^{\mathsf{corpus}}$로 모델을 학습시킨 후 모델을 불러와 태스크에 적용 시키는 것이다. 본 책에서는 사람을 예시로 들었는데, 사람은 무언가를 배울때 완전히 0부터 시작하진 않는다. 사람마다 배경지식이 존재하기 때문에, 배경지식이 많은 사람의 경우 새로운 일을 배울 때 남들보다 빠른 학습 능력을 가지는 것과 비슷한 맥락이라고 한다. 

 

 

임베딩의 역사와 종류

임베딩의 대표적인 기법은 잠재 의미 분석(Latent Semantic Analysis)이다. 잠재 분석은 SVD 와 같은 분해 기법을 통해 차원을 축소하는 방법을 의미한다. SVD에 대한 내용은 여기를 참고하면 된다. 앞에서 다룬 Term-Document Matrix의 경우 문서가 많으면 많을수록 나오는 어휘 수는 많아지기 때문에 매우 Sparse한 행렬을 가지게 된다. 이러한 행렬을 우리는 희소 행렬(Spase matrix)라고 부른다. 

 

이러한 희소 행렬을 사용하면 0 값이 매우 많이 존재하기 때문에 불필요한 연산량이 많아져 메모리가 많이 소모되고, 시간도 역시 많이 소모된다. 이러한 문제를 확장성 문제(Scalability problem)라고 부른다. 그렇기에 우리는 희소 행렬 $S \in \mathbb{R}^{m \times n}$을 $W \in \mathbb{R}^{m \times d}$와 $D \in \mathbb{R}^{n \times d}$로 분해한다. ( $m, n \ge d$ ) 그렇게 되면 고차원의 정보를 저차원으로 보냄으로써 표현이 가능해진다. 여기서 $W$는 단어 수준 임베딩을 의미하고, $D$는 문서 수준 임베딩을 의미한다. 

 

최근에는 뉴럴 네트워크(Neural Network) 기반의 임베딩 기법이 주목받고 있다. [reference] 뉴럴 네트워크 기반 모델들은 이전 단어들이 주어졌을 때 문장 내 단어들을 마스킹(masking)하고 해당 단어를 맞추는 형태로 학습을 진행한다. 2017년 이전 임베딩 기법들은 NPLM, Word2Vec, GloVe, FastText, Swivel 등의 대개 단어 수준의 모델이었다. 단어 수준의 모델은 동음이의어(homonym)를 분간하기 어렵다는 점이 존재했다. 

 

동음이의어 등의 문제를 해결하기 위해 2018년도 부터 문장 수준의 모델이 등장했는데, 가장 처음으로 등장한 모델이 바로 ELMo(Embedding from Language Models)이다. 그 후 지금까지도 유명한 Transformer 기반 모델인 BERT(Bidirectional Encoder Representations from Transformer)GPT(Generative Pre-Training) 등이 존재한다. (지금은 BART, electra 등 여러 모델이 더 등장했다)

 

1990년대 이전까지의 대부분의 자연어 처리에서는 feature를 직접 뽑아서 분석을 수행했다. 언어학적 지식을 활용하여 rule-based로 feature를 추출해냈다. 한국어에서는 명사 앞에 관형사가 올 수 있고 조사가 명사 뒤에 오는 경향이 있으므로 이러한 rule을 모델에 학습시키는 것이다. 

 

2000년대 중반 이후 자연어 처리에서도 딥러닝 모델을 사용하기 시작했다. 딥러닝은 사람이 직접적으로 rule을 지정해주지 않더라도 모델이 알아서 잘 학습하기 때문이다. 사람의 개입 없이 모델 스스로 처음부터 끝까지 이해하도록 유도하는 기법을 End-to-End model 이라고 부른다. (Sequence-to-Sequence, etc..)

 

2018년 ELMo 모델이 나온 후 pre-train, fine tuning 등의 방식으로 발전되고 있다. 일단 먼저 대규모 말뭉치(corpus)를 통해 모델을 학습 시킨 후 우리가 가지고 있는 데이터를 파인튜닝 및 전이 학습하는 방식이다. ELMo, BERT, GPT 모두 그러한 방식으로 모델을 학습한다. 

 

임베딩 기법은 크게 행렬 분해(Matrix Factorization), 예측 기반(Predict-.based), 토픽 기반(Topic-based)의 방법으로 분류할 수 있다. 행렬 분해는 GloVe, Swivel, SVD과 같이 행렬을 분해해 둘 중 하나의 행렬만 사용하거나 더하거나 이어붙여 임베딩으로 사용한다. 예측 기반 방법은 문장 내 단어를 지우고 모델을 학습한 후 예측하는 기법으로 BERT, GPT, Word2Vec 등이 있다. 토픽 기반 방법은 문서 내에 잠재된 주제를 추론하는 방식이다. LDA(Latent Dirichlet Allocation)이 대표적인 기법이다 LDA 같은 모델은 학습 후 각 문서가 어떤 주제를 갖는지 확률 벡터로 반환한다.