NLP

ELMO, BERT, GPT, 그리고 ViT

알 수 없는 사용자 2021. 6. 11. 18:33
반응형

본격적인 글에 앞서 이 글은 CV를 연구중인 사람이 쓴 NLP 정리 글이다. 따라서 큼직한 내용의 이해를 목표로 하며 작성자의 주관적인 내용이 많이 포함될 수 있다.

 

위 사진... 나이대가 조금 있는 사람이라면 어렸을 적(어쩌면 어리기 전일수도..?) 한번쯤은 봤을 캐릭터들이다. 

아마 빨간 애가 ELMO이고 머린 긴 노란 녀석이 BERT일 것이다.

 

NLP 계열의 큼지막한 녀석들을 나열해보자면 다음과 같다.

 

2017 Jun : Transformer

2018 Feb : ELMo

2018 Jun : OpenAI GPT

2018 Oct : BERT

2019 Feb : OpenAI GPT-2

2020 Jun : OpenAI GPT-3

 

+.. T-NLG?

 

물론.. 여기에 비교적 최근 나온 DALL.E 나 CLIP 같은 녀석도 껴야 하나 고민이 되었지만 그쪽 계열은 CV와도 연관 관계가 깊으니 빼고 저정도 될 것이다.

 

2017년 Transformer의 등장이 있었지만 아직 LSTM이 많이 쓰이던 때가 2018년이다.

그런 관점에서 보았을 때 ELMO는 기존 모델들의 word-embedding을 개선시킨 녀석이라 말할 수 있다.

 

일단 기존에는 '단어'에 집중하여 워드임베딩을 했었다.

그러나 이러한 방식에는 큰 맹점이 있다. 바로 문장별로 단어의 의미가 다를 수 있다는 것이다.

이전 포스팅에 잠깐 등장하였지만 '개가 참 귀엽다' 와 '너 참 개 같다' 에서의 '개'는 완전히 다른 용도로 쓰이는 단어이다. 그럼에도 불구하고 기존 워드임베딩은 '개'라는 단어를 하나의 벡터로 임베딩 시킴으로써 서로 다른 단어의 뜻을 같은 벡터로 나타내려 시도했었다.

 

이에 반기를 들고 나타난 녀석이 바로 엘모이다. 엘모는 임베딩을 할 때 문장 전체의 context를 담아서 임베딩을 하려 시도하였다. 미리 학습된 (pretrain) LSTM 모델에 문장 전체를 넣어 각 단어의 임베딩 벡터를 구하는 방식이다.

이 때 bidirection LSTM을 사용하였으며 기존 모델과는 다르게 residual connection을 추가하였다. (input feature를 조금 더 잘 전달하고 그래디언트 배니쉬를 억제하였다.)

ELMO

이녀석은 결과적으로 단어들의 word embedding을 바꿔주었고 이를 다양한 데이터셋과 여러 baseline에 붙였을 때 전반적인 성능 향상을 보여주었다.

사실 오늘의 메인 콘텐츠는 엘모가 아니기에 이 정도 설명만 하고 넘어가도록 하자.

 

그럼 이번에는 GPT와 BERT에 대해 조금 알아보자

GPT는 Generative Pre-trained Transformer의 약자로 단어들이 주어졌을 때 다음 단어를 예측하는 Task를 통해 pretrain한 녀석이다.

BERT는 Bidirectional Encoder Representations from Transformers의 약자로 문장에 빵꾸를 내서 맞추는 Masked Language model이라 할 수 있다. 이 때 문장 앞과 뒤쪽 모두 양방향으로 본다하여 Bidirectional이라는 말이 붙었다.

 

GPT는 기존 Transformer에서 (이전게시물을 참고하자) Masked Multi-Head Attention 부분이라 생각하면 편하다.

 

그리고 BERT는 기존 Transformer에서 Encoder만 사용한 녀석이라 생각하면 편하다. 

 

BERT는 self-attention을 통해서 맥락 정보를 충분히 뽑아내는 대신 다음 단어를 예측하는 것은 조금 덜 잘한다.

이에 반해 GPT는 다음 단어 예측은 잘하지만 해당 단어 뒤쪽의 정보는 알 수 없다.

 

