원본 Transformer는 Encoder-Decoder 구조를 기반으로 합니다. Encoder와 Decoder 블록이 독립적인 모델이 되면서 Transformer 모델의 유형을 Encoder 유형, Decoder 유형, Encoder-Decoder 유형으로 나눌 수 있습니다.

1. Encoder 유형

input sequence를 압축하여 고정된 길이의 벡터로 변환합니다. 이 모델은 주로 크기가 고정된 입출력 문제에 사용됩니다.

1-1. BERT(Bidirectional Encoder Representations from Transformers)

2018년 구글이 개발한 언어 모델로, masking된 토큰을 예측하는 것(Maksed Language Modeling, MLM)과 한 텍스트 구절이 다른 텍스트 구절 뒤에 나올 확률을 계산(Next Sentence Prediction)하는 task로 훈련된 모델입니다. 상대적으로 무거운 모델입니다.

1-2. DistilBERT(Distilled version of BERT)

BERT를 경량화하고 속도를 향상시킨 모델입니다. Pre-training 단계에서 Knowledge Distillation이라는 기술을 사용해서 BERT보다 40% 더 적은 메모리를 사용하고 60% 더 빠르면서 BERT 성능의 97%를 달성합니다.

1-3. RoBERTa(Robustly Optimized BERT approach)

더 많은 훈련 데이터로 더 큰 배치에서 더 오래 훈련하며 NSP task는 하지 않았습니다. BERT에 비해 성능이 향상되었습니다.

1-4. XLM (Cross-lingual Language Model)

다국어 학습을 위해 개발된 모델입니다. XLM의 논문에서는 MLM을 다중 언어 입력으로 확장한 Translation Language Modeling(TLM)을 소개했습니다. 이런 Pre-training 단계를 실험한 저자들을 번역 작업을 포함해 여러 가지 다중 언어 NLU 벤치마크에서 최상의 결과를 얻었습니다. XLM 모델은 다국어 번역, 다국어 분류 등 다양한 다국어 작업에 활용될 수 있습니다.

 

2. Decoder 유형

Decoder 유형 모델은 문장에서 다음 단어를 예측하는 데 뛰어나므로 대부분 text 생성 작업에 사용됩니다. 

2-1. GPT (Generative Pretrained Transformer)

2018년에 등장했으며 Pre-trained Language Model 개념을 처음으로 제시했습니다. GPT는 이전 단어를 기반으로 다음 단어를 예측하도록 훈련되었습니다.

2-2. GPT-2

2019년에 등장했으며 GPT보다 훨씬 많은 양의 데이터를 학습하여 더욱 자연스러운 텍스트를 생성할 수 있게 되었습니다. 

2-3. CTRL (Code TransOrmers with Listops)

Salesforce가 개발한 모델입니다. GPT-2같은 모델은 생성된 시퀀스의 스타일은 거의 제어하지 못합니다. CTRL은 시퀀스 시작 부분에 '제어 토큰'을 추가해 이 문제를 해결했습니다. 이를 통해 생성 문장의 스타일을 제어해 다양한 문장을 생성합니다.

2-4. GPT-3

GPT-2를 100배 늘려 1750억 개의 파라미터를 가진 모델입니다. few-shot learning능력이 크게 향상되어 적은 양의 데이터만으로도 새로운 작업을 빠르게 학습할 수 있게 되었습니다.

 

3. Encoder-Decoder 유형

3-1. T5 (Text-to-Text Transfer Transfomer)

모든 텍스트 기반 task를 "Text-to-Text" 형식으로 변환해서 처리합니다. 

3-2. BART

BERT의 양방향 인코딩과 GPT의 단방향 디코딩 방식을 결합하여 학습합니다. 입력 시퀀스는 마스킹, 문장 섞기, 토큰 삭제, 문서 순환(document roation)에서 가능한 한가지 방식을 거칩니다. 변경된 입력이 인코더를 통과하면 디코더는 원본 텍스트를 재구성합니다. 모델을 유연하게 만들어 NLU, NLG 작업에 모두 사용할 수 있습니다.

3-3. M2M-100

Meta에서 2020년에 발표한 모델로 100개의 언어를 번역하는 최초의 번역 모델입니다. 희귀하거나 잘 알려지지 않은 언어에서 고품질의 번역을 수행합니다. 저자원 언어에 대한 번역 성능이 뛰어납니다.

3-4. BigBird

