자연어(natural language)는 우리가 일상 생활에서 사용하는 언어를 의미한다. 자연어 처리(natural language processing)은 이러한 자연어의 의미를 분석하여 컴퓨터가 처리할 수 있도록 하는 일을 말한다.
NLP는 다양한 활용 분야가 존재한다.
자연어 처리 분야에서 임베딩이란 사람이 쓰는 자연어를 기계가 이해할 수 있는 숫자의 나열인 vector로 바꾸는 결과 혹은 그 일련의 과정 전체를 의미하며, 이 벡터 공간에 자연어의 의미와 정보를 손실없이 잘 담아내는 것이 중요하다.
임베딩을 통해 단어를 일정한 벡터 공간 내에 위치시킬 수 있기에 단어간의 유사도를 측정할 수 있다. 주로 코사인 유사도(방향이 완전히 같을 때 1이며 1에 가가울수록 유사하다고 판단)를 사용한다.
단어간 벡터 사칙연산을 통해 단어들 사이의 의미적, 문법적 관계를 도출할 수 있다.
임베딩은 다른 딥러닝 모델의 입력값으로 자주 사용한다.
단어의 빈도를 그대로 벡터로 사용한다.
구분 | 문서A | 문서B | 문서C |
---|---|---|---|
단어a | 0 | 4 | 5 |
단어b | 1 | 2 | 3 |
단어c | 3 | 0 | 0 |
문서 A,B,C에서 단어 a,b,c가 나타나는 빈도를 벡터로 나타내면, B의 임베딩은 [4,2,0]이다. 문서 B와 C의 단어 빈도가 유사하기에 비슷한 내용의 문서라고 유추할 수 있다.
한국어의 경우 DTM에서 빈도수를 가지고 벡터를 만들 때, '을/를','이/가'와 같은 조사가 가장 많이 나올 것이다. 그러나 이러한 조사는 문서의 특징, 주제를 나타내지 않는다. 이를 보완하기 위해 등장한 것이 TF-IDF이다. 단어의 빈도와 역 문서 빈도(문서의 빈도에 특정 식을 취함)를 사용하여 DTM 내의 각 단어들마다 중요한 정도를 가중치로 주는 방법이다. TF-IDF는 주로 문서의 유사도, 검색 시스템에서 검색 결과의 중요도, 문서 내에서 특정 단어의 중요도를 구할 때 많이 사용된다.
신경망 모델을 사용하여 대규모 corpus에서 단어 연관성을 학습하는 모델이다.
학습 방식
The fat cat sat on the mat
에서 sat
이 중심 단어(center word)이고 나머지가 주변 단어(context word)라면 주변 단어들을 이용하여 sat
을 예측하는 것이다. 이때, 중심 단어를 예측하기 위해서 앞, 뒤로 몇개의 단어를 참고할지에 대한 범위를 윈도우(window)라고 한다. RNN은 은닉층의 노드에서 활성화 함수를 통해 나온 결과값을 출력층 방향으로 보내면서 다시 은닉층 노드의 다음 계산의 입력으로 보낸다. 현재 시점 t에서의 메모리 셀이 갖고 있는 값은 과거의 메모리 셀들의 값에 영향을 받은 것이다. 문맥의 의미론적인 것을 담을 수 있다. RNN 셀의 각 시점의 입, 출력의 단위는 보편적으로 '단어 벡터'이다.
사용에 따라,
RNN은 문제가 하나 있었는데, 이는 장기 의존성 문제(the problem of Long-Term Dependencies) 라고 한다. 바닐라 RNN이 시점이 길어질수록 앞의 정보가 뒤로 충분히 전달되지 못한다. 정보량이 손실되고 앞의 정보는 영향력이 없어진다.
그래서 RNN의 은닉층에 cell-state를 추가하였다. 은닉층의 메모리 셀에 입력, 망각, 출력 게이트를 추가하여 불필요한 기억을 지우고 기억해야할 것들을 저장하였다.
입력된 시퀀스로부터 다른 도메인의 시퀀스를 출력하는 다양한 분야에서 사용되는 모델이며 챗봇과 기계번역에서 많이 사용된다. 크게 인코더와 디코더의 두 개의 모듈로 구성된다. 인코더는 입력 문장의 모든 단어들을 순차적으로 입력받은 뒤에 마지막에 이 모든 단어 정보를 압축래서 컨테스트 벡터(context vector) 라는 하나의 벡터를 만든다. 이는 인코더에서의 마지막 RNN셀의 은닉 상태값을 말하며 입력 문장의 모든 단어 토큰들의 정보를 요약하여 담고 있다. 입력 문장의 정보가 하나의 컨텍스트 벡터로 모두 압축되면 인코더는 컨텍스트 벡터를 디코더로 전송하여서 디코더는 컨텍스트 벡터를 받아서 번역된 단어를 한 개씩 순차적으로 출력한다.
seq2seq가 RNN에 기반하였기에 두가지 문제가 있었다. 하나의 고정된 크기의 벡터에 모든 정보를 압축하는 과정에서 정보 손실 발생하고 RNN의 고질적인 문제인 기울기 소실(vanishing gradient) 문제이다.
이를 해결하기 위해,디코더에서 출력 단어를 예측하는 매 시점마다, 인코더에서의 전체 입력 문장을 다시 한 번 참고한다.단, 전체 입력 문장을 전부 다 동일한 비율로 참고하는 것이 아니라, 해당 시점에서 예측해야할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중(attention)해서 보는 원리이다.
2017년 구글이 발표한 논문인 "Attention is all you need"에서 나온 모델로 기존의 seq2seq의 구조인 인코더-디코더를 따르면서도, 논문의 이름처럼 어텐션(Attention)만으로 구현한 모델이다. 어텐션을 RNN의 보정을 위한 용도가 아닌 RNN을 제거 후 Attention 메커니즘만 활용해서 인코더, 디코더 아키텍처 사용하였다.
셀프 어텐션(self-attention: 문장의 단어를 자신이 가지고 있는 문장의 모든 단어와 비교하고 각 단어의 문맥적 관련성을 가지도록 재조정하는 방식)을 통해 key에 대한 value 즉, 얼마나 관련성이 높은 단어인지 연산하며 이를 병렬적으로 수행하여 기존 RNN과 어텐션의 비효율성 개선 및 정확도 향상한다.
이를 기반으로 BERT와 GPT가 나왔다.
BERT는 Transformer의 인코더를 12번 쌓은 구조이며, 각 layer마다 multi-head self-attention과 position-wise feed forward network를 거치며 문맥의 의미 반영한다. Transformer의 인코더만 사용해서 언어를 임베딩한다고 보면 된다. Pre-trained BERT에 위에 classification layer를 하나 추가해주면 다양한 NLP를 처리 (fine-tuning)할 수 있다. 기본적인 구성은 영어 데이터로 구성이 되어 있다. wiki나 book data와 같은 대용량 unlabeled data로 모델을 미리 학습 시킨 후에, 특정 task를 가지고 있는 labeled data로 transfer learning을 하는 모델이다.
학습과정
이전 단어들이 주어졌을 때, 현재 알고 있는 단어들을 기반으로 다음단어 예측하는 모델이다. 언어 모델은 특별한 labeling이 필요 없기 때문에 시용한다. 사람이 직접 labeling을 할 경우 비싸고, 시간도 오래걸리고, 정확도도 떨어진다. 이러한 labeling이 필요없는 언어모델에, 엄청나게 많은 양의 텍스트를 학습시키면, labeling에 소요되는 시간과 비용을 절약할 뿐만 아니라, 우리가 모르는 자연어의 내재적인 특징마저 학습하여 엄청나게 뛰어난 자연어처리 모델을 만들수 있다.
위키피디아, 책 등의 대용량 코퍼스로 미리 학습 시킨 Pretrained Model이다. 대용량 코퍼스에 대해 사전학습을 진행한 Language Model은 넓은 범위의 언어적 정보를 갖게 되며, 이러한 정보가 자연어 처리의 다양한 task를 해결할 때, 전이되게 사용할 수 있다.
Transformer 아키텍처를 기반으로 한다.
BERT – Transformer의 인코더 아키텍처 활용
GPT – Transformer의 디코더 아키텍처 활용
GPT 는 다음 단어를 예측하는 언어모델이기 때문에 Masked self-attention을 적용한 Transfomer Decoder를 사용한다.
강의
http://web.stanford.edu/class/cs224n/
블로그
Ratsgo’s blog
https://ratsgo.github.io/natural%20language%20processing/2019/09/12/embedding/
딥러닝을 이용한 자연어 처리 입문
https://wikidocs.net/book/2155
책
한국어 임베딩
http://www.yes24.com/Product/Goods/78569687
와이빅타에서 열심히 교육해주신 홍0우님