Study

한국어 임베딩 - 1.서론

빨간당무 2019. 12. 14. 16:48

이 글은 이기창 님의 저서인 한국어 임베딩 내용을 라마인드 하기 위해 정리한 문서입니다. 

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


1. 서론 (p.27~)

1.1 임베딩이란 (p.28~)


1.2 임베딩(embedding)의 역할 (p.30~)

- 단어/문자 강 관련도 계산

- 의미적/문법적 정보 함축

- 전이 학습

 

임베딩 - 단어/문자 강 관련도 계산

단어 벡터들 사이의 유사도를 계산 가능

Word2Vec, FastText, NPLM, GloVe, Swivel

t-SNE라는 차원 축소 기법으로 N(N>2)차원 이상의 단어 벡터들을 2차원으로 줄여 시각화 가능

 

임베딩 - 의미적/문법적 정보 함축

단어 벡터 간 덧셈/뺄셈을 통해 단어들 사이의 의미적, 문법적 관계를 도출 가능 (단어 유추 평가)

ex) 아들 - 딸 + 소년 = 소녀

 

임베딩 - 전이 학습

다른 딥러닝 모델의 입력값으로 사용하는 기법


1.3 임베딩 기법의 역사와 종류 (p.36~)

1.3.1 통계 기반에서 뉴럴 네트워크 기반으로 (p.36~)

통계기반

잠재 의미 분석(Latent Semantic Analysis) - 단어 사용 빈도 등 말뭉치의 통계량 정보가 들어 있는 커다란 행렬(Matrix)에 특이값 분해(Singular Value Decomposition) 등 수학적 기법을 적용해 행렬에 속한 벡터들의 차원을 축소하는 방법

위 방법의 단점은 어휘수는 10~20만 내외에 달하는데 반해, 문서 하나의 모든 어휘가 쓰이는 경우가 드물기 때문에 대부분의 요소 값이 0인 행렬인 희소 행렬(Sparse Matrix)가 되어 버림

잠매 의미 분석 수행 대상 행렬은 여러 종류가 될 수 있음

단어-문서 행렬(Word-Document Matrix), TF-IDF 행렬(Term Frequency-Inverse Document Frequency), 단어-문맥 행렬(Word-Context Matrix), 점별 상호 정보량 행렬(Pointwise Mutual Information Matrix) 등

 

뉴럴 네트워크 기반

Neural Probabilistic Language Model 이후

뉴럴 네트워크 기반 모델은 

1. 이전 단어가 주어졌을 때 다음 단어가 뭐가 될지 예측 하거나

2. 문장 내 일부분에 구멍을 뚫어 놓고(Masking) 해당 단어가 무엇일지 맞추는 과정에서 학습됨


1.3.2 단어 수준에서 문장 수준으로 (p.38~)

단어 수준 임베딩 기법의 단점은 동음이의어(Homonym)를 분간하기 어려움 - 단어의 형태가 같다면 동일한 단어로 보고, 모든 문맥 정보를 해당 단어 벡터에 투영하기 때문임

ELMo(Embeddings from Language Models), BERT(Bidirectional Encoder Representtions from Transformer), GPT(Generative Pre-Training) 등

문장 수준 임베딩 기법은 개별 단어가 아닌 단어 시퀀스(Sequence) 전체의 문맥적 의미를 함축하기 때문에 단어 임베딩 기법 보다 전이 학습 효과가 좋은 것으로 알려짐

예를 들어 한국어에서 배는 배(pear), 배(belly), 배(ship) 등 다양한 의미를 지닌 동음이의어인데 단어 임베딩을 썼다면 이 모든 의미가 뭉뚱 그려져 하나로 표현됨 문장 수준 임베딩 기법을 사용하면 이들을 분리해 이해 가능 (p.39 그림 1-8)


1.3.3 룰 → 엔드투엔드 → 프리트레인/파인 튜닝 (p.40~)

한국어 문장을 구문 분석(pparsing)하는 모델을 만들 때 언어학적인 지식을 활용하여 피처(Feature)를 사람이 직접 뽑고 규칙(Rule)을 정의하였음

엔드투엔드 모델(end-to-end model)은 데이터를 통째로 모델에 넣고 입출력 사이의 관계를 사람의 개입 없이 모델 스스로 처음부터 끝까지 이해하도록 유도하는 기법. 기계 번역에 쓰인 시퀀스투시퀀스(Sequence-to-Sequence) 모델이 대표 사례임

이후 프리트레인(Pretrain)과 파인 튜닝(Fine Tuning) 방식으로 발전함

대규모 말뭉치로 임베딩을 만듦 (프리트레임) : 말뭉치의 의미적, 문법적 맥락이 포함됨

이후 임베딩을 입력으로 하는 새로운 딥러닝 모델을 만들고 우리가 풀고 싶은 구체적 문제에 맞는 소규모 데이터에 맞게 임베딩을 포함한 모델 전체를 업데이트함 (파인 튜닝, 전이 학습) : ELMo, GPT, BERT 등 기법들

 

다운스트림 태스크(Doenstream Task) : 우리가 풀고 싶은 자연어 처리의 구체적 문제들

- 품사 판별(Part-Of-Speech Tagging)

- 개체명 인식(Named Entity Recognition)

- 의미역 분석(Semantic Role Labeling)

 

업스트림 태스크(Upstrame Task) : 다운스트림 태스크에 앞서 해결해야 할 과제 (단어/문장 임베딩을 프리트레인하는 작업)

다운스트림 태스크의 예시

- 품사 판별 : 나는 네가 지난 여름에 한 [일]을 알고 있다. → 일: 명사(Noun)

