"어텐션은 '맥락'을 모아야 한다 — 자기 자신의 정보는 FFN에게 맡겨라."
Self Attention (SA)이 자기 자신의 값 벡터와 지나치게 유사한 출력을 만들어내는 '어텐션 유사도 편향'을 발견하고,
단 두 줄의 코드로 이를 제거하는 Exclusive Self Attention (XSA)을 제안합니다.
Transformer는 두 가지 핵심 블록의 반복으로 구성됩니다. SA(Self Attention)는 문맥 속 다른 위치의 정보를 모아오고, FFN(Feed Forward Network)은 각 위치를 독립적으로 변환합니다. 이 역할 분담은 2017년 "Attention is All You Need" 이후 거의 변하지 않았습니다.
왜 이런 현상이 발생할까요? 두 가지 구조적 원인이 맞물립니다.
① 값 벡터들이 서로 양의 상관관계를 가집니다. 같은 시퀀스 내 값 벡터 \(v_i, v_j\)의 평균 코사인 유사도가 0보다 크기 때문에, 어떤 위치에서 어텐션을 집계하더라도 결과가 \(v_i\)와 비슷해지는 경향이 있습니다.
② 자기 자신 위치에 높은 어텐션 점수가 할당됩니다. 대각 어텐션 값 \(a_{i,i}\)가 상대적으로 높아, SA 출력 \(y_i\)가 \(v_i\) 자체를 많이 반영합니다. 레이어가 깊어질수록 이 편향은 더욱 심해집니다.
"This suggests that standard SA tends to aggregate value vectors similar to what the self value \(v_i\) already encodes, which implicitly overlaps with role of FFN and consequently diminishes SA's goal of context modeling.""이는 표준 SA가 자기 값 벡터 \(v_i\)가 이미 인코딩한 것과 유사한 값 벡터를 집계하는 경향이 있음을 시사하며, 이는 FFN의 역할과 암묵적으로 겹쳐 SA의 맥락 모델링 목표를 약화시킨다."
평가 이 발견은 단순한 관찰이 아닙니다. SA와 FFN 사이에 비효율적 경쟁이 존재한다는 구조적 진단입니다. SA가 자기 위치의 정보 변환을 담당하면, FFN이 같은 일을 다시 해야 하거나 SA가 맥락 모델링에 쓸 용량이 줄어듭니다.
실제 1.3B 파라미터 모델 분석 결과를 재현한 시각화. 레이어가 깊어질수록 SA 출력과 자기 값 벡터의 코사인 유사도가 증가합니다.
문제 진단이 명확하면, 해결책도 명확합니다. SA 출력에서 자기 값 벡터 방향의 성분을 빼버리면 됩니다. 이것이 Exclusive Self Attention (XSA)의 전부입니다.
보충 정사영(projection)이란? 벡터 \(y\)를 단위 벡터 \(\hat{v}\) 방향으로 투영한 값은 \((y \cdot \hat{v})\hat{v}\)입니다. 이를 \(y\)에서 빼면, \(y\)에서 \(\hat{v}\) 방향 성분이 완전히 제거된 벡터를 얻습니다. 이것이 XSA의 핵심 연산입니다. 직교 보완(orthogonal complement)이라고도 불립니다.
트레이드오프: XSA는 어텐션 출력에서 \(v_i\) 방향 정보를 명시적으로 삭제합니다. 이 정보가 필요하다면 어떻게 될까요? 잔차 연결(residual connection)이 있기 때문에 \(x_i\) 자체가 그대로 다음 레이어로 전달됩니다. FFN은 이 잔차로부터 위치별 변환을 수행할 수 있어, 표현력 손실이 없습니다.
표준 SA의 정의를 먼저 확인합니다.
| 변수 | 의미 | 비고 |
|---|---|---|
W_q, W_k, W_v | 쿼리, 키, 값 선형 투영 행렬 | 학습 파라미터 |
q_i, k_j, v_j | i번째 위치의 쿼리, j번째 위치의 키·값 | 헤드별 분리 |
a_{i,j} | i→j 어텐션 점수 (softmax 정규화) | 인과적: j ≤ i만 참조 |
y_i | SA 출력 (가중 합산된 값 벡터) | vᵢ 방향 편향 존재 |
직관적 해설
수학적 배경
이제 XSA의 추가 단계를 정의합니다. 앞의 SA 연산은 그대로 유지하고, 마지막 단계만 바꿉니다.
| 변수 | 의미 | 비고 |
|---|---|---|
y_i | 표준 SA의 출력 | vᵢ 방향 편향 있음 |
v_i | 자기 자신(i번째 위치)의 값 벡터 | 정규화 기준 |
(y_iᵀ v_i) / ‖v_i‖² | y_i의 v_i 방향 스칼라 투영 계수 | 그람-슈미트 직교화와 동일 |
z_i | XSA 출력. v_i와 직교(orthogonal)함 | 어텐션 유사도 편향 = 0 |
직관적 해설
수학적 유도
XSA는 표준 SA에 단 두 줄의 코드를 추가하는 것으로 구현됩니다. 아래에서 단계별로 살펴봅니다.
def exclusive_self_attention(x, Wq, Wk, Wv, Wo, H): B, T, D = x.shape Q = (x @ Wq).reshape(B, T, H, D // H).transpose(1, 2) K = (x @ Wk).reshape(B, T, H, D // H).transpose(1, 2) V = (x @ Wv).reshape(B, T, H, D // H).transpose(1, 2) Y = torch.nn.functional.scaled_dot_product_attention(Q, K, V, is_causal=True) Vn = torch.nn.functional.normalize(V, dim=-1) # ← XSA 추가 ① Z = Y - (Y * Vn).sum(dim=-1, keepdim=True) * Vn # ← XSA 추가 ② out = Z.transpose(1, 2).reshape(B, T, D) @ Wo return out
| 항목 | 설정값 | 비고 |
|---|---|---|
| 코드베이스 | NanoGPT | 재현 용이성 |
| 위치 인코딩 | RoPE | 학습된 PE 대체 |
| 추가 LayerNorm | 토큰 임베딩 직후 | 학습 안정성 향상 |
| 데이터셋 | FineWeb-100BT (~100B 토큰) | GPT-2 토크나이저 |
| 배치 크기 | 256 (글로벌), 0.5M 토큰/배치 | |
| 학습 반복 | 200K iterations (≈100B 토큰) | 1 epoch |
| 옵티마이저 | AdamW | lr warmup 2K steps |
| 학습률 스케줄 | 코사인 감쇠, 최솟값 = max_lr / 10 | |
| 컨텍스트 길이 | 기본 2048 (최대 16384까지 실험) | |
| 수치 정밀도 | bfloat16 | B200 GPU |
| 모델 크기 | 레이어 수 | d_model | 헤드 수 | d_head | 학습률 |
|---|---|---|---|---|---|
| 0.7B | 24 | 1536 | 6 | 256 | 5.0 × 10⁻⁴ |
| 1.4B | 24 | 2048 | 24 | 128 | 4.0 × 10⁻⁴ |
| 2.7B | 32 | 2560 | 24 | 128 | 3.0 × 10⁻⁴ |
보충 논문에서 학습률은 베이스라인에 대해 그리드 서치로 찾고, XSA에도 동일한 학습률을 사용합니다. 즉 XSA가 별도의 하이퍼파라미터 튜닝 없이도 성능 이득을 얻는지 공정하게 비교합니다.
슬라이더를 조작해 y_i와 v_i의 각도를 바꾸면서, XSA가 어떻게 v_i 방향 성분을 제거하는지 확인하세요.
세 가지 모델 크기(0.7B, 1.4B, 2.7B) 모두에서 XSA가 SA를 일관되게 앞섭니다. 모델이 클수록 격차도 커지는 경향을 보입니다.
ARC-Easy, BoolQ, HellaSwag, LAMBADA, OpenBookQA, PIQA, SocialIQA, WinoGrande 8개 태스크에서 평균 정확도를 비교합니다.
| 모델 | 방법 | ARC-E | BoolQ | HSwag | LAMBADA | OBQA | PIQA | SocIQA | WinoGr | 평균 |
|---|---|---|---|---|---|---|---|---|---|---|
| 0.7B | Baseline | 51.26 | 61.07 | 55.68 | 52.82 | 35.00 | 74.05 | 40.02 | 55.88 | 53.22 |
| XSA | 52.69 | 61.19 | 56.29 | 54.07 | 32.20 | 73.78 | 41.45 | 56.20 | 53.48 (+0.26) | |
| 1.4B | Baseline | 56.19 | 65.47 | 60.69 | 56.24 | 34.60 | 75.90 | 41.40 | 58.80 | 56.16 |
| XSA | 58.84 | 62.29 | 62.41 | 58.57 | 36.00 | 76.61 | 42.84 | 59.98 | 57.19 (+1.03) | |
| 2.7B | Baseline | 58.59 | 60.98 | 66.20 | 60.18 | 37.00 | 76.61 | 42.94 | 61.96 | 58.06 |
| XSA | 60.65 | 64.86 | 67.40 | 62.04 | 38.40 | 77.80 | 41.45 | 62.75 | 59.42 (+1.36) |
특히 주목할 만한 결과입니다. 시퀀스가 길어질수록 XSA의 이득이 더 커집니다. 512에서는 이득이 작지만, 16384에서는 격차가 뚜렷해집니다.
1e-4부터 6e-4까지 4가지 학습률에서 XSA는 Baseline 대비 일정한 마진을 유지합니다. 특정 학습률에서만 유효한 효과가 아닙니다.
평가 한계 4는 중요한 지적입니다. XSA가 "단순히 정규화 효과를 주는 것"인지, "진정으로 역할 분리를 이루는 것"인지 구분하려면 이론적 분석이 필요합니다. 향후 연구에서 해석 가능성(interpretability) 관점의 분석이 기대됩니다.
XSA는 구현이 극히 단순하면서도 일관된 성능 이득을 보이기 때문에, 실용적 파급력이 클 수 있습니다.
논문이 핵심적으로 다루는 질문입니다. 표현력이 손실되지 않는 이유는 잔차 연결 때문입니다.
"in the presence of residual connections and the FFN block, XSA 1) maintains the expressiveness of standard SA and 2) promotes modeling efficiency"
Transformer의 각 레이어는 \(\text{output} = x + \text{Attn}(x) + \text{FFN}(x)\) 형태입니다. \(x\) 자체가 잔차로 전달되기 때문에, 어텐션 출력에서 \(v_i\)(즉 \(x_i\)를 선형 변환한 것)의 방향을 제거해도 FFN이 잔차에서 해당 정보를 그대로 활용할 수 있습니다.
Attention Sink [Xiao et al., 2023]는 시퀀스 앞에 특별한 "싱크 토큰"을 추가해 불필요한 어텐션을 흡수합니다. XSA는 다른 방식으로 유사한 효과를 냅니다.
XSA에서는 어텐션이 \(v_i\) 방향을 향하지 않아도 되므로, 대각 어텐션 점수 \(a_{i,i}\)가 "싱크" 역할을 자연스럽게 할 수 있습니다. 즉 암묵적 Attention Sink처럼 작동합니다.
실험에서 XSA에 명시적 Attention Sink를 추가해도 성능 마진이 유지되므로, 두 기법은 독립적으로 기여합니다.
저자는 이를 근거로 "더 큰 규모에서도 XSA가 유리할 것"이라고 추정합니다. 모델이 클수록 SA와 FFN의 용량 경쟁이 더 뚜렷하게 나타나기 때문에, 역할 분리의 이득도 커지는 것으로 해석할 수 있습니다.
평가 단, 이는 2.7B까지의 스케일링 추세를 외삽한 추론이며, 수십B 규모에서도 같은 패턴이 성립하는지는 직접 실험이 필요합니다.
평가 논문은 이 질문을 다루지 않습니다. XSA는 어텐션 출력 후처리이기 때문에 이론적으로 사전 학습된 모델에 적용 후 파인튜닝할 수는 있지만, 처음부터 XSA로 학습한 것과 동일한 이득을 얻을지는 불확실합니다. 모델 가중치가 표준 SA 기반으로 최적화되었기 때문입니다.
평가 XSA의 핵심 연산은 어텐션 계산 방식이 아닌 출력에서의 투영 제거이므로, GQA나 MLA와 독립적으로 결합 가능합니다. 다만 GQA에서는 키·값이 여러 쿼리 헤드에 공유되므로 "자기 위치의 값 벡터" 정의가 약간 달라질 수 있어, 실험적 검증이 필요합니다.