2019년 5월 6일 월요일

논문 설명 - Learning and Evaluating General Linguistic Intelligence

Intro

작년 한 해 Contextual Embedding을 만들 수 있는 Language Model들이 많이 나왔습니다. 이런 모델들은 자연어 처리의 여러 문제들에서 기존의 모델들보다 좋은 평가 결과를 냈습니다. 이후, 이런 모델들을 분석한 논문들도 나와서 읽어보고 정리해 봤습니다.

논문 1. "Learning and Evaluating General Linguistic Intelligence" by DeepMind, 업로드 날짜 : 2019. 1.
https://arxiv.org/pdf/1901.11373.pdf

논문 2. "What do you Learn from Context? Probing for Sentence Structure in Contextualized Word Representations" by Google AI Language, etc, ICLR 2019.
https://openreview.net/pdf?id=SJzSgnRcKX


요약

두 논문 모두 실험을 통해 모델의 능력들을 평가한다는 공통점이 있습니다. 각 논문을 간단히 소개해보겠습니다.

논문 1의 중요 단어는 "General" 입니다. 특정 task의 특정 dataset으로 훈련시킨 언어 모델이 같은 task의 다른 dataset으로 평가했을 때 얼마나 빨리, 얼마나 좋은 성능을 내는지, 또 다른 task에 적용했을 때는 얼마나 빨리, 좋은 결과를 보여주는지에 관심이 있습니다. 결론적으로 아직 갈 길이 먼 것 같습니다.

논문 2의 중요 단어는 "Context"입니다. 제목에 두 번이나 나오죠. 이 논문의 결론은, "Context를 반영한 word embedding이 주로 syntactic한 정보들을 많이 반영하며, semantic한 정보들은 별로 갖고 있지 않다." 입니다.

이제 본격적으로 두 논문을 하나씩 좀 더 자세히 살펴 보겠습니다.


Learning and Evaluating General Linguistic Intelligence



사실 DeepMind가 아니면 이런 거창한 제목을 붙이기도 힘들었을 것이라 생각합니다. 아무리 BERT가 대단하다고 해도 말이죠. 아래는 논문 Abstract의 첫 문장입니다.
"We define general linguistic intelligence as the ability to reuse previously acquired knowledge about a language’s lexicon, syntax, semantics, and pragmatic conventions to adapt to new tasks quickly"
논문에서는 General linguistic intelligence를 이미 습득한 단어, 문법적, 의미론적, 실용적(?) 지식을 새로운 task에 맞게 빠르게 재사용하는 능력이라 정의합니다. 그리고 이를 반영할 수 있는 학습 평가 지표도 제시합니다.

Introduction

최근까지의 연구는 특정 데이터에 맞는 모델을 설계하여 좋은 성능을 얻는 것이 목표인 경우가 많았습니다. 이런 경향 때문에 어떤 task에서 좋은 성능을 얻었다고 해서 그만큼 언어에 대한 지능, 이해가 높아졌다라고 보기는 힘들었습니다.

이런 가운데 매우 큰 데이터로 unsupervised pretraining을 거친 후, 각 task, dataset에 맞게 fine-tuning을 하는 language model들이 등장했습니다(ELMo, GPT, BERT 등). 이런 경우 pretrained된 모델은 특정 dataset에 맞게 설계, 학습된 모델보다 상대적으로 일반적인 언어지능을 가졋다고 볼 수 있겠죠.

또한 여러 task들을 동시에 학습하는 multi-task learning도 등장했습니다. 이렇게 학습된 모델도 좀 더 일반적인 언어 지능을 갖고 있겠죠.

논문에서 얘기하는 일반적인 언어 지능의 요소에는
1. 여러 task를 수행할 수 있는(아마 ELMo, GPT, BERT 등이 이런 능력을 갖고 있다고 볼 수 있을 것 같습니다.) 능력
2. 단어 표현을 쉽게 저장하고, 재사용하고 조합(단어 -> phrase, 문장, 문서)하며 이미 습득한 언어 지능을 재활용하는 능력
3. 조금의 학습만으로 새로운 task에 잘 적응할 수 있는 능력
들을 얘기합니다. 이 중에서 이 논문에서 알아보고자 하는 능력은 3. 에서 설명하는 능력입니다.


Tasks

모든 task들에 대해 실험을 하기 어려우니 논문에서는
Reading Comprehension(QA) - (데이터셋 : SQuAD 1.1, TriviaQA, QuAC),
Semantic Role Labeling,
Relation Extraction,
Natural Language Inference - (데이터셋 : MNLI, SNLI)
4가지 task에 대해 실험하고 결과를 분석합니다.

Models

사용한 모델은 ELMo + BiDAF, BERT 입니다.

Evaluating Transfer

