Show and Tell - A Neural Caption Generator 논문 리뷰
24 Nov 2018Introduction
Show and Tell: A Neural Caption Generator 논문을 리뷰한 포스트입니다. 이미지를 보고 설명하는 글을 만들어내는 Image Captioning 문제를 CNN과 LSTM을 조합한 end-to-end 구조의 신경망으로 풀었고 그 당시 SOTA(State-of-the-art)를 갱신했다는 내용입니다.
이 자료는 모두의연구소 의 풀잎스쿨반인 NLP Boot Camp 에서 발표한 내용입니다.
Contents
- Introduction
- Model
- Experiments
- Results
Introduction
- 이미지를 설명하는 문장을 자동으로 만들어 내는것(Image description)은 굉장히 어려운 문제다. (challenging task)
- image classification과 object dection보다 훨씬 어렵다.
$\rightarrow$ 이미지 인식 + 자연어 표현까지 학습해야 되기 때문
Contribution
- Image description 문제를 푸는 end-to-end 시스템을 제안함.
- 논문에서 제안하는 모델은 vision과 language 모델 중에 SOTA인 모델들의 구조의 일부를 조합해서 만듬.
- 기존 SOTA 보다 더 좋은 성능을 보여줌.
Idea
- encoder RNN - decoder RNN
- Source language $S$ - Target language $T$
maximizing $p(T|S)$ 하도록 학습
Idea
- encoder RNN $\rightarrow$ encoder CNN
- image $I$
- target sequence of words $S = { S_1, S_2, … }$
- Neural Image Caption model (NIC)
maximizing $p(S|I)$ 하도록 학습
이 논문에서 새롭게 제안하는 모델의 이름은 Neural Image Caption(NIC)입니다. 이전에 나온 논문인 Seq2Seq(또는 RNN Autoencoder)의 구조와 거의 유사합니다. 대신 encoder RNN이 아닌 encoder CNN을 사용해 이미지의 feature를 decoder의 입력으로 합니다. 또 다른 점은 둘 다 RNN 구조를 사용했을 때는 encoder의 hidden state를 decoder의 hidden state로 초기화 해주었는데 NIC에서는 encoder CNN의 출력을 decoder RNN의 첫 번째 입력으로 넣어줍니다.
Model
- Machine translation 모델과 같이
- input Image가 주어졌을 때 정답 output Sequence의 확률을 maximizing
- correct transcription $S$, input image $I$, parameter $\theta$
이 그림은 논문의 그림이고 더 좋은 구조 그림은 아래에 있습니다.
Training
- Encoder로 Deep CNN 사용.
- Decoder로 LSTM 사용.
\(x_{t-1} = CNN(I)\) \(x_t = W_eS_t, t \in \{0, ...., N-1\}\) \(p_{t+1} = LSTM(x_t), t \in \{0, ...., N-1\}\)
Training Details
- Over fiiting을 막기 위한 techniques
- Pre-Train 된 Deep CNN 사용. (e.g. ImageNet)
- Pre-Train 된 Word embedding vetor 사용. (효과 적음)
- Dropout & Ensembling
Pre-Train 된 word embedding vector를 사용하는 것은 효과가 적었기 때문에 실제 실험에서는 random initialize해서 사용했고 NIC 모델의 학습을 통해 embedding vector도 잘 학습됨을 아래 결과에서 보입니다.
Model
구현 입장에서 더 명확하다고 생각되는 구조 그림.
Inference
- Sampling : 가장 확률이 높은 값(단어)을 고른다.
- BeamSearch : k 개의 후보(단어)를 뽑아서 다음 t+1 에서의 단어와의 조합의 확률을 보고 높은 값을 고른다.
BeamSearch는 단순히 가장 높은 확률을 가지는 단어를 선택하는 것이 아닌 상위 k개를 뽑아 그 단어들로 다음 단어를 예측한 후 각 단어들의 확률을 더해 문장 단위로 높은 확률을 가지는 문장을 결과로 사용합니다.
Experiments
Evaluation Metrics
- Amazon Mechanical Turk experiment
- BLEU
- METHOR
- CIDER
각 지표는 wiki나 google을 통해 검색해보면 잘 나와 있습니다.
Datasets
- 이미지마다 5개의 문장 (SBU 제외)
- Pascal VOC 2008은 test로만 사용 (실험에서는 학습은 MSCOCO로 함)
- Flickr는 사진과 사진에 대한 글을 올리는 사이트
- SBU는 Flicker에 올라온 사진과 글을 그대로 데이터로 사용
SBU는 정확히 이미지를 설명하는 글이 아닌 사용자들이 올린 글이기 때문에 일종의 noise 역할을 하기를 기대함. (weakly labeled examples)
Results
결과를 통해 세 가지 질문에 답하려 함.
- How dataset size affects generalization
- What kinds of transfer learning it would be able to achieve
- How it would deal with weakly labeled examples
Generalization
- 좋은 데이터가 10만개 정도
- 데이터가 많아지면 더 좋은 결과가 나올 것이라 예상
- 데이터가 부족하기 때문에 generalization(overfitting 방지)을 하기 위해 노력함.
논문에서 overfitting 방지를 위해 위의 Training Details에서 설명한 3가지 방법을 실험했다고 설명합니다.
Generation Results
- 여러 metric으로 평가해봄.
- 사람보다 점수가 높은 경우가 있지만 실제 결과는 그렇지 않음.
- metric에 대한 연구도 더 필요할 것으로 보임.
Generation Results
Transfer Learning
- 다른 dataset 간의 transfer가 가능한지 실험.
- Flickr30k -> Flickr8k (유사 데이터, 데이터 차이 4배)
- BLEU 4 증가
- MSCOCO -> Flickr8k (다른 데이터, 데이터 차이 20배)
- BLEU 10 감소, but 만든 문장은 괜찮음.
- MSCOCO -> SBU
- BLEU 16 감소
Generation Diversity Discussion
- generating model 모델이 새롭고 다양하고 높은 퀄리티의 문장을 만들어내는지 확인.
굵게 표시된 문장이 dataset에 없는 문장이다.
Ranking Results
- 다른 연구에서 사용되는 지표인 Ranking Scores에서도 높은 점수를 받음.
Human Evaluation
- 사람이 직접 평가한 지표를 보여줌.
- BLEU Score는 human보다 높았는데, 여기서는 낮다.
- BLEU 지표가 완벽한 지표는 아님을 보여줌.
Human Evaluation
Analysis of Embedding
- Word embedding vector도 유사한 단어들끼리 뭉쳐있도록 잘 학습됨을 확인.
Reference
- https://arxiv.org/abs/1411.4555
- https://github.com/YBIGTA/DeepNLP-Study/wiki/Show-and-Tell:-A-Neural-Image-Caption-Generator-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0
- https://github.com/yunjey/pytorch-tutorial/tree/master/tutorials/03-advanced/image_captioning