Sparse attention을 사용하여 기존 Transformer 모델보다 훨씬 긴 문맥(512->4096 토큰)을 처리할 수 있습니다. 따라서 텍스트 요약과 같이 긴 의존성을 보존해야 할 때 유용합니다.

728x90

'Artificial Intelligence' 카테고리의 다른 글

[Audio] Audio Data  (1) 2024.06.27
[Transformer] Masked Self-Attention  (0) 2024.06.13
[Transformer] Self-Attention  (2) 2024.06.10
지도학습 vs 비지도학습  (0) 2024.05.31
[인공지능 기초 지식] 평가지표  (0) 2024.05.20

2017년 'Attention Is All You Need' 논문에서 Transformer 구조를 소개하면서 딥러닝 세계에 많은 영향을 주었습니다.

Transformer에는 3가지 Attention이 있습니다.

  1. Encoder Self-Attention
  2. Encoder-Decoder Attention
  3. Decoder Masked Self-Attention

1. Encoder Self-Attention

"고양이가 생선을 맛있게 먹었다"라는 문장이 있을 때, "먹었다"라는 단어의 의미를 제대로 파악하기 위해서는 "고양이가", "생선을" 등의 다른 단어들과의 관계를 잘 이해해야 합니다. Self-Attention은 이런 방법처럼 문장 내 단어 간의 관계를 스스로 학습해서 문장 내에서 어떤 단어가 중요한지 스스로 판단해 문맥을 이해합니다.

Encoder-Decoder Attention과 차이점은 Self-Attention은 '나는 사과를 먹는다' -> 'I eat an apple'에서 '먹는다'를 번역할 때, 'I', 'apple'등 관련된 단어들에 더 높은 가중치를 부여해 문맥을 반영합니다. 즉, 하나의 시퀀스(Query)를 기준으로 다른 시퀀스(Key, Value)에서 관련된 정보를 찾아 집중합니다.

반면, Self Attention은 단인 데이터 시퀀스 내부의 관계를 파악하는 데 사용됩니다. 문장 내 단어 간의 관계를 분석하여 문맥을 이해하는 데 효과적입니다. "고양이가 생선을 맛있게 먹었다"에서 "먹었다"이라는 단어의 Query, Key, Value 벡터를 생성하고 같은 문장 내 다른 단어들과의 관계를 계산합니다. "고양이가", "생선을" 과의 연관성이 높게 나타날 것입니다. 즉, 하나의 시퀀스 내에서 각 단어가 다른 단어들과 얼마나 관련되어 있는지 파악합니다.

  Encoder-Decoder Attention Self-Attention
데이터 시퀀스  2개 이상 단일 시퀀스
목적 시퀀스 간 관계 파악 시퀀스 내부 관계 파악
활용 예시 번역 모델(encoder-decoder) 문맥 이해

 

2. Self-Attention 작동 방식

Self-Attention은 Query, Key, Value를 사용해 단어 간의 관계를 파악합니다. 아래의 순서에 따라 Self-Attention이 작동합니다.

 

1. 입력 문장의 각 단어를 Query, Key, Value 벡터로 변환합니다.

2. 각 단어의 Query 벡터와 문장 내 모든 단어의 Key 벡터를 비교유사도(Attention Score)를 계산합니다.(Scaled Dot-Product)

3. 유사도를 기반으로 각 단어의 Value 벡터에 가중치를 부여하고 가중치가 부여된 Value 벡터들을 합산하여 문맥 정보가 반영된 벡터를 만듭니다.

2-1. 입력 문장의 각 단어를 Query, Key, Value 벡터로 변환합니다.

Query, Key, Value는 입력 데이터(단어)를 임베딩한 후, 각각의 Linear Layer를 통과시켜 계산됩니다. 

Query의 Linear Layer, Key의 Linear Layer, Value의 Linear Layer은 모두 다른 가중치를 갖고 있습니다.

입력 벡터에 가중치 행렬을 곱해 Query, Key, Value를 만듭니다. (bias는 더하지 않습니다.)

결국 Self Attention의 Query, Key, Value는 모두 동일한 정보로부터 선형변환을 통해 만들어졌다고 할 수 있습니다. 시작 값이 단어의 이메딩 값으로 같기 때문에 Self를 붙이는 겁니다.

 

      • Query: 지금 당장 처리하고 있는 토큰의 벡터(현재 단어가 다른 단어들에게 던지는 질문(ex. "나랑 관련 있는 단어 있어?"))
      • Key: 다른 모든 토큰의 벡터(다른 단어들이 Query에 대한 답변으로 내놓는 정보(ex. "난 고양이야", "난 생선이야"))
      • Value: 다른 모든 토큰의 벡터(각 단어가 가진 정보 자체(ex. "고양이는 귀엽지", "생선은 맛있어"))

