🫡아래 자료를 참고하였습니다.
TeddyNote Youtube
오몰내알 Tistory blog
🔻Recall, Precision, F1-score 복습
ML/DL을 공부한 사람들은 이미 이 평가지표들에 대해 익술할 것이다. RAG도 큰 틀에서 보면 검색한 문서가 정답인지 아닌지 분류하는 classification task라고 볼 수 있으므로 해당 task의 평가지표를 활용할 수 있다.
아래의 간단한 예제를 통해 recall, precision, f1-score 계산 방법을 복습해보자.
(노란 gt는 negative, 파란 gt는 positive)
N,P : 예측이 true인지, false인지에 대한 정보
T,F : 예측이 맞았는지 틀렸는지에 대한 정보
gt (ground truth) : 정답
- \( recall = \frac{TP}{FN+TP}\)
- \( precision=\frac{TP}{FP+TP}\)
- Retrieval gt 1에 대한 recall, precision, f1 score
- \(recall=\frac{2}{0+2}=1.0\)
- \( precision=\frac{2}{3+2}=0.4\)
- \( f1-score=2\frac{1.0\times 0.4}{1.0+0.4}=0.571...\)
- Retrieval gt 2에 대한 recall, precision, f1 score
- \(recall=\frac{1}{1+1}=0.5\)
- \(precision=\frac{1}{1+1}=0.5\)
- \(f1-score=2\frac{0.5\times 0.5}{0.5+0.5}=0.285...\)
🔻RAG에서의 평가지표별 특징에 대해 이해하기
[이미지 출저 : TeddyNote Youtube]
RAG에서 retrieve하는 passages의 개수를 늘리면 recall은 증가하지만, precision은 감소한다. precision은 retrieve한 전체 passage들 중 정답 passage의 비율이다.
passage가 많아진다는 것은 곧 LLM(generator)이 쓸모없는 passage를 참고하여 환각 증세를 더 보이기 쉽다는 의미.
⇒ hallucination을 줄이고 싶다면 precision을 높이는 것이 유용할 수 있다.
금융, 법률 도메인처럼 절대 거짓말을 하면 안 되는 분야에서 precision 지표가 중요하게 작용한다.
- NDCG, mAP, mRR
- 본래 추천시스템에서 사용되던 평가함수이다.
- 다른 지표들과 다르게 “순서”(ex. cosine similarity에 의한 순위)를 고려하는 지표 ( Rank-Aware Metric ) (recall, precision, f1 score는 rank-unaware metric)
- recall이 똑같이 높은 두 retrieval 시스템을 평가할 때 이런 지표들이 유용하게 작용한다.
🔻nDCG, mAP, mRR 평가지표 이해하기
RAG를 공부하며 처음 알게 된 평가지표들인 만큼 예시와 함께 구체적으로 설명하고자 한다. 예시는 아래의 그림을 공통적으로 사용한다.
해당 retriever에 3개의 query를 질문한 뒤 성능을 측정하려고 한다.
세가지 query의 recall은 모두 1로 동일하지만, nDCG, AP, RR값은 모두 다르다.
🔸nDCG (normalized Discounted Cumulative Gain)
- 가장 효과적인 평가지표이지만, 복잡한 수식을 갖고 있는 만큼 측정하기 어려운 지표이다. 추천시스템이라면 각 아이템에 대한 평점이 존재해야 측정할 수 있고, RAG라면 각 passage에 대한 rel 점수가 미리 정의되어 있어야 한다. 그러나 현실적으로 vector db의 문서들에 대해 모든 query의 IDCG를 구해놓는 것이 어렵다.
- 하나의 쿼리에 대해 평가하는 지표이다.
- 여러 쿼리에 대해 평가하고 싶으면 각 쿼리에 대해 nDCG를 구한 다음 평균을 구하면 된다. → mnDCG?!
- DCG
- \[ DCG_p=\sum_{i=1}^p\frac{rel_i}{log_2(i+1)} \]
- rel = 관련도 점수, RAG에서는 similarity 값으로 해석할 수 있다. 또는 사용자가 설정할 수 있다. (위의 예시를 예로 들면, gt에 해당하는 passage는 rel=1, 해당하지 않는 passage는 rel=0으로 할 수 있다. 또는 gt의 순서대로 a=3, d=2, e=1이라는 rel값을 줄 수도 있다.)
- i : retrieve한 passage들의 순서 (p = passage의 개수)
- \(y=\frac{1}{log_2(x)}\) : 해당 그래프는 x가 증가할수록 y가 천천히 감소하는 그래프이다. 즉, DCG는 passage의 순서가 나중일수록 중요도가 점차 감소하도록 설계된 식이다. 그러나 rel 점수가 높은 passage라면 나중 순서라도 중요하게 여겨진다.
- 위의 식이 standard식이라면 industry 식에서는 relevance 점수를 더 강조하기 위해 아래와 같은 식을 사용 \[ DCG_p=\sum_{i=1}^p\frac{2^{rel_i}-1}{log_2(i+1)} \]
- IDCG (Ideal DCG) : 가장 이상적인 순서로 검색된 passage 리스트에 대한 DCG
- \[IDCG_p=\sum_{i=1}^{|REL_p|}\frac{2^{rel_i}-1}{log_2(i+1)}\]
- \(|REL_p|\) : list of relevant documents(ordered by their relevance) in the corpus up to position p, 즉 corpus에서 정답 passage들을 relevant 점수순으로 정렬한 passage 리스트
- nDCG : DCG를 IDCG로 나누어 정규화한 값이다.
- \[nDCG_p=\frac{DCG_p}{IDCG_p}\]
- 위의 예시에 대한 nDCG값
- Query 1의 nDCG 계산
- retrieved = [b,a,c,e,d]
- gt = [a,d,e]
- relevance = [0, 3, 0, 1, 2]
gt에 해당하지 않는 passage이면 rel값은 0이고, gt에 해당한다면 해당하는 순서대로 rel 값을 매긴다고 정의하자. - DCG = \(0+\frac{2^3-1}{log_2(3)}+0+\frac{2^1-1}{log_2(5)}+\frac{2^2-1}{log_2(6)}= 6.0953...\)
- IDCG = [3,2,1]
\(IDCG=\frac{2^3-1}{log_2(2)}+\frac{2^2-1}{log_2(3)}+\frac{2^1-1}{log_2(4)}=9.3927...\) - ⇒ nDCG = 0.6489…
- - 같은 방식으로 Q2, Q3도 계산하면 약 0.5513…, 0.68… 의 값이 나옴.
관련 높은 passage가 먼저 나올수록 점수가 높다는 사실을 확인할 수 있다.
+) rel 점수 정의를 단순히 gt이면 1, gt가 아니면 0으로 설정할 경우 nDCG의 차이는 더 드라마틱해진다. → nDCG_q1 = 약0.68, nDCG_q3 = 약0.85
🔸mAP (mean Average Precision)
- 평균 정밀도를 계산한 값으로, 여러 쿼리에서의 검색 성능을 평가할 때 유용하다.
- Precision @k : 전체 p개의 retrieved passages들 중 k번째 문서까지의 정밀도
- \[Precision@k = \frac{n(rel)}{k}\]
- n(rel) : k번째까지의 문서들 중 relevant한 문서(=ground truth)의 개수 (내가 임의로 이름지은 변수이다.)
- AP : 각 쿼리의 평균 정밀도
- \[AP=\frac{\sum_{k=1}^pPrecision@k\times rel_k}{n(rel)}\]
- rel_k = k번째 passage의 relevant score
- n(rel) : relevant한 문서(passage)(=ground truth)의 개수
- ex) Query에 대한 retrieved passages = [a,b,c,d,e]
- gt = [a,c,e]
- rel = [1,0,1,0,1] : gt인 것은 1, gt가 아닌 것은 0으로 부여.
- precision@1 * rel_1 : [1] → 1.0 * 1 = 1.0
- precision@2 * rel_2 : [1,0] → 0.5 * 0 = 0
- precision@3 * rel_3 : [1,0,1] → 0.66… * 1 = 0.66…
- precision@4 * rel_4 : [1,0,1,0] → 0.5 * 0 = 0
- precision@5 * rel_5 : [1,0,1,0,1] → 0.6 * 1 = 0.6
- ⇒ AP = (1.0+0.66+0.6)/3 = 0.753…
- mAP : Q개의 query에 대해 각각의 AP를 구한 후 평균값을 구하는 것.
- \[mAP = \frac{\sum_{i=1}^Q(AP_i)}{Q}\]
- Q : 평가할 쿼리의 개수
- 위의 예시에 대한 mAP값
- (rel 점수는 gt가 아닌 passage는 rel=0, gt인 passage는 rel=1 부여)
- Q1의 AP
-
retrieved = [b,a,c,e,d]
gt = [a,d,e]
rel = [0,1,0,1,1]
precision@2 * rel_2 = [0,1] * 1 = 0.5
precision@4 * rel_4 = [0,1,0,1] * 1 = 0.5
precision@5 * rel_5 = [0,1,0,1,1] * 1 = 0.6
AP = 1.6/3 = .0.533… - Q2의 AP
-
retrieved = [9,3,1,2,5]
gt = [1,2,3]
rel = [0,1,1,1,0]
precision@2 * rel_2 = [0,1] * 1 = 0.5
precision@3 * rel_3 = [0,1,1] * 1 = 0.66…
precision@4 * rel_4 = [0,1,1,1] * 1 = 0.75
AP = 0.636… - Q3의 AP
-
retrieved = [x,w,t,s,z]
gt = [s,x,z]
rel = [!,0,0,1,1]
precision@1 * rel_1 = [1] * 1 = 1
precision@4 * rel_4 = [1,0,0,1] * 1 = 0.5
precision@5 * rel_5 = [1,0,0,1,1] * 1 = 0.6
AP = 0.7 - mAP = 0.623
🔸mRR (mean Reciprocal Rank)
(reciprocal = 역수)
- 처음으로 relevant passage를 찾은 위치의 역수를 평균한 지표이다. 즉, N개의 pasage들 중 relevant passage를 얼마나 빨리 찾는지를 평가할 수 있다.
- 다중 쿼리 평가 지표이다.
- RR : 첫 번째 관련 passage 순위의 역수
- \[RR=\frac{1}{rel_{first}}\]
- $rel_{first}$ : 첫 번째 relevant passage의 순서(내가 임의로 이름지은 변수이다.)
- ex) retrieved = [a,b,c,d,e]
- gt = [b,d,e] 일때,
rel_first는 “b”이고 b의 순서는 2 이므로 이때의 RR은 1/2 이다. - mRR : 각 쿼리에 대한 RR들의 평균이다.
- \[mRR = \frac{1}{Q}\sum_{i=1}^QRR_i=\frac{1}{Q}\sum_{i=1}^Q\frac{1}{rel_{first,i}}\]
- 위의 예시에 대한 mRR값
- Q1의 AP
-
retrieved = [b,a,c,e,d]
gt = [a,d,e]
RR = [0,1] = 1/2 - Q2의 AP
-
retrieved = [9,3,1,2,5]
gt = [1,2,5]
RR = [0,0,1] = 1/3 - Q3의 AP
-
retrieved = [x,w,t,s,z]
gt = [s,x,z]
RR = [1] = 1 - mRR = \(\frac{1}{3}(\frac{1}{2}+\frac{1}{3}+1)=0.6111...\)
🔸요약
- nDCG : 문서의 순서에 따른 관련성을 평가, 1에 가까울수록 이상적인 검색 결과.
- mAP : 여러 쿼리에 대해 평균 정밀도를 계산, 검색 결과의 정밀도를 평가.
- mRR : 첫 번째 관련 문서를 얼마나 빠르게 찾는지 평가, 1에 가까울수록 좋은 성능.
'데이터 > ML & DL' 카테고리의 다른 글
[CV] VGG19 fine-tuning - Image Classifiaction for chart, diagram, table (0) | 2024.07.30 |
---|---|
[교육] LG Aimers 5기 ML/DL 교육 (0) | 2024.07.03 |
[NLP] nn.Embedding과 BertTokenizer를 활용한 임베딩 (0) | 2024.05.22 |
[금융 데이터] 금융 데이터 분석 방법과 포트폴리오 (1) | 2024.04.01 |
[강화학습] Monte Carlo Method (0) | 2024.03.20 |