본문 바로가기

Generative Model

CIDEr Score


본 글은 [CIDEr: Consensus-based Image Description Evaluation]을 바탕으로 작성하였음을 명시합니다.

 

▶️  Consensus-based Image Description Evaluation(CIDEr) Score

CIDEr는 Image captioning에서 생성된 문장이 정답 문장과 얼마나 유사한 지를 평가하는 지표입니다.

  • Image captioning은 입력 데이터 Image $X_0$에 대하여 인간의 개입 없이 Image $X_0$을 묘사하는 sentence 혹은 text를 출력하는 모델을 의미합니다. 

CIDEr을 이해하기 전에 "n-gram"와 "TF-IDF(Term Frequency-Inverse Document Frequency)" 개념에 대한 이해가 필요합니다. 본 글에서는 "n-gram"와 "TF-IDF" 설명 후, CIDEr에 대해 설명하고자 합니다.


▶️  Contents 

1️⃣ n-gram

2️⃣ TF-IDF

3️⃣ CIDEr


1. n-grams

n-gram은 text나 speech에서 $n$개의 연속적인 항목의 시퀀스를 의미합니다.

 

▶️Example: "I love language processing"

  • 1-gram (또는 unigram)
    • {"I", "love", "language", "processing"}
  • 2-gram (또는 bigram)
    • {"I love", "love language", "language processing"}
  • 3-gram (또는 trigram)
    • {"I love language", "love language processing"}

 

2. Term Frequency-Inverse Document Frequency(TF-IDF)

TF-IDF(단어 빈도 - 역 문서 빈도)단어의 출현 빈도문서 내 분포를 기반으로 각 단어의 중요도를 측정하는 방법입니다. 모든 문서에서 자주 등장하는 단어의 중요도는 낮아지고, 특정 문서에서만 자주 등장하는 단어의 중요도는 높아지는 방식입니다.

 

▶️ [단어의 빈도] TF

$$\text{TF(t,d)} = \dfrac{\text{문서 d에서 단어 t가 등장한 횟수}}{\text{문서 d에 등장한 모든 단어의 수}} \tag{1}$$

  • $d$ = 문서
  • $t$ = 단어

▶️ [역 문서 빈도] IDF

$$\text{IDF(t, D)} = log(\dfrac{\text{총 문서의 개수}}{\text{단어 t를 포함하는 문서의 수}}) = log(\dfrac{D}{1 + DF(t)}) \tag{2}$$

  • $d$ = 문서
  • $t$ = 단어
  • $D$ = 총 문서의 개수
  • $\text{DF}(t)$ = 전체 문서들 중 해당 문서 $d$를 제외한 나머지 문서 $D$에서 해당 단어 $t$가 몇 번 사용되었는 지를 의미합니다.

식 (2)에서 분모에 1을 더해주는 이유는 분모가 0이 되는 것을 방지하기 위해서입니다. log를 붙이는 이유는 총 문서의 수인 $D$가 커질수록 IDF 값이 기하급수적으로 커지기 때문입니다.

 

▶️ TF-IDF

$$\text{TF-IDF(t,d,D)} = \text{TF(t,d)} * \text{IDF(t,D)}$$

 

TF-IDF는 특정 단어가 해당 문서에서 얼마나 unique한가를 나타내기 위한 방식입니다. TF-IDF가 높을수록 해당 문서에서 자주 등장하지만 다른 문서에서는 잘 등장하지 않는 단어입니다.

 

3. CIDEr score

▶️Notation

  • $I_i$ = $i$th image
  • $c_i$ = $i$th image로부터 생성된 문장 (candidate sentence)
  • $S_i = \{s_{i1}, s_{i2}, \cdots, s_{im}\}$ = $i$th image의 정답 문장(참조 문장; reference sentence)

▶️Purpose

CIDEr score는 이미지 $I_i$에 대해 생성된 candidate sentence $c_i$가 image caption $S_i = \{ s_{i1}, s_{i2}, \cdots, s_{im} \}$과 얼마나 잘 일치하는 지를 자동으로 평가합니다.

 

평가 조건은 다음과 같습니다.

  1. Candidate sentence $c_i$와 reference sentence $s_{ij}$의 유사도를 측정합니다.
    • 유사도가 높을수록 $k$번째 n-gram의 가중치(weight)를 높게 부여해야 합니다.
  2. Reference sentence $s_{ij}, \, j \in \{ 1,2, \cdots, m \}$에 존재하지 않는 n-gram은 candidate sentence $c_i$에 포함되지 않는 것이 바람직합니다.
    • $k$번째 n-gram이 reference sentece $s_{ij}, \, j \in \{ 1,2, \cdots, m \}$에 존재하지 않는 경우 $k$번째 n-gram의 가중치(weight)는 낮게 부여해야 합니다.
  3. 모든 Image $I_i$에서 공통적으로 나타나는 n-gram은 상대적으로 덜 중요한 정보일 가능성이 높습니다.
    • $k$번째 n-gram이 모든 Image $I_i$에서 공통적으로 나타나는 경우 $k$번째 n-gram의 가중치(weight)를 낮게 부여해야 합니다.

[조건 1] ~ [조건 3]을 만족하기 위해 각 n-gram별로 TF-IDF weight를 계산합니다.

