Show and Tell: A Neural Image Caption Generator
이번에 리뷰할 논문은 NIC 이다.
논문 : https://arxiv.org/abs/1411.4555
해석에 참고한 영상 : https://www.youtube.com/watch?v=yfsFW-mfOEY&t=146s (동빈나)
1. 모델
해당 모델은 이미지를 글로 번역하여 출력하는 기술이다.
모델은 크게 CNN + RNN 형태로 이루어져 있으며, 여기서 RNN은 LSTM을 사용하고 있다.
(해당 논문은 2015 논문이며 그 당시 최고의 번역 모델을 사용했다 볼 수 있다.)
[ CNN ] -> context vextor(고정크기) -> [ RNN ] 형태
- 히든 스테이트 : 이전에 처리한 정보와, 지금 들어온 입력을 sigmoid 한 것.
히든 스테이트도 입력과 같은 차원을 가진다 (?)
- 출력 : FC를 거쳐 스팸 여부 (binary)를 출력 가능.
- LSTM : 장기기억(cell state)와 단기기억(hidden state)의 두가지 상태를 가진다.
forget gate : 어떤 정보를 잊게 만들지 결정하는 레이어. 가중치를 시그모이드 한 값이며, 오래된 정보중 필요없는 정보는 잊도록 만든다. - input gate: 새로운 정보를 cell state에 반영한다. 즉 새롭게 특정한 정보를 기억하도록 만든다.
- 장기기억 : 이 forget gate와 input gate를 통해 만들어진다.
- ouput gate : 장기기억과 현재 데이터를 이용해 단기기억을 갱신한다.
- 모든 가중치(weight, 행렬형태)는 전체적으로 공유된다.
- BLEU 스코어로 결과를 확인하였다. (보통 1부터 4까지 확인한다.)
(논문에서는 이 스코어도 불완전하기에 높은 값을 가져도 결과가 안좋을수 있다함.)
2. 코드 말풀이
- Fliker8k로 학습
- 단어가 등장할때마다 카운트해서, 실제로 차원으로 사용할 단어사전을 정한다.
- 파이토치에 사용할수 있는 데이터셋으로 정의
- 이미지는 rgb로 바꾸고 transform.
- 캡션 문자열은 토큰을 붙여 학습용으로. (sos, eos)
- 위 이미지와 캡션으로 구성된 튜플을 배치로 만들기.
- 이미지 : (batchsize, 3, 256, 256) (파이토치에서 이미지처리에 많이쓰는 shape)
타겟 : (batch size, padded_length) - 파이토치의 데이터 로더 적용
- 인코더CNN
resnet의 기존 FC레이어를 제거하고 우리의 워드임베딩차원의 FC레이어를 새로 붙인다.
def forward : 이미지를 resnet에 넣고, flatten해서 FC에 넣음. - 디코더RNN
일반적 LSTM.
임베딩 - lstm - linear
forward : 짧은 문장엔 패딩넣기. lstm - FC레이어
매번 hidden 뽑아서 쌓아서 결과 내기. - 학습 및 평가
학습 이미지셋에 대해 Augmentation, Nomalization .
val과 test는 리사이즈, Nomalization .
인코더, 디코더정의. 여기선 Adam으로 옵티마이저 업뎃
3. 후속 연구
Neural Image Caption with Visual Attention (ICML 2015)
- NIC에 어텐션 기법 적용
고정된 context vector는 병목 현상 및 정보 손실이 일어난다.
s2s 모델에 어텐션 매커니즘을 사용한다. 즉, 디코더는 인코더의 모든 출력을 참고한다.
각 h의 중요한 정도를 가중치로(w) 저장한 다음 출력에 활용하는 어텐션 매커니즘을 활용.
장점은 결과에 설명이 가능하다는 것.
시각화를 하면 어떤 정보를 중요하게 여겼는지 확인이 가능하다!