- 문장 성분 분석 : 나는 [네가 지난 여름에 한 일]을 알고 있다. → 네가 지난 여름에 한 일 : 명사구(Noun Phrase)

- 의존 관계 분석 : [자연어 처리는] 늘 그렇듯이 [재미있다]. → 자언어 처리는, 재미있다 : 주격명사구(Nsub)

- 의미역 분석 : 나는 [네가 지난 여름에 한 일]을 알고 있다. → 네가 지난 여름에 한 일 : 피행위주역(Patient)

- 상호 참조 해결 : 나는 어제 [성빈이]를 만났다. [그]는 스웨터를 입고 있었다. → 그=성빈이


1.3.4 임베딩의 종류와 성능 (p.41~)

행렬 분해 기반 방법

행렬 분해(Factorization) 기반 방법은 말뭉치 정보가 들어 있는 원래 행렬을 두 개 이상의 작은 행렬로 쪼개는 방식의 임베딩 기법

분해한 이후엔 둘 중 하나의 행렬만 쓰거나 둘을 더하거나(sum) 이어 붙여(concatenate) 임베딩으로 사용 : GloVe, Swivel 등

 

예측 기반 방법

- 어떤 단어 주변에 특정 단어가 나타날지 예측하거나,

- 이 전 단어들이 주어 졌을 때 다음 단어가 무엇일지 예측하거나

- 문자 내 일부 단어를 지우고 해당 단어가 무엇일지 맞추는 과정에서 학습하는 방법

Word2Vec, FastText, BERT, ELMo, GPT 등

 

토픽 기반 방법

주어진 문서에 잠재된 주제(Latent Topic)를 추론(Inference)하는 방식으로 임베딩을 수행하는 기법

잠재 디리클레 할당(Latent Dirichlet Allocation) : 이 모델은 학습이 완료되면 각 문서가 어떤 주제 분포(Topic Distribution)를 갖는지 확률 벡터 형태로 반환

 

임베딩 성능 평가

BERT-large > BERT-base > GPT > ELMo > GloVe 순 (p.43 그림 1-10 임베딩 종류별 성능)


1.4 개발 환경

1.4.1 환경 소개

Ubuntu 16.04.5, Python 3.5.2, Tensorflow 1.12.0


1.4.5 이 책이 도움받고 있는 오픈소스들 (p.52~)

TensorFlow : https://www.tensorflow.org

Gensim : https://radimrehurek.com/gensim

FastText : https://fasttext.cc

GloVe : https://nlp.stanford.edu/projects/glove

Swivel : https://github.com/tensorflow/models/tree/master/research/swivel

ELMo : https://allennlp.org/elmo

BERT : https://github.com/google-research/bert

Scikit-Learn : https://scikit-learn.org

KoNLPy : http://konlpy.org/en/latest/

Mecab : http://eunjeon.blogspot.com/

soynlp : https://github.com/lovit/soynlp

Khaiii : https://github.com/kakao/khaiii  https://tech.kakao.com/2018/12/13/khaiii/

Bokeh : https://docs.bokeh.org/

sentencepiece : https://github.com/google/sentencepiece


1.5 이 책이 다루는 데이터와 주요 용어 (p.53~)

텍스트(text)

말뭉치(corpus) : 텍스트 데이터

표본(Sample) : 특정한 목적을 가지고 수집한 말뭉치

컬렉션(collection) : 말뭉치에 속한 각각의 집합

문장(sentence) : 이 책에서 다루는 데이터의 기본 단위, 마침표나 느낌표, 물음표와 같은 기호로 구분된 문자열

문서(document), 단락(paragraph)의 집합 : 생각이나, 감정, 정보를 공유하는 문장의 집합, 줄바꿈(\n) 문자로 구분된 문자열

토큰(token), 단어(word), 형태소(morpheme), 서브워드(subword) : 이 책에서 다루는 가장 작은 단위

토크나이즈(tokenize) : 문장을 토큰 시쿼스로 분석하는 과정, 토큰 시퀀스는 문장을 토큰으로 나누는 것, 토큰 구분자는 쉼표를 주로 사용

어휘 집합(vocabulary) : 말뭉치에 있는 모든 문서를 문장으로 나누고 여기에 토크나이즈를 실시한 후 중복을 제거한 토큰들의 집합

미등록 단어(unknown word) : 어휘 집합에 없는 토큰


1.6 이장의 요약 (p.55~)

- 임베딩이란 자연어를 기계가 이해할 수 있는 숫자의 나열인 벡터로 바꾼 결과 혹은 그 일련의 과정 전체를 가리킴

- 임베딩을 사용하면 단어/문장 간 관련도를 계산할 수 있음

- 임베딩에는 믜미적/문법적 정보가 함축돼 있음

- 임베딩은 다른 딥러닝 모델의 입력값으로 쓰일 수 있음

- 임베딩 기법은 (1) 통계 기반에서 뉴럴 네트워크 기반으로 (2) 단어 수준에서 문장 수준으로 (3) 엔드투엔드에서 프리트레인/파인 튜닝 방식으로 발전해옴

- 임베딩 기법은 크게 행렬 분해 모델, 에측 기반 방법, 토픽 기반 기법 등으로 나눠짐

- 이 책이 다루는 데이터의 최소 단위는 토큰임. 문장은 토큰의 집합, 문서는 문장의 집합, 말뭉치는 문서의 집합을 가리킴. 말뭉치 > 문서 > 문장 > 토큰. 어휘 집합은 말뭉치에 있는 모든 문서를 문장으로 나누고 여기에 토크나이즈를 실시한 후 중복을 제거한 토큰들의 집합임