Transformer의 Attention 구조와 BERT·GPT 아키텍처

Self-Attention과 Multi-Head Attention의 처리 방식, BERT·GPT·Encoder-Decoder 구조 차이와 Transformer 운영 관점을 정리합니다.

2026-08-14 · 최초 발행 2024-04-29

Attention이 문맥을 통합하는 방식

Transformer는 순환 구조나 합성곱 없이 Attention으로 문맥 정보를 모으는 딥러닝 아키텍처다. 인코더와 디코더를 함께 두거나, 인코더 전용 또는 디코더 전용 스택으로 구성할 수 있다.

핵심인 Self-Attention은 입력 임베딩에서 Query, Key, Value(Q/K/V)를 만들고 토큰 간 유사도를 계산한다. Q·K^T로 유사도 행렬을 구한 뒤 √dk로 스케일링하고 Softmax로 가중치를 정규화한다. 이 가중치로 V를 집계해 각 토큰의 표현을 갱신한다.

시퀀스 길이를 n, 임베딩 차원을 d라고 할 때 Self-Attention의 시간·메모리 복잡도는 O(n^2·d)다. 긴 입력에서는 비용이 빠르게 커지므로 효율적 어텐션, 캐시, 슬라이딩 윈도우 같은 방식으로 부담을 완화한다.

여러 관점에서 관계를 읽어야 할 때는 Multi-Head Attention을 사용한다. 독립적인 헤드가 서로 다른 표현 아공간에 주의를 두고, 각 결과를 결합한 뒤 선형 변환으로 하나의 표현으로 통합한다. 전역 의존성을 학습하기 좋고 병렬화도 수월하다.

순환 구조가 없는 만큼 순서 정보는 별도로 공급한다. 정현파 또는 학습형 위치 임베딩을 사용하며, 이는 길이 일반화와 도메인 전이 시 안정성에 영향을 준다. 패딩 마스크는 유효한 토큰만 보게 하고, 캐주얼 마스크는 미래 토큰을 차단한다. 마스크의 정렬과 브로드캐스팅이 맞지 않으면 결과의 일관성이 깨질 수 있다.

잔차 연결과 레이어 정규화는 기울기 전파를 안정화한다. 포지션-와이즈 FFN은 비선형 확장으로 표현력을 보강하며, 드롭아웃과 어텐션 드롭아웃은 과적합을 줄이는 역할을 한다.

인코딩과 생성에서 갈리는 모델 선택

BERT가 맞는 작업

BERT는 인코더만 사용하는 양방향 컨텍스트 모델이다. MLM(Masked Language Modeling)과 NSP/구문 변형을 학습 과제로 삼아 토큰 표현을 최적화한다.

분류, 검색, 개체명 인식, 문장 임베딩처럼 인코딩이 본체인 태스크에 강점이 있다. 파인튜닝, 어댑터, 프로빙 구조를 적용하기도 쉽다. 반면 생성 태스크를 직접 수행하기는 어렵고, 긴 시퀀스로 확장하면 비용이 커진다.

GPT가 맞는 작업

GPT는 디코더만으로 구성되며 캐주얼 마스크 아래에서 다음 토큰을 예측한다. 대규모 사전학습을 바탕으로 텍스트 생성, 요약, 코딩, 대화형 에이전트 같은 생성 태스크에 적합하다.

KV 캐시는 토큰 단위 추론에서 재계산을 줄여 지연을 낮추는 데 쓰인다. 다만 긴 컨텍스트를 유지하는 비용은 남아 있고, 환각을 관리해야 한다. 지시를 따르도록 만들기 위해 SFT/RLHF/DPO 같은 추가 미세조정이 필요하다.

소스와 타깃을 함께 다룰 때

Encoder-Decoder 구조에서는 인코더가 소스 입력을 인코딩하고 디코더가 타깃 시퀀스를 생성한다. 번역과 요약에 적합하며, 크로스-어텐션으로 소스와 타깃의 상호작용을 정교하게 만든다. 대신 두 스택을 운영해야 하므로 파이프라인 복잡도는 증가한다.

토큰이 블록을 통과하는 경로