TF-IDF weight를 사용할 경우, 하나의 이미지 내에서 자주 반복되는 단어는 높은 가중치를, 모든 이미지에서 자주 등장하는 단어는 낮은 가중치를 부여할 수 있습니다.

 

▶️Process

1️⃣ Candidate $c_i$와 Reference $S_i$ 모두 어근 혹은 기본 형태로 변환합니다.

  • example)
    • “fishes” → “fish"
    • “fishing” → “fish”
    • “fished” → “fish"

2️⃣ 각 문장을 n-gram 집합으로 표현합니다.

n-gram 집합에서 임의의 원소는 $\omega_k$로 명시하겠습니다.

 

3️⃣ TF-IDF Weighting 계산

식 (3)은 $i$번째 image $I_i$의 $j$번째 reference sentence $s_{ij}$의 TF-IDF weight 계산식입니다.

 

$$\begin{align*} g_k(s_{ij}) =& \dfrac{h_k(s_{ij})}{\sum_{w_l \in \Omega} h_l(s_{ij})} log (\dfrac{|I|}{\sum_{I_p \in I} \max (1, \sum_q h_k(s_{pq}))}) \\ &= \text{TF} * \text{IDF} \end{align*} \tag{3} $$

 

  • $h_k(s_{ij})$ = n-gram $\omega_k$가 reference sentence $s_{ij}$에서 발생한 횟수(빈도 수)입니다.
  • $\text{TF}=\dfrac{h_k(s_{ij})}{\sum_{w_l \in \Omega} h_l(s_{ij})}$
  • $\text{IDF}=log (\dfrac{|I|}{\sum_{I_p \in I} \max (1, \sum_q h_k(s_{pq}))}) $

식 (4)은 $i$번째 image $I_i$의 candidate sentence $c_{i}$의 TF-IDF weight 계산식입니다.

$$\begin{align*} g_k(c_i) &= \dfrac{h_k(c_i)}{\sum_{w_l \in \Omega} h_l (c_i)}(\dfrac{log|I|}{log (\sum_{I_p \in I} \max(1, h_k(c_p)))}) \\ &= \text{TF} * \text{IDF} \end{align*} \tag{4}$$

 

4️⃣ $\text{CIDEr}_n$ score 계산

길이가 $n$인 n-gram(e.g. 1-gram, 2-gram, 3-gram, 4-gram, .... )에 대한 $\text{CIDEr}_n$는 식 (5)와 같이 cosine similarity를 이용하여 계산합니다.

 

$$\text{CIDEr}_n (c_i, S_i) = \dfrac{1}{m} \sum_j \dfrac{g^n(c_i) \cdot g^n(s_{ij})}{ || g^n(c_i) || || g^n(s_{ij}) ||} \tag{5}$$

  • $g^n(c_i)$는 candidate sentence $c_i$에 대해 생성된 모든 길이 $n$인 n-gram의 vector입니다.
    • 즉, 각 n-gram $\omega_k$에 대해 구해진 $g_k(c_i)$ 값을 모아놓은 vector입니다.
  • $g^n(s_{ij})$는 reference sentence $s_{ij}$에 대해 생성된 길이 $n$인 n-gram의 vector입니다.

 

▶️Example

  • candidate sentence $c_i$ = "I love natural language processing."
  • 2-gram(bigram) 기준으로 n-gram을 추출하면 다음과 같습니다.
    • $\omega_1 = \{\text{"I"}, \text{"love"} \}$, $\omega_2 = \{ \text{"love"}, \text{"natural"} \}$, $\omega_3 = \{ \text{"natural"}, \text{"language"}\}$, $\omega_4 = \{\text{"language"}, \text{"processing}\}$
  • 이를 vector $g^2(c)i)$로 표현하면 다음과 같습니다.

$$
g^2(c_i) =
\begin{bmatrix}
g_1(c_i) \\
g_2(c_i) \\
g_3(c_i) \\
g_4(c_i)
\end{bmatrix}
=
\begin{bmatrix}
g_{\{"I", "love"\}}(c_i) \\
g_{\{"love", "natural"\}}(c_i) \\
g_{\{"natural", "language"\}}(c_i) \\
g_{\{"language", "processing"\}}(c_i)
\end{bmatrix}
$$

5️⃣$\text{CIDEr}$ score 계산
최종적으로 CIDEr score는 식(6)과 같이 길이가 $n$인 n-gram(e.g. 1-gram, 2-gram, 3-gram, 4-gram, .... )에 대한 $\text{CIDEr}_n$의 가중 평균식으로 계산됩니다.

$$\text{CIDEr}(c_i,S_i) = \sum^N_{n=1} w_n \text{CIDEr}_n(c_i, S_i) \tag{6}$$

 

[CIDEr: Consensus-based Image Description Evaluation]에 따르면 unifrom weights $w_n = \dfrac{1}{n}$으로 설정하는 게 가장 좋다고 합니다.

 


 

본 글은 Image captioning에 대한 성능 평가로 사용되는 방법론인 CIDEr에 대해 살펴보았습니다.

CIDEr에 대한 코드는 아래 링크를 참조하시는 것을 추천드립니다.

 

pycocoevalcap/cider/cider_scorer.py at master · salaniz/pycocoevalcap

Python 3 support for the MS COCO caption evaluation tools - salaniz/pycocoevalcap

github.com

 

'Generative Model' 카테고리의 다른 글

[Image Captioning] ExpansionNet-v2  (0) 2025.03.16