본문 바로가기

컴퓨터공학

Perceiver IO: a scalable, fully-attentional model that works on any modality

반응형

https://huggingface.co/blog/perceiver

 

Perceiver IO: a scalable, fully-attentional model that works on any modality

Perceiver IO: a scalable, fully-attentional model that works on any modality TLDR We've added Perceiver IO to Transformers, the first Transformer-based neural network that works on all kinds of modalities (text, images, audio, video, point clouds,...) and

huggingface.co

https://arxiv.org/abs/2107.14795

 

Perceiver IO: A General Architecture for Structured Inputs & Outputs

A central goal of machine learning is the development of systems that can solve many problems in as many data domains as possible. Current architectures, however, cannot be applied beyond a small set of stereotyped settings, as they bake in domain & task a

arxiv.org

본 포스팅은 위의 글의 번역본이다. 시작!

 

TLDR

Perceiver IO는 모든 종류의 modality(text, image, audio, video, point clouds .. )를 다룰 수 있는 transformer 기반의 네트워크이다. 본 포스팅은 모델의 기술적인 깊은 설명을 다룬다. 

 

Introduction

2017년에 처음 공개된 Transformer (Vaswani et al)은 인공지능 분야에서 큰 열풍을 일으켰으며, machine translation에서 SOTA를 달성하였다. 2018년도, transformer encoder를 이용한 NLP 모델인 BERT가 제안되었고, 성능은 월등했다. 

 

그 후 얼마 지나지 않아서, AI 연구자들은 다른 도메인에서도 BERT를 사용하고자 하는 노력들을 해왔다. 몇가지 예시들은 다음과 같다. 

  • Wav2Vec2 (Facebook AI) : 오디오 도메인으로의 확장
  • Vision Transformer (Google AI): vision task
  • Video Vision Transformer (Google AI): video로의 확장

large scale pre-training를 통해 모든 도메인에서 성능향상을 보였다.

 

하지만 Transformer에는 너무나도 큰 한계가 정해져 있다. Transformer의  self attention은 메모리와 연산량 측면에서 굉장히 안좋은 성능을 보인다. 모든 layer에서 pairwise dot product를 통해 모든 input으로 부터 query와 key를 추출한다. 그러므로 preprocessing을 거치지 않는이상 high-dimentsional data에 self-attention을 적용할 수 없었다. 예를 들어 Wav2Vec2의 경우 feature encoder를 통해 raw waveform을 feature sequence로 변경하여 사용하였다. Vision Transformer (ViT) 에서는 input image를 non-overlapping patch (token) 으로 나누어 사용했다. 또한 Video Vision Transformer에서는 non-overlapping spatio-temporal 토큰을 추출하여 사용하였다. 이렇게 특정 modality에 Transformer을 적용하기 위해서는 token sequence로 바꿔주는 과정이 꼭 필요했다. 

 

The Perceiver

오늘 소개하는 Perceiver는 self-attention을 input이 아닌 latent variable에 적용함으로써 이 문제를 해결하고자 한다. Input (text, image, audio, video) 는 latent와 cross attention 할 때만 사용이 된다. 이러면 latent space에서 연산이 이루어지기 때문에, 연산량을 현저히 줄일 수 있다. 더이상 input size에 대한 quadratic dependency가 없어진 것이다. Transformer Encoder는 input size에 선형적 관계를 가지고 있으나, latent attention은 input 사이즈와 무관하다. Perceiver 논문 다음으로 나온 Perceiver IO의 경우, 해당 아이디어를 임의의 사이즈의 output에도 대응할 수 있도록 확장하였다. Output에도 cross attention을 해서 사용하는 것이다. 본 포스팅에서는 Perceiver와 Perceiver IO라고 지칭하는 것들 둘 다 Perceiver IO로 받아들이시면 된다. 

 

다음 섹션부터는 구현을 살펴보면서 Perceiver IO가 어떻게 작동하는지 살펴볼것이다. tensor와 shape 위주로 자세히 설명되어있다. HuggingFace가 제작한 Transformer 시리즈 라이브러리를 사용하여 설명한다. 

 

모든 Perceiver 종류들은 PerceiverModel Class에 기반하여 구현되었다. PerceiverModel를 초기화하기 위해서는 다음과 같은 3가지의 컴포넌트가 필요하다. 

  • Preprocessor
  • Decoder
  • Postprocessor

물론 위의 3가지는 선택사항이다. Preprocessor의 경우에는 input를 embedded 하지 않은 경우에만 필요하고, Decoder의 경우에는 Perceiver encoder의 output (last hidden state of the latent)을 더 유용한 것으로 decode 하고 싶은 경우에만 사용한다 (classification logit이나 optical flow 같은). Postprocessor는 decoder의 output을 원하는 특정한 feature로 바꾸고 싶을때만 사용한다 (auto encoding할때만 필요하다. 뒤에서 더 언급).

 

모델 Overview는 다음과 같다. 

Perceiver architecture

가장 먼저, input (any modality나 가능)은 필요시 Preprocessor을 통해 전처리가 된다. 다음으로, 전처리된 input은 Perceiver encoder의 latent variables와 함께 cross-attention을 수행한다. 여기서 latent variable은 Query를, 전처리된 input에서는 Key와 Value 값을 뽑는다. 그 후, Perceiver encoder는 여러개의 self-attention layer을 거치며 latent embedding을 업데이트 시킨다. Encoder는 (batch_size, num_latents, d_latents) 사이즈 텐서인 last hidden state를 반환한다.  그 다음 디코더는 latent의 final hidden state를 유용한 value로 decode 하는 역할을 한다. Cross-attention을 사용해서 수행이되고, latent는 key와 value로 trainable embedding은 query로 mapping하여 사용한다. 마지막으로 postprocessor는 decoder의 output을 특정 feature로 뽑아준다. 

 

이제부터는 text 데이터에서 Perceiver를 어떻게 사용했는지 코드를 보면서  살펴보자. 너무 길어지는 것 같아 다음 포스팅으로 넘기도록 하겠다! 아래 링크들에서 확인 가능합니다!

 


Perceiver IO: Text Classification

https://oculus.tistory.com/60?category=500795 

 

Perceiver IO: Text Classification

지난 포스팅에 이어 Perceiver IO의 적용에 대해 코드 단위로 알아보도록 하겠다. Huggingface에서 구현한 라이브러리를 중심으로 설명을 한다. Perceiver IO의 기본개념에 대해서는 아래의 이전포스팅을

oculus.tistory.com

Perceiver IO: Image Classification

https://oculus.tistory.com/61?category=500795 

 

Perceiver IO: Image Classification

지난 포스팅들에 이어, 오늘은 perceiver IO를 Image Classification에 적용한 예제를 살펴보도록 하겠다. Perceiver IO의 기본개념에 대해서는 아래의 이전포스팅을 확인해주길 바란다. Perceiver for Images 앞..

oculus.tistory.com

Perceiver IO: Optical Flow

https://oculus.tistory.com/62?category=500795 

불러오는 중입니다...

 

반응형