Sliding Window Attention: 긴 문맥을 더 효율적으로 읽기 위한 방법

포비·2026년 5월 7일

알아보자

목록 보기
102/111

Transformer를 공부하다 보면 결국 한 번은 Attention의 비용 문제를 만나게 된다.

Transformer의 강점은 문장 안의 토큰들이 서로를 직접 바라볼 수 있다는 점이다.
하지만 이 구조는 시퀀스가 길어질수록 비용이 급격히 커진다.

일반적인 self-attention에서는 각 토큰이 입력 전체의 모든 토큰을 바라본다.
입력 길이가 짧을 때는 문제가 크지 않지만, 문서가 길어지고 context length가 커질수록 attention matrix도 함께 커진다.

이 문제를 해결하기 위해 나온 대표적인 아이디어 중 하나가 Sliding Window Attention이다.


기본 아이디어

Sliding Window Attention은 이름 그대로 “움직이는 창”을 두고 attention을 계산하는 방식이다.

일반적인 full attention에서는 한 토큰이 전체 토큰을 모두 바라본다.
예를 들어 입력이 10,000토큰이라면, 각 토큰은 나머지 많은 토큰들과 관계를 계산해야 한다.

반면 sliding window attention에서는 각 토큰이 전체를 보지 않는다.
자기 주변의 일정한 범위만 본다.

예를 들어 window size가 512라면, 한 토큰은 전체 10,000토큰을 보는 것이 아니라 자신 근처의 512개 정도의 토큰만 바라본다.

즉, 핵심은 이렇다.

모든 토큰을 다 보지 말고,
가까운 토큰들만 보자.

이렇게 하면 attention 계산 범위가 제한되고, 긴 시퀀스를 훨씬 효율적으로 처리할 수 있다.


Full Attention과 Sliding Window Attention의 차이

Full Attention은 모든 토큰이 모든 토큰을 바라본다.

Token 1  -> Token 1, 2, 3, 4, 5, ...
Token 2  -> Token 1, 2, 3, 4, 5, ...
Token 3  -> Token 1, 2, 3, 4, 5, ...

반면 Sliding Window Attention은 가까운 범위만 바라본다.

Token 1  -> Token 1, 2, 3
Token 2  -> Token 1, 2, 3, 4
Token 3  -> Token 1, 2, 3, 4, 5
Token 4  -> Token 2, 3, 4, 5, 6

이 방식은 긴 문서를 처리할 때 특히 유용하다.

Full Attention의 계산 비용은 시퀀스 길이에 대해 대략 O(n²)로 증가한다.
반면 window size를 w로 고정하면 Sliding Window Attention은 대략 O(n × w) 형태로 볼 수 있다.

여기서 중요한 점은 w가 고정되어 있으면 입력 길이 n이 길어져도 비용이 제곱으로 폭발하지 않는다는 것이다.


왜 가까운 토큰만 봐도 되는가

처음에는 이런 의문이 생길 수 있다.

전체 문맥을 다 보지 않으면 성능이 떨어지는 것 아닌가?

어느 정도는 맞다.
Full Attention은 모든 토큰이 서로를 직접 볼 수 있기 때문에 표현력이 강하다.

하지만 실제 언어에서는 가까운 토큰들이 중요한 경우가 많다.
단어의 의미, 문장 구조, 구문 관계, 짧은 문맥 흐름은 대부분 주변 토큰들과 강하게 연결되어 있다.

예를 들어 다음 문장을 보자.

나는 어제 카페에서 친구를 만나 커피를 마셨다.

여기서 마셨다를 이해하는 데 가장 중요한 정보는 아주 멀리 떨어진 토큰이 아니라 커피를 같은 가까운 단어다.

Sliding Window Attention은 이런 지역적 문맥을 우선적으로 활용한다.


단순히 짧게 보는 것과는 다르다

Sliding Window Attention을 단순히 “문맥을 잘라서 보는 방식”으로 이해하면 조금 부족하다.

중요한 점은 Transformer layer가 여러 층으로 쌓인다는 것이다.

한 layer에서는 가까운 토큰만 볼 수 있다.
하지만 여러 layer를 지나면서 정보는 점점 더 멀리 전달될 수 있다.

예를 들어 window size가 4라고 해보자.

첫 번째 layer에서는 한 토큰이 주변 4개 정도의 토큰만 본다.
하지만 두 번째 layer에서는 그 주변 토큰들이 이미 자기 주변 정보를 담고 있다.
세 번째 layer로 가면 더 넓은 범위의 정보가 간접적으로 들어올 수 있다.

