Attend to You: Personalized Image Captioning with Context Sequence Memory Networks Review

3 minute read

Abstract

  • 다양한 타입의 context 정보에 대한 저장소로 memory를 이용, 이전에 생성된 단어들을 memory에 추가, CNN을 이용해는 memory 정보를 추출하는 과정을 통해 개인화된 captioning을 할 수 있었다.

1. Introduction

  • 이미지에 대한 알고리즘 뿐만 아니라 자연스러운 문장을 만들기 위해 이미지에 대한 해석과 언어 모델을 연결시켜야 됐다.
  • 해당 논문은 image captioning에서 개인화 문제를 다룬다.
  • 논문에서는 유저가 사용하는 단어와 문체를 고려해 이미지에 대한 묘사를 만들어낸다.
  • 초점을 맞춘 task는 해쉬 태그 예측포스트 생성이 되겠다. (이모티콘도 포함)
  • context sequence memory networkCSMN을 제시하겠다.
  • 두 task 모두 word sequence 예측으로 볼 수 있기 때문에 dict만 바꾸면서 같은 model을 사용했다.
  • 다만, 해쉬 태그를 순서가 없다고 간주하지 않고 게시글과 같이 순서가 있다고 전제했다.

4. The Context Sequence Memory Network

Imgur

  • (a): image description과 유저의 이전 게시글을 통해 context memory를 설정한다.
  • (b): memory state를 기반으로 매 time step t마다 단어를 예측한다.
  • (c): 새로운 아웃풋 단어가 만들어 진다면 word output을 업데이트한다.
  • 인풋은 특정 유저의 query image 이고 아웃풋은 문장이다.
  • 즉, 는 해쉬 태그와 게시글에 대응한다.
  • 선택적인 인풋은 메모리에 더해지는 해당 유저의 활성 단어들과 같은 context 정보이다.

    4.1. Construction of Context Memory

  • 세 가지 종류의 context 정보를 저장하기 위해 메모리를 만들었다.
    1. 쿼리 이미지에 대한 표현을 위한 image memory
    2. 유저의 이전 게시글을 기반으로 하고 TF-IDF로 가중치를 둔 D개의 빈번한 단어들에 대한 user context memory
    3. 이전에 생성된 단어들에 대한 word output memory
  • 메모리에 대한 각각의 인풋은 인풋과 아웃풋 memory representation으로 임베딩된다. 이에 대해 위첨자 a와 c를 각각 쓰겠다.

Image Memory

  • ImageNet 2012 dataset에 대해 pretrained된 ResNet101을 이용해 이미지를 표현했다.
  • 두 개의 다른 description을 사용했는데 하나는 res5c layer의 feature maps와 pool5 feature vectors이다.
  • res5c의 feature map 은 모델이 spatial attention을 사용할 때 유용했고 pool5의 feature 는 이미지의 feature vector로 사용됐다.
  • 그래서 pool5는 single memory cell에 삽입되었지만 rec5c feature map은 49개의 cell들을 차지한다.
  • 이미지 memory vector 은 다음과 같다.

  • input memory와 output memory 모두 같고 r5c와 p5 모두 같아서 편의상 위와 같이 한번에 썼다. (논문에서도 약간 이런 식으로 함…)
  • 아래 나오는 식들은 res5c feature를 사용한다는 걸 가정한다.

User Context Memory

  • 을 유저의 이전 게시글에서 가장 빈번한 D개의 단어들이라고 정의한다.
  • 을 점수를 감소시키면서 user context memory에 인풋으로 넣는다.(CNN을 나중에 더 효과적으로 사용하기 위해서라고 한다.)
  • context memory는 유저의 활성 단어들 혹은 해쉬 태그를 이용한 문체에 좀 더 집중해서 모델의 성능을 향상시킨다.
  • 을 만들 때는 단순히 가장 빈번한 단어만 고려하지 않았다. TF-IDF 점수를 이용했다. 즉, 많은 유저들이 흔하게 사용하는 단어는 사용하지 않았다는 뜻이다. 이렇게 한 이유는 그런 단어들이 개인화에 도움이 되지 않기 때문이다.
  • user context memory vector 는 다음과 같다.

  • 는 j번째 활성 단어에 대한 one-hot vector이다.
  • input과 output memory에 같은 를 사용했지만, 별 개의 단어 임베딩 매트릭스를 사용했다.

Word Output Memory

  • word output memory에 이전에 만들어진 일련의 단어들 을 삽입했다. 다음과 같이 표현된다.

  • 는 j번째 이전 단어에 대한 one-hot vector이다.
  • 같은 word embeddings 를 사용했고 파라미터 는 user context memory와 같다.
  • 새로운 단어가 만들어질 때마다 모든 iteration에 대해 를 업데이트 했다.

  • 최종적으로 인풋과 memory representation을 concatenate했다.
  • m은 메모리의 사이즈를 나타내고 세 개의 메모리 타입의 크기의 합이다.

4.2. State-Based Sequence Generation

  • RNN이 sequence 생성에 많이 쓰이지만 우리는 쓰지 않았다. 대신 순차적으로 memory에 이전까지 만들어진 모든 단어를 저장한다.
  • 각각의 아웃풋 단어를 예측하는 건 모든 이전 단어들, 이미지 구역, user context의 조합에 선별적으로 attention을 줌으로써 이루어진다.
  • memory state를 기반으로 time step t에서 단어 에 대한 예측이 어떻게 이루어지는지 살펴보자.
  • 을 이전 단어에 대한 one hot vector라고 해보자.
  • time t일 때, memory network에 다음과 같은 input vector 를 만들어 낸다.

, where

  • 다음으로 는 context memory의 attention model에 feed된다.
  • 행렬곱은 한 뒤 softmax를 취해서 input vector 가 각각의 memory 와 잘 맞는지 확인했다.
  • 는 현재 time step에서 input memory의 어떤 부분이 input 에 중요한지 나타낸단.
  • output memory representation 의 각각의 컬럼을 와 element-wise 곱을 통해 rescale했다.
  • 결과적으로, attention이 적용된 output memory representation 를 얻어낼 수 있었다.
  • 는 세 가지 memory type들로 분해될 수 있다.

Memory CNNs

  • 그 다음으로 에 CNN을 적용했다. 확실히 CNN을 사용하면 captioning 성능을 확연히 올렸었다.
  • depth가 300인 세 개의 filter를 정의했다. window sizes h는 [3,4,5]를 이용했다.
  • 각각의 memory 타입에 별개로 하나의 convolutional layer와 max-pooling layer를 사용했다.
  • *는 convolutional operation을 나타낸다.
  • 최종적으로 을 h= 3~5까지 concatenate해서 를 얻는다.
  • 다른 memory type에도 이와 같은 연산을 적용해

  • 다음으로 output 단어 확률 를 계산한다.
  • 마지막으로 가장 높은 확률을 가지는
  • 만약 output word 가 EOS 토큰이 아니라면 를 word output memory에 feed하고 time step t+1의 input으로 feed한다.
  • 요약하자면 논문에서 사용한 inference는 모델이 각각의 time step에서 최적의 단어를 순차적으로 찾는 과정을 통해 최적의 sequence를 만들어내기 때문에 greedy하다.

Result

post generation Imgur

hashtag prediction Imgur