본문 바로가기

인공지능(AI) 이론과 코드/6. 자연어처리(NLP)

[생성형 AI] MQR 뜻 의미(다중 쿼리 검색기, Multi Query Retriever)

MQR(Multi Query Retriever)

 

[한 줄 정의]

사용자 질문(쿼리)을 의미는 유사하지만, 형태는 다른 프롬프트 생성을 자동화하는 기술

 

[ 설명 ]

 

 MQR은 질문(Query)에 대해 DB를 검색하고, 모든 쿼리에서 고유한 공통점을 가져와서, 잠재적으로 관련이 있는 DB 집합을 가져옵니다. 동일한 질문에 대해 다양한 관점의 프롬프트를 생성함으로써, Cos 유사도* 등 거리 기반 검색의 일부 한계를 극복하고 더 풍부한 결과를 얻을 수 있습니다.

 

코사인 유사도(cosine similarity)는 내적공간의 두 벡터간 각도의 코사인값을 이용하여 측정된 벡터간의 유사한 정도를 의미한다. 각도가 0°일 때의 코사인값은 1이며, 다른 모든 각도의 코사인값은 1보다 작다.

- 위키백과 -

 

Cos 유사도 등, 거리 기반 Vector DB 검색은 고차원 공간에 쿼리를 포함(표시)하고 "거리"를 기반으로 유사한 포함된 문서를 찾습니다. 그러나 쿼리 문구가 미묘하게 변경되거나 임베딩이 데이터의 의미를 잘 포착하지 못하는 경우, 검색 시 다른 결과가 나타날 수 있습니다. 이러한 문제를 해결하기 위해 등장한 기술이 바로 MQR(Multi Query Retriever) 입니다.

 

[ 연구논문 ]

  1. Joshua Ainslie  등, " GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints " - 해당 논문은 RAG의 기본 원리와 사용 사례에 대해 상세히 다루고 있습니다.
  2. Noam Shazeer, "Fast Transformer Decoding: One Write-Head is All You Need" - 이 논문은 Transformer 신경 시퀀스 모델에 사용되는 Multi-head attention layers 는 시퀀스 간에 정보를 이동하기 위한 RNN의 대안으로 제시했습니다.(2019)

