본문 바로가기
IT 개발/AI

[LLM] 어텐션

by 이것 저것 모든것 2025. 3. 3.
728x90

 

어텐션에 대한 설명

어텐션(Attention)은 딥러닝, 특히 자연어 처리(NLP) 분야에서 널리 사용되는 메커니즘입니다. Transformer 모델의 핵심 구성 요소이며, 입력 데이터의 특정 부분에 집중하여 모델의 성능을 향상시키는 데 중요한 역할을 합니다.

어텐션의 작동 방식

사람이 문장을 읽을 때 모든 단어에 동일한 중요도를 두지 않고, 문맥에 따라 특정 단어에 더 집중하는 것처럼, 어텐션 메커니즘도 모델이 입력 데이터의 특정 부분에 더 집중하도록 도와줍니다. 이는 쿼리(Query), 키(Key), 값(Value)이라는 세 가지 요소를 사용하여 이루어집니다.

  1. 쿼리(Query): 현재 처리 중인 단어 또는 정보를 나타냅니다.
  2. 키(Key): 입력 데이터의 다른 모든 단어 또는 정보를 나타냅니다.
  3. 값(Value): 키와 연결된 실제 정보를 나타냅니다.

어텐션 메커니즘은 쿼리와 각 키 사이의 유사도를 계산하여 어텐션 가중치를 생성합니다. 이 가중치는 쿼리와 관련성이 높은 키에 더 높은 값을 부여합니다. 그런 다음, 이 가중치를 사용하여 값들을 가중 평균하여 컨텍스트 벡터를 생성합니다. 이 컨텍스트 벡터는 쿼리에 대한 추가 정보를 제공하며, 모델이 입력 데이터를 더 잘 이해하도록 도와줍니다.

어텐션의 종류

어텐션 메커니즘에는 다양한 종류가 있으며, 대표적으로 다음과 같은 것들이 있습니다.

  • 셀프 어텐션(Self-Attention): 입력 데이터 내에서 각 단어가 다른 모든 단어와의 관계를 고려하여 컨텍스트 벡터를 생성합니다. 이는 문장 내에서 단어들 간의 관계를 파악하는 데 유용합니다.
  • 크로스 어텐션(Cross-Attention): 두 개의 다른 입력 데이터 간의 관계를 파악하여 컨텍스트 벡터를 생성합니다. 이는 번역이나 요약과 같은 작업에서 유용합니다.

어텐션의 장점

어텐션 메커니즘은 다음과 같은 장점을 제공합니다.

  • 긴 시퀀스 처리: RNN과 같은 순차 모델과 달리, 어텐션은 입력 데이터의 모든 부분을 동시에 고려할 수 있으므로 긴 시퀀스를 효과적으로 처리할 수 있습니다.
  • 병렬 처리: 어텐션 계산은 병렬화가 가능하여 학습 속도를 향상시킬 수 있습니다.
  • 해석 가능성: 어텐션 가중치를 통해 모델이 어떤 부분에 집중했는지 파악할 수 있어 모델의 해석 가능성을 높여줍니다.

어텐션의 활용

어텐션은 자연어 처리 분야에서 다양한 작업에 활용되고 있습니다.

  • 기계 번역: 번역할 문장의 각 단어에 대해 원본 문장의 어떤 단어에 집중해야 하는지 파악하여 번역 품질을 향상시킵니다.
  • 텍스트 요약: 중요한 정보를 담고 있는 단어에 집중하여 요약을 생성합니다.
  • 질의 응답: 질문과 관련된 텍스트 부분에 집중하여 정확한 답변을 찾습니다.
  • 이미지 캡셔닝: 이미지의 특정 영역에 집중하여 설명을 생성합니다.

어텐션은 딥러닝 모델의 성능을 향상시키는 데 중요한 역할을 하는 강력한 도구입니다. 다양한 분야에서 활용되고 있으며, 앞으로 더욱 발전할 것으로 예상됩니다.

 

728x90

 

어텐션 계산하기

이 코드는 compute_attention이라는 함수를 정의하여 어텐션 가중치를 계산하고 값에 적용하는 역할을 합니다. 이는 Transformer 모델의 핵심 구성 요소인 어텐션 메커니즘의 중요한 부분입니다.

자세히 살펴보겠습니다.

  1. 필요한 라이브러리 가져오기:
content_copy 
from math import sqrt
import torch.nn.functional as F
Use code with caution
- `math` 라이브러리의 `sqrt`는 제곱근을 계산하는 데 사용되며, 어텐션 점수를 조정하는 데 사용됩니다.
- `torch.nn.functional` ( `F` 로 가져옴)은 어텐션 가중치 계산에 사용되는 `softmax` 함수를 포함하여 다양한 PyTorch 함수에 대한 액세스를 제공합니다.
  1. compute_attention 함수 정의:
content_copy 
def compute_attention(querys, keys, values, is_causal=False):
  dim_k = querys.size(-1)
  scores = querys @ keys.transpose(-2, -1) / sqrt(dim_k)
  weights = F.softmax(scores, dim=-1)
  return weights @ values
Use code with caution
- 이 함수는 일반적으로 입력 임베딩에 적용된 선형 변환의 출력인 `querys`, `keys`, `values` 를 입력으로 받습니다.
- `is_causal` 은 이 특정 구현에서는 사용되지 않는 부울 매개변수입니다 (기본값은 `False`). 일부 어텐션 메커니즘에서는 시퀀스에서 미래 토큰에 주의를 기울이지 않도록 하는 데 사용됩니다 (예: 언어 모델링에서).
  1. 어텐션 점수 계산:
content_copy 
dim_k = querys.size(-1)
  scores = querys @ keys.transpose(-2, -1) / sqrt(dim_k)
Use code with caution
- `dim_k` 는 키 (및 쿼리)의 차원을 저장합니다.
- `scores` 는 `querys` 와 전치된 `keys` 간의 내적을 수행한 다음 결과를 `dim_k` 의 제곱근으로 나누어 계산됩니다. 이러한 스케일링은 학습 과정을 안정화하는 데 도움이 됩니다.
  1. 어텐션 가중치 계산:
content_copy 
weights = F.softmax(scores, dim=-1)
Use code with caution
- `weights` 는 `scores` 에 softmax 함수를 적용하여 얻습니다. 이렇게 하면 가중치가 정규화되고 합이 1이 되어 쿼리와 관련된 각 키의 중요도를 나타냅니다.
  1. 값에 어텐션 가중치 적용:
content_copy 
return weights @ values
Use code with caution
- 최종 출력은 `weights` 를 계수로 사용하여 `values` 의 가중 합을 수행하여 계산됩니다. 이를 통해 모델은 입력 시퀀스의 가장 관련성이 높은 부분에 효과적으로 집중할 수 있습니다.

요약하자면, compute_attention 함수는 Transformer 모델의 기본 구성 요소인 scaled dot-product attention 메커니즘의 핵심 로직을 구현합니다. 쿼리, 키, 값 간의 관계를 기반으로 어텐션 가중치를 계산하고 이러한 가중치를 사용하여 입력 시퀀스의 컨텍스트를 인식하는 표현을 생성합니다.

728x90

'IT 개발 > AI' 카테고리의 다른 글

[LLM] 텐서 (tensor)란?  (15) 2025.03.03
[LLM] 소프트맥스 (softmax)  (21) 2025.03.03
[LLM] 임베딩과 위치 인코딩 생성하기  (24) 2025.03.03
[LLM] 트랜스포머  (19) 2025.03.02
[LLM] 토큰 임베딩  (25) 2025.03.02