해당 논문이 나온 시기는 2014년이다. AI를 배우면 처음 배우는 AlexNet도 2012년에 ImageNet 대회에서 우승한 것을 생각해보면 AI 발전의 상당히 초기 시기의 논문이라고 생각된다.
당시 이미지 내의 내용을 설명하는 것은 NLP, CV 분야에서 모두 가장 기본적인 문제였다. 본 논문에서는 CV와 기계 번역을 결합한 generative 모델을 기반으로 deep recurrent 아키텍쳐를 제안한다.
기존 방법론과 한계
이미지를 설명하는 것은 쉬운 task가 아니다. 왜냐하면 이미지를 설명하는 것은 단순히 이미지 내에 있는 주요한 객체만 설명하는 것이 아니라 그것과 관련된 속성이라던지 행동, 관계 등등을 모두 포괄해야 하는 것이기 때문이다. 또한 결국 자연어로 표현되어야 하기 때문에 Language model이 필요했다.
때문에 기존의 접근 방식들은 이미지에서 description으로 변환하는 방식을 제안했다. 즉, 하나의 모델로 합쳐진 형태가 아니라 여러 단계의 파이프라인을 붙여서 description을 만들었다는 것이다. 이 부분이 좀 흥미로웠다.
당시의 기존 방법들을 좀 더 자세히 살펴보자.
일단 대체적으로 이미지를 설명하는 것보다 비디오를 설명하는 쪽에 먼저 관심이 많았다고 한다. 이때 어떻게 하냐면 영상에서 사람, 차, 공 등과 같은 시각적인 요소를 먼저 인식한 다음 그 결과를 논리나 그래프 같은 구조화된 표현으로 바꾸고 그 구조를 규칙이나 템플릿을 활용해 문장으로 변환하는 방식이었다. 딥러닝의 성능이 그렇게 좋지 않을 때를 생각해보면 이렇게 사람의 개입이 강하게 들어간 게 자연스럽게 생각된다. 이렇게 했을 때 사람이 규칙이나 구조를 많이 손을 대야 하며 상황이 좀 제한된 도메인에서만 잘 된다는 단점이 존재했다.
이후 이제 객체를 좀 더 잘 인식하기 시작하면서 이미지에서 텍스트 생성이 관심을 받기 시작하였고 CNN이 이미지에서 여러 개의 객체 목록을 뽑고 (ex. dog, ball) 이를 가지고 주체, 행동, 대상을 뽑아 템플릿으로 문장화하는 방식이 나타났다. 하지만 이렇게 되어도 단점은 여전히 해결되지 않았다.
이를 해결하기 위해서 '문장을 새로 생성하기 보다 이미 있는 정답 문장 중 고르면 어떨까?'하는 접근법이 생겨났다. 학습 데이터에 이미 존재하는 문장들을 저장해두고 이미지와 문장을 같은 공간에 벡터로 저장하여 가까운 것을 찾는 것이다. 문법적으로 훨신 자연스럽고 사람의 개입이 적어졌다는 장점이 존재했지만 새로운 객체 조합이 있는 이미지는 설명하지 못하고 문장을 생성하는 것이 아니라 찾는 것이기 때문에 한계가 존재했다.
때문에 본 논문에서는 CNN + LSTM을 하나로 묶어 end-to-end로 진짜 문장을 생성하는 것을 목표로 한다. 즉, 이미지를 입력 받아서 하나의 모델로 description을 출력하는 것을 목표로 하는 것이다. 이미지 $I$를 입력 받아 이미ㄷ지를 적절하게 설명하는 단어 시퀀스 $S = {S_1, S_2, ..., }$ 를 생성할 확률 $p(S|I)$의 likelihood를 최대화하도록 하는 단일 joint 모델을 제안했다.
간단하게 모델을 설명하면, encoder를 CNN으로 대체하여 이미지의 representation을 얻고, 이를 RNN decoder에 입력하여 target 문장을 생성하는 방식이다. CNN은 image classification task로 사전학습되며, 마지막 hidden layer의 representation을 LSTM에 첫 입력으로 제공하여 문장 생성을 시작한다.
본 논문에서 제안한 모델을 Neural Image Caption (NIC)라고 부른다.
NIC (Neural Image Caption)
NIC의 경우 이미지를 번역하듯이 문장으로 바꾸는 모델이다. 즉, CNN이 이미지를 이해하게끔 하고 LSTM이 그것을 보고 단어를 하나씩 생성하게 한다고 생각하면 좋을 것 같아.
이미지 → 벡터 → 설명 문장
NIC의 목적 함수는 다음과 같다.
이미지 I가 주어졌을 때 정답 문장 S가 나오도록 확률을 최대화하겠다!
이를 통해 주어진 이미지 $I$에 대해 올바른 description의 확률을 최대화하고자 한다. 여기서 $\theta$는 모델 파라미터이며 $S$는 해당 이미지의 올바른 문장이다.
최종 출력인 $S$는 길이가 정해져있지 않기 때문에 한 번에 예측하지 못한다. 때문에 chain rule을 적용해 다음과 같이 분해한다. 즉, 단어를 하나씩 생성하는 방식으로 진행하는 것이다.
다음 단어 확률 = 이미지 + 지금까지 만든 단어들의 조건부 확률
학습 시 $(S, I)$ 쌍을 학습 데이터로 사용하고 전제 training set에 대해 (2)번 식의 log probability 합을 stochastic gradient descent로 최적화한다.
그렇다면 이 $p(S_t | I, 이전 단어들)$ 을 어떻게 계산할까?
바로 RNN을 활용할 수 있다. 하지만 RNN의 가장 큰 단점을 우리는 알고 있다.
문장이 길어지게 되면 앞부분 정보를 잘 잊어버린다는 것이다. 때문에 본 논문에서는 LSTM을 활용한다.
LSTM은 중요한 건 오래 기억하고 필요 없는 건 잊어버리는 RNN이다.
LSTM의 게이트 종류는 다음과 같다.
게이트
역할
forget gate
이전 기억을 지울지
input gate
새 정보를 저장할지
output gate
어떤 정보를 밖으로 낼지
❓ LSTM이 대체 왜 앞부분 정보를 RNN보다 잘 기억하게 되는 것일까? LSTM이 장기 기억에 강점을 가질 수 있는 것은 $c_t$ 덕분이다.
일단 RNN 수식을 살펴보자. RNN은 이전 상태를 가져와서 새로운 입력과 섞고 tanh와 같은 활성화 함수를 통과시켜서 새로운 상태를 만든다. 출처: https://childult-programmer.tistory.com/55 그런데 역전파 과정에서는 시간 방향으로 거슬러 올라가며 기울기를 계산해야 한다. 이때 같은 가중치 행렬이 반복해서 곱해지고, tanh의 미분값도 계속 곱해진다.문제는 tanh의 미분값이 항상 1 이하이며 대부분의 경우 1보다 작다는 점이다. 또한 가중치 행렬 역시 학습 안정성을 위해 보통 큰 값을 갖지 않지 않고 1보다 작은 값을 가진다. 결과적으로 1보다 작은 값들이 반복해서 곱해지면서 기울기가 점점 작아지고 과거로 갈수록 거의 0에 가까워진다. 이것이 기울기 소실 문제이다. 출처: https://woka.kr/blog/deep%20learning%20%EA%B8%B0%EC%B4%88/2025/03/04/LSTM.html이 때문에 RNN은 장기 의존성을 학습하는 데 한계를 가진다.
하지만 LSTM은 $c_t$를 추가해서 곱셈만 하는 것이 아니라 덧셈 구조로 기울기 소실 문제를 완화한다. 위 LSTM 수식만 봐도 알 수 있다. 이 덕분에 기울기가 매 단계마다 마냥 작아지지 않고 비교적 안정되게 전당되어 RNN보다 장기 정보를 좀 더 잘 보존할 수 있는 것이다.
그렇다면 어떻게 이미지와 단어를 넣을까?
1. 이미지를 사전학습한 CNN
일단 제일 먼저 ImageNet과 같은 classification 데이터셋으로 사전학습된 CNN을 활용하여 지막 classification layer를 제외하고 그 직전 layer의 출력 벡터를 image representation으로 활용한다.
본 논문에서는 당시 ILSVRC 2014 classification 대회에서 우승한 GoogLeNet (Inception v1)을 CNN으로 활용하였다고 한다. 또한 따로 fine-tuning은 하지 않고 사전학습된 가중치를 그대로 활용하였다.
2. LSTM에 이미지 입력 + LSTM이 다음 단어 생성
CNN을 통해 얻은 image representation을 한 번만 넣는다.
이때 구체적으로 시간 축을 다음과 같이 설정한다.
t=−1 : 이미지 입력
t=0 : <START> 입력
t=1 : 첫 단어 생성/학습
…
마지막에 <END> 생성
즉, CNN이 이미지 $I$를 보고 벡터를 만들면 그 벡터를 LSTM이 보고 다음 단어를 하나씩 만드는 것이다.
왜 LSTM에 이미지를 매 스템마다 넣어주지 않을까? 논문에서 실험해보았는데 네트워크가 이미지의 노이즈에 과도하게 의존하고 과적합이 증가, 성능이 하락하는 단점이 있어 처음 한 번만 넣어주는 것을 택했다고 한다.
손실 함수는 각 timestep에서 정답 단어의 negative log likelihood를 합산한 것이다.
즉, 매 timestep마다 정답 단어 확률이 높아지도록 학습한다.
학습 중에는 Teacher forcing 방법으로 모델이 만든 단어를 쓰지 않고 정답 단어를 다음 입력으로 사용하며 학습이 끝난 뒤 문장을 만들 때에는 Beam search 방식을 활용한다. 논문에서는 beam size = 20을 사용했으며 greedy(beam=1)보다 BLEU score가 2점 더 좋았다고 한다.
이는 논문 4.3.7 Analysis of Embeddings 에서 언급된 것으로 중요한 부분이라고 생각되어 중간에 정리하여 첨부한다.
LSTM에서 단어를 만들 때 이전 단어를 embedding 벡터로 받아서 사용하게 된다.
우리는 one-hot 보다 word embedding 벡터가 더 좋다는 것을 알고 있다. 논문에서는 이러한 지식을 다시 한 번 짚고 넘어가준다.
만약 horse, pony, donky 라는 비슷한 의미의 세 단어가 있다고 할 때 one-hot이라면 다음과 같이 표현하게 되고 이는 의미 상 '말과 비슷한 동물'이라는 의미를 담고 있지 않게 된다. 모델 입장에서는 horse와 donut, horse와 pony의 차이가 동일하게 되는 것이다.
horse = [1,0,0]
pony = [0,1,0]
donkey = [0,0,1]
반면, word embedding 벡터로 표현하게 된다면 horse와 pony, donky는 모두 비슷한 문장의 맥락에서 나오게 될 것이고 비슷한 단어들은 벡터 공간에서 가깝게 위치하게 된다. (약간 이런 느낌..)
이를 통해 모델은 horse ≈ pony ≈ donkey라는 의미를 숫자로 알 수 있게 되는 것이다.
논문에서는 이러한 개념과 함께 이게 CNN에 도움이 된다고 한다. 예를 들어서 horse ≈ pony ≈ donkey가 가까운 위치에 존재하면 CNN이 말과 유사한 동물에 관련된 feature를 추출하도록 유도할 수 있다는 것이다. 예를 들어 unicorn과 같은 단어가 train 데이터셋에 많이 없더라도 해당 단어가 horse라는 word embedding과 가까이 위치함으로써 '아 유니콘은 말과 비슷한 동물이구나~'를 알게 되는 것이다.
Experiments
주어진 이미지에 대해 어떤 description이 정확한지 판단하는 게 쉽지 않기 때문에 본 논문에서는 선행 연구의 가이드라인ㅇ 따라 생성된 각 문장을 1점부터 4점까지 사람에게 평가하도록 했다. 이외에도 많이 쓰이는 BLEU score와 perplexity도 활용하였다.
활용한 데이터셋은 다음과 같다.
여러 실험들과 실험 결과는 어땠을까?
일단 가장 먼저 overfitting 문제를 해결하기 위해 실험한 결과를 보여주었다.
overfitting 을 완화하기 위해 CNN을 Imagenet 사전학습 모델로 초기화하였더니 일반화에 큰 도움이 되었음
word embedding을 대규모 뉴스 코퍼스로 초기화하였는드ㅔ 큰 개선이 없어 랜덤 초기화를 활용함
dropou, model ensembling은 BLEU score 향상에 기여함
hidden unit 수와 depth 조절하는 것이 overfitting 문제 완화에 도움이 됨
때문에 모든 파라미터는 stochastic gradient descent로 학습하였고 CNN 가중치는 고정하였으며 embedding과 LSTM hidden size는 512차원으로 설정했다고 한다. 단어는 기본 tokenization 후, 학습 데이터에서 최소 5회 이상 등장한 단어만 유지했다.
또한 데이터셋에 따라서 다른 성능을 보이기도 했는데 더 많은 데이터셋으로 학습할 경우 (Flickr30k → Flickr8k) BLEU score가 향상했다. 또한 특정 데이터셋에서 학습된 모델을 다른 데이터셋에 쓰는 Transfer Learning의 경우 도메인이 비슷하면 괜찮지만 도메인이 많이 다르면 BLEU score가 많이 떨어지는 것을 알 수 있었다.
또한 위에서 언급한 사람이 평가한 것의 경우 NIC는 baseline 보다 우수했지만 GT보다는 낮은 점수를 보였다.
실험 섹션에서 흥미로웠던 건 실제로 모델이 문장을 생성하는가? 에 대한 실험이었다.
당시에 그냥 모델이 외워서 비슷한 문장을 내는 것이 아니냐는 비판이 있었고 진자 새 문장을 생성한다는 것을 보여주기 위해 아래 실험을 진행했다.
모델이 생성한 top1 문장을 보면 80% 정도가 training dataset에 존재했다고 한다. 하지만 중요한 건 여기서 N-best examles를 보았다. N = 15개로 모델이 하나의 문장을 생성할 때 top 15개를 보았는데 top 15 후보 중 절반은 새로운 문장이었던 것이다.
아무래오 top 1은 모델이 확률을 최대화하려고 하기 때문에 80%가 training에 존재할 수 밖에 없지 않았나... 생각한다.
+ 논문에서는 학습 데이터의 양이 비교적 적어서 암기하기가 비교적 쉬운 것 같다고 언급한다.
위 사진을 보면 좀 더 쉽게 이해할 수 있다. 이건 총 세 개의 이미지에서의 N-best examles (beam search 상위 후보들)를 보여주는 것으로 모델이 가장 그럴듯하다고 생각한 문장들을 여러 개 나열한 것이다. 굵은 글씨는 training dataset에서 존재하지 않았던 문장들로 보면 모델이 그냥 training 문장을 복사하는 것이 아니라 새로운 조합을 만들어내고 있다는 것을 알 수 있다.
Conclusion
본 논문에서는 이미지를 이해하고 이를 문장으로 생성할 수 있는 end-to-end neural network NIC를 제안한다. NIC는 CNN과 LSTM을 이루어져 있으며 Pascal 데이터셋에서 당시 기존 SOTA 가 BLEU-1 score 25인 반면, NIC는 59를 달성하였다. (인간은 69) 또한 COCO 데이터셋에서는 BLEU-1 score .7을 달성하며 당시 SOTA 성능을 달성했다.