둘 중, 첫번째 논문인 " GQA " 에 대해 아래와 같이 알아보겠습니다. 이 논문은 2023년 발표된 논문으로 61회 인용되었습니다.('24.2.16 기준)


 

[ 논문요약 ]

 

해당 논문은 Multi Query 다중 쿼리 트랜스포머 모델을 학습하기 위한 새로운 방법입니다. 이 방법은 Multi Head 멀티헤드 체크포인트에서 일반화된 다중 쿼리 트랜스포머 모델을 훈련하는 것을 중점적으로 다룹니다. 

또한, 멀티쿼리 트랜스포머 모델의 효율성과 성능을 평가하기 위해 GQA 그룹화된 쿼리 어텐션(Grouped-query attention) 실험을 수행하고, 이러한 모델이 다양한 자연어 처리 작업에서 어떻게 성능을 향상시킬 수 있는지에 대한 결과를 제시합니다.

 

GQA 그룹화된 쿼리 어텐션(Grouped-query attention)은 대신 각각의 그룹에 대해 단일 키와 밸류 헤드를 공유하며, 다중 헤드와 다중 쿼리 어텐션 사이에서 보간을 수행합니다. 구글이 발표한 LLM 모델 LaMa2 에서 GQA가 적용되었습니다. 앞서 언급한 MHA와 MQA의 장점을 융합하여, 빠르면서도(MHA의 장점) 성능을 유지(MHA의 장점) 하는 것이 가능해졌습니다.

 

 

[ 수학적인 개념 ]

 

LLM의 언어 표현의 대부분은 주의 작업을 통해 시퀀스 전체에 걸쳐 컨텍스트를 혼합하는 데서 비롯됩니다. Vaswaniet al . Multi-Head Attention을 다음과 같은 수학적 연산으로 제안합니다. 여기서 h는 작업의 "헤드" 수를 나타내고 S와 L은 각각 입력 및 출력 시퀀스 길이를 나타내며 d_k는 모델 아키텍처의 숨겨진 차원을 나타냅니다.

 

https://blog.fireworks.ai/multi-query-attention-is-all-you-need-db072e758055


[ MQA 개념도 ]

 

다중 헤드 어텐션(Multi-Head Attention, MHA) 알고리즘의 개선 버전인 다중 쿼리 어텐션(Multi-Query Attention, MQA)을 가 등장했죠(2019). 이는 주의의 기계 효율성을 향상시키면서 정확도 저하를 최소화했습니다.

 

K와 V 값에서 헤드 차원 h을 제거하거나 크게 줄입니다. 다중 헤드 어텐션에서는 전체 주의 계산이 h번 복제되는 반면, 다중 쿼리 어텐션에서는 각 "헤드"의 쿼리 값 Q에 동일한 K와 V 변환을 적용합니다.

https://blog.fireworks.ai/multi-query-attention-is-all-you-need-db072e758055

 

 

[ MHA VS. GQA VS. MQA 개념도 ]

 

GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints

 

위 그림은 논문에 소개된 그룹화된 쿼리 방법의 개요입니다.

 

MHA 다중 헤드 어텐션(Multi-head attention)은 H개의 쿼리, 키, 밸류 헤드를 가집니다. 다중 쿼리 어텐션은 모든 쿼리 헤드에 대해 단일 키와 밸류 헤드를 공유합니다. NLP의 마일스톤 격인 유명한 Transfomer  논문에서 소개되었습니다.

 

MQA 멀티 쿼리 어텐션 (Multi-Query attention)QKV (Query, Key, Value) head가 각각 H개씩 있는 MHA와 달리 MQA에서는 QKV 중에서 key와 value의 헤드가 하나씩만 있습니다. Key와 Value 는 하나이지만, Query는 여러개 구조이므로 Multi Query 라고 부릅니다.

 

GQA 그룹화된 쿼리 어텐션(Grouped-query attention)은 대신 각각의 그룹에 대해 단일 키와 밸류 헤드를 공유하며, 다중 헤드와 다중 쿼리 어텐션 사이에서 보간을 수행합니다. 구글이 발표한 LLM 모델 LaMa2 에서 GQA가 적용되었습니다. 앞서 언급한 MHA와 MQA의 장점을 융합하여, 빠르면서도(MHA의 장점) 성능을 유지(MHA의 장점) 하는 것이 가능해졌습니다.


 

[ 파이썬 코드 구현 샘플 ] 

 

아래 코드는 언어 생성 모델(ChatOpenAI)을 사용하여 질문에 대한 관련 문서를 검색하는 과정을 보여줍니다. MultiQueryRetriever를 통해 ChatOpenAI를 기반으로한 검색 모델을 생성하고, 특정 질문에 대해 관련 문서를 찾아 unique_docs에 저장하는 예시입니다.

# 1. 샘플 벡터DB 생성기

# langchain 패키지에서 필요한 모듈들을 불러옵니다.
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings

# 블로그 글을 로드합니다.
loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
data = loader.load()

# 텍스트를 분할합니다.
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
splits = text_splitter.split_documents(data)

# 벡터DB 생성
embedding = OpenAIEmbeddings()
vectordb = Chroma.from_documents(documents=splits, embedding=embedding)


# 2. 검색기

# langchain 패키지에서 MultiQueryRetriever 모듈을 불러옵니다.
from langchain.retrievers.multi_query import MultiQueryRetriever

# langchain_openai 패키지에서 ChatOpenAI 모듈을 불러옵니다.
from langchain_openai import ChatOpenAI

# 질문을 설정합니다.(Task Decomposition에는 어떤 접근 방법들이 있나요?)
question = "What are the approaches to Task Decomposition?"

# ChatOpenAI 객체를 생성하여 언어 생성 모델을 설정합니다.
llm = ChatOpenAI(temperature=0)

# MultiQueryRetriever를 사용하여 언어 생성 모델로부터 검색 모델을 생성합니다.
retriever_from_llm = MultiQueryRetriever.from_llm(
    retriever=vectordb.as_retriever(), llm=llm
)

# 쿼리에 대한 로깅 설정
import logging

logging.basicConfig()
logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)

# 관련 문서들을 검색하여 unique_docs에 저장합니다.
unique_docs = retriever_from_llm.get_relevant_documents(query=question)

# 검색된 관련 문서들의 개수를 출력합니다.
len(unique_docs)

 

[ 페이퍼스 위드 코드 ] 

 

https://paperswithcode.com/method/multi-query-attention

 

Papers with Code - Multi-Query Attention Explained

Multi-head attention consists of multiple attention layers (heads) in parallel with different linear transformations on the queries, keys, values and outputs. Multi-query attention is identical except that the different heads share a single set of keys and

paperswithcode.com

 

다음은 PAPERS WITH CODE 에서 연결된 스타가 가장 많은 Pytorch 코드입니다.

Meta(facebook) Research 페이스북 연구소에서 만든 llama 모델입니다.

 

https://github.com/facebookresearch/llama

 

GitHub - facebookresearch/llama: Inference code for LLaMA models

Inference code for LLaMA models. Contribute to facebookresearch/llama development by creating an account on GitHub.

github.com

 

 

논문 원문은 아래에서 pdf로 다운로드 받으실 수 있습니다.

https://arxiv.org/pdf/2305.13245.pdf

 

반응형
LIST