본문 바로가기
AI/CS224N 2019

[Lecture 13 - 1][Stanford CS224n(Winter 2019)] Contextual Word Representationsand Pretraining

by 아오씬나 2021. 2. 8.
반응형

 

1. Reflections on word representations (10 mins) ← 이번 포스트에서 다룰 주제입니다.
2. Pre-ELMo and ELMO (20 mins) ← 이번 포스트에서 다룰 주제입니다.
3. ULMfit and onward (10 mins) ← 이번 포스트에서 다룰 주제입니다.
4. Transformer architectures (20 mins)
5. BERT (20 mins)


1. Reflections on word representations

우리는 지금까지,

단어를 표현하는 방법을 배웠고, 단어 벡터를 훈련시켰고, 그것을 모델에 사용했습니다.

단어를 벡터로 표현하는 방법으로는 Word2vec, GloVe 또는 fastText와 같은 알고리즘을 배웠습니다. 

 

 

새로 등장한 비지도 pre-trained 많은 양의 텍스트를 학습한 pre-trained word vectors 는

NLP 에서 neural network  를 더 잘 동작하도록 변화시켰습니다.

 

위 표는 2014년 쯤 만들어진 자료로 POS 와 NER 의 실험결과를 정리한 표입니다.

상위에는 2000년 대 NLP 에서 사용된 전통적인 categorical feature based classifier (rule base) 를 통한 당시 최고의 성능을 보여줍니다.

 

다음은 동일 데이터 셋으로 신경망을 지도 학습한 모델에 대한 결과입니다.

표에서와 같이 지난 10년 동안은 CRF, SVM 과 같은 classifier 를 사용했는데, 이것이 신경망 대비 8프로 더 잘 동작했습니다.

 

하지만 그 후, 사람들은 단어 표현에 대한 비지도 학습을 할 수 있다는 아이디어를 생각해냈습니다.

2011년에 Collobert, Weston 은 비지도 단어 표현을 훈련을 위해 100개 hidden layer를 학습하는데 7 주를 보냈습니다.

그리고 이것을 통해 Supervised NN 81% 에서 88.87% 로 올라갔습니다.

또한 마지막으로 다양한 기능을 추가하여 state-of-the-art 보다 좀 더 나은 시스템을 만들었습니다. 

 

"

pre-trained word vectors 는 모든 신경망을 Rule base 대비 경쟁력 있게 만든 비결입니다. 

"

 

 

몇 주 전에 배운 dependency parser 학습 시에 word vector 를 사용하는 것과 pre-trained word vector 를 사용한 결과입니다.

약 1% 씩 pre-trained 워드 벡터를 사용한 쪽이 우수한 것을 볼 수 있습니다. 

 

대부분의 경우 pre-trained unsupervised word embedding 이 유용합니다.

왜냐하면 훨씬 더 많은 자료로부터 그것들을 훈련시켜서 더 많은 어휘에 대해 알 수 있고, 자주 쓰이지 않는 단어를 알 수 있는 등 

성능 향상에 도움이 되기 때문입니다. 

 

이번 페이지에서는 잠시 주요 내용에서 벗어나 unknown word 를 처리하는 팁을 알려줍니다.

 

단어가 5회 이상 나온 데이터는 그대로, 이외의 데이터는 <UNK> 로 학습합니다.

그리고 run time 에는 OOV 단어에 대해 <UNK> 로 처리합니다.

 

문제: 정체성이나 의미로 서로 다른 UNK 단어를 구별 할 방법이 없다.

첫번해결방법은 지난 시간에 배운 것처럼 Character level 의 모델을 구축하여 해결하는 것 입니다.

 

두번째 해결방법은 특히 QA 시스템에 많은 도움이 됩니다. 

QA 시스템의 경우 단어 벡터 어휘를 벗어난 경우에도 기존의 단어의 identity 와 매치하는 것이 중요하기 떄문입니다.

 

2017년 제안된 팁은 두가지 방법으로 

a. test time 에 새로운 단어를 발견하면, pre-trained 단어 임베딩에 있는 단어 벡터를 사용하는 것입니다.

b. <UNK> 가 아니라, 그 시점에 새로운 랜덤 워드 벡터를 할당합니다. 이것을 각 단어가 고유한 정체성을 갖는 효과가 있습니다. 

이것은 <UNK> 매칭으로는 만들 수 없는 매칭을 만들어내어 잘 동작합니다.

 

