들어가며

🦩 Flamingo는 NeurIPS 2022에 Accept 되었던 Google DeepMind의 논문이다. 간단하게 Pretrained된 Vision 모델과 Language 모델을 연결한 새로운 모델 구조를 제시한 논문이라고 설명할 수 있다. 본 포스트에서는 Paper의 Appendix를 참고하여 Flamingo의 구조를 구성하는 각 모듈에 대한 구체적인 이해를 바탕으로 내용을 리뷰하고자 한다. 따라서 Flamingo의 개괄적인 내용은 생략한다.

(paper link : https://proceedings.neurips.cc/paper_files/paper/2022/hash/960a172bc7fbf0177ccccbb411a7d800-Abstract-Conference.html)


 전체 모델 구조

간단한 모델 구조도 (Figure 3: Flamingo architecture overview)

 


Vision Encoder

: from pixels to features

Vision Encoder는 이미지와 텍스트가 섞인 입력 데이터 중, 이미지 데이터의 Feature를 추출하는 역할을 수행하는 모듈

 

  • NFNet(Normalizer-Free ResNet)-F6 모델을 pretrain시킨 뒤 freeze 시켜서 Vision Encoder 모듈로 사용
    • 이미지와 텍스트 데이터 쌍들에 대해서 Contrastive objective을 통해 pretrain함
    • (Appendix B.1.3) 내용
      • 저자는 해당 Encoder를 바닥 부터 새롭게 학습시켰다고 함 (trained from scratch)
      • Vision Encoder와 별개로 BERT를 사용한 Language Encoder를 함께 학습시켰는데, Vision과 Language 데이터 쌍은 각 Encoder를 통과하면서 공유되는 embedding space위에 표현됨
        • 실제 Flamingo 모델에서는 Vision Encoder의 가중치만 사용하고, Language Encoder는 사용하지 않음
      • 해당 embedding된 값들을 통해 Contrastive learning 수행
        • Multi-class cross-entropy를 사용하여, 같은 쌍에 속하는 두 embedding 값의 유사도는 커지고 다른 쌍에 속하는 두 embedding 값의 유사도는 작아지도록 함
        •  text-to-image constrastive loss 와 image-to-text constrastive loss를 사용해서 두 loss의 합이 최소가 되도록 학습함
  • 이미지 데이터의 경우,  2D인 해당 Layer의 최종 산출물을 1D로 Flatten함 (2D → 1D)
  • 비디오 데이터의 경우,  초당 1장의 이미지(1 FPS)로 샘플링한 뒤 이미지 처리와 동일한 방식을 각각 수행한다(3D → 1D )
    • 단, 비디오의 시간 순서 정보 손실을 방지하기 위해서 temporal embedding값을 각 프레임 이미지 데이터에 더해준다.  
  • 이후 1D Sequence는 다음 모듈인 Perceiver Resampler의 입력으로 사용 

Perceiver Resampler

: from varying-size large feature maps to few visual tokens

Perciever Resampler는 Vision Encoder의 산출물을 frozen 된 language 모델에 맞는 입력 형태로 변환하는 징검다리의 역할을 수행하는 모듈

  • Vision Encoder에서 이미지 혹은 비디오 데이터의 feature를 큰 수의 차원에 표현하게 되는데, 이를 고정된 (논문에서는 64) 개수의 이미지 토큰으로 변환
  • 위 Figure 5의 예시를 보면, 비디오 데이터의 각 프레임은 Vision Encoder를 통과하여 feature map을 만들게 되고, 이 프레임들의 시간 정보를 유지하기 위해 temporal embedding 값을 더해준 다음 flatten 한 토큰을 learned latent queries와 concat한다. 이를 Perceiver Resample 내의 attention에서 Key와 Value로 사용하게 되고, learned latent queries는 Query가 되어 연산하게 된다.
  • 모듈의 출력 토큰의 개수는 Query로 사용된 learned latent queries의 수와 동일함
  • 이처럼 큰 수의 차원을 갖는 vision feature map을 고정된 수의 차원을 갖는 vision token으로 resample 함으로써, 이후 cross-attention을 수행할 때 계산 비용 측면에서 이점을 가짐

Gated Cross-Attention Dense layer

시각적인 정보와 언어적인 정보를 통합하여 다음 토큰을 예측할 수 있게 해주는 모듈

  • Freeze된 LM을 활용하기 위해서는 Vision feature와 Language feature를 모두 고려한 데이터 표현 방식이 필요함
  • Perceiver Resampler에서 생성한 Vision feature(X)을 Key, Value로 사용하고 Language input(Y)을 Query로 하는 Cross-Attention layer을 통해서 시각적 정보와 언어적 정보를 통합함

  • Cross-Attention layer에서 Masking 기법을 사용
    • Text의 현재 위치 바로 직전에 있었던 Image/Video 만을 고려하도록 Mask를 씌우고 학습함 

https://www.coursera.org/learn/generative-ai-with-llms/lecture/9uWab/course-introduction

 

코스 소개 - 1주차 | Coursera

Video created by DeepLearning.AI, Amazon Web Services for the course "대규모 언어 모델을 통한 생성형 AI". 제너레이티브 AI 사용 사례, 프로젝트 수명 주기 및 모델 사전 학습

www.coursera.org


들어가며

전 직장 동료가 운영하는 모여서 각자 글쓰기 동아리에 함께 참여하게 되면서, 그동안 미뤄왔던 LLM에 대한 기초 공부를 포스팅으로 남기고자 한다. 총 3주차로 짜여진 코스를 주차 별로 수강하면서 LLM 전반에 대한 흐름을 이해하고 간단한 예제를 직접 구현하는 것이 목표이다. 각 강의의 내용을 정리하고 이해를 돕기위해 영상에 나오는 그림들을 첨부할 예정이다.


➡️ Generative AI & LLMs

  • LLM에 입력값으로 전달하는 텍스트를 Prompt라고 함
    • 일반적으로 수천 단어를 입력할 수 있지만, 모델마다 상이함
  • LLM의 결과값은 Completion이라고 함
    • 즉, LLM의 inference값
    • 원래 입력한 Prompt 텍스트와 생성된 텍스트를 포함

➡️ LLM use cases and tasks

  • 최근 LLM과 Generative AI는 chat bot 개발에 집중됨
  • Prompt를 기반으로 에세이를 작성하거나, 텍스트를 요약하거나, 서로 다른 두 언어간의 번역 작업을 수행할 수 있음
  • 자연어를 기계 코드로 번역할 수 있음
  • 뉴스 기사를 입력하여 모든 사람과 장소를 식별하는 작업을 할 수 있음 (NER: Named Entity Recognition)
  • 외부 데이터 소스와 연동해서 LLM을 강화하는 작업을 할 수 있음
    • Pretrain하는 과정에서 알지 못하는 정보를 모델에 제공하여 추가로 학습시키는 과정

➡️Text generation before transformers

  • 생성 알고리즘은 새로운 기술이 아님
    • 기존 RNN은 당시에 잘 수행되었지만, 부족한 계산 자원과 많은 메모리 사용으로 인해 제한적이었음
    • RNN의 단점을 해결한 Transformer 아키텍쳐의 등장으로 오늘날의 Generative AI 발전이 가능했음
      • GPU를 사용할 수 있도록 효율적인 확장이 가능함
      • 입력 데이터를 병렬처리하여 더 큰 학습데이터를 활용할 수 있음 

➡️Transformers architecture

Transformer 아키텍처의 RNN과 다른 특징들을 통해 언어 모델 성능이 크게 향상되었음

  • 문장 내에서 단어와 인접한 단어들 뿐만 아니라 다른 모든 단어와의 관련성을 학습함 (Self-Attention, 향후 강의에서 자세히 다룸)

 

Transformer 구조는 EncoderDecoder로 분리할 수 있으며, 서로 연동되어 작동하고 여러 유사점을 가짐

Transformer의 구조 예

 

텍스트를 Transformer에 Inputs으로 전달하기 위해서는 토큰화가 선행되어야 함

토큰화 방식 예

  • 토큰화는 단어 문자열을 모델의 Input으로 사용하기 위해 숫자(Token IDs)로 변환하는 방법
  • 토큰화를 통해 얻는 숫자(Token IDs)는 모델이 받아드릴 수 있는 모든 단어의 사전 내 위치를 나타냄
  • 모델을 학습시킬 때와 추론(텍스트 생성)할 때 사용하는 토큰화 방식이 같아야 함

 

변환된 각 토큰은 Embedding 레이어에 전달됨

Embedding 구조 예

  • Embedding 레이어는 학습 가능한 벡터 임베딩 공간
  • 숫자로 표현된 토큰은 Embedding 레이어를 통과함으로써 다차원 벡터로 변환됨 
  • 다차원 벡터로 Embedding하는 과정을 통해 단어 토큰의 의미와 문맥을 학습함

Embedding 방식 예

  • 위 예를 보면, 각 단어 토큰들이 512크기의 벡터로 Embedding 되었음을 볼 수 있음
    • 512는 Transformer 원본 논문에서 제시한 Embedding 벡터 크기이고, 상황에 따라 조절해서 사용할 수 있음

 

Embedding된 다차원 토큰 벡터가 Encoder 및 Decoder의 Input으로 사용되기 전에 마지막으로 Positional Encoding 과정을 거치게 됨

 

Positional Encoding 방식 예

  • 모델의 Input은 병렬적으로 처리되기 때문에, 문장에서의 단어 순서 정보가 누락되게 됨
  • Positional Encoding을 통해 단어 순서의 정보를 더해줌으로써 단어 위치의 관계성을 잃지 않게 됨

 

토큰 벡터와 Positional Encoding 벡터를 합산한 벡터는 Encoder 및 Decoder에 전달되어 Self-Attention 레이어로 전달됨

 

  • 모델 학습 중 학습되는 Attention Weight는 해당 입력 문장 내에서 각 단어가 다른 모든 단어에 미치는 중요도를 대변함

 

Self-Attention을 통해서 모델은 문장 내 각 단어의 문맥적 종속성을 잘 포착할 수 있지만, 이러한 일련의 과정을 여러 다른 주체가 수행하도록 하는 방법이 Multi-headed Self-Attention

  • Multi-headed Self-Attention은 여러 세트(head)의 Self-Attention 과정을 서로 독립적으로 병렬적으로 학습하는 방법
  • 여러 head에서 입력 문장을 각기 다른 각도에서 바라보며 학습을 진행한다고 해석할 수 있음
    • 각 head의 Attention weight는 무작위로 초기화 되고 충분한 Train데이터와 시간이 주어져 입력 문장에 대한 다양한 측면을 학습하는 것
  • head의 수는 모델마다 상이하지만 12~100개가 일반적

 

모든 head의 Attention weight가 계산 되고 나면, Fead forward 레이어를 통해서 모든 토큰의 Logit 벡터를 얻을 수 있음

이후에 Logit벡터를 Softmax 레이어를 통과시켜 문장 내의 모든 단어에 대한 확률값을 구할 수 있음

Softmax 값 예

  • Softmax 출력값에는 입력 문장에 있는 모든 단어에 대한 확률이 포함됨
  • 가장 높은 확률을 갖는 단어가 모델이 예측하는 단어가 됨
  • Task에 따라서 이 최종 벡터를 활용하는 방법이 다양할 수 있음

 

➡️Generating text with transformers

이전 lecture에서 Transformer의 아키텍처 주요 구성 요소들에 대해 개요를 소개했고, 이번 lecture에서는 전체 프로세스에 대한 설명을 진행

 

Example) 프랑스어를 영어로 번역하는 Transformer

  1. Transformer를 학습시킬 때 사용한 토큰화 방식을 사용해서 입력 문장(프랑스어)의 단어들을 토큰화
  2. 토큰들은 Embedding 레이어를 통과하여 다차원 벡터로 변환됨
  3. 변환된 벡터는 Encoder의 Multi-headed Self-Attention 레이어와 Feed forward 네트워크를 통과하여 출력됨
    1. 이때의 Encoder 출력값은 입력 문장의 구조와 의미를 심층적으로 표현함
  4. Encoder의 출력값은 Decoder의 중간에 삽입되어 Decoder의 Self-Attention의 일부 입력값으로 사용됨
  5. 문장의 시작을 알리는 토큰이 Decoder의 입력에 추가됨
  6. 이 상태가 되면 Decoder가 다음 토큰을 예측하도록 트리거되고, Encoder의 출력값을 바탕으로 다음 토큰을 예측함
    1. Decoder의 Self-Attention 출력은 Feed forward 네트워크와 Softmax를 거쳐서 첫 번째 토큰을 예측하게 됨
  7. 모델이 문장 종료를 알리는 토큰을 예측할 때 까지 Decoder의 출력 토큰을 Decoder의 입력 토큰으로 다시 전달하여 다음 토큰 예측을 트리거하며 이 루프를 계속함
  8. 이 시점에서 최종 예측된 토큰들을 해독해서 다시 단어로 변환하여 최종 출력을 생성함

 

위의 번역 예제에서는 Encoder와 Decoder를 모두 사용했지만, Encoder만을 사용하는 등의 아키텍처 변형을 할 수 있음

  • Encoder만을 사용하는 모델
    • 입력 시퀀스와 출력 시퀀스의 길이가 같지 않도록하는 레이어를 추가함으로써 감정 분석이나 분류 문제를 풀 수 있음
    • e.g. BERT
  • Encoder와 Decoder를 모두 사용하는 모델
    • 번역 문제와 같이 시퀀스 간 작업에서 잘 작동함
    • e.g. BART, T5
  • Decoder만을 사용하는 모델
    • 오늘날 가장 일반적으로 사용됨
    • e.g. GPT, BLOOM, Jurassic, Lama

 

 

+ Recent posts