ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Deep Learning] Chapter12 Transformers2
    Deep Learning 2024. 1. 9. 19:13
    반응형

    12.5. Transformers for Natural Language Processing

    지금까지 transformer 구조에 대하여 공부하였다. 본 섹션에서는 transformer 가 어떻게 NLP tasks에 사용되는지 소개한다. NLP tasks 들은 text 를 words 혹은 word fragments 와 같은 token 으로 나누는 tokenizer 로 시작을 한다. 그리고 각 token 들은 사전에 학습된 embedding 으로 mapping 된다. 그리고 embeddings 는 series of transformers 의 입력으로 주어진다.

    이들이 순서대로 어떻게 동작하는지 살펴본다.

    12.5.1. Tokenization

    Text processing pipeline 은 tokenizer 로 시작한다. Tokenizer 는 text 를 vocabulary 에 있는 token 들로 나눈다. 앞선 예제에서는 이러한 token 들을 “word” 단위로 나누었지만 “word” 단위로 나누는 것에는 많은 문제점들이 있다.

    • “word” 를 token 의 단위로 사용했을 때의 문제점
      1. Vocabulary 에 없는 단어들이 “꼭” 생긴다. (이름, 신조어 등)
      1. punctuations, (””, ‘’, .?!-’) 은 중요한 문장의 요소임에도 불구하고 이들과 같은 부호들을 어떻게 처리할지 불분명하다.
      1. 서로 다른 접미사를 갖는 같은 의미를 갖는 단어들에 대해서 서로 다른 token 들을 vocabulary 에 포함해야한다. (e.g. walk, walks, walked, walking) 또한 이들이 서로 밀접한 관계를 갖고 있음을 나타낼 방법도 없다.

    이를 해결하는 간단한 방법은 punctuation과 letters 를 기준으로 vocabulary 를 생성하는 것이다. 하지만 이럴 경우 입력 text 를 너무 잘게 쪼개게 되어 각 letters 간의 관계도 학습하게 되어 impractical 하다.

    실제로는 letter 와 word 의 중간 단계 즈음을 사용한다. 더 크고 less frequent 한 words 들로 조합할 수 있는 자주 사용되는 words나 fragments 들로 vocabulary 를 구성한다.

    walking, walk, walked, walks → walk, ing, s, ed, sleep

    구체적으로, 자주 사용 되는 sub-string 들을 greedy 하게 merge 해가는 byte pair encoding 과 같은 sub-word tokenizer 를 사용하여 vocabulary 를 구성한다.

    12.5.2. Embeddings

    Vocabulary, V\mathcal{V} 에 있는 각 token 들은 unique한 word embedding에 맵핑 된다. 그리고 모든 embeddings 들은 matrix, ΩeRD×V\bold{\Omega}_e \in \R^{D\times |\mathcal{V}|} 에 저장된다. 이를 위해 NN개의 input tokens들은 먼저 TRV×N\bold{T} \in \R^{|\mathcal{V}|\times N} 의 matrix로 맵핑 돼야한다. 여기서 T\bold{T}nthn^{th} column은 V×1|\mathcal{V}|\times 1 의 크기를 갖는 one-hot vector 이다.

    Embeddings, X=ΩeT\bold{X} = \bold{\Omega_eT} 와 같이 연산 된다. (See Fig. 12.9)

    12.5.3. Transformer Model

    Text를 나타내는 embedding matrix, X\bold{X}KK개의 transformers의 입력으로 들어간다. Transformers는 크게 3가지의 타입이 있다.

    Encoder 는 text embedding 을 다양한 tasks에 사용할 수 있는 representation 으로 transform 한다.

    Decoder 는 input text 를 이어 다음 token 을 예측한다.

    Encoder-decoder 는 하나의 text 를 다른 text 로 mapping 변환하는 sequence-to-sequence tasks에 사용된다. 이러한 모델들을 다음 섹션들에서 설명한다.

    12.6. Encoder model example: BERT

    BERT30,00030,000 개의 tokens을 갖는 vocabulary를 사용하는 encoder model이다. 입력 tokens 들은 10241024 의 dimension을 갖는 word embeddings 로 맵핑되고 2424개로 이어진 transformers의 입력으로 주어진다. 각각의 transformer 에는 16개의 heads를 갖는 self-attention 메커니즘을 포함한다. V,Q,KV, Q, K 들은 각각 6464 의 dimension을 갖는다. (Ωvh,Ωqh,ΩkhR1024×64\bold{\Omega_{vh}, \Omega_{qh}, \Omega_{kh} \in \R^{1024\times 64}}). 마지막 FC layer의 dimension은 40964096 이다. 파라미터의 총 갯수는 약 340M 이다.

    BERT와 같은 encoder 모델들은 transfer learning에 사용된다. Pre-training stage 에서는 self-supervision 의 학습 방법으로 방대한 양의 text corpus로 학습한다. Fine-tuning stage 에서는 앞서 잘 학습된 pre-trained model 을 의도에 맞게 상대적으로 작은 데이터셋으로 학습시킨다.

    12.6.1. Pre-training

    Pre-training stage 에서는 self-supervision 을 사용하여 네트워크를 학습 시킨다. self-supervision 학습 방법은 따로 manually label 들을 구할 필요가 없기 때문에 방대한 데이터를 그냥 사용할 수 있다는 장점이 있다. BERT의 경우 인터넷에서 구한 corpus 의 문장들 사이의 단어를 예측하는 방식으로 학습되었다. (See Fig.12.10)

    학습 과정에서 maximum token length 는 512 이고 batch size 는 256이다. 학습에는 3.3B 크기의 word corpus가 사용되었고 약 50 epoch 정도 학습 시켰다.

    모델이 missing words 를 예측하도록 학습하면 문법 (syntax) 에 대해서도 다소 학습된다. 예를 들어, car, house 앞에서 red 라는 단어를 많이 본 반면, shout 라는 단어 앞에서는 거의 보지 못했을 것이기 때문이다. 또한 상식 (common sense) 에 대해서도 다소 학습한다. 하지만 이러한 정도의 understanding 을 갖는 모델은 그 수준에 제한이 있다.

    12.6.2. Fine-tuning

    Fine-tuning stage 에서는 특정 task에 모델이 잘 동작하도록 파라미터를 optimize 한다. Encoder의 최종 output를 특정 task에 맞게 transform하기 위해 뒤에 추가적인 layer가 붙는다. 특정 tasks들은 아래와 같은 예시가 있다.


    Text classification:

    BERT 에서는 special token, <cls> token 이 각 string 앞에 배치된다. Sentiment analysis (문장이 긍정/부정인지 여부를 파악) 와 같은 task 에 대해서는 <cls> token 에 대한 vector 를 하나의 값 (얼마나 긍정인지? e.g. 0.6: 긍정, 0.3: 부정) 으로 mapping 하여 logistic sigmoid에 입력으로 준다. 그리고 이를 binary cross-entropy loss 를 사용하여 학습한다.


    Word classification:

    Named entity recognition(word classification의 다른 이름) 의 목표는 각 단어가 어떤 entity type (e.g. person, place, organization or no-entity) 을 갖는지 분류하는 것이다. EE개의 entities 가 있을 때 각 word에 관련된 vector를 E×1E\times 1 크기의 vector로 맵핑하여 multi-class cross entropy loss로 학습한다.


    Text span prediction:

    SQuAD 1.1 question answering task는 Question 이 있고 Wiki에서 구한 Answer 가 concatenated 되어 tokenied 되어있다. BERT는 answer를 포함하는 문장의 text span을 예측하는데 사용된다.

    각 token은 text span의 시작 혹은 끝점인지에 대한 2개의 값들로 mapping 된다. (2×12\times 1 크기의 vector) 두 값에 대한 최종 결과들은 각각 softmax 함수에 입력으로 주어져 어디가 시작인지 끝인지를 예측하게 된다.

    12.7. Decoder model example: GPT3 ← 다음주에 계속

    본 챕터에서는 decoder 의 예시인, GPT3 에 대해서 간략히 설명한다. 기본 아키텍쳐는 encoder 와 거의 비슷하고 여러 개의 transformers가 붙어있고 word embeddings 를 입력으로 받는다.

    encoder 는 word embeddings 를 downstream task에 대하여 적용할 수 있는 representation 을 학습하는 것이 목표인 반면, decoder 의 목표는 간단하다. “주어진 sequence 다음으로 올 token을 예측하는 것”.

    12.7.1. Language Modeling

    GPT3 는 autoregressive language model 이다. 예를 들어 “It takes great courage to let yourself appear weak.” 라는 문장이 주어졌다고 하자. 간단히 token은 하나의 word라고 하자. 그러면 전체 문장에 대한 probability 는 아래와 같이 구할 수 있다.

    조금 더 정확히는, autoregressivce model 은 probability, P(t1,t2,...,tN)P(t_1, t_2, ..., t_N) 을 autoregressive sequence로 분해 (factor) 한다고 할 수 있다.

    위와 같은 autoregressive formulation은 각 token 들의 log probability 를 maximize 하는 것과 next token을 예측하는 task 간의 연결 고리를 보인다.

    12.7.2. Masked self-attention

    Decoder를 학습하기 위해 autoregressive model로 input text의 log probability 를 maximize 한다. 이상적으로는 모든 문장들을 한번에 입력으로 주고 이들의 probability를 구하여 gradient를 계산하는 것이 최선이다. 하지만 모든 문장을 한 번에 준다면 문제가 발생한다.

    예를 들어 Pr(great|It takes)Pr(\text{great|\text{It takes}}) 는 “It takes great” 에도 접근하지만 이후에 “courage to let yourself appear weak.” 에도 접근할 수 있다. (예측할 단어와 이후에 나올 단어 간의 attention map을 계산할 수 있음.) 따라서 모델이 뒷 문장을 “컨닝” 한다고 볼 수 있다. 이러한 방식으로는 학습이 적절하게 이루어지지 않는다.

    다행히, tokens는 self-attention layer 에서만 이루어진다. 따라서 attention map에서 현재 token의 오른쪽에 있는 attention 값들을 모두 00 으로만 만들어주면 된다. 이를 위해서 attention layer 에서 softmax 함수에 이전 결과들을 입력으로 주기 전에 오른쪽 값들을 모두 -\infin 로 픽스하면 된다. 이 방법을 masked self-attention 이라고 한다.

    학습에서는 각 token에 해당하는 vector에 FC layer → softmax 를 통과시킨 값과 GT token 값을 비교하여 multi-class cross entropy loss 를 사용하여 계산한다. (See Fig. 12.12)

    12.7.3. Generating text from a decoder

    앞서 masked self-attention 을 통해

    12.7.4. GPT3 and Few-shot Learning

    GPT3와 같은 Large Language Models (LLM) 은 이러한 아이디어를 훨씬 방대한 스케일로 확장하였다. GPT3는 sequence length를 20482048까지 늘렸고 3.2M 의 batch size 를 갖는다. 9696개의 transformers를 포함하며 각 word embedding의 size는 1288812888 이다. Self-attention layer의 head의 갯수는 9696개이고 V,Q,KV,Q,K의 각 vector 의 크기는 9696이다. 300B 개의 tokens 와 175B개의 문장들로 학습되었다.

    아래는 GPT3의 갈색으로 text가 주어졌을 때 GPT가 생성한 문장을 청색으로 칠한 결과이다.

    이러한 스케일의 모델은 놀라운 특성이 하나 있는데, 이들은 다양한 tasks를 fine-tuning 없이도 수행할 수 있다는 것이다. 약간의 examples 들을 주면 이를 가지고 금방 학습할 수 있다.

    갈색은 사람이 준 입력, 청색은 GPT가 생성한 결과이다. 이러한 관찰을 바탕으로 LLM을 few-shot learner 라고 한다. (Context learning 이라고도 함.)

    12.8. Encoder-Decoder model example: machine translation

    Sequence-to-sequence task의 한 예제는 두 언어간의 통역하는 것이다. 이는 source sentence로 부터 좋은 representation 을 계산할 encoder 와 target sentence 를 생성할 decoder 가 필요하다. 바로 encoder-decoder model 을 사용해서 이러한 task 를 해결할 수 있다.

    영어를 불어로 번역하는 예제를 생각해보자. encoder 는 영어 문장을 입력으로 받아 여러 개의 sequences로 이루어진 transformers의 입력으로 주어 각 token에 대한 좋은 representation 을 output으로 낸다. 학습 중에 decoder 는 불어로 된 GT 문장을 입력으로 받아 masked self-attention 을 사용하여 주어진 문장의 다음 token 을 예측하도록 학습된다.

    Decoder 만을 사용한 모델과는 달리, 여기서는 encoder 의 output에도 “attention” 을 한다. 각 불어로 된 출력 token은 이전까지의 출력 tokens (불어) 와 영어로 문장의 모든 tokens 도 함께 condition 으로 받는다.

    이는 decoder의 구조를 약간 변형하여 구현할 수 있다. decoder encoder 는 각각 self-attention 다음으로 FC layer가 있다. 여기서 이 두 사이에 새로운 attention module 을 추가하면 된다. 이 새로운 attention 메커니즘을 encoder-decoder attnetion 혹은 cross-attention 이라고 한다.

    cross-attention 은 query 는 decoder의 embedding 으로 계산되고, key, values 를 encoder의 embeddings 으로 계산한다. (See Fig. 12.14)

    12.9. Transformers for long sequences

    Attention 메커니즘은 각 token 을 모든 tokens와 비교하기 때문에 토큰의 수가 증가하면 연산량이 quadratically 증가한다. Attention 메커니즘에서의 각 token과의 관계를 아래와 같이 visualization 할 수 있다. (See Fig. 12.15)

    연산량에서의 이러한 quadratic increase 는 결국 transformer 에 입력으로 줄 수 있는 sequence의 길이를 제한할 수 밖에 없다. 따라서 다양한 방법들이 입력 token의 length를 늘이기 위해 고안되었다.

    그 중 하나는 self-attentino 을 prune 하거나, interaction matrix 를 sparsify 하는 것이다. (See Fig.12.15c-h). 예를 들어 attention 연산을 convolutional 구조로 제한하여 각 token이 주변 몇 tokens 들과만 interacts 하도록 하는 것이다. 여러 개의 layers 를 거쳐 receptive field 가 커지면서 더 먼 token 들과도 interacts 할 수 있다. 이미지에서 CNN과 같이 kernel size 혹은 dilation 을 다양하게 바꿀 수도 있다.

    위와 같은 vanilla convolutional approach 는 receptive field 가 충분히 커지기 위해 많은 layer가 필요할 수 이따. 이러한 문제를 해결하기 위해 attention 에 앞서 항상 연산이 될 token들을 미리 정해두는 전략을 취할 수 있다. (See Fig. 12.15 g-h) <cls> token 과 같은 token이 이러한 global token 의 예시가 될 수 있다.

    12.10. Transformers for Images

    Transformer 는 원래 text data processing 을 위해 고안되었다. 하지만 transformer가 text 분야에서 대단한 성능을 보이자 이미지에도 transformer 를 적용하는 실험이 이루어졌다. 하지만 이는 두 가지 이유로 좋은 아이디어는 아니다.

    1. 이미지의 pixel은 text 보다 훨씬 많아 self-attention 에서 실질적으로 bottle-neck 이 생길 것이다.
    1. CNN은 각 레이어에서 spatial translation 에 대한 invariant 를 갖도록 좋은 inductive bias 가 있다. 하지만 transformer 는 이러한 inductive bias 까지 학습해야한다.

    이러한 한계에도 불구하고 이미지 transformer는 classification 뿐만 아니라 다양한 taks 에서 CNN 보다 좋은 성능을 보여주고 있다. 이는 아마, 모델의 큰 사이즈와 방대한 데이터로 pre-training 했기 때문이라고 여겨진다. 본 섹션에서는 transformers for images를 다룬다.

    12.10.1. ImageGPT

    ImageGPT 는 transformer decoder 이다. 이미지의 일부분을 받아 나머지 pixel 값들을 채우도록 하는 autoregressive model 이다. 각 픽셀을 token 으로 갖는 ImageGPT는 엄청나게 컸음에도 불구하고 (~6.8B) 64×6464\times 64 의 이미지 밖에 처리하지 못했다. 또한 24bit 의 RGB color space 가 너무 큰 token size를 갖기 때문에 이를 9bit의 color space 로 mapping 하여 token의 수 (V=512|\mathcal{V}| = 512)를 제한하였다.

    하지만 ImageGPT 는 각 pixel 에서의 다른 positional encoding 만을 학습하였다. 이는 곧, 각 pixel 이 주변의 픽셀과 연관이 크다. 라는 것 밖에 학습하지 못했다는 것이다. 아래는 ImageGPT 가 생성한 예시 이미지이다.

    12.10.2. Vision Transformer (ViT)

    Vision Transformer (ViT) 는 ImageGPT 에서 pixel 이 너무 많아 64×6464\times 64 의 작은 이미지로 밖에 생성하지 못했다는 점. 각 픽셀이 주변 픽셀과 연관이 있다. 정도 밖에 학습하지 못하는 문제를 해결하기 위해서 이미지를 16×1616\times 16 개의 patches 로 나누었다. (See Fig. 12.17)

    각 patch 는 학습된 FC layer 에 의해 더 작은 dimension 을 갖는 embedding 으로 mapping 되고 모든 embedding 은 transformer의 입력으로 주어진다. (다시 강조하자면, standard 1D positional encodings 이 학습됨.)

    ViT 는 <cls> token 을 사용하는 encoder 모델이다. 하지만 BERT 와는 다르게 18,00018,000개의 classes 를 갖고 303M 갯수의 이미지 데이터로 supervised pre-training 을 한다. <cls> token 에 해당되는 transformer의 마지막 레이어의 embedding 은 class label 을 predict 하는데 사용된다.

    Pre-training 이 끝나면 마지막 FC layer 만 적절한 class의 크기를 갖는 레이어로 교체하여 fine-tuning을 한다. ImageNet benchmark 에서 ViT 는 11.45%11.45\% 의 top-1 error rate 을 기록하였다. 하지만 이러한 supervised pretraining 에도 불구하고 SOTA CNN 모델의 성능을 뛰어넘지는 못하였다. attention 메커니즘이 CNN의 inductive bias보다 좋은 성능 가지려면 엄청나게 많은 데이터셋으로 학습해야한다.

    (엄청나게 많은 데이터셋으로 학습시키면 ViT가 SOTA 임.)

    12.10.3. Multi-scale vision transformers

    ViT 는 CNN 과는 달리 정해진 scale 에서만 동작한다. 이미지를 다양한 scales 에서 process 하는 다양한 transformers 구조가 제안되었다. CNN과 비슷하게 high-resolution patch 에서 시작하여 점차 channels 을 늘리고 resoltuion은 줄이는 방법을 사용한다.

    이러한 multi-scale transformers의 대표적인 예는 shifter-window or Swin transformer 이다. 이는 이미지를 여러 개의 pathes 와 나누고 patches들을 window 의 grid 로 grouping 한다. self-attention 메커니즘은 각 window 의 grid 내에서 독립적으로 수행된다. (See Fig. 12.18)

    Windows 들은 인접한 다른 transformers의 입력으로 들어가도록 sifted 되어 어떤 patch의 effective receptive field 가 주변 window의 가장자리 바깥으로도 확장되도록 한다. (window 의 가장자리는 windwo 의 중심부 보다 부당한 대우를 받고 있음. window 의 중심부는 주변 patches 와의 관계를 적절히 계산할 수 있지만 window 가장자리에 있는 자기 자신의 바로 옆 patch 와의 관계를 계산할 수 없음.)

    Scale 은 겹치지 않는 (non-overlapping) 2×22\times 2 patches 를 concatenating 하고 이에 linear transform 을 적용하여 줄일 수 있고 여기서 channel 을 두 배로 늘린다. Swin transformer 에는 <cls> token 이 없다. 대신 마지막 레이어의 값들의 평균을 최종 embedding 으로 사용한다. 그리고 FC layer 에 통과시켜 classes 의 갯수만큼 적절한 shape 으로 linear transform 하여 각 class 별 probability를 계산한다. 본 교재가 작성되고 있을 무렵 SOTA Swin transformer 의 성능은 ImageNet 에서 9.89%9.89\% 의 top-1 error rate 을 기록하였다.

    비슷한 아이디어로는 전체 이미지의 information을 정기적으로 통합하는 것이다. Dual attention vision transformers (DaViT) 는 (이미지 patch에 대한 attention 을 구하고 다음에 channel 에 대하여 attention을 구하는 듯?) [교재에서 무슨 말을 하는지 모르겠어서 논문의 overview 이미지를 가져옴.]

    Practice

    Transformers for text tutorial

    Tutorial 5: Transformers and Multi-Head Attention — PyTorch Lightning 2.1.3 documentation
    Home
    https://lightning.ai/docs/pytorch/stable/notebooks/course_UvA-DL/05-transformers-and-MH-attention.html
    • Learning rate warm-up

      Learning rate warm-up 은 transformer 를 학습할 때 자주 사용되는 테크닉이다. Learning rete warm-up 은 초반 iteration 에서는 learning rate 을 0부터 우리가 설정한 lr 까지 서서히 증가시키는 방법을 말한다. 따라서 초반에는 학습을 천천히, 조심스럽게 시작한다고 볼 수 있다.

      실제로 learning rate warm-up 을 사용하지 않고서 transformer 를 학습시키면 모델이 diverge 하거나 converge 하더라도 training ,test 에서 훨씬 안좋은 성능을 보인다. Liu et al. (2019) 의 연구에서 제안한 아래 플롯을 보자.

      💡
      w/o Adam 와 w Adam 의 성능 차이를 보라. transformer 를 학습시킬 때 warm-up scheduler 는 꼭 사용해야하는 테크닉이다.

      여기에는 두 가지 정도 이를 설명하는 이유가 있다.

      1. Adam optimizer는 bias를 조정하는 factor가 있는데 adaptive 한 learning rate sheduler 를 사용하면 초반에 큰 bias 를 가질 수 있다고 한다. 이러한 문제를 해결한 RAdam 은 transformer를 학습할 때 warm-up 이 따로 필요없다. (좋은데..?)
      1. 반복적으로 각 레이어 사이에 적용된 LayerNorm은 초반 iterations 에서 굉장히 큰 gradient 를 유발할 수 있다. 이를 Pre-Layer Normalization (Pre-Activation ResNet 과 비슷) 혹은 Adaptive Normalization 과 같은 테크닉을 사용하면 어느 정도 해결할 수 있다.

      그럼에도 불구하고 많은 연구에서 오리지널 transformer 를 사용한다. 왜냐하면 warm-up scheduler 가 간단하고 효과적이기 때문이다. 다양한 scheduler 가 있지만 그 중에서 가장 널리 사용되는 cosine-annealing scheduler 과 warm-up 을 합친 cosine warm-up scheduler 가 많이 사용된다.

    Transformers for image classification

    Tutorial 15: Vision Transformers — UvA DL Notebooks v1.2 documentation
    Guides
    https://uvadlc-notebooks.readthedocs.io/en/latest/tutorial_notebooks/tutorial15/Vision_Transformer.html

    위 튜토리얼을 참고하여 공부하면 좋을듯하다


    Uploaded by N2T

    반응형
Designed by Tistory.