LLM

[LLM] STS(Sentence Textual Similarity) 계산 방법 정리

JustJunsu 2024. 10. 11. 10:01
728x90

1. STS(Sentence Textual Similarity) 이란?

STS는 두 문장의 의미적 유사성을 평가하는 방법입니다. 문장 벡터 간의 유사도를 계산한 후, 그 값을 실제 라벨과 비교하여 성능을 평가합니다. 라벨은 0~5 사이의 연속적인 값으로 주어질 수 있고, 0 또는 1로 이진화된 경우도 있습니다. 이에 따라 평가 방법도 달라집니다.

1.1 Cosine Similarity

코사인 유사도는 두 벡터 간의 각도를 이용하여 문장 간 유사도를 계산합니다. 두 벡터가 이루는 각도가 작을수록 유사하다고 평가합니다.

계산식:

$$ Cosine Similarity = \frac{A \cdot B}{\|A\| \|B\|} $$

여기서:

  • $ A \cdot B $ 두 벡터의 내적입니다.
  • $ \| A \| 와 \| B \| $는 각 벡터의 크기(길이)입니다.
from sklearn.metrics.pairwise import cosine_similarity
cos_sim = cosine_similarity(vector1, vector2)

2. STS 라벨이 0~5일 때 성능 평가

2.1 Pearson Correlation Coefficient

Pearson 상관계수는 코사인 유사도와 실제 라벨 간의 선형 상관관계를 측정합니다. 이 지표는 두 변수의 관계가 얼마나 직선적인지를 평가합니다.

계산식:

$$ r= \frac{\sum (X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum (X_i - \bar{X})^2} \sqrt{\sum (Y_i - \bar{Y})^2}} $$

여기서:

  • $X_i$는 코사인 유사도 값입니다.
  • $Y_i$는 실제 라벨(0~5)입니다.
  • $\bar{X}$와 $\bar{Y}$는 각각의 평균입니다.
import numpy as np

# 코사인 유사도와 Pearson 상관계수 계산
pearson_corr = np.corrcoef(cos_sim, true_labels)[0, 1]

2.2 Spearman Correlation Coefficient

Spearman 상관계수는 순위 기반 상관관계입니다. 코사인 유사도 값과 실제 라벨의 순위를 매긴 후, 그 순위 간의 상관관계를 측정합니다. 비선형적인 관계도 반영할 수 있습니다.

계산식:

$$ρ=1 - \frac{6 \sum d_i^2}{n(n^2 - 1)}$$

여기서:

  • $d_i$​는 각 문장의 순위 차이입니다.
  • $n$은 문장의 개수입니다.
from scipy.stats import spearmanr

# 코사인 유사도와 실제 라벨의 순위 상관계수 계산
spearman_corr, _ = spearmanr(cos_sim, true_labels)

3. STS 라벨이 0 또는 1일 때 성능 평가

3.1 ROC-AUC (Receiver Operating Characteristic - Area Under Curve)

ROC-AUC는 이진 분류 모델의 성능을 평가하는 지표입니다. 모델이 0과 1 사이를 얼마나 잘 구분하는지에 대한 평가를 나타냅니다.

ROC 곡선:

  • $x$축: False Positive Rate (FPR)
  • $y$축: True Positive Rate (TPR)

AUC 계산 원리: ROC 곡선 아래의 면적을 계산하며, 1에 가까울수록 좋은 성능을 의미합니다.

from sklearn.metrics import roc_auc_score
roc_auc = roc_auc_score(true_labels, cos_sim)

3.2 Accuracy (정확도)

정확도는 전체 예측 중 맞춘 비율입니다.

계산식:

$$Accuracy=\frac{TP + TN}{TP + TN + FP + FN}$$

여기서:

  • $TP$: True Positive (참 긍정)
  • $TN$: True Negative (참 부정)
  • $FP$: False Positive (거짓 긍정)
  • $FN$: False Negative (거짓 부정)
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(true_labels, cos_sim)

3.3 Precision (정밀도)

정밀도는 모델이 1로 예측한 것 중 실제로 1인 비율을 의미합니다.

계산식:

$$Precision = \frac{TP}{TP + FP}$$

from sklearn.metrics import precision_score
precision = precision_score(true_labels, cos_sim)

3.4 Recall (재현율)

재현율은 실제 1인 것 중 모델이 1로 예측한 비율을 나타냅니다.

계산식:

$$Recall=\frac{TP}{TP + FN}$$

from sklearn.metrics import recall_score
recall = recall_score(true_labels, cos_sim)

3.5 F1-Score

F1-Score는 정밀도와 재현율의 조화 평균을 나타냅니다.

계산식:

$$F1=2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}$$

from sklearn.metrics import f1_score
f1 = f1_score(true_labels, cos_sim)

4. 결론 및 마무리

이처럼 STS 성능 평가에서는 라벨의 범위와 평가 지표에 따라 다양한 계산 방법을 적용할 수 있습니다. 연속형 라벨(0~5)에서는 Pearson 및 Spearman 상관계수를 통해 유사도와 라벨 간의 상관관계를 측정하며, 이진 라벨(0 또는 1)에서는 ROC-AUC, Precision, Recall 등의 이진 분류 평가 지표를 사용할 수 있습니다.

728x90