Attention
기계번역에서 현재 단어 하나만 보는게 아니라 주변 단어 전체를 함께 고려해 번역하는것이 Seq2Seq 모델의 가장 큰 개선점이었다.
Query, Key, Value 세가지 벡터를 이용해 현재 필요한 정보가 무엇인지를 계산해 모든 정보를 동일하게 기억하려고 하지않는다. 사람이 메모할때 중요한 내용만 적는것과 같은 매커니즘.
Attemtion을 도입하면 긴문장을 처리할수있고 문맥 유지 능력ㅇ이 향상되는 효과가있다.
https://standout.tistory.com/1844
입력과 출력의 길이가 달라도 처리할 수 있는 모델 Seq2Seq , 정보 병목(Information Bottleneck) (feat. Atte
Seq2Seq (Sequence to Sequence) 입력 시퀀스(Sequence)를 다른 출력 시퀀스로 변환하는 딥러닝 모델이다. 순서가 있는 데이터를 입력받아, 또 다른 순서가 있는 데이터를 출력하는 모델주로 LSTM나 GRU기반으
standout.tistory.com
Transformer란?
Attention 메커니즘만을 이용하여 문장을 처리하는 딥러닝 모델
기존의 RNN, LSTM, GRU는 단어를 순서대로 처리했지만, Transformer는 모든 단어를 동시에 처리(병렬 처리)할 수 있도록 설계되었다.
https://standout.tistory.com/1844
입력과 출력의 길이가 달라도 처리할 수 있는 모델 Seq2Seq , 정보 병목(Information Bottleneck) (feat. Atte
Seq2Seq (Sequence to Sequence) 입력 시퀀스(Sequence)를 다른 출력 시퀀스로 변환하는 딥러닝 모델이다. 순서가 있는 데이터를 입력받아, 또 다른 순서가 있는 데이터를 출력하는 모델주로 LSTM나 GRU기반으
standout.tistory.com
2017년 구글이 발표한 논문 Attention Is All You Need에서 처음 소개
현재 대부분의 자연어 처리(NLP) 모델의 기반이 되는 구조
BERT, GPT, T5, BART, Vision Transformer(ViT)
LSTM은 반드시 순서대로 계산해야해 병렬 처리가 어려워 긴 문장시 첫 번째 단어 정보를 끝까지 전달해야 해 정보가 점점 희미해질 수 있고 시간축(Time Step) 을 따라 계산하기 때문에 GPU를 충분히 활용하기 어렵지만
Transformer의 핵심은 Self-Attention으로 문맥을 이해하고, Multi-Head Attention으로 여러 관계를 동시에 학습하여 긴 문장도 효과적으로 처리하는 것이다.
이때 Multi-Head Attention는 Transformer에서 가장 중요한 부분인데
기존 Attention은 한번만 본다면 Multi-Head는여러 번, 동시에 봐 여러 관계를 동시에 학습한다.
Multi-Head Attention은 여러 개의 Self-Attention을 동시에 수행하여 단어 간의 다양한 의미와 관계를 여러 관점에서 학습하는 메커니즘
Self-Attention
Self-Attention은 문장의 모든 단어 간의 관계를 계산하여 현재 단어를 이해하는 데 가장 중요한 단어에 집중(Attention)하는 메커니즘
The animal didn't cross the street because it was tired.에서 it이 누구냐 묻는다면
Self-Attention은 문장의 모든 단어끼리 관계를 계산해 현재 단어와 가장 관련성이 높은 단어를 찾아 문맥을 이해하는 메커니즘이다.
import torch
import torch.nn as nn
# Transformer 모델 생성
transformer = nn.Transformer(
d_model=512,
nhead=8,
num_encoder_layers=6,
num_decoder_layers=6,
dim_feedforward=2048,
dropout=0.1,
batch_first=True
)
src = torch.rand(32, 10, 512) # (배치, 입력 길이, 임베딩 차원)
tgt = torch.rand(32, 8, 512) # (배치, 출력 길이, 임베딩 차원)
torch.Size([32, 8, 512])
nn.Transformer 안에는 Self-Attention이 이미 구현되어 있다.
TransformerEncoderLayer 안에 self_attn이있고 실제로 확인해볼 수 있다.
encoder_layer = nn.TransformerEncoderLayer(
d_model=512,
nhead=8
)
print(encoder_layer)
TransformerEncoderLayer(
(self_attn): MultiheadAttention(...)
(linear1): Linear(...)
(dropout): Dropout(...)
(linear2): Linear(...)
(norm1): LayerNorm(...)
(norm2): LayerNorm(...)
)
# Transformer의 장점
병렬 처리가 가능하여 학습 속도가 빠르고 긴 문장의 의존 관계를 효과적으로 학습할 수 있다.
Self-Attention을 통해 문장 전체의 문맥을 동시에 고려하고 다양한 NLP 작업에서 높은 성능을 보인다.
현재 대부분의 대규모 언어 모델(LLM)의 기반 구조이다.
Self-Attention은 입력 길이를 (n)이라고 할 때 시간 및 메모리 복잡도가 (O(n^2)) 이므로 매우 긴 문장을 처리할 때 비용이 커진다.
대규모 모델 학습에는 많은 GPU 메모리와 연산 자원이 필요하다.
비교적 많은 학습 데이터가 있어야 성능을 충분히 발휘한다.
self.attention = SelfAttention()은 Transformer를 직접 구현할 때 사용하는 코드
nn.Transformer나 nn.MultiheadAttention을 사용할 때는 직접 만들 필요가 없다.
논문를 공부하거나, Transformer를 처음부터 만들어보고 싶다면 먼저 Self-Attention 클래스를 만들어 사용한다.
class TransformerBlock(nn.Module):
def __init__(self):
self.attention = SelfAttention()
self.feed_forward = FeedForward()
self.norm = nn.LayerNorm(...)
Self-Attention으로 문맥을 이해한 뒤, Feed Forward가 그 정보를 더 깊게 가공한다.
작은 신경망.
Self-Attention은 단어와 단어의 관계를 계산한다면 Feed Forward는 각 단어를 혼자 더 깊게 계산한다. 기존 신경망에서 입력 - 은닉층 - 출력처럼 앞으로만(Forward) 계산하기 때문에 Feed Forward Network(FFN)라고 부른다.
self.feed_forward = nn.Sequential(
nn.Linear(512, 2048),
nn.ReLU(),
nn.Linear(2048, 512)
)