사실 이보다 더 자세히 설명하고자 한다면 얼마든지 설명 할 수 있지만 일단은 GPT는 살짝 미뤄두고 BERT에 대해 조금 더 깊게 파고들어보자.

 

BERT는 기본적으로 Self-attention을 이용한다. 따라서 그냥 아무런 문장이나 다 훈련 데이터로 사용이 가능하다. 실제로 BERT는 위키피디아와 BooksCorpus을 이용해서 레이블이 없는 문장들을 가지고 학습하였다.

또한 인코더를 BERT-Base는 12개 BERT-Large는 24개를 쌓아올려 Large의 경우 340M 정도의 파라미터 수를 가지고 있다. 많다고 생각되었지만 요즘 모델들을 보면 또 그렇게 많은 것 같지도 않다.

BERT는 훈련 데이터가 입력으로 들어가면 15퍼센트의 단어들을 Masking 한다. 즉, 몇몇 단어들을 가린다. 그리고 신경망이 그 가린 단어들을 예측하도록 한다. 근데 최종적으로 원하는 용도로 사용하기 위해 finetuing을 할 때는 Mask라는 것이 없으므로 15퍼센트 중에서 10퍼센트는 그냥 두고 10퍼센트는 다른 단어로 바꿔서 (80퍼는 Masking) 넣어준다.

 

예시를 들어보자면 [이 블로그 글은 참 읽기 좋다.] 라는 문장을 랜덤하게 [이 (Masking) 글은 참 읽기 좋다.] 로 바꾸는 것이다. 그러면 우리는 이 모델이 맞춰야 하는 정답을 알고 있기 때문에 Loss를 정의하여 모델을 학습시킬 수 있다. 

 

다른 정리 글에서 이해를 정말 쉽게 도와주는 예시가 있어 가져와봤다. https://wikidocs.net/115055

'My dog is cute. he likes playing' 라는 문장을 모델에 넣어준다고 생각해보자.

이 때 dog를 Mask하면 해당 위치의 출력이 무엇을 예측하였는지 판단한다. 지금은 cat이라 예측하였으므로 틀렸다. 

이걸 이제 어떨때는 Mask를 하고 어떨때는 단어를 바꾸고 어떨때는 또 그대로 두는 것이다.

지금 보면 he -> king으로 바뀌었다. 이때 모델을 통과한 단어는 he를 예측해야 하는 것이다.

또한 play는 그대로 play이다. 모델은 이 그대로인 녀석을 그대로 출력을 내보낼 수도 있어야 한다.

즉, 문맥을 통해 파악하여 적당한 단어들을 내보낼 수 있어야 한다는 것이다.

 

이런 Mask 말고도 BERT는 2개의 문장을 주고 이어지는 문장인지 아닌지 구별하는 학습도 진행한다. 위 사진에서 다 MLM Classifier(Masked Language Model) 인데 맨 앞에 녀석은 NSP Classifier이다. NSP는 Next Sentence Prediction의 약자로 다음 문장인지 아닌지 맞추는 것이다. 저기에 일종의 Label을 output으로 가지게 하여 이어지는 문장이면  IsNextSentence 라벨을, 아니면 NotNextSentence라벨을 출력하게 만들었다. 

 

이렇게 훈련된 BERT는 다양한 Task에 응용될 수 있다.

기본적으로 classification으로 사용할 수 있다.

지금 이 구조를 잘 기억해두자. 문장이 들어왔을 때 제일 첫 output을 class token으로 활용한다. 

Q&A의 경우 질문이 들어온 곳의 ouput 들을 가지고 Answer를 내보낼 수 있다.

 

 

자 이제 이런 사전 지식을 바탕으로 CV에 어떻게 적용되는지 한번 훑어보자.

An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (ICLR 2021 Oral)

ICLR 2021 오랄에 나온 논문이다. 사실 작년 10월부터 이미 각광받던 논문이다. 줄여서 ViT라고 부른다.

 

기본적인 아키텍처는 다음과 같다. 눈치가 빠른 사람이라면 BERT처럼 생겼다는 것을 알 수 있을 것이다.

그렇다... 무려 이미지를 패치단위로 쪼개서 단어 넣듯이 넣어주는 녀석이다.

