논문명: RECOMP: Improving Retrieval-Augmented LMs with Compression and Selective Augmentation
논문 링크: https://arxiv.org/abs/2310.04408
'Lost in the middle' 을 해결하기 위해 등장한 논문 중 하나다.
https://heygeronimo.tistory.com/101
핵심
- RECOMP (Retrieve, Compress, Prepend)
- Retrieve: 문서를 가져와서
- Compress: 압축해서 (이때 생성형 요약과 추출형 요약을 곁들이며)
- Prepend: 붙이자
그러면 방법이 핵심이겠네?
: Black-Box LM 이라고 가정한다. 예전에 Black-Box의 의미는 모델이 어떻게 이런 답을 생성하는지 알 수가 없어서 딥러닝 모델은 속을 알 수 없다는 의미로 사용했었다. 하지만 RAG 분야에서는 학습이 불가능한 모델을 Black-Box라고 부르는 것 같다.
Extractive Retriever
- 추출형이니까 문서 내에서도 문장마다 이 문장은 쓰자, 이 문장은 쓰지 말자를 정한다.
- Dual Encoder 구조라고 한다
- Input Query 전용 인코더 A, Sentence 전용 인코더 B가 있다고 보면 된다. 이때 인코더가 만드는 임베딩의 차원은 같다. 그 이유는 내적을 하기 위함이다. 내적값이 클수록 Query 와 가깝다, 즉 도움이 되는 문장이라고 가정한다.
- 그래서 내적값으로 등수를 측정하여 K개를 뽑아서 입력해준다고 한다.
- 임베딩을 추출할 때는 문장을 대표하는 [CLS] token 을 활용했다고 한다.
Abstractive Retriever
- Dual Encoder 구조를 사용한다. 생성형 요약이기 때문에 그런 것 같다.
- 다만 문서를 요약해서 LLM에게 주려는 목적으로 제작된 데이터셋은 기존에 없었다.
- 그래서 LLM을 통해서 요약을 할 것이라고 한다. LLM이 query-focused summary 생성을 잘 한다는 가정 하에 진행하는데, 그 가정과 관련된 논문을 3개 정도 제시했다. 아래 논문이 그 중 하나인데, 지도 교수님이 같아서 남겨둔다. (추후 정리도 해보겠다.)
- 하여튼 LLM의 능력을 distillation 할 것이라고 한다. 자세한 건 뒤에서 설명하겠다.
https://arxiv.org/abs/2305.19271
그냥 잘하는 요약 모델 아무거나 가져와서 쓰면 안돼?
: 네, 안됩니다. 그 이유는 저자는 아래와 같이 밝힌다.
Our compressor resembles text summarization models in the output should be faithful to the original input, yet the main goal is different. Instead of capturing salient information for humans readers, compressors aim to produce a concise text that are useful for a LM on an end task.
- 요약은 사람 독자에게 주요 정보를 추출하여 전달하는 게 목적이라면,
- 압축은 LM에게 작업하기 위해서 딱 필요한 정보만 제공해야 한다.
- 그래도 모르겠다고? 예시를 들어주겠다.
- 요약: 뉴스 기사를 읽었을 때 제목과 같이 한줄로 내용만 작성해주면 됨. 예컨대, '라스베가스 대홍수'라고 요약할 수 있음.
- 압축: 언어모델이 이미 알고 있는 정보라면, 기사의 핵심이여도 제공하지 않아도 됨. 이미 언어모델이 알거나 작업과 관련이 없어보이면 그 문서의 핵심이라도 날려버리면 됨. 예컨대, 쿼리/질문이 "대홍수가 언제쯤 발생하기 시작한거야?"였다면, 원래는 대홍수가 발생한 시각까지는 중요하지 않은 정보였는데, 여기선 중요한 정보라서 제공해줘야 함.
그래서 학습은 어떻게 하는데?
Extractive Retriever
- 이 모델은 인코더 모델 2개뿐이다. 문장 인코더랑 쿼리 인코더만 사용한다.
- 둘의 내적값이 높을수록 쿼리와 관련된 문장이라고 보기 때문에 유사도를 높이는 게 핵심이다.
- Retrieval 분야에서 흔히 쓰는 Contrastive Loss 다. Postive Sample 과의 유사도는 높이고, Negative Sample 과의 유사도는 낮추는 방식이다. 혹여나 이 손실함수의 형태가 어색하다면 Retrieval 분야부터 공부하는 것이 좋다. DPR 같은 논문이 쉬우니 찾아보세요 :)
그렇다면, 핵심은 Postive 와 Negative 를 뽑는 것이다. 이걸 어떻게 뽑을까?
- 그 문장과 쿼리를 같이 넣었을 때 정답을 생성할 확률을 기반으로 점수를 매겼다
- 이 점수가 높은 5개를 postive 로 뽑힌다. 그리고 특이한 점은 negative 문장을 뽑을 때 가장 낮은 점수 5개를 뽑는 게 아니라 postive 에 포함되지 않는 문장 중 가장 점수가 높은 문장을 뽑았다. 느낌상 hard negative, 그럴싸하지만 필요없는 문장을 구분하기 위함인 것 같다.
- 평가는 '그래서 네가 준 문장들로 LM이 정답을 생성해? 아니면 못해?'로 평가한다고 한다.
Abstractive Retriever
일단 정답이 없는데? 존재하지 않는 태스크라서 만들어야 해
: 생성형 요약은 애초에 정답이 없다. 그래서 만들어야 한다. 거대 언어 모델의 도움을 받고자 한다.
- 위처럼 GPT3.5-turbo 에게 부탁해서 정답을 만들었다고 한다
- 아까 말했듯이 거대언어모델은 잘한다는 가정을 전제로 데이터셋 제작에 들어간다
- NQ dataset 을 만들 때 쓰는 프롬프트만 읽어봐도 감이 온다. (직접 읽어보라는 뜻)
하지만 생성한 요약을 바로 쓰는 건 아니고 필터링을 거친다고 한다.
겁나 복잡해보인다. 하지만 걱정하지 마라. 요약해서 설명하겠다.- 2번 라인: 1 ~ T: T가 데이터 개수다. 그냥 데이터마다 필터링을 적용하겠다 정도로만 받아들이자.
- 4번 라인: n 은 한 데이터당 n개의 요약 후보를 만들었다는 의미다. 예컨대, 데이터 1개당 5개의 요약을 생성해서 그 중 가장 뛰어난 요약을 사용하겠다고 보면 편하다.
- 5 ~ 8번 라인: 각 후보를 입력에 붙여서 언어모델의 점수를 측정한다. 가장 뛰어난 요약 후보가 함께 주어졌을 때 정답 생성 능력이 가장 좋을테니까. n개 중 최고 성능 점수를 기록한 요약을 저장하는 게 8번 라인이다.
- 9번 라인: 오히려 요약을 안 주는 게 더 좋을 수 있으니 요약 없이 언어 모델에게 물어본다.
- 10 ~ 13번 라인: 요약 제공한 것 중 최고 성능과 요약 안 준 상태에서의 성능을 비교한다. 안 주는 게 나으면 그냥 빼버리고, 요약을 함께 제공하는 게 나으면 13번 라인처럼 추가한다.
- 14번 라인: 이렇게 가장 도움이 되는 요약만 모인 데이터셋으로 Fine-tune 한다.
성능이 궁금하다, 하나만 보자
: 다 요약하기엔 시간이 없고 아이디어는 대략 이해했으니 성능 하나만 같이 살펴보자.
- 첫번째 줄: 제공 토큰 개수가 0이다. 즉, 쿼리 말고 어떤 정보도 주지 않았을 때의 성능이다.
- RALM without compression: Retrieval 까진 했는데 압축을 전혀 적용하지 않았을 때의 성능이다. 확실히 토큰 수가 엄청나게 증가하면서 성능도 떨어지는 걸 확인할 수 있다.
- Phrase/token level compression: 압축을 하긴 하는데, 기존 방법론으로 시도한다. Bag-of-Words 기법은 빈도관계 없이 uni-gram으로 만들어서 공백단위로 합쳤다고 한다. NE는 Named Entity 만 추출해서 ' '.join(NE_list) 처럼 합쳤다고 한다. 이거 밑에 그림 넣어뒀으니 보면 이해가 잘 될 것이다. 여튼 기존 압축 방법론으로 해봤다는 점. 토큰 수가 확실히 줄었다.
- Extractive Compression of Top 5 documents: 5개의 문서 중 최고의 문장 1개 뽑기. 이 방법에선 Ours 가 확실히 가장 좋다.
- Oracle: 이건 5개의 문서에 있는 모든 문장을 실제로 하나씩 넣어보면서 최고의 성능을 찾은 것이다. 최고 성능의 상한선을 보기 위함인데, ours 와 그렇게 머지 않다는 걸 확인할 수 있다. w/ gpt2는 최고 성능을 확인할 때, 전부 GPT2로 통일해서 model 에 따라 달라지지 않도록 고정했다고 한다. (이게 무슨 말이냐고? Ours 는 GPT2로만 문장 1개씩 뽑도록 학습했는데, oracle 은 GPT2-XL, GPT2-J 등 평가 모델에서 최고 성능을 뽑는 건 좀 불공정해. 최고 성능을 뽑는 걸 일일이 다 확인하는 평가 모델이라도 GPT2로 맞춰줘야 평등하지!)
더 자세하게 읽는 건 나중에 하도록 하자. 핵심과 구현 방식을 이해하는 게 중요하다. 이렇게 압축하는 방식이 있다는 걸 알아두자.