즉, 한 번에 전체를 보지는 않지만, layer를 거치면서 정보가 점진적으로 퍼질 수 있다.

이 점 때문에 Sliding Window Attention은 단순한 truncation과는 다르다.
그냥 앞부분이나 뒷부분을 잘라버리는 것이 아니라, 제한된 범위 안에서 정보를 계속 전달하는 구조다.


Longformer에서의 Sliding Window Attention

Sliding Window Attention을 설명할 때 자주 언급되는 모델이 Longformer다.

Longformer는 긴 문서를 처리하기 위해 full self-attention을 sparse attention pattern으로 바꾼 모델이다.
기본적으로 각 토큰은 주변 window 안의 토큰만 바라본다.

이렇게 하면 긴 문서를 더 효율적으로 처리할 수 있다.

하지만 Longformer는 모든 토큰을 local attention으로만 처리하지 않는다.
필요한 경우 일부 토큰에는 global attention을 부여한다.

예를 들어 문서 분류 작업에서는 [CLS] 토큰이 전체 문서를 봐야 할 수 있다.
질문응답 작업에서는 질문 토큰들이 문서 전체와 연결될 필요가 있다.

그래서 Longformer는 다음 두 가지를 함께 사용한다.

1. Local Attention
   - 대부분의 토큰은 주변 window만 본다.

2. Global Attention
   - 중요한 일부 토큰은 전체 문맥을 본다.

이 구조는 꽤 현실적인 타협이다.

모든 토큰이 전체를 보면 너무 비싸다.
하지만 모든 토큰이 가까운 곳만 보면 전역 정보가 부족하다.

Longformer는 대부분은 local하게 처리하고, 꼭 필요한 토큰만 global하게 연결해서 긴 문서 처리 문제를 해결하려고 했다.


Mistral 7B에서의 Sliding Window Attention

Sliding Window Attention은 긴 문서 모델에서만 쓰이는 개념이 아니다.
최근 LLM에서도 중요한 최적화 방식으로 사용된다.

대표적인 예가 Mistral 7B다.

Mistral 7B는 Grouped-Query Attention과 Sliding Window Attention을 함께 사용한다.
여기서 Sliding Window Attention은 긴 시퀀스를 더 낮은 추론 비용으로 처리하기 위한 장치로 사용된다.

Mistral 7B에서 중요한 점은 window 밖의 토큰이 완전히 의미 없어지는 것은 아니라는 점이다.

각 layer에서는 제한된 window만 보지만, 여러 layer를 통과하면서 정보가 더 멀리 전달될 수 있다.
즉, 한 layer에서 모든 것을 직접 보지 않아도 layer가 쌓이면서 window보다 먼 토큰의 정보도 간접적으로 영향을 줄 수 있다.


Rolling Buffer Cache

Mistral 7B와 Sliding Window Attention을 이야기할 때 함께 나오는 개념이 Rolling Buffer Cache다.

LLM이 텍스트를 생성할 때는 이전 토큰들의 key-value 값을 cache에 저장한다.
이것을 KV cache라고 한다.

일반적인 방식에서는 생성되는 토큰이 많아질수록 KV cache도 계속 커진다.
긴 context를 처리할수록 메모리 부담이 커지는 이유 중 하나다.

하지만 Sliding Window Attention에서는 어차피 일정 범위 안의 토큰만 본다.
그렇다면 모든 과거 토큰의 key-value를 계속 저장할 필요가 없다.

Rolling Buffer Cache는 이 점을 이용한다.

window size만큼의 cache 공간만 유지하고,
오래된 값은 새 값으로 덮어쓴다.

즉, cache 크기가 계속 증가하지 않고 고정된 크기 안에서 굴러간다.

이 구조는 긴 시퀀스를 처리할 때 메모리 사용량을 줄이는 데 도움이 된다.


장점

Sliding Window Attention의 가장 큰 장점은 효율성이다.

입력 길이가 길어져도 모든 토큰 쌍을 계산하지 않기 때문에 full attention보다 비용이 훨씬 낮다.
긴 문서, 긴 코드, 긴 대화처럼 context가 커지는 상황에서 특히 유용하다.

두 번째 장점은 지역 문맥을 잘 활용한다는 점이다.

언어에서 많은 정보는 가까운 위치에 있다.
문장 안의 단어 관계, 코드에서 변수 사용, 문단 안의 흐름은 대부분 근처 문맥에 의존한다.

