본 글은 [CIDEr: Consensus-based Image Description Evaluation]을 바탕으로 작성하였음을 명시합니다.
▶️ Consensus-based Image Description Evaluation(CIDEr) Score
CIDEr는 Image captioning에서 생성된 문장이 정답 문장과 얼마나 유사한 지를 평가하는 지표입니다.
- Image captioning은 입력 데이터 Image X0에 대하여 인간의 개입 없이 Image X0을 묘사하는 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
TF(t,d)=문서 d에서 단어 t가 등장한 횟수문서 d에 등장한 모든 단어의 수
- d = 문서
- t = 단어
▶️ [역 문서 빈도] IDF
IDF(t, D)=log(총 문서의 개수단어 t를 포함하는 문서의 수)=log(D1+DF(t))
- d = 문서
- t = 단어
- D = 총 문서의 개수
- DF(t) = 전체 문서들 중 해당 문서 d를 제외한 나머지 문서 D에서 해당 단어 t가 몇 번 사용되었는 지를 의미합니다.
식 (2)에서 분모에 1을 더해주는 이유는 분모가 0이 되는 것을 방지하기 위해서입니다. log를 붙이는 이유는 총 문서의 수인 D가 커질수록 IDF 값이 기하급수적으로 커지기 때문입니다.
▶️ TF-IDF
TF-IDF(t,d,D)=TF(t,d)∗IDF(t,D)
TF-IDF는 특정 단어가 해당 문서에서 얼마나 unique한가를 나타내기 위한 방식입니다. TF-IDF가 높을수록 해당 문서에서 자주 등장하지만 다른 문서에서는 잘 등장하지 않는 단어입니다.
3. CIDEr score
▶️Notation
- Ii = ith image
- ci = ith image로부터 생성된 문장 (candidate sentence)
- Si={si1,si2,⋯,sim} = ith image의 정답 문장(참조 문장; reference sentence)
▶️Purpose
CIDEr score는 이미지 Ii에 대해 생성된 candidate sentence ci가 image caption Si={si1,si2,⋯,sim}과 얼마나 잘 일치하는 지를 자동으로 평가합니다.
평가 조건은 다음과 같습니다.
- Candidate sentence ci와 reference sentence sij의 유사도를 측정합니다.
- 유사도가 높을수록 k번째 n-gram의 가중치(weight)를 높게 부여해야 합니다.
- Reference sentence sij,j∈{1,2,⋯,m}에 존재하지 않는 n-gram은 candidate sentence ci에 포함되지 않는 것이 바람직합니다.
- k번째 n-gram이 reference sentece sij,j∈{1,2,⋯,m}에 존재하지 않는 경우 k번째 n-gram의 가중치(weight)는 낮게 부여해야 합니다.
- 모든 Image Ii에서 공통적으로 나타나는 n-gram은 상대적으로 덜 중요한 정보일 가능성이 높습니다.
- k번째 n-gram이 모든 Image Ii에서 공통적으로 나타나는 경우 k번째 n-gram의 가중치(weight)를 낮게 부여해야 합니다.
[조건 1] ~ [조건 3]을 만족하기 위해 각 n-gram별로 TF-IDF weight를 계산합니다.
TF-IDF weight를 사용할 경우, 하나의 이미지 내에서 자주 반복되는 단어는 높은 가중치를, 모든 이미지에서 자주 등장하는 단어는 낮은 가중치를 부여할 수 있습니다.
▶️Process
1️⃣ Candidate ci와 Reference Si 모두 어근 혹은 기본 형태로 변환합니다.
- example)
- “fishes” → “fish"
- “fishing” → “fish”
- “fished” → “fish"
2️⃣ 각 문장을 n-gram 집합으로 표현합니다.
n-gram 집합에서 임의의 원소는 ωk로 명시하겠습니다.
3️⃣ TF-IDF Weighting 계산
식 (3)은 i번째 image Ii의 j번째 reference sentence sij의 TF-IDF weight 계산식입니다.
gk(sij)=hk(sij)∑wl∈Ωhl(sij)log(|I|∑Ip∈Imax
- 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 |
---|