위에서 언급했던 것처럼 얼마나 빨리 학습되는가를 평가하기 위한 지표인 "codelength"를 제시합니다. 수식은 아래와 같습니다.
|y| 는 라벨의 개수입니다.
A는 {(x_i, y_i)}, i : 1 ~ N : N개의 데이터 x와 라벨 y의 쌍으로 이루어진 데이터셋입니다.
A_j는 {(x_i, y_i)}, i : 1 ~ j :  j번째까지의 데이터, 라벨로 이루어진 A의 부분 집합입니다.
W^A_i는 A_i를 이용해서(처음 i개의 데이터만 이용해서) 학습한 파라미터입니다.
이를 통해 p(y_i | x_i; W^A_i-1)의 의미는 i-1개의 데이터를 이용해 파라미터 W를 학습한 후, i번째 데이터의 라벨을 예측하는 것이라 알 수 있을 것입니다. 이 값은 학습이 100% 정확하다면 1.0이 될 것이고(x가 주어졌을 때 100% 확률로 y를 예측함) 로그를 씌우면 0이 됩니다.

i를 2부터 N까지 증가시키면서 결과를 모두 더하는데, 학습이 빨리 되면 빨리 될수록 l(A)의 값은 작아지게 됩니다. 예를 들어 설명해보겠습니다.

|y|은 2이고, 데이터의 개수인 N이 4일 때,
예시 1 : (x1, y1)로는 학습이 전혀 되지 않았으나(p(y|x, W)는 1/2), (x2, y2)를 학습한 후 완벽하게 모델이 학습된 경우.
p(y2|x2, W^A1) = 1/2
p(y3|x3, W^A2) = 1
p(y4|x4, W^A3) = 1 이므로 l(A) = 1-(-0.5 + 0 + 0) = 1.5

예시 2 : (x1, y1), (x2, y2)로는 학습이 전혀 되지 않았으나(p(y|x, W)는 1/2), (x3, y3)를 학습한 후 완벽하게 모델이 학습된 경우.
p(y2|x2, W^A1) = 1/2
p(y3|x3, W^A2) = 1/2
p(y4|x4, W^A3) = 1 이므로 l(A) = 1-(-0.5 + -0.5 + 0) = 2

이렇게 codelength는 학습이 빨리 될수록 작아지는 것을 알 수 있습니다.
실제로 이런 아이디어를 적용해볼 경우 부분집합을 나누는 단위를 데이터 한 개가 아닌 여러 개의 묶음으로 나누어야겠죠.

Experiments


Unsupervised Pretraining

챕터의 제목이 조금 이상하다는 느낌이 들지만 이 챕터는 얼마나 많은 in-domain(training) 데이터가 필요한가에 대해 살펴봅니다. 실험 대상 task는 SQuAD와 MNLI입니다. BERT와 ELMo 모두 4만개 정도의 데이터를 학습해야 최고 성능에 근접했다고 합니다. pretrained 모델 치고는 매우 많다고 하네요. BERT 모델이 ELMo에 비해 최종 성능도 높았고, 학습도 빨리 진행됐습니다. 아래 그림은 차례대로 SQuAD 1.1, MNLI에 대한 실험 그래프 입니다. (+supervised는 뒤에서 설명하겠습니다.)
---

pretraining을 거치치 않고 task의 데이터로 BERT를 학습시킨 BERT_scratch모델은 그리 좋은 성능을 내지 못했습니다. (이 비교를 통해 pretraining의 효과를 알아보려는 것인지도 모르겠습니다)

그리고 추가적으로 codelengh지표를 측정합니다. SQuAD는 만개씩 8개로, MNLI는 4만개씩 10개의 부분집합으로 나누어서 측정했습니다. SQuAD 데이터셋에서는 BERT가 102.42, ELMo가 112.96을 기록했고, MNLI에서는 BERT가 89.22, ELMo가 132.17의 codelength를 가졌습니다. BERT가 성능도 좋았지만 학습도 그만큼 빨리 되었다는 것을 위의 그래프와 함께 codelength로도 알 수 있었습니다.


Beyond Unsupervised Pretraining

이 챕터에서는 다른 데이터셋으로 미리 학습했을 때 성능이 향상되는지를 알아봅니다. 실험에서는 semantic role labeling, relation extraction, SNLI, TriviaQA, QuAC 데이터셋으로 먼저 학습시킨 후 SQuAD 데이터를 학습시킵니다. 이 모델을 각각 BERT+supervised, ELMo+supervised라 부릅니다. 이 때의 성능은 아래의 표와 같습니다.


이런 pretraining을 통해 최종 EM, F1 성능이 향상되었지만 가장 크게 차이나는 것은 codelength입니다. 다른 데이터셋으로 미리 학습시키면 학습이 그만큼 빨리 된다는 것을 알 수 있습니다. 이는 pretrained 모델에 추가되는 각 task에 맞는 final layer가 미리 학습됐기 때문이라고 추정합니다. 좀 더 해석하면 같은 QA task인 TriviaQA, QuAC 데이터셋을 통해 SQuAD도 잘 할 수 있도록 학습된 것이라 할 수 있습니다. 실제로 SQuAD 데이터를 하나도 학습하지 않은 상태에서 BERT+supervised, ELMo+supervised 모델은 각각 62.9, 43.3 F1을 냈다고 합니다.