다시 돌아가서, 지금까지 우리는 단어들을 표현하고, Word2vec, GloVe, fastText 등의 알고리즘으로 각 단어에 대한 단어 벡터를 얻었습니다.

하지만 하나의 단어를 하나의 벡터로 표현하는 것에는 몇가지 한계점이 있었습니다. 

 

1. 단어가 문맥에 관계없이 항상 동일한 표현이 됩니다.   

    우리가 실제로 알고 싶은 것은 특정한 맥락 속에 있는 sense of the word 입니다.   

    예) 스타 라는 단어에는 천문학적인 개념의 별과 할리우드 sense 의 스타 가 있습니다. 

 

2. 우리는 단어에 대해 하나의 표현만 가지고 있지만, 단어의 언어적, 사회적 의미에 따라 달라짐을 내포하지 못함.

    문법적으로 다른 예는 아래와 같습니다.

    예) arrive 와 arrival 은 거의 비슷하지만 품사로서는 다릅니다. 하나는 동사, 하나는 명사입니다. 
     

    단어들은 또한 의미론적으로 레지스터와 함축적 차이(connotation differences)를 가지고 있다.

    의미는 같지만 각 단어를 사용할 때 적절하게 다른 register 과 connotation difference를 갖고 있습니다.

    bathroom, toilet 이런..

    

우리는 약 6 주 전에 이 문제를 보고 해결했을 수도 있습니다.

우리는 가장 아래에 단어를 임베딩하고, LSTM 레이어와 같은 rnn 레이어에서 각 단어의 hidden state 를 계산했고 그 값은 다음 hidden state 와 output 을 계산하는데 사용되었습니다.

그리고 우리는 각 단어의 hidden state 를 이 문맥에서의 word representation이라고 잘 이해하고 넘어갔었습니다. 

그것을 토대로 QA 시스템을 이해했고 attention mechanism 위에서 각 단어 표현이 잘 동작함을 확인했습니다. 

 

그래서 이미, 문맥에서의 각 단어를 표현할 수 있는 방법을 고안해낸 것 같았습니다. 

이 강의에서는 이러한 특징을 활용한 모델을 살펴봅니다. 


2. Pre-ELMo and ELMo

Pre-ELMo 라고 불리는 TagLM 모델을 먼저 알아봅니다. 

이것은 현대의 context-sensitive 워드 임베딩의 전신입니다.

 

Main Idea:

"

문맥에서의 단어의 의미를 잘 알고 싶다.

그러나 NER 과 같은 Task 에서는 적은 양의 데이터로 학습한다. (일반적으로 NER 학습 데이터는 50만 단어 정도)

semi-supervised 방식을 사용하면 어떨까?

"

 

이 장은 NER 의 간단한 설명입니다. 

사람, 위치, 날짜, 조직과 같은 것에 라벨을 붙여 인식할 수 있는 표현을 갖는 것을 NER 이라고 하죠.

 

Step 1: 라벨이 없는 자료로 시작

 

Step 2: Word2vec 와 같은 기존 단어 임베딩 모델을 train.           

             동시에, neural language model 도 train. (bi-LSTM language model 등)

 

Step 3: 시퀀스 태깅 모델에 각 단어의 word2vec 에서 얻어진 값과 lm 에서 얻어진 hidden state 값을 feature 로 제공하면 NER 이 더 잘 작동할 수 있습니다. 

 

더 자세히 살펴봅니다.

 

1. 첫번째로 할 일은 우측의 별도로 훈련된 neural language model 을 통해 뉴욕의 출력값을 얻는 것입니다. 

여기서 언어모델은 많은 비지도 데이터에 대해 훈련된 bi-LSTM 언어모델이라고 가정합니다.

forward lm 과 backward lm 을 실행하여 hidden state를 얻고 각 결과를 concat 하여 Entity Recognizer 에 제공합니다. 

 

2. 왼쪽 그림에서는 Recognizer 에서 문장에 대해 word2vec 임베딩을 수행하고, 또한 char-level 의 CNN/RNN 을 함께 사용한 표현을 concate 합니다. 

 

3. 이 concat 한 값을 bi-LSTM 레이어에 공급합니다. 

   첫번째 bi-LSTM 레이어의 output 을 얻으면, 출력값과 1 의 lm 결과를 concat합니다.

 

4. 3의 값을 두번째 bi-LSTM 에 input 데이터로 공급합니다. 

 

