자연어처리를 공부하다 보면 한 번쯤은 들어봤을 대표적인 논문, 바로 ELMo 논문입니다.
많은 사람들이 현대적인 언어 모델의 시작점으로 BERT나 GPT를 떠올리지만, 그 이전에 문맥(context)을 반영한 단어 임베딩의 중요성을 처음으로 제시한 논문이 바로 ELMo입니다.
이 논문의 핵심은 제목 그대로, Deep contextualized word representations, 즉 문맥을 반영한 깊이 있는 단어 표현을 학습하고 이를 다양한 자연어처리 과제에 적용하는 것입니다.
단어의 의미는 문맥에 따라 달라진다

위 표에서 확인할 수 있듯이, “play”라는 단어는 운동 경기에서의 ‘경기’, 혹은 공연에서의 ‘연주’라는 전혀 다른 의미로 쓰일 수 있습니다.
기존의 정적인 단어 임베딩(GloVe, Word2Vec 등)은 문맥을 고려하지 않고 항상 동일한 벡터를 부여하는 구조이기 때문에 이러한 의미 차이를 반영하지 못하는 한계가 있었습니다.
ELMo의 제안: 문맥을 반영한 동적 임베딩
ELMo는 Embeddings from Language Models의 줄임말로, 이름에서 알 수 있듯이 언어 모델로부터 문맥 기반의 임베딩을 생성합니다.
이 모델은 문맥을 학습하기 위해 양방향 LSTM(BiLSTM) 기반의 Bidirectional Language Model(biLM) 구조를 활용합니다. 즉, 문장의 왼쪽에서 오른쪽으로 읽는 방향(left-to-right)과 오른쪽에서 왼쪽으로 읽는 방향(right-to-left) 두 가지 모두를 학습하여, 각 단어의 위치에서 그 문맥을 최대한 반영한 벡터 표현을 생성합니다.
이렇게 학습된 ELMo 임베딩은 사전학습(pre-trained) 상태로 저장되며, 이후 다양한 downstream task에 쉽게 적용될 수 있습니다. 모델 구조를 바꾸지 않고도 ELMo 벡터를 입력에 추가하거나 중간에 삽입하여 성능을 향상시킬 수 있습니다.
이러한 방식은 총 6개의 대표적인 NLP 과제(문장 의미 분석, 문장 유사도, 질의응답 등)에서 SOTA(State-Of-The-Art) 성능을 달성하는 데 성공했습니다. 기존의 정적인 임베딩 방식과 비교하여 상대 오류율을 6~20%까지 낮추는 성과를 보였으며, 이는 ELMo의 문맥 기반 임베딩 방식이 기존 방법론보다 얼마나 효과적인지를 잘 보여줍니다.
Introduction
기존 NLP에서 Pre-trained model이 word representations을 학습하는 데 좋은 결과를 나타내고 있었지만 high quality representations을 학습하는 데는 아직까지 challenging한 상태라고 합니다.
위에서 설명했듯이 기존 방식은 같은 단어는 같이 임베딩하여 학습하였기 때문에 복잡한 언어의 구문, 맥락적 특성(syntax & semantics)과 다의어(polysemy)와 같은 문제들을 해결하는 데 어려움이 있었습니다.
이 논문에서는 위 문제를 해결하고자 Deep Contextual word representation 방법을 소개합니다. 바로 ELMO인 것이죠!
ELMo는 기존 각 단어별로 임베딩을 한 것이 아니라 large text corpus로 bidirectional LSTM(left-to-right, right-to-left) 두 가지 LSTM의 벡터들을 결합하여 더 deep 하게 문장단위로 임베딩을 하였다고 제시합니다. 한마디로 2가지 LSTM들이 앞뒤 문맥을 파악하고 같은 위치의 layer끼리 결합하겠다는 의미입니다. 이렇게 하면 기존보다 더 깊은 층으로 word representations을 풍부하게 학습할 수 있습니다.
LSTM의 낮은 단계의 layer(입력과 가까운 층)는 품사 등 문법 정보를, 높은 단계의 layer(출력과 가까운 층)는 문맥 정보를 학습하는 경향이 있고, layer에 weight를 두어 각 task에 맞춰서 적절히 학습이 가능합니다. 이렇게 임베딩한 방법이 20% 에러율을 낮췄다고 하네요. 이렇게 하여 deep representations이 성능향상에 도움이 되었다고 증명이 되었습니다.
이젠 구체적으로 ELMO의 구조에 대해 알아보도록 하겠습니다.
ELMo: Embeddings from Language Models
기존 각 단어마다 동일한 임베딩이 아니라 ELMo는 sentence단위의 word representations이라고 설명하였습니다. 이 word representations을 학습하기 위해 Bidirectional LSTM을 사용하고 이것을 ELMo라 합니다. 이 ELMo를 downstream에 적용하고 어떻게 구성되어 있는지 아래에서 설명하겠습니다.
ELMo는 앞서 말했듯이, 순방향 LSTM과 역방향 LSTM을 독립적으로 학습합니다. 이것이 무슨 말이나면, 우리가 흔히하는 PyTorch에서 사용하는 LSTM에서 bidirectional을 사용할지 안할지 여부를 결정하는 것과는 다릅니다. 이것은 하나의 Loss function에서 학습이 되는 것이지만, ELMo는 순방향 loss function + 역방향 loss function, 즉, 서로 다른 모델이라고 볼 수 있습니다.
다시 돌아가서, ELMo의 순방향, 역방향의 모델을 그림을 통해 확인해보겠습니다.