Generalization

이제 반대로 특정 데이터로 학습한 모델이 그 데이터에 오버피팅 됐는지 아니면 같은 task의 다른 데이터셋에도 잘 적용되는지를 알아봅니다. 실험은 SQuAD를 학습한 모델로 다른 TriviaQA와 QuAC 등에서 얼마나 잘 할까를 평가합니다. 다른 데이터셋으로는 학습하지 않고 평가했습니다.

결론적으로 충분히 좋은 결과를 보여주지 못합니다. TriviaQA의 1등 점수는 68.65입니다.  괄호 밖의 점수는 F1이고 괄호 안의 점수는 EM 점수입니다.


같은 task의 데이터셋이라도 데이터의 분포가 다르기 때문인 것 같습니다. 특정 Task를 배우는 것과 데이터셋에 대해 학습하는 것은 차이가 있어 보입니다.


Curriculum and Catastrophic Forgetting

이 챕터에서는 학습 순서가 성능에 영향을 주는지, 그리고 모델이 이전에 습득한 지식을 얼마나 발리 잊어버리는지 실험합니다.

첫번째는 SQuAD로 학습한 모델을 이어서 MNLI로 학습하면서 성능을 측정합니다. Training iteration은 MNLI의 학습량을 의미합니다.

학습이 진행될 수록 MNLI의 성능은 증가한 후 거의 수렴하지만 SQuAD의 성능은 점점 감소합니다.
MNLI의 final layer는 QA task와는 다른 layer(parameter)를 사용합니다. 그럼에도 불구하고 QA의 성능이 떨어진다는 것은, MNLI를 학습하면서 공통으로 사용하는 pretrained model의 파라미터들도 많이 바뀐다는 뜻이겠죠.

이러한 경향은 SQuAD로 학습한 모델을 TriviaQA로 학습할 때도 이어집니다.

MNLI로 학습할 때보다 SQuAD의 성능이 더 떨어지네요.
재밌는(?) 것은 이 모델(pretrain->SQuAD->TriviaQA로 학습된 상태)에 MNLI를 계속해서 학습시키면 SQuAD, TriviaQA의 성능은 거의 그대로이고, MNLI의 성능만 증가합니다.


마지막 실험에서는 random하게 아무 task들의 데이터를 뽑아서 학습시킵니다. 아래는 BERT를 그렇게 학습시킨 실험 결과입니다. 모든 task에서 고루 좋은 성능을 보입니다.


이런 학습 방법의 장점은 모든 task에서 성능이 좋다는 것이지만, 단점으로는 그만큼 여러 종류의 데이터가 필요하고, 새로운 task가 생겼을 경우 처음부터 다시 학습해야 하죠. 학습을 다시하는 것은 매우 비용이 큰 만큼 여러 task를 이어서 학습하는 continual learning을 잘 하기 위한 연구도 필요해 보입니다.

Discussion

이 논문은 제목대로 General Linguistic Intelligence가 있나 평가를 하지 새로운 방법을 제시하지는 않습니다. 실험을 통해 분석한 결과로는 아직 general linguistic intelligence를 달성하기 위한 여러 능력들이 부족하다고 하죠. Pretrained 모델의 성능이 좋다 해도 여전히 fine tuning을 위한 많은 데이터가 필요하고, 하나를 학습시키면 다른 하나는 또 잊어버린다는 것을 알았습니다.

이런 문제들을 해결하기 위한 방법들을 언급하는데, 일반적인 해법들을 제시합니다.
- transfer and continual learning methods
- memory module
- meta learning : 새로운 task에 빨리 적응하는 기술. NLP의 입력은 거의 같기에 많은 도움이 될 것이라 합니다.
- training curriculum
- generative language model

또한 adversarial example들에 대한 robustness, 여러 언어를 동시에 처리하는 능력 등 연구가 필요하다는 등의 언급을 하며 끝을 맺습니다.


결론적으로 아직은 멀었다....... 라는 얘기를 여러 실험을 통해 하는 DeepMind의 논문이었습니다. 다른 사람들의 연구를 약간 까려고 한 실험일 수 있겠다는 생각도 들고요 ㅎㅎ. 아직 이런 General Linguistic Intelligence를 논하기엔 이른 시점이라고 생각합니다.

한 편으로는 실제로 BERT에 Multi-task learning(random으로 task를 선택해서 학습하는)을 적용한 BigBird논문이 BERT보다좋은 성능을 냈는데, 그래도 어느정도 방향성은 제대로 제시했다는 느낌도 주는 논문이었습니다 .

댓글 없음:

댓글 쓰기