I implemented the code using Keras.
Requirements: Python3, Keras 2.0(Tensorflow backend), NLTK, matplotlib, PIL, h5py, Jupyter
-
Download the Flicker8k dataset and place it in the path that contains the notebook file.
Maybe the directory names are Flicker8k_Dataset and Flickr8k_text.
Flicker8k_Dataset contains image files, and Flickr8k_text contains caption and dataset split information.(train, dev, test) -
Data prepare Open data_processing.ipynb
In most cases, the code have comments and can be followed in order. -
Train and test Open train_evaluate.ipynb
In most cases, the code have comments and can be followed in order.
- Open Demo.ipynb
In demo, custom data to be put, and we have prepared an example in ./examples/. - If you want to only demo, final model is in the repository, so you just need to create a tokenizer in train_evaluate.ipynb.
Visual understanding 분야는 기존의 Computer vision 문제들, Image classification 혹은 Object recognition 보다 어렵다.
이미지를 문장으로 설명해내는 Task는 이미지에 포함된 객체와 함께 특성과 행동까지 잡아내야 하며, 이를 자연어로 표현해야 하는데 이는 이미지 모델뿐 아니라 언어모델까지 필요하다.
저자들은 이 Task를 풀기 위해 Machine translation으로부터 영감을 얻었다.
문장 내의 단어들을 해석, 치환, 재배치 하는 기존의 방식에서, 최근 RNN을 이용한 Encoder-Decoder 방식이 훨씬 간단하고 좋은 성능으로 해결하고 있다.
Encoder-RNN이 문장을 적절한 Vector representation으로 변환하고, Decoder-RNN이 vector 로부터 번역한 문장을 생성한다.
저자들은 이 Nerual Image Caption(or NIC)라 불리는 Encoder-RNN을 Encoder-CNN으로 대체한 모델을 제안한다.
CNN은 기존의 Computer vision 문제들에서 우수한 성능을 내고 있고, 이는 CNN이 이미지를 잘 embeddeing 한다고 볼 수 있다.
따라서 CNN을 이미지 encoder로 사용하는 것은 자연스러운 일이고, 저자들은 ImageNet으로 pre-trained 된 모델을 사용했다.
NIC는 다른 NN과 같이 SGD를 통해 학습된다.
NIC는 Pascal, Flicker8k, 30k, MSCOCO, SBU dataset에서 사람과 근접한 State of the art를 달성했다.
Machine translation과 마찬가지로 Encoder는 고정된 차원의 vector로 encoding 하고,
Decoder는 해당 vector를 decoding하여 이미지를 설명하는 문장을 생성한다.
당시 연구들은 sequence model이 주어졌을 때 correct translation의 확률을 maximize하는 방향으로 학습하는 것이 좋다고 통계적으로 보여진다.
저자들은 아래와 같은 수식을 Maximizing하는 방식으로 모델을 학습시켰다.
Equation 1. Image I 가 주어졌을 때, Description S
문장 S 는 길이가 제한적이지 않고, 따라서 joint probability를 이용한 아래 수식처럼 표현할 수 있다.
문장을 생성하는 모델에 RNN을 사용하는것은 자연스럽고, 저자들은 RNN을 더 Concrete하게 만들기 위해 두 가지 Crucial한 선택을 했다.
이에 대한 문제를 LSTM을 사용하여 해결하였다.
LSTM은 Vanishing or exploding gradient 문제를 잘 해결하기 때문에 당시 sequence task에서 State of the art를 달성하였고, 저자들도 이를 선택했다.
2014 이미지넷에서 우승한 GoogLeNet을 사용하여 이미지를 embedding 했다.
기존의 Computer vision 문제를 잘 해결하는 모델이 이미지를 잘 표현하는 vector representation를 만들 것이라 생각했다.
또한 문장을 word 단위로 split 하여 Image vector와 같은 차원으로 embedding 했다.
LSTM은 Vanishing or exploding gradient 문제를 잘 해결하기 때문에 선택했고, LSTM의 전체적인 구조는 아래와 같다.
Encoder-CNN과 결합한 LSTM의 모습은 아래와 같고, 모든 LSTM의 parameter는 공유된다.
Figure 3. LSTM model combined with a CNN image embedder
이미지는 맨 처음 입력 단 한번만 들어가고, 이미지 벡터로부터 LSTM이 출력한 결과를 다음 LSTM의 입력으로 넣으면서 학습, 추론한다.
저자들은 매 step마다 이미지를 넣어주는 시도를 했으나 이는 오히려 더 쉽게 Overfit 되는 결과를 보였다.
저자들은 NIC에서 Inference하는 두 가지 방법을 제시했다.
Sampling 방식은 아주 단순하다.
최대 문장의 길이가 될 때 혹은 끝나는 신호가 나올 때까지 LSTM에서 Softmax를 거쳐 출력된 최대 값의 단어를 이어붙여, 이를 다음 LSTM의 입력으로 넣어주는 방식이다.
BeamSearch는 매 t번째까지의 입력으로 만들어진 문장 k개를 유지하며, k개의 문장들로부터 t+1번째까지의 문장 중 다시 k개를 반환하는 방식이다.
k=1 일 때는 굉장히 Greedy하며 BLEU score는 k=20일 때의 BLEU score보다 평균적으로 2점 정도 하락했다.
Image description에서 가장 많이 사용되는 Metric은 BLEU score이고, n-gram을 통해 평가된다.
n-gram이란 다음에 나올 단어를 예측할 때 은 앞선 n-1개의 단어에 의존하는 방식이다.
주로 1-gram을 많이 이용하고 저자들 또한 BLEU-1을 주로 이용하였고, 추가적으로 ME-TEOR, Cider score도 제시하였다.
다음과 같은 Dataset을 이용하였다.
SBU를 제외하고는 모두 5개의 문장이 Labeling 되어 있다.
저자들은 SBU가 Flikcr에서 사용자들이 올린 Description이기 때문에 Noise가 있다고 보았다.
또한 Pascal은 Test를 위해서만 사용하였고, 나머지 4개의 Data로 학습한 모델을 이용했다.
논문에서 저자들은 아래와 같은 사항들을 이용하여 실험했다.
- 학습 시 CNN은 Imagnet을 통해 pre-trained 된 weight를 그대로 이용하였고, fine tuning은 하지 않았다.
- Word embedding vector도 pre-trained 된 모델을 써 보았으나 효과가 없었다.
- SGD로 학습했고 fixed learning rate를 사용, decay는 사용하지 않았다.
- Word embedding size와 LSTM의 크기는 512로 셋팅했다.
- Overfitting을 피하기 위해 Dropout과 ensemble을 사용했다. - BLEU score 향상은 거의 없었다.
- Hidden layer의 개수와 깊이를 다양하게 설정했다.
사용한 4가지 Datasets 전부에서 SOTA BLEU-1 score를 갱신했다.
어떤 datasets로부터 학습된 모델은 다른 datasets에도 적용될 수 있는지 실험했다.
같은 유저 집단이 만든 Flickr dataset에서는 Transfer learning이 효과가 있었다.
Flickr30k로 학습된 모델을 이용하면 Flickr8k에서 BLEU score가 4점 정도 상승한다.
MSCOCO는 Flickr30k 보다 5배 크지만, **dataset 간 miss-match가 많았고 BLEU score가 10점 정도 내려갔다.
저자들은 Generate model 관점에서, 얼마나 다양한 문장들을 생성할 수 있는지, 얼마나 수준이 높은지를 확인하였다.
k=20인 BeamSearch에서 상위 15개 정도는 BLEU-1 score 기준으로 사람과 견줄만한 58점 정도를 달성했다.
Table 3. MSCOCO test set의 생성된 몇가지 예시.
one-hot encoding과 다르게 Embedding은 Word dictionary의 크기에 제한되지 않는다.
저자들은 Embedding space에서 KNN을 이용한 몇 가지 예시를 제시했는데 아래와 같다.
Table 6. KNN을 이용한 Word embedding space analysis.
Embedding Vector는 다른 Vision component에도 도움을 줄 수 있는데,
horse와 pony, donkey는 근접하기 때문에 CNN이 horse-looking 동물의 특징을 추출하는 것이 더 수월해질 것이다.
아주 심한 경우에 Unicorn 같은 몇몇 예시들도 horse와 근접하기 때문에, 기존의 bag of word 방식보다 더 많은 정보를 줄 수 있다.