다만 이미지는 2D 이기 때문에 이걸 1자로 쭉 펴서 넣어준다. 이 과정에서 버트랑 똑같이 (버트에서도 Position Embedding은 당연히 들어간다.) 포지션 임베딩을 해준다. 그리고 가장 첫 번째 output을 classification token으로 삼아 class를 분류하는 것이다. 

이 ViT라는 녀석은 재밌게도 Transformer를 사용했기 때문에 데이터를 매우 많이 넣어줘야 한다. 데이터가 적을때는 기존 모델들보다 성능이 안좋지만 (BiT가 ResNet 기반의 기존 모델이다.) 충분한 데이터를 가지고 학습을 할 때 성능이 계속 증가하여 결국 SOTA를 찍은 모습이다. 아마 현재는 2위 자리를 지키고 있을 것이다.

 

ViT의 등장은 CV쪽에서 꽤나 큰 파장을 불러 일으켰다.

기존 Self-Supervised Learning 쪽에서 Contrastive Learning 계열이었던 MoCo가 MoCo v3를 발표하며 backbone으로 ViT를 사용하기도 했다. (관련 게시물도 추후 다뤄보도록 하겠다.)

또한 MLP-Mixer라던지 F-NET 등의 Transformer에서 attention 부분을 MLP로 대체하거나 푸리에변환으로 대체하는 등의 움직임도 보이고 있다.

 

하지만 그 중에서도 개인적으로 굉장히 재밌게 본 논문이 하나 있어 짧게 소개하고자 한다.

SiT: Self-supervised vIsion Transformer 라는 논문으로 4월쯤에 arxiv에 등재된 논문이다.

모델 아키텍처는 다음과 같다. 굉장히 흥미로운데, 버트 기반의 Encoder를 제대로 활용하여 이미지를 Self-supervised 한다. 이미지에 augmentation을 가한 뒤 (색을 바꾸거나 블러를 하거나 노이즈를 넣거나 다른 이미지의 일부분을 잘라 넣는다.) 이를 엔코더에 넣어 원래 이미지를 만들도록 하는 것이다.

마치 버트에서 마스크를 씌운것과 같은 이치이다.

 

또한 동시에 이미지를 랜덤하게 회전을 시켜 90도, 180도, 270도, 0도 4개중 하나를 맞추도록 한다. 이는 SSL에서 이전에 연구되었던 한가지 방법인데 이를 한번에 트랜스포머에 넣은 것이다.

 

이 뿐만 아니라 representation vector를 2번째 자리 output으로 받아내 contrastive learning 도 함께 진행한다. 즉, 이미지를 서로 다른 2가지 방식으로 augmentation을 진행하여 그 2개의 output은 같아지도록 학습한다. 같은 이미지에서는 같은 vector가 나오도록 말이다.

 

이 3가지를 한번에 진행한다는 것이 개인적으로는 Transformer에 저 뒤쪽에 남는 많은 output을 모두 사용할 수 있기에 정말 좋은 듯 하며 또한 이 모델은 데이터의 수 또한 적은 데이터를 가지고 잘 학습되었다는 것이 인상적이었다.

 

이 외에도 생성모델에서도 Transformer는 연구되고 있다.

TransGAN이라는 제목의 이 논문은 CNN을 전혀 사용하지 않은 GAN이다. 이 모델도 다음에 따로 포스팅을 해보도록 하겠다. 일단 간단히 보이는 것 처럼 이미지를 패치단위로 나누어 생성하고, Real/Fake를 판단한다. 이 또한 ViT의 형식이라 생각하면 된다.

 

이 외에도 GANsformer 라는 논문도 Transformer의 attention을 활용하여 만들어진 생성모델이다.

이처럼 CV 분야에서도 활발하게 Transformer가 사용되고 있는 점을 봤을 때 관련 지식을 빠르게 습득하는 것은 매우 중요한 과제로 보인다.

반응형

'NLP' 카테고리의 다른 글

Transformer를 알아보자 [Attention is all you need]  (0) 2021.06.11
NLP Task 정리  (0) 2021.06.11
인공지능에서 Attention 이란? _ seq to seq  (0) 2021.06.11
NLP 벤치마크 GLUE  (0) 2021.06.11
RNN과 LSTM  (0) 2021.05.02