5. output 을 소프트맥스 분류를 하여 뉴욕을 Location 이라고 인식하는 태그를 얻습니다. 

 

여기서 중요한 것은 Bi-LSTM에서 얻은 이러한 표현들이 유용하다는 것입니다.
그들의 의미와 맥락을 나타내는 일종의 표현으로, 우리는 더 나은 NER 또는 다른 시스템에 train 시킬 수 있다.

 

뒤에서 질문이 하나가 나오는데, 우측 언어모델의 pre-trained 의미에 대한 문의였습니다.

pre-trained 의 의미는 우측의 char-level 모델처럼 back propagation 을 통해 계속해서 학습이 되는 것이 아니라는 의미였던 것 같습니다

 

The main reason why it's- in some sense pre-trained, is this was trained first.
But the main reason why people think of this as pre-training is after you've trained this, it is frozen.
when you're training this system, there's no gradient flowing back into this neural language model that's changing and updating it; it's just fixed.
And so that's sort of the sense when people are talking about pre-training.
It's sort of normally a model that you trained somewhere else and that you're using to give features, but isn't part of the model that you are now training.

 

 

CoNLL 2003 영어 데이터셋으로 NER 을 수행한 결과입니다.

 

2003년의 결과는 IBM 리서치 랩스 출신(1등) 이 Stanford (3등? 4등?) 보다 더 좋았습니다.

IBM 시스템은 여러 시스템을 한데 모아 매우 복잡했습니다.

2005년의 또 다른 Stanford NER 이 있고, 이것은 널리 사용되는 전형적인 스탠포드 NER 시스템이기도 합니다.

2000년대 후반, 2010년대 초반에는 Conditional Random Field 모델이 주로 사용되었습니다. 

 

그리고 2017년에 들어서는 Bi-LSTM 모델이 NLP 에서 널리 사용되기 시작했다고 합니다. 

2005 년의 Base 시스템과 비교했을 때 약 4% F1 스코어가 올라갔습니다.

 

그리고 최종적으로는 2017 년 TagLM 을 사용한 모델이 당시의 최고의 NER 시스템을 제공했습니다.

 

위의 빈 공간은 이후 다시 설명하겠습니다.

 

언어 모델의 상세 정보가 있는데, 
언급된 내용만 정리해보자면, 아래 세가지입니다.

 

1. supervised data 는 LM 학습에 도움이 되지 않는다. <-- label 이 정해진 데이터는 학습에 도움이 되지 않는다..?

2. 단방향이 아닌 bidirectional language model 이 더 유용하다.

3. 큰 언어모델을 얻기 위해 더 많은 데이터에 대해 훈련시켜야 한다.

 

Pre-ELMo 가 나온지 Matt Peters 와 그 동료들은 ELMo 라고 부르는 획기적인 시스템을 고안해냅니다.

contextual word vectors 가 대단하며, 모든 사람들이 traditional word vector 가 아닌 이것을 사용해야 한다고 말할만큼 획기적이었다고 합니다.

 

Tag LM 와 ELMo 의 차이를 말하자면, 똑같은 일을 하고 있지만 조금 더 나아졌습니다.

조금 더 나아진 부분은 bi-directional model 을 조금 다르게 수행한다는 것입니다.

사람들이 사용하기 쉬운 좀 더 compact 한 언어모델을 위해,

word representation 을 아예 없애고 character CNN을 사용하여 단어 표현을 만들기로 결정했습니다.

이렇게 하면 저장해야하는 매개 변수 수, 사용해야하는 큰 사이즈의 행렬을 줄일 수 있기 때문입니다.

 

오른쪽 아래의 식은 아주 복잡하지만, 풀어서 설명하면,

k번째 토큰의 j번째 레이어의 순방향, 역방향 LSTM 레이어에서 나온 hidden state 를 붙인 벡터를 말합니다.

그리고 s_j_task 는 j번째 레이어가 해당 Task 를 수행하는데 얼마나 중요한지를 가리키는 스칼라 값으로 해당 레벨에 대한 가중치를 배웁니다.

그 값을 전체 레이어 j 0~L 까지 합산하고, 마지막으로 감마는 특정 작업에 대한 글로벌 스케일링 factor 입니다. ELMo 벡터의 크기를 스케일 해서 해당 task 수행을 돕는 역할을 합니다. 

 

바꿔서 말하면, ELMo 임베딩은 각 레이어별 히든 벡터들에 가중합을 한 결과입니다.