예: 패딩/캐주얼아니오입력 토큰토큰 임베딩포지셔널 인코딩 추가Q/K/V 프로젝션마스크 적용?스케일드 닷프로덕트 어텐션멀티헤드 결합/선형 투영잔차 연결 + 레이어 정규화포지션-와이즈 FFN잔차 연결 + 레이어 정규화출력 표현 또는 다음 블록

토큰은 임베딩과 위치 정보를 거쳐 Q/K/V로 투영되고, 마스킹과 어텐션 계산을 통과한다. 이어 멀티헤드 출력을 결합하고 정규화와 FFN 블록을 거쳐 다음 블록 또는 출력 표현으로 전달된다.

마스크 텐서의 브로드캐스팅이 맞지 않으면 batch, head, seq, seq 차원을 확인한다. OOM이 발생하면 시퀀스 길이와 배치를 줄이고, 혼합정밀(AMP) 또는 정수 양자화를 적용한다.

태스크와 운영 특성으로 보는 아키텍처

아키텍처 성능(태스크 적합) 확장성(길이/분산) 일관성(출력 안정) 안정성(학습/추론) 운영 편의
BERT(Encoder-only) 인코딩/분류/검색 강점 길이 확장 한계, 롱폼 변형 필요 고정 임베딩 일관성 우수 학습 안정적, 추론 비용 일정 파인튜닝/임베딩 서비스 용이
GPT(Decoder-only) 생성/요약/대화/코드 강점 KV 캐시로 실시간 생성 유리 프롬프트 민감, 가이드 필요 RLHF 등 추가 안정화 필요 API/프롬프트 엔지니어링 용이
Encoder-Decoder 번역/정밀 요약 강점 양 스택으로 비용 증가 소스-타깃 정합 우수 학습 복잡, 튜닝 비용 큼 파이프라인 복잡 관리 필요

구현에서 확인할 Attention 연산

Python 3.10+, PyTorch 2.2+, CUDA 선택을 전제로 한 실행 가능 예제다.

import torch
import math
from torch import nn

class MultiHeadSelfAttention(nn.Module):
    def __init__(self, d_model=128, num_heads=8):
        super().__init__()
        assert d_model % num_heads == 0, "d_model은 num_heads로 나누어떨어져야 함"
        self.d_model = d_model
        self.num_heads = num_heads
        self.d_head = d_model // num_heads
        self.q_proj = nn.Linear(d_model, d_model)
        self.k_proj = nn.Linear(d_model, d_model)
        self.v_proj = nn.Linear(d_model, d_model)
        self.out_proj = nn.Linear(d_model, d_model)

    def forward(self, x, attn_mask=None):
        # x: [B, S, D]
        B, S, D = x.shape
        q = self.q_proj(x).view(B, S, self.num_heads, self.d_head).transpose(1, 2)  # [B, H, S, Dh]
        k = self.k_proj(x).view(B, S, self.num_heads, self.d_head).transpose(1, 2)  # [B, H, S, Dh]
        v = self.v_proj(x).view(B, S, self.num_heads, self.d_head).transpose(1, 2)  # [B, H, S, Dh]

        scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(self.d_head)  # [B, H, S, S]
        if attn_mask is not None:
            # attn_mask: [B, 1 or H, S, S], masked 위치에 -inf
            scores = scores.masked_fill(attn_mask == 0, float("-inf"))

        attn = torch.softmax(scores, dim=-1)
        attn = torch.nan_to_num(attn, nan=0.0)  # 안정화
        out = torch.matmul(attn, v)  # [B, H, S, Dh]
        out = out.transpose(1, 2).contiguous().view(B, S, D)  # [B, S, D]
        return self.out_proj(out)

# 사용 예시
B, S, D = 2, 16, 128
x = torch.randn(B, S, D)
# 캐주얼 마스크 생성(자기 이후 토큰 차단)
causal = torch.tril(torch.ones(S, S)).unsqueeze(0).unsqueeze(0)  # [1,1,S,S]
mha = MultiHeadSelfAttention(d_model=D, num_heads=8)
y = mha(x, attn_mask=causal)  # [B, S, D]
print(y.shape)

