2021.05.26 - [Study/NLP] - [NLP/자연어처리] Seq2Seq(3) - 트랜스포머(Transformer)_Encoder
2021.05.26 - [Study/NLP] - [NLP/자연어처리] Seq2Seq4 - 트랜스포머(Transformer)_Decoder
지금까지 자연어 처리에서 Transformer까지 내용에 대해 이론적으로 정리했다. 오늘 정리할 내용은 ELMo의 알고리즘 방식, 그리고 다른 알고리즘들과의 차이점에 대해서 설명해보려고 한다. 참고한 자료들은
고려대 산업경영공학과 교수님인 강필성교수님의 강의자료와, 자연어처리를 위한 딥러닝, Jay Allamar 이다.
1. 지금까지의 Word Embedding
ELMo가 출현하기 전의 Word Embedding 방법론은 Word2Vec과 GloVe등이 사용되어 왔었다. 이들의 방식은 각 token들을 정수로 표현하여 임베딩 한 후 단어간의 의미가 비슷한지, 반대인지 등을 나타내왔다. 이러한 Word_Embedding의 방법의 치명적인 단점 중에 하나는 하나의 토큰 당 하나의 임베딩 벡터가 부여되기 때문에 다의어의 경우에는 그 의미를 반영할 수 없다는 점이었다. 즉, 문맥을 반영하지 못한다는 점이었다.
예를 들어 "하늘에서 눈(snow)이 온다"의 눈과 "눈(eye)이 아파 안과에 갔다"에서의 눈은 명확히 다른 언어다. 그러나 Word-Embedding을 하면 같은 임베딩 벡터가 출력된다.
2. 그래서, Contexttualized word embedding!
이러한 Word-embedding의 단점을 보안하기 위해 맥락속의 단어의 의미 뿐만 아니라 맥락 자체에 대한 정보도 나타낼 수 있는 embedding을 고려하기 위해, contextualized word-embedding이 탄생했다.
contextualized word-embedding은 각 단어에 문장의 맥락 속에서 어떠한 의미를 가지는지에 따라 다른 embedding을 가지게 한다. 이를 사용하는 알고리즘 중 하나가 ELMo이다.
3. ELMo(Embeddings from Language Models)
ELMo는 크게 두가지의 특징이 있는데, 하나는 사전 훈련된(pre-trained) 단어 표현법 과 높은 품질의 단어 표현법의 이상적인 모델링(단어 사용에 대한 복잡한 특성, 다의어에 대해 문맥에 따라 다른 단어의 의미 등)이다.
ELMo는 각 단어에 고정된 embedding을 이용하는 대신에 먼저 전체 문장을 본다. 그리고 특정한 task로 학습된 bi-directioal(양방향성) LSTM을 이용해 각 단어의 embedding을 생성한다.
ELMo가 이용하는 LSTM은 거대한 데이터 셋에서 학습되며, 그 다음 자연어를 처리하는 다른 모델에서 하나의 부분으로 이용할 수 있다.
ELMo를 더 자세히 살펴본다면, 단어의 sequence에서 다음 단어를 예측하는 LM(Language Model)에서 언어에 대한 이해를 습득한다. 또한 bu-direction LSTM을 사용하기 때문에 backward language모델을 사용함으로 이전 단어를 예측하는 부분에 대해서도 학습하게 된다.
ELMo는 학습한 후에 나오는 hidden state들을 하나의 벡터로 concatenate한 후 각 층의 hidden layer의 값들로 weited sum 을 통해 contextualized embedding을 출력한다. 가중치에 대한 값을 산정하는 방법은, 이후 downstream task가 무엇이냐에 따라 달라지는 parameter이다.
4. bi-directional Language Model
양방향성 언어 모델에 대해서 수학적으로 설명을 더 들어보도록 하자.
먼저 forward language model에 대해 알아보자면, N개의 토큰이 주어졋을 때, k번째 토큰 $t_k$을 예측하기 위해 1번째부터 k-1번째의 토큰 $t_1, ... t_k$를 가지고 있다고 가정을 한다. 그럼 각각의 결합확률분포의 식은 아래와 같다.
$$(p(t_1, t_2, ..., t_N) = \prod{k=1}^N (t_k| t_1, t_2, ..., t_{k-1})$$
이는 먼저 생성된 단어들에 대해서만 영향을 받는다는 의미로, k번째 토큰에 대한 임베딩을 말한다. 이를 L개의 layer만큼 쌓은 LSTM에 입력으로 넣는다. 이를 통해 나온 hidden state 벡터들은 문맥을 고려한 표현법이 된다. 각 hidden state의 표현 방법은 $\overset{\rightarrow}{h}_{k, j}^{LM}$으로 표현되며, k번째의 토큰에 대한 j번째 층의 hiddenlayer로 표현된다. 가장 꼭대기 층의 hidden layer에서 softmax layer을 추가하여 k+1번째의 토큰을 예측한다.
이와 반대로, backword language model은 N개의 토큰이 추어졌을 때, k번째 토큰을 예측하기 위해 k+1번째 부터 N번째의 토큰을 가지고 있다고 가정한다. 즉, 이에 대한 결합분포식은
$$(p(t_1, t_2, ..., t_N) = \prod{k=1}^N (t_k| t_{k+1}, t_{k+2}, ..., t_N)$$
이 된다. 이는 나중에 생성된 단어들에 대해서만 영향을 받는다. 이의 표현 방식도, 반대로인 $\overset{\leftarrow}{h}_{k, j}^{LM}$로 표현된다.
결국 bi-directional 모델에서는 우리가 가지고 있는 파라미터들을 통해 foward language 모델의 정확도 값과, backword language 모델의 정확도 값을 함께 최대화 해야한다.
5. ELMo를 이용해 어떤 Task를 수행할 것인가?
pretrained model을 사용해서 실제 supervied-learning으로 최종적으로 잘 학습시키는 과정을 downstream task라고 하는데, ELMo를 이용해 어떻게 downstream task를 수행하는지에 대해 알아보도록 하자.
biLM(bi-directional Language Model), 즉 ELMo를 이용해 hidden layer를 concat하고, 그를 가중치 합으로 모델의 결과값을 정하는데, 각 task에 대한 token의 가중치는 학습을 통해 결정한다.
위 슬라이드와 같이, L개의 layer를 쌓는다는 가정하에 원래 우리가 찾으려는 word의 임베딩 값 x와 양쪽 방향의 hidden layer 들까지, 2L+1개의 representation이 생성된다. 이를 위한 task를 수행하기 위해서 각 hidden layer의 가중치를 위한 $s_j$의 softmax normalized된 weight값과 있고, ELMo vector를 전반적으로 scale해주는 감마 벡터 $\gamma^{task}$를 구한다.
6. ELMo를 어떻게 활용하는 것이 가장 효과적인가?
위의 슬라이드와 같이, ELMo의 hidden state를 어떻게 활용하는 것이 가장 성능이 잘 나오는가에 대한 문제는,
1. 각 hidden state에 가중치를 다르게 부여하는 것
2. 각 hidden state값을 전부 동일하게 1/(L+1)만큼의 값으로 부여하는 것
3. 가장 마지막 hidden state값을 사용하는 것
4. ELMo를 사용하지 않는 것(일반 word_embedding을 사용하는것)
순으로 성능의 차이를 볼 수 있고,
ELMo를 사용해서 downstream 문제를 해결하는 문제에서는
1. input과 output에 ELMo의 결과를 전부 연결하는 것
2. input에만 ELMo의 결과를 연결하는 것
3. ouptut에만 ELMo의 결과를 연결하는 것
4. ELMo를 사용하지 않는 것
순으로 성능의 차이를 볼 수 있다.
7. 결론
처음으로 pretrain을 통해서 언어 모델에 단 문제를 해결할 수 있는 방법에 대해서 나오며, Word2Vec, Glove와는 다르게 문맥을 기반으로 한 word embedding방법이 나와 큰 성능의 향상을 보였다. 이는 자연어처리에서 큰 혁신을 불러일으켰는데, 이후에도 GPT와 BERT라는 알고리즘을 통해 pretrain 이후 fine-tune하는 모델들을 소개할 예정이다.