2-2. 각 단어의 Query 벡터와 문장 내 모든 단어의 Key 벡터를 비교해 유사도(Attention Score)를 계산합니다. (Scaled Dot-Product)

Attention Score은 Query 벡터와 Key 벡터 사이의 유사도를 나타내는 점수입니다. 다시 말해, 현재 처리 중인 단어(Query)가 입력 데이터에 있는 단어들(Key)과의 유사도를 구하는 과정입니다. Attention Score가 높을수록 두 단어가 서로 관련성이 높다는 것을 의미합니다. "😋"라는 Query는 "😺"와 "🐟"의 key와 높은 점수를 가질 것입니다.

 

🧮 수식

예를 들어, "😺"과 나머지 단어들("😺", "🐟", "😋", "🍽️")과의 유사도를 구한다고 해봅시다.

Attention Score(q, K) = (q*K^T) / sqrt(d_k)

  • q: ("고양이가"의)Query 벡터
  • K^T: Key matrix transpose
  • d_k: Key matrix 차원

나머지 단어들도 한번에 계산한다고 하면 수식은 다음과 같이 됩니다.

Attention Score(Q, K) = (Q*K^T) / sqrt(d_k)

  • Q: Query matrix
  • K^T: Key matrix transpose
  • d_k: Key matrix 차원

📌 sqrt(d_k)로 나누는 이유

여기서 Key matrix 차원의 제곱근으로 나누는 이유는 Scaling하기 위해서입니다. Scaling하지 않고 softmax 함수에 통과하면 큰 값들로 인해 softmax 분포가 지나치게 편향될 수 있습니다. 특정 Key에 대한 확률값이 1에 매우 가까워지고 나머지는 0에 가까워질 수 있습니다. Scaling을 했기 때문에 그냥 dot-product attention이 아니라 scaled dot-product attention입니다.

2-3. 유사도를 기반으로 각 단어의 Value 벡터에 가중치를 부여하고 가중치가 부여된 Value 벡터들을 합산하여 문맥 정보가 반영된 벡터를 만듭니다.

Attentions score를 softmax 함수에 통과해 확률 분포로 변환합니다. 각 단어에 대한 Attention Weight의 합이 1이 되도록 합니다.

 

🧮 수식

Attention Weight(Q, K) = softmax(Attention Score(Q, k))

 

각 단어에 대한 Attention Weight를 각 단어의 Value와 곱합니다. 즉, 현재 처리하고 있는 단어(Query)에 대한 각 단어들의 가중치(Attention Weight)를 구하고 이를 각 단어들의 Value와 곱함(가중합)으로써 현재 처리 중인 단어와 단어 사이의 관계에 대해 계산합니다. "먹었다"라는 단어는 "고양이"와 "생선"의 Value에 높은 가중치를 부여하고 다른 단어들의 Value에는 낮은 가중치를 부여하게 됩니다.

가중치가 부여된 Value들을 모두 더하면 문맥 정보가 담긴 최종 벡터가 만들어집니다. "먹었다"라는 단어는 "고양이"와 "생선"의 정보를 충분히 반영하게 되었습니다.

🧮 수식

Attention(Q, K, V) = Attention Weight(Q, K)V

 

3. Self-Attention의 장점

  • 문장의 전체 문맥 파악 가능: RNN처럼 순차적으로 정보를 처리하지 않고 문장 전체를 한 번에 고려하여 RNN보다 문맥을 잘 파악할 수 있습니다.
  • 병렬 처리 가능: 각 단어의 Attention Score을 한번에 계산할 수 있어서 빠르게 연산할 수 있습니다.
  • 장기 의존성 해결: 문장 길이에 제한 없이 멀리 떨어진 단어 간의 관계도 효과적으로 파악할 수 있습니다.

 

Reference

https://wikidocs.net/31379

https://ffighting.net/deep-learning-basic/%EB%94%A5%EB%9F%AC%EB%8B%9D-%ED%95%B5%EC%8B%AC-%EA%B0%9C%EB%85%90/attention-and-self-attention-in-deep-learning/

https://velog.io/@nkw011/transformer

 

 

 

728x90

+ Recent posts