03.13 D+3
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 생성할 때마다 뽑지 않는다고 생각한 것 같다.)
- RAG-token은 top-k를 검색하는 과정이 매 token 생성할 때마다라고 한다. (논문에 정확히 명시되진 않았지만, 아래 수식을 본 몇몇 블로그 분들 + gpt4는 이렇게 주장한다) RAG-Sequence는 1번만 검색하는데 비해 RAG-token은 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된다는 설명:
- https://velog.io/@tobigs-nlp/Retrieval-Augmented-Generation-for-Knowledge-Intensive-NLP-Tasks
- https://bea.stollnitz.com/blog/rag/
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