TIL

03.13 D+3

썬2 2024. 3. 14. 10:13

RAG-Sequence와 RAG-Token에 관하여

며칠전 "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks" 논문을 보았는데, 찜찜하게 넘어간 부분이 있어서 추가 정리하였습니니다~

RAG-Sequence

  • 하나의 passage가 주어졌다고 고정된 상태에서, 그 passage 기준으로 마지막 시점까지 generation 된다.
  • generation된 각각의 vocab disturibtion이 다시 passage의 score에 의해 가중합된다.
  • vocab distribution이 max length까지 생성된다. (꼭 max length만큼 출력하지 않는 듯)
    → vocab 크기 X max length가 passage 개수 만큼 나온다.
  • 근데 test 과정에서 문제가 발생한다.passage 하나마다 max length까지 생성이 됐기에, passage 하나마다 3가지 문장이 생성된다.
  • 3가지 문장에 대한 likelihood 값을 계산한다. 이 likelihood 값을 marginalization 하기 위해, vocab distribution에 대한 likelihood 값과 passage에 대한 likelihood 값을 가중치 합으로 계산하게 된다..
  • 근데 각 passage에서 생성되지 않은 문장도 있다. → 이를 계산할 방법이 없다. 탐색되지 않는 부분을 다시 모델에 forward해서 계산할 수 있지만, beam search가 클수록 연산량이 부담된다.
    ⇒ 디코딩 과정에서 탐색되지 못하면 logit을 0으로 가정한다.

RAG-Token

  • 하나의 passage에 대해 한 token 분포를 생성하고, 이 token 분포가 각 시점마다 생성되어 하나의 위치에 대해 모든 paasage를 가중합 하게 된다.
    → 하나의 위치마다 marginalization이 이루어진다.
  • 이를 매 토큰마다 반볷한다.
  • marignalization을 통해 The가 나오면, The도 세가지 passage에 모두 입력한다.
    → 복수의 vocab distribution을 한번에 aggregation해서 기존에 알고 있는 generation 과정을 따라한다. 때문에 beam search / Nucleus Sampling 등 다양한 디코딩 방법론을 사용 가능하다.

그렇다면 RAG-Sequence와 RAG-Token 중 뭐가 더 효율적인가?

문제 정의에 따라 다른데,

  • token-level precision과 다양한 소스로부터  output을 다양하게 뽑는 것이 중요하다면, RAG-token
  • 전체 문장에서  output이 일관적이고 통일성 있게 뽑는 것이 더 중요하다면, RAG-Sequence
  • 속도 측면은, RAG-Sequence가 더 빠른 경향이 있다.
    • RAG-token은 top-k를 검색하는 과정이 매 token 생성할 때마다라고 한다. (논문에 정확히 명시되진 않았지만, 아래 수식을 본 몇몇 블로그 분들 + gpt4는 이렇게 주장한다) RAG-Sequence는 1번만 검색하는데 비해 RAG-token은 token 생성할 때마다 검색해야해서 더 느리다는 의견.
      • 아래 RAG-token의 Retriever가 있는 위치를 RAG-Sequence랑 비교해보면, Pi 오른쪽에 있어서 그렇게 해석한 것 같다. ( Retriever인 p_eta의 condition이 x뿐이라, generated된 토큰인 y_i를 넣지 않는다면, x는 고정이라 결과값은 같을텐데 top-k를 다시 검색하는 의미가 있나? 라는 생각이 들어 처음에는 token 생성할 때마다 뽑지 않는다고 생각한 것 같다.)

왜 Jeopardy question generation이 더 좋을까?
답변에 따른 질문 생성이라서, 다양한 도큐먼트를 많이 참고해서 token-level이 더 좋은듯하다.

 

참고:

RAG 논문 설명: https://www.youtube.com/watch?v=gtOdvAQk6YU&t=1s

디코딩 전략 설명: https://beausty23.tistory.com/235

RAG-token에서 token 생성할 때마다 generated된다는 설명:

 

 

Probability와 Likelihood 차이

likelihood(가능도): 관측된 사건이 고정된 상태에서, 확률 분포가 변화될 때(=확률 분포를 모를 때 = 가정할 때), 확률을 표현하는 단어

probability(확률):  주어진 확률 분포가 고정된 상태에서, 관측되는 사건이 변화될 때, 확률을 표현하는 단어

 

N-gram language model에서 디코딩 전략

아래처럼 Bigram이라면 문서에서 두쌍씩 단어들이 있는 확률들을 구한다.

만약 START 다음 단어를 고른다면, Word1이 START이고 Word2가 And, I, You, But인 단어들 중 Probability가 가장 높은 단어를 고를 수 있다. (Greedy)
하지만 이렇게하면 다양한 답이 나올 수 없다. 그렇기에 확률이 높은 k개에서 연이어 고르거나(beam search), 랜덤 샘플링으로 고를 수도 있다.

 

Beam-Search란?

빔의 개수(K)를 골라서 각 시점마다 최적의 K개를 남긴다. (일종의 가지치기)

https://blog.naver.com/sooftware/221809101199