Sliding Window Attention은 이 지역성을 잘 이용한다.

세 번째 장점은 시스템 구현 측면에서도 현실적이라는 점이다.

특히 LLM 추론에서는 KV cache 메모리가 중요하다.
Sliding Window Attention과 rolling buffer cache를 함께 사용하면 긴 입력을 더 낮은 메모리 비용으로 처리할 수 있다.


단점

물론 단점도 있다.

가장 큰 단점은 먼 거리의 관계를 직접 보기 어렵다는 점이다.

예를 들어 문서 맨 앞에서 정의한 개념이 문서 맨 뒤에서 다시 등장하는 경우를 생각해보자.
Full Attention이라면 두 위치가 직접 연결될 수 있다.

하지만 Sliding Window Attention에서는 두 토큰이 서로의 window 안에 있지 않으면 직접 attention할 수 없다.

이 문제를 해결하기 위해 몇 가지 방식이 사용된다.

첫 번째는 global attention이다.
중요한 토큰만 전체 문맥을 보게 만들어 전역 정보를 연결한다.

두 번째는 layer를 여러 개 쌓는 것이다.
각 layer에서 정보가 조금씩 이동하면 먼 정보도 간접적으로 전달될 수 있다.

세 번째는 dilated sliding window 같은 변형이다.
window 안에서 모든 가까운 토큰을 보는 대신 일정한 간격으로 더 먼 토큰까지 보게 만들어 receptive field를 넓히는 방식이다.


직관적으로 이해하기

Sliding Window Attention은 사람이 긴 글을 읽는 방식과 비슷하다.

사람도 책을 읽을 때 모든 페이지를 동시에 비교하지 않는다.
현재 문장을 읽을 때는 바로 앞뒤 문장을 가장 많이 참고한다.

필요할 때만 제목, 목차, 요약, 앞부분의 핵심 정의를 다시 본다.

Sliding Window Attention도 비슷하다.

대부분의 토큰은 가까운 문맥만 본다.
정말 중요한 일부 위치만 전체 문맥과 연결한다.
이렇게 하면 전체를 매번 다 보는 것보다 훨씬 효율적이다.


왜 지금 중요한가

LLM이 커지면서 모델 크기만큼 중요한 것이 context length가 되었다.

사용자는 더 긴 문서, 더 긴 코드, 더 긴 대화를 한 번에 넣고 싶어 한다.
하지만 full attention으로 context length를 계속 늘리면 계산량과 메모리 비용이 너무 커진다.

Sliding Window Attention은 이 문제에 대한 현실적인 타협점이다.

전체 문맥을 매번 완전히 보지는 않는다.
대신 가까운 문맥을 효율적으로 처리하고, layer 구조나 global attention, rolling cache 같은 기법으로 긴 입력을 다룰 수 있게 만든다.

즉, Sliding Window Attention은 단순히 성능을 조금 포기하고 속도만 챙기는 꼼수가 아니다.
긴 문맥을 실제 시스템에서 감당 가능한 비용으로 처리하기 위한 구조적 선택에 가깝다.


정리

Sliding Window Attention은 각 토큰이 전체 시퀀스를 보는 대신, 자신 주변의 일정한 window 안에서만 attention을 계산하는 방식이다.

이 방식은 full attention의 O(n²) 비용 문제를 줄이고, 긴 문서나 긴 context를 더 효율적으로 처리할 수 있게 만든다.

Longformer는 이 아이디어를 긴 문서 처리에 적극적으로 사용했고, local attention과 global attention을 결합해 긴 입력을 다룰 수 있게 만들었다.

Mistral 7B는 Sliding Window Attention을 LLM 추론 효율화에 활용했고, rolling buffer cache를 통해 KV cache 메모리 사용량을 줄였다.

결국 핵심은 이렇다.

모든 토큰을 전부 보지 않아도 된다.
가까운 문맥을 중심으로 보고,
필요한 정보만 더 넓게 연결하면 된다.

한 줄로 요약하면 다음과 같다.

Sliding Window Attention은 모든 토큰을 전부 보지 않고, 가까운 문맥을 중심으로 attention을 계산해서 긴 입력을 현실적인 비용으로 처리하게 해주는 방법이다.


참고자료

profile
무엇이든 필요한 것을 합니다. https://mint-middle-1e5.notion.site/2b7655e8316980ad9422d96a6f3947de

0개의 댓글