흔히 아는 언어 모델(Language Model)임을 알 수 있습니다. 즉 현재 토큰을 기준으로 다음 토큰이 나올 확률을 예측하는 모델입니다.
한 문장이 있고, 이 문장이 N개의 토큰들로 나누어진다면 (t_1, t_2, ... , t_N)이 나오고, 이를 언어 모델의 수식을 표현하면 아래와 같습니다:

마찬가지로 현재 토큰을 기준으로 이전 토큰을 예측하는 모델을 LSTM의 backward 부분입니다.

본 논문의 목적은 두 forward와 backward의 각 파라미터를 별도로 유지하면서 두 log likelihood를 공통적으로 최대화하는 것이기 때문에 아래와 같이 표현할 수 있습니다.

이렇게 해서 학습이 되는 forward와 backward의 각 토큰별 hidden representation을 가지고 ELMo를 만들게 됩니다.
아래 그림을 통해 확인해보시죠!

즉, Stick이란 단어의 ELMo는 위 그림처럼 구해질 수 있는 것입니다.
ELMo를 요약하자면 두 LSTM의 layer representations의 결합입니다. 각 토큰 마다 L-layer biLM(2L)과 처음 token layer를 합치면 총 2L+1개의 representations이 나옵니다.
수식으로 표현하자면 아래와 같습니다:

위의 모델을 downstream에 적용하기 전에 먼저 모든 layers를 하나의 vector로 압축시켜줘야 합니다. 그럼 이제 여러 개 layer들을 압축한 수식은 다음과 같습니다.

Using biLMs for supervised NLP tasks
위에서 ELMo를 pre-train 하였으니 이제 task에 맞게 적용시켜 supervised 구조를 설계하면 됩니다. 방법은 아주 간단합니다.

위 그림처럼 입력단과 softmax를 거치기 전, 즉 logits값에 concat을 하는 방식으로 downstream task에 적용시킵니다.
1. biLM을 학습시켜 각 단어에 대한 layer representations를 저장하고,
2. downstream에 맞게 pretrain된 모델의 선형 결합을 학습하도록 합니다.
- Pre-trained 된 biLM의 weights를 고정합니다.
- Input text를 각 token에 대해 biLM을 거쳐 task에 맞게 ELMO_k^task를 뽑아냅니다.
- input token x_k^LM과 ELMO_k^task를 concat하여 이를 Supervised task RNN모델(ELMo 학습때 사용된 모델이 아님)에 넣어줍니다.
이렇게 함으로써, ELMo는 다양한 downnstream task에서 좋은 성능을 거두게 되었습니다.

마무리
ELMo는 단순한 단어 임베딩 기법을 넘어, 문맥을 반영한 표현이 얼마나 강력한 성능 향상을 이끌어낼 수 있는지를 보여준 선구적인 연구입니다. 기존의 정적 임베딩 방식이 갖고 있던 한계, 즉 문맥을 무시한 단일 벡터 표현의 문제를 BiLSTM 기반의 언어 모델을 통해 효과적으로 극복했으며, 이로 인해 다양한 자연어처리 과제에서 SOTA 성능을 달성할 수 있었습니다.
또한 ELMo의 또 다른 중요한 의의는 사전학습된 언어 모델을 별도로 fine-tuning하지 않고도 downstream task에 쉽게 통합할 수 있다는 점입니다. 이는 이후 등장한 BERT, GPT 등의 모델들이 "언어 모델의 사전학습 + 파인튜닝"이라는 패러다임으로 확장될 수 있었던 기반이 되기도 했습니다.
ELMo는 단어 수준의 의미 표현에서 출발하여 문장 수준의 문맥 이해로 나아가는 전환점을 제시한 모델이며, 지금도 여전히 "문맥 기반 표현"이라는 자연어처리의 핵심 아이디어를 이해하는 데 중요한 출발점이 됩니다.
언어 모델의 발전 과정을 공부하는 입장에서, ELMo는 반드시 짚고 넘어가야 할 기념비적인 연구라고 할 수 있습니다.(NAACL 2018의 Best Paper였다고 합니다.)
참고로 이 논문은 NAACL 2018 Best Paper로 선정되기도 했습니다.
앞으로도 꾸준히 논문 리뷰를 이어갈 예정입니다!
긴 글 읽어주셔서 감사합니다. 🙇🏻♂️