ELMo 모델은 입력 문장의 토큰 수 만큼의 토큰 임베딩 들을 반환하게 됩니다.

 

먼저, 각 단어의 표현을 얻기 위해 LM (bi-LSTM)을 실행합니다.

freeze (pre-trained) language model 을 지도학습 모델에 넣는데, 

이 때 Tag LM 에서 한 것 처럼 중간 레이어에 넣을 수도 있고,

output 을 내기 위한 소프트맥스를 수행하기 전에 ELMo 표현을 사용할 수도 있습니다. 

 

Tag LM 모델에서와 동일한 그림으로 설명하고,

동작 방식도 똑같이 설명합니다. 

 

이런 작은 개선점을 반영한 ELMo 를 통해 NER 작업을 수행했을 때 0.3% 의 향상을 보였습니다. 

0.3% 하는 결과뿐만 아니라, ELMo representation 을 거의 모든 NLP 작업에 사용하여 훨씬 더 많은 성능 향상을 얻을 수 있다는 것을 보여줬기 때문에 사람들은 이 결과에 주목했습니다. 

 

SQuAD QA, Natural language Inference, Semantic Role Labeling, Corefference, 개체인식, 감성분석의 task들의 

baseline 에 ELMo 벡터를 중간에 hidden representation 으로 더하면 예측에 더 도움이 됩니다. 

전체적으로 3% 향상을 보입니다.

보통 1년 동안 한가지 Task 에 대해 새로운 논문을 쓰고 1% 의 성능향상을 얻기 위해 많은 노력을 하기 때문에 이 수치는 정말 엄청난 성능향상으로 볼수 있습니다. 

이 논문은 NAACL 2018 컨퍼런스에서 최우수 논문상을 수상했습니다.

 

위의 그림에서 본 것처럼 스택은 Deep 하지 않고 bi-LSTM 두 개 Layer 뿐이었습니다.

 

lower-level LSTM : 단어의 문법적인 측면을 잘 표현함

                               part-of-speech tagging,  syntactic dependencies, NER

higher-level LSTM : 문맥을 반영한 단어의 의미를 잘 표현함

                                semantic role labeling and question answering

 

ELMo를 공부하며 논문을 정리한 아래 블로그를 보고 이해가 잘 되어서 링크 공유해봅니다.

dongchans.github.io/2019/118/

 

내맘대로 논문 요약하기 - ELMo

ELMo는 Embeddings from language models의 약자인데요, 말그대로 language model을 학습함으로써 각 token에 대한 embedding을 만드는 방식입니다.

dongchans.github.io

 

3. ULMfit and onward

ELMo 와 비슷한 시기에 나온 ULM 핏입니다. (Universal Language Model Fine-tuning)

text classification Task 를 수행한다는 전제로 설명을 합니다.

기본적으로 우리가 하고 싶은 것은 큰 언어 모델을 텍스트분류를 더 잘 하기 위해 정보를 전송한다는 개념을 가집니다.

 

아키텍처는 왼쪽 그림과 같습니다.

 

1. 먼저 큰 말뭉치를 세 개의 은닉층이 있는 LM 으로 학습시킵니다. General Domain 의 lm 을 Pre-train 합니다.2. 그리고 task 에 맞춘 언어모델로 튜닝을 합니다. Fine tune.3. 마지막으로 task classifier 를 fine tune 합니다. 

 

풀어서 말하면, 먼저 대량의 코퍼스로 일반적인 언어모델을 학습하고,

그 모델을 토대로 task 에 등장하는 텍스트에 맞춰서 추가 학습(fine tuning) 한 후,

기존 softmax 레이어를 freeze 하고 분류기에 맞는 prediction unit (softmax 레이어)을 추가하여 classifier를 fine tuning 하는 것입니다.

 

추가로 찾아보니, 2번의 fine tune 과정에서 수행하는 테크닉은 두가지가 있는데, 

레이어 별로 lr 을 조정하고, epoch 에 따라서 lr 을 조정하는 겁니다.

자세한 내용은 아래 블로그를 참고하시면 좋겠습니다.

 

brunch.co.kr/@learning/13

 

전이 학습 기반 NLP (2): ULMFiT