마스크는 bool 또는 0/1 dtype을 일치시키고, 입력과 같은 디바이스에 둬야 한다. 메모리가 부족하면 S를 줄이고 AMP(torch.autocast), bfloat16 또는 float16을 적용한다.

BERT와 GPT의 간단한 추론에는 transformers>=4.44, torch>=2.2가 필요하다.

from transformers import AutoTokenizer, AutoModelForMaskedLM, AutoModelForCausalLM, pipeline

# BERT: MLM
bert_name = "bert-base-uncased"
fill = pipeline("fill-mask", model=bert_name)
print(fill("Transformers are [MASK] for NLP."))

# GPT: 텍스트 생성
gpt_name = "gpt2"
gen = pipeline("text-generation", model=gpt_name, device_map="auto", torch_dtype="auto")
print(gen("In enterprise AI, transformers", max_new_tokens=50, do_sample=True))

GPU가 없는 환경에서는 device_map="cpu"를 지정하고 max_new_tokens를 제한해 지연을 막는다. 한국어 모델이 필요하면 KoBERT, KoGPT 등을 대체로 사용할 수 있다.

검색부터 코드 지원까지의 활용 방식

검색과 랭킹에서는 BERT 임베딩으로 쿼리와 문서를 매칭하고 Bi-Encoder 또는 ColBERT 구조를 적용한다. 색인 임베딩 생성, ANN 검색, Cross-Encoder 재랭킹 순서로 파이프라인을 구성할 수 있다.

문서 요약과 보고서 자동화는 GPT 기반 지시추론에 도메인 프롬프트를 템플릿화하는 방식으로 다룬다. 장문은 분할 요약, 체인 요약, 검증 프롬프트로 이어 처리한다.

RAG에서는 인코더 임베딩 검색과 생성형 응답을 결합한다. 근거 문서를 함께 제공하고 답변 근거를 하이라이트하면 신뢰성을 높일 수 있다.

GPT류 모델은 코드 생성, 리팩터링, 테스트 케이스 생성에도 사용된다. 이 경우 안전 가드레일과 보안 규칙을 프롬프트 및 처리 경로에 넣어야 한다.

NER와 감성 분석 같은 분류·추출 작업에는 BERT 파인튜닝 또는 지시학습을 적용할 수 있다. 소량 라벨로도 우수 성능을 낼 수 있으며, 클래스 불균형이 있을 때는 Focal Loss 등을 사용한다.

비용과 품질을 함께 조정하는 운영 기준

디코더 증분 추론의 토큰당 복잡도는 O(n·d)이며, KV 캐시는 재계산을 최소화한다. 시퀀스 길이를 절반으로 줄이면 n^2 특성 때문에 어텐션 메모리는 약 75% 절감된다. 파인튜닝 대신 LoRA나 Adapter를 사용하면 모델과 설정에 따라 GPU 메모리를 60~90% 절감한 환경도 보고됐다.

전이학습은 라벨 비용을 줄이고 도메인 일반화를 높인다. 블록이 모듈화돼 있어 유지보수와 업그레이드도 수월하다. RAG와 가드레일을 결합하면 생성 결과의 신뢰성을 보강할 수 있다.

시퀀스 길이, 배치 크기, 정밀도(bf16/fp16)는 함께 조정한다. 지연에 민감한 서비스는 KV 캐시와 프리필·디코드 분리 운영을 검토한다. INT8/4 양자화는 메모리를 줄이는 대신 품질 저하 가능성이 있으며, top-p와 temperature는 품질과 창의성의 균형을 조정하는 수단이다.

대규모 모델은 텐서·파이프라인·시퀀스 병렬화와 체크포인트 병렬화로 운영할 수 있다. FlashAttention, Long/Sliding Attention 같은 효율적 어텐션을 적용할 수 있으며, 최신 구현 세부는 최신 정보 확인이 필요하다.

프롬프트 주입과 데이터 유출을 막는 규칙, PII 마스킹, 응답 검증, 콘텐츠 필터링도 운영 경로에 포함한다. 데이터 편향과 오염을 감시하고 평가 벤치마크를 다각화해야 한다.

트랜스포머Self-AttentionBERTGPT자연어 처리