NLP는 NLU(Natural Language Understanding)와 NLG(Natural Language Generation)로 구분할 수 있습니다. 문자 그대로 NLU는 자연어 형태의 문장을 이해하는 기술이고 NLG는 자연어 문장을 생성하는 기술입니다. 결국 NLU와 NLG 모두 인간과 기계가 의사 소통할 수 있도록 도와주는 기술입니다. 이번 포스팅에선 NLU의 전반적인 내용과 QA에 대해서 다뤄보겠습니다.
NLU?
NLU는 자연어 형태의 문장을 이해하는 기술입니다.
이때 언어를 이해한다는 것은 2가지 측면으로 나눠서 생각할 수 있습니다. 바로 문법과 의미입니다. 따라서 기계가 만약 문법과 의미를 잘 알고 있다면 언어를 이해하고 있다고 할 수 있습니다.
Syntatic : 언어를 이해한다면 주어진 문장이 문법적으로 옳은 문장인지 구분할 수 있을 것.
Semantic : 언어를 이해한다면 주어진 문장이 가지고 있는 의미를 이해할 수 있을 것.
NLU의 성능 평가는 주로 GLUE benchmark를 통해서 이뤄집니다. GLUE의 경우 NLU 모델이 9가지 Task에 대해 수행해서 얻은 점수들을 평균하여 종합 성능을 확인합니다. 각각의 Task와 해당하는 데이터셋은 다음과 같습니다.
NLU Benchmark : GLUE
GLUE는 왜 굳이 NLU의 종합적인 성능을 확인하는 걸까요?
이는 GLUE의 탄생 배경을 알면 이해할 수 있습니다.
과거엔 NLU 모델들이 대부분 특정한 Task를 잘 풀기 위해서만 설계됐습니다. 따라서 모델들을 다른 데이터셋, Task에 적용하게 된다면 효과적인 성능을 보여주지 못하기 때문에 굳이 종합적인 성능을 확인할 필요가 없었습니다.
하지만 NLU에서도 Transfer Learning(전이 학습)이 도입되면서 모델을 평가할 새로운 방법이 필요해졌습니다.
전이학습에 활용될 모델은 Fine-Tuning으로 다양한 NLU Task에 활용되기 때문에 결국 종합적인 성능을 비교해야지만 그 성능을 확인할 수 있기 때문입니다.
QA
QA는 NLU의 Task 중 하나로 문자 그대로 질문에 대한 답을 찾는 Task입니다.
QA는 질문에 대답할 때 2가지 방법을 사용합니다. information-retrieval(정보검색)과 reading comprehension(문맥 이해)입니다. 이 중에서 문맥을 이해하여 대답하는 QA 모델과 이에 해당하는 데이터셋에 대해서 살펴보겠습니다.
QA 모델에 사용되는 데이터는 SQuAD로 그림과 같이 각 데이터를 구분시켜주는 Question ID, Title과 실제 훈련에 활용될 context, answer, question으로 구성돼있습니다. 이때 SQuAD는 answer가 항상 context내 sequence로 이뤄졌다는 특징이 있습니다.
따라서 SQuAD를 활용한 QA 모델은 answer가 나오는 context의 위치만 정확하게 찾아내면 됩니다.
모델 평가는 예측된 답과 실제 답의 token 중첩 정도를 활용합니다.
이때 exact match와 f1-score를 통해서 가능한데 f1-score가 좀 더 안정적인 평가 방법입니다.
QA에서 높은 성능을 거둔 다양한 모델 BERT와 LUKE에 대해서 간단하게 살펴보겠습니다.
BERT
BERT(Bidirectional Transformers for Language Understanding)는 이름에서도 알 수 있듯이 결국 Bidirectional Transformers가 핵심입니다. BERT는 문맥을 더 잘 이해하기 위해서 Bidrectional한 언어 모델을 Transformers의 Encoder만을 사용해서 구현했습니다.
Encoder만을 이용했기 때문에 Layer에 전파될수록 Self-Attention이 계속 진행됩니다. 이를 통해 Bidirectional한 Representation을 얻을 수 있습니다.
QA에서 BERT를 활용하기 위해서는 question과 context를 packed sequence로 처리해야 합니다. 따라서 입력 임베딩은 Token 임베딩과 Segment 임베딩의 합입니다. 이때 Token 임베딩과 Segment 임베딩은 다음과 같습니다.
Token 임베딩 : [cls] 토큰이 question의 시작에, [sep] 토큰이 question과 context의 끝에 더해진다.
Segment 임베딩 : 주어진 문장이 question인지 context인지 알수 있도록 A와 B가 더해진다.
LUKE(Deep Contextualized Entity Representations with Entity-aware Self-attention)
LUKE는 words representation 뿐만 아니라 다양한 NLU Task에 활용되는 Entity Representation을 Bi-directional Transformer로 구합니다.
Entity Representation을 구하기 위한 부분을 제외하면 나머지는 RoBERTa와 동일합니다.
모델을 통해 주어진 words와 entities를 독립적인 tokens으로 처리하여 Contextualized Embeddings을 얻었습니다.
훈련을 위해서 BERT처럼 masked 언어 모델을 활용했고 entity를 Representation을 잘 반영할 수 있는 Entity-aware Self-attetnion을 제안했습니다.
그림처럼 네트워크는 기존의 BERT 기반 모델들과 매우 비슷합니다. 따라서 Entity 입력을 어떻게 처리하는 지만 확인해보겠습니다.
입력 문장 : Beyonce lives in Los Angeles
- Entity의 Token Embedding은 효율적인 계산을 위해서 Token Embedding을 행렬 B와 U로 분해합니다.
- Entity의 Position Embedding은 words 단위에서의 Position Embedding 값을 그대로 가져온다. 이때 Entity의 길이가 가 1보다 큰 경우(Los_Angeles) 각 Entity들의 Position Embedding 평균을 Embedding 값으로 사용한다.
참고
https://huffon.github.io/2019/11/16/glue/
CS224n
카카오브레인
딥러닝을 이용한 자연어 처리 입문