Classifiers from Language Models | ELMo에 이어서, 이번 포스팅에서 다룰 내용은 언어 모델이 학습한 지식을 전이하여 문서 분류기를 학습하는 것입니다. Universal Language Model Fine-tuning for Text Classification (AC

brunch.co.kr

그들은 그리고 1 GPU 모델의 연구에 관심이 있었고, 그에 대한 트릭, 디테일한 부분들이 들어있으니 논문을 찾아보면 된다고 합니다.

 

ELMo부터 제대로 이해하고 올게요 교수님..

 

Text classifier 의 error rate 을 비교한 자료입니다.

ULMFiT을 통해 error rate 을 크게 낮췄다는 얘기를 하고 있습니다.

여기 데이터 셋 중 IMDb 는 감성 분석을 위한 텍스트분류 데이터 셋이고, TREC 는 topical 텍스트분류를 위한 셋입니다.

 

우측의 그래프에서는 많은 양의 데이터로 학습을 시킨다면 결과가 좋다는 의미입니다. 

이 그래프에서 파란색 선은 텍스트분류기를 지도 학습하는 방법이고, 이는 많은 데이터가 있어야 잘 할 수 있습니다. 

주황색 선은, ULMFiT 으로 이 전이학습을 이용한다면, 학습데이터를 적게 사용해도 결과가 꽤 잘 나옵니다.

그리고 초록색 선은, 파인 튜닝을 통해 domain specific 하게 만드는 과정을 말하며 이 역시 유용함을 보여줍니다.

 

이후에는 발전된 내용들입니다.

1 GPU day 의 학습시간이 소요되는 ULMFiT 에서 

GPT, BERT, 그리고 2019년 2월 훨씬 더 많은 학습을 한, 더 크고 더 좋은 GPT-2 모델이 소개되었습니다.

 

이 장표에서의 결과는 GPT-2 에서 나온 언어모델의 결과 중 소개된 아주 좋은 예 입니다. 

앞에는 사람이 쓴 몇 문장으로 문맥을 제공하고, 이 후 언어모델이 더 많은 텍스트를 생성한다고 하면 아래 아래와 같습니다.

 

그것은 과학자가 그들의 독특한 뿔인 Ovid's Unicon, 이 네 뿔 달린 은백색의 유니콘을 이전에는 과학에 알려지지 않았던 것에서 유래합니다.

 

이것은 어쨋든 문맥의 흐름이 이어진다는 것에서 언어모델이 잘 만들어졌다. 좋은 텍스트를 생산한다. 라고 말합니다.

 

아래 동영상을 보면, 지난 LM 강의에서 봤던 모델 대비해서 정말 그럴싸해 보입니다.
www.youtube.com/watch?v=XMJ8VxgUzTc&fbclid=IwAR2xgRshy2wu0nnHXGy-pFOeooiXNPUMz1FViTBaeBh13zks5aQw3mOdDmo

 

 

그리고 이 모델은 Fake news 등의 악용의 가능성이 있어, 공개하지는 않고 light version 만 공개했다고 합니다.

이미 아시겠지만 2020년 6월 11일 (베타) GPT-3 베타버전이 나왔군요.

github.com/openai/gpt-3

 

openai/gpt-3

GPT-3: Language Models are Few-Shot Learners. Contribute to openai/gpt-3 development by creating an account on GitHub.

github.com

2020년 5월 도입된 이전버전 GPT-2보다 2배 이상 크다. 2020년 7월 현재 베타 테스트 중에 있으며, 사전 훈련된 언어의 자연어 처리(NLP) 시스템의 일환이다.

 

그리고, 신청을 통해 제공된 gpt-3 API 를 활용한 다양한 서비스를 보여주는 사이트도 있다고 합니다.

gptcrush.com/resource/flipbook-animator/

 

Flipbook Animator on GPT Crush - Demos of OpenAI's GPT

Text to Frame by Frame Animation

gptcrush.com

 

그리고 아주 재밌는 활용 사례를 정리한 조코딩 님 유튜브 링크도 첨부합니다. (문제되면 삭제하겠습니다.)

www.youtube.com/watch?v=I7sZVrwM6_Q

 

리소스가 더 커지고 있다는 점 외에,

표시된 세 시스템에서 같은 점은 트랜스포머 아키텍처를 사용한다는 점입니다.

트랜스포머 아키텍처는 매우 강력할 뿐만 아니라 기술적으로도 더 큰 사이즈로 scaling 하는 것을 가능케 했습니다. 

다음 강의에서 트랜스포머 논문의 저자 중 한 명이 자세히 소개한다고 합니다. 

 

반응형

댓글