
DeepSeek Sparse Attention의 메커니즘 - 풀 스캔을 그만둔 LLM
요약
DeepSeek의 Sparse Attention(DSA) 메커니즘을 통해 기존 Transformer의 연산 효율성 문제를 해결하는 방법을 설명합니다. 모든 토큰을 계산하는 대신 필요한 부분만 선택적으로 계산하여 자원 효율성을 극대화하는 알고리즘적 접근을 다룹니다.
핵심 포인트
- 기존 Attention의 이차 함수적 연산량 증가 문제 지적
- DeepSeek Sparse Attention(DSA)을 통한 계산 낭비 최소화
- 벡터 내적을 활용한 단어 간 관련도 계산 원리 해설
- 하드웨어 증강이 아닌 알고리즘 최적화의 중요성 강조
서론
지금까지의 대규모 언어 모델(LLM)은 계산 자원의 물리적인 힘으로 성능을 향상시키는 접근 방식이 주류였습니다. Transformer 아키텍처의 핵심인 Attention 메커니즘은 입력이 길어질수록 계산량이 이차 함수적으로 증가하는 과제를 안고 있으며, 이 벽을 넘기 위해 전 세계적으로 방대한 수의 고성능 GPU가 소비되어 왔습니다.
DeepSeek사가 채택하고 있는 DeepSeek Sparse Attention(이하 DSA)은 이러한 구도를 크게 바꾸었습니다. Sparse(스파스)는 '드문드문한'이라는 의미로, 모든 계산을 수행하는 대신 정말로 필요한 부분만을 선택하여 계산하는 수법입니다. 하드웨어의 증강이 아니라 알고리즘의 고안을 통해 계산의 낭비를 극한까지 깎아내어, 제한된 계산 자원으로도 세계 최고 수준의 성능을 끌어낼 수 있음을 증명했습니다.
이 기사에서는 DSA의 메커니즘을 소프트웨어 엔지니어의 시점에서 해설합니다. 검색 엔진이나 데이터베이스의 최적화와 같은 발상이 뉴럴 네트워크의 심장부에 어떻게組み込ま져 있는지, 일본어 예문과 의사 코드(Pseudo-code)를 사용하여 따라가 보겠습니다.
Attention 메커니즘은 풀 테이블 스캔이다
DSA가 무엇을 개선했는지 이해하기 위해, 먼저 기존의 Attention 메커니즘이 무엇을 하고 있는지 확인합니다.
AI가 문장을 처리할 때, 모든 단어(토큰)는 내부에서 벡터로 변환됩니다.
벡터란
벡터는 여기서 '단어의 의미를 수백에서 수천 개의 수치 나열로 표현한 것'입니다. 이 벡터는 인간이 설계하는 것이 아니라, LLM이 대량의 텍스트로 학습하는 과정에서 자동으로 획득합니다. 학습 데이터 중에서 '사과'와 '귤'은 '먹다', '과일', '달콤하다'와 같은 동일한 문맥에 반복해서 등장하기 때문에, 학습을 거듭할수록 벡터 공간상에서 가까운 위치에 배치되게 됩니다. '게임'은 과일과는 출현하는 문맥이 다르므로 떨어진 위치가 됩니다. 이 거리 관계를 사용하여 단어 간의 관련도를 수치로 계산할 수 있습니다.
다음 예문을 사용하여 구체적인 움직임을 따라가 보겠습니다.
어제, 아오모리에서 도착한 사과를 책상에 놓았다. 그 후, 친구와 온라인 게임을 하고, YouTube로 영상을 보고, 목욕을 한 뒤에, 아까 그 '먹었다'.
AI가 마지막의 '먹었다'를 처리하고 있을 때, '무엇을 먹었는가'라는 문맥을 이해해야 합니다. AI의 내부에서는 지금 처리하고 있는 단어를 Query(검색 질의), 과거의 모든 단어를 Key(검색 대상 인덱스)라고 부릅니다.
기존의 Attention에서는 Query인 '먹었다'가 문장 내의 모든 Key에 대해 벡터의 내적(Inner product) 계산을 수행하여 관련도를 구합니다. 내적은 두 벡터가 같은 방향을 향할수록 큰 값을 반환합니다. '먹었다'와 '사과'는 둘 다 식사나 소비에 관한 의미 성분을 많이 가지고 있기 때문에 벡터의 방향이 가까워져 내적이 커집니다. 반대로 '먹었다'와 'YouTube'는 의미의 중첩이 거의 없기 때문에 벡터의 방향이 어긋나 내적은 작아집니다.
이 메커니즘으로 계산하면, 예를 들어 다음과 같은 관련도를 얻을 수 있습니다(수치는 설명을 위한 가상의 값입니다).
- '먹었다' × '어제' = 관련도 0.1 (시간의 수식어로, 동작의 대상이 아님)
- '먹었다' × '게임' = 관련도 0.05 (오락의 문맥으로, 식사와는 의미가 멂)
- '먹었다' × 'YouTube' = 관련도 0.01 (영상 시청의 문맥으로, 식사와의 의미 중첩이 거의 없음)
- '먹었다' × '목욕' = 관련도 0.02 (입욕의 문맥으로, 식사와는 별개의 생활 행위)
- '먹었다' × '사과' = 관련도 0.95 (음식 그 자체로, '먹었다'와 의미의 방향이 일치함)
이 내적 계산이 무거운 이유는 벡터의 차원 수에 있습니다. 실제 LLM에서는 단어 하나당 수천 차원(GPT-3에서 12,288차원)의 벡터를 가지고 있으며, 두 단어의 내적을 구하는 것만으로도 수천 번의 곱셈과 덧셈이 필요합니다. 게다가 Attention에서는 한 단어에 대해 이 계산을 문장 내의 모든 단어만큼 반복합니다. 예를 들어 1,000토큰의 문장이라면, 단어 하나당 1,000번, 문장 전체로는 1,000 × 1,000 = 100만 번의 내적 계산이 실행됩니다. 이것이 '행렬 곱셈'이라고 불리는 처리의 정체입니다.
인간이라면 '게임을 먹었다'라는 해석은 하지 않겠지만, 기존의 AI는 모든 조합에 대해 이 무거운 계산을 실행합니다. 소프트웨어 엔지니어의 시점에서 말하자면, 거대한 테이블에 대해 인덱스 없이 풀 스캔(Full scan)을 수행하고 있는 상태입니다. 문장이 길어질수록 계산량은
DSA의 3단계 파이프라인
DSA는 이러한 전수 조사(Brute-force) 계산을 중단하고, 3단계 파이프라인으로 대체했습니다.
- 가벼운 처리로 대략적인 후보를 선정
- 상위 K개의 후보를 동적으로 압축
- 압축된 후보에 대해서만 무거운 계산을 실행
앞서 언급한 "먹었다"의 예시를 통해 각 단계의 움직임을 따라가 보겠습니다.
가벼운 카테고리 분류
단어가 벡터(Vector)로 변환되는 시점에 각 단어가 벡터 공간의 어느 위치에 있는지 알 수 있습니다. DSA는 무거운 곱셈을 실행하기 전에, 이 공간 정보를 사용하여 단어를 버킷(Bucket, 클러스터)으로 대략적으로 분류합니다. 이 분류에는 LSH라고 불리는 기술이 사용됩니다.
LSH(Locality-Sensitive Hashing)란
LSH(Locality-Sensitive Hashing)는 유사한 데이터에 동일한 해시(Hash) 값을 할당하는 특수한 해시 함수입니다. 일반적인 해시 함수(SHA-256 등)는 입력이 단 1비트만 달라도 완전히 다른 값을 반환합니다. 암호화나 변조 탐지에는 이러한 성질이 필수적입니다. 하지만 LSH는 반대로 벡터 공간상에서 가까운 위치에 있는 데이터를 높은 확률로 동일한 버킷에 분류합니다. "같은 버킷 안의 내용만 찾으면 유사한 데이터를 찾을 수 있을 것"이라는 지름길(Shortcut)이 가능해지므로, 모든 항목에 대해 무거운 유사도 계산을 수행하지 않아도 됩니다. 근사 최근접 이웃 탐색(Approximate Nearest Neighbor Search) 기술로서 널리 사용됩니다.
이 분류 결과, 예문의 단어들은 다음과 같은 버킷으로 분류됩니다.
- 버킷 A (음식·소비 계열): 사과, 먹었다, 저것
- 버킷 B (장소·시간 계열): 어제, 아오모리, 책상, 욕조
- 버킷 C (오락 계열): 게임, YouTube, 동영상
Top-K 추출
"먹었다"의 벡터는 버킷 A(음식·소비 계열)에 속해 있습니다. DSA 알고리즘은 문맥을 연결하기 위해 동일한 버킷이나 유사한 성질을 가진 단어만 살펴보는 것으로 충분하다고 판단합니다. 이 압축 과정에는 역색인(Inverted Index)과 동일한 발상이 사용됩니다.
역색인(Inverted Index)이란
역색인은 책의 맨 뒤에 있는 색인(Index)과 같은 구조입니다. 일반적인 데이터는 "문서 ID → 포함된 단어" 순서로 저장됩니다. 역색인에서는 반대로 "단어 → 이를 포함하는 문서 ID 리스트"라는 역조회 사전(Dictionary)을 미리 만들어 둡니다. 검색 엔진에서 널리 사용되는 기술로, 특정 키워드를 포함하는 데이터를
Top-3개(K=3)를 선택하는 설정일 경우, 가벼운 근사 검색을 통해 뽑히는 것은 다음 3가지입니다.
- 사과
- 저것
- 책상 ("놓았다"라는 동사와 세트로 물리적인 대상으로 걸려들었다고 가정)
압축된 후보로만 스코어링(Scoring)
추출된 3개의 단어에 대해서만 본래의 무거운 어텐션(Attention) 계산을 실행합니다. 스코어링은 서류 전형을 통과한 후보자에 대한 최종 면접과 같습니다. LSH나 역색인에 의한 사전 압축은 속도를 우선시하기 때문에 약간의 노이즈가 섞일 수 있습니다. 따라서 최종 단계에서는 행렬 곱셈이나 코사인 유사도(Cosine Similarity)를 사용하여 엄밀하게 순위를 매깁니다.
- "먹었다" × "사과" = 관련도 0.95
- "먹었다" × "저것" = 관련도 0.80 (직전의 대명사로서 강하게 결합됨)
- "먹었다" × "책상" = 관련도 0.10
AI는 "게임"이나 "YouTube"와의 무거운 계산을 완전히 건너뛴 채, "먹은 것은 사과(저것)이다"라는 정답에 도달합니다. 처리 대상의 개수가 고정되어 있기 때문에 계산량의 상한선이 보장된다는 점이 큰 이점입니다.
이 흐름은 백엔드 개발에서의 Elasticsearch나 벡터 DB(Vector DB)의 검색과 동일한 구조입니다. 모든 레코드에 대해 복잡한 스코어링 함수를 실행하는 것이 아니라, 먼저 역색인이나 LSH로 후보를 Top-K개로 압축하고, 그 후보에 대해서만 무거운 계산을 실행하여 최종적인 정렬을 수행합니다. DSA는 이 인덱스 검색을 통한 압축을 신경망(Neural Network)의 계산 그래프 내부에 통합하여, GPU 하드웨어 레벨에서 고속으로 동작하도록 만든 것입니다.
의사코드(Pseudo-code)로 비교하기
지금까지의 메커니즘을 Python 스타일의 의사코드로 표현합니다.
기존의 Attention
def standard_attention(current_token, past_tokens):
results = []
# 과거의 모든 토큰에 대해 무거운 계산을 실행한다
...
루프 안에서 매번 무거운 행렬 계산이 실행되기 때문에, 과거의 토큰이 늘어날수록 처리 시간이 폭발적으로 증가합니다. 데이터량이 10배가 되면 계산량은 100배가 됩니다.
DSA의 접근 방식
def sparse_attention(current_token, past_tokens, top_k=100):
# 1. LSH를 통해 현재 단어가 속한 버킷 ID를 가져옵니다.
my_bucket_id = lsh_hash(current_token.vector)
...
첫 번째 필터링은 데이터량이 늘어나도 계산량이 거의 늘어나지 않는 처리입니다. heavy_matrix_multiplication (무거운 행렬 곱셈)은 미리 지정된 K번만 실행됩니다. 이를 통해 답변 정확도를 떨어뜨리지 않으면서 계산 자원을 대폭 절약하고 있습니다.
Transformer의 어디에 DSA가 들어가는가
DSA는 Transformer와 독립된 메커니즘이 아닙니다.
Transformer란
Transformer는 2017년 Google 연구자들이 발표한 딥러닝 (Deep Learning) 아키텍처입니다. 현재 거의 모든 LLM (GPT, Claude, Gemini, DeepSeek 등)의 기반이 되고 있습니다. 문장의 문맥을 이해하기 위한 어텐션 (Attention) 모듈을 핵심으로 하며, 이 어텐션의 성능과 계산 비용이 모델 전체를 지배합니다.
Transformer 전체 구조는 그대로 유지하면서, 핵심인 '무겁고 연비가 나쁜 기존의 어텐션'을 'DSA라는 고효율의 신형'으로 교체한 구성입니다. 엔진을 교체했지만 차체는 그대로인 이미지와 비슷합니다.
이 업그레이드의 혜택은 로컬 환경에서 LLM을 실행할 때 특히 커집니다. 개인 PC나 사내 서버에서 LLM을 구동할 때 가장 큰 벽은 GPU의 VRAM (비디오 메모리) 용량 부족입니다. 기존 어텐션에서는 긴 문장을 읽힐 경우 메모리 사용량이
장문 처리와 할루시네이션(Hallucination)의 관계
DSA의 주요 목적은 속도 향상과 메모리 절약이지만, 할루시네이션 (Hallucination, 사실에 근거하지 않은 출력을 생성하는 현상) 방지에도 간접적으로 기여하고 있습니다.
LLM에는 긴 문장을 읽히면 처음과 마지막 내용만 기억하고, 중간 부분에 적힌 중요 사항을 놓치는 약점이 있었습니다. 이 현상은 Lost in the middle이라고 불립니다. 놓친 정보에 대해 질문을 받으면, AI는 모른다고 답하는 대신 그럴듯한 거짓말을 생성해 버립니다.
기존 어텐션은 모든 단어에 조금씩 주의를 분산시키기 때문에, 노이즈에 파묻혀 중요한 정보를 놓치기 쉬웠습니다. DSA는 현재 처리와 관련이 깊은 정보만을 핀포인트로 찾아내어 그곳에 집중합니다. 무관한 정보에 현혹되지 않게 되어, 긴 문장 중간에 파묻힌 사실도 정확하게 집어낼 수 있습니다. 문맥을 놓침으로써 발생하는 할루시네이션을 억제하는 효과가 나타납니다.
계산 자원의 제약이 알고리즘의 혁신을 낳았다
DSA가 탄생한 배경에는 계산 자원의 제약이 있습니다. 미국의 수출 규제로 인해 중국 기업들은 NVIDIA의 최신 GPU (H100 등)를 자유롭게 조달할 수 없습니다. DeepSeek가 사용할 수 있는 것은 이전 세대 GPU (A800 등)나 제한된 수의 GPU입니다.
하드웨어의 힘으로 이길 수 없다면, 소프트웨어를 극한까지 갈고닦아 승부한다는 길을 택했습니다. DSA를 비롯한 연산 절감 기술을 구사한 결과, 제한된 GPU 환경에서도 미국의 톱 모델에 필적하는 성능을 실현하고 있습니다.
백엔드 세계에서도 서버를 늘리는 것이 아니라 쿼리의 실행 계획 (Execution Plan)을 재검토함으로써 극적으로 개선되는 경우가 있습니다. DSA는 이러한 발상을 뉴럴 네트워크 (Neural Network)의 가장 계산이 무거운 부분에 도입한 것입니다.
요약
DSA는 기존 어텐션 메커니즘이 수행하던 모든 토큰의 전수 조사 계산을 검색 엔진과 동일한 3단계 파이프라인으로 교체한 아키텍처입니다. LSH를 통한 경량 분류로 후보를 좁히고, 무거운 행렬 계산은 상위 K개에 대해서만 실행함으로써 정확도를 유지하면서도 계산량을 극적으로 줄였습니다. 이 메커니즘은 속도와 메모리 개선뿐만 아니라, 장문 처리 시의 할루시네이션 억제에도 간접적으로 기여합니다. 전치 인덱스 (Inverted Index)나 LSH와 같이 백엔드에서 오랫동안 활약해 온 기술이 뉴럴 네트워크의 심장부에組み込まれている (組み込まれている, 통합되어 있는) 사실은 소프트웨어 엔지니어에게 시사하는 바가 큽니다.
참고 문헌
이 기사에서 다룬 DSA(DeepSeek Sparse Attention)의 정식 논문 명칭은 Native Sparse Attention(NSA)입니다. DSA는 통칭이며, 논문에서는 「Native Sparse Attention: Hardware-Aligned and Natively Trainable Sparse Attention」이라는 제목으로 발표되었습니다.
- Native Sparse Attention: Hardware-Aligned and Natively Trainable Sparse Attention — Sparse Attention 기법을 제안한 논문 (2025년 2월)
- DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model — Multi-head Latent Attention (MLA)를 도입한 논문 (2024년 5월)
- DeepSeek-V3 Technical Report — MLA와 MoE를 결합한 모델의 기술 보고서 (2024년 12월)
- Attention Is All You Need — Transformer 아키텍처를 제안한 원본 논문 (2017년 6월)
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기