본문 바로가기

BLOG/딥러닝

Show, Attend and Tell (Encoder, Decoder, Attention)

【5】RNN 기본 다지기 / Show, Attend and Tell

Show, Attend and Tell (Encoder, Decoder, Attention)

 

이번에 소개할 이미지 캡셔닝 논문은 2016년에 발표된 [Show, Attend and Tell: Neural Image Caption Generation with Visual Attention] 이다.이 논문은 6.2장에서 언급한 show and tell의 후속작으로 이전 논문에 Attention 매커니즘을 추가하였다. 

그림 출처: 논문

 

이전 논문처럼 인코더 부분은 CNN으로 디코더 부분은 RNN(LSTM)으로 같으나 문장을 만드는 디코더 파트에 attention을 적용하였다. 그 결과 이미지 설명문의 매 단어를 생성할때 모델 스스로 이미지의 어디를 볼지 학습한다. 

 

 

그림 출처: 논문

 

Attention은 문자 그대로 ‘집중’하려는 것이며 이를 이미지 캡셔닝에 적용하면 위 그림처럼 이미지의 특정 부분을 더 집중해서 보는 것이다. frisbee 단어를 생성할때 이미지에서 원반을 집중해서 보고 dog 단어를 생성할때 이미지 속의 개를 집중해서 본다. 즉, 모델이 디코딩 할때 관련된 인코딩 부분을 다른 픽셀보다 더 중요하게 고려하는 것이다. 

 

 

우선 모델의 구조를 하나씩 살펴보며 이를 조합하는 방식으로 진행해보자.

 

1. Encoder

그림출처:  https://github.com/sgrvinod/a-PyTorch-Tutorial-to-Image-Captioning

 

인코더는 입력으로 받은 컬러이미지를 더 작은 이미지로 인코딩 한다. 이 과정은 원본 이미지의 유용한 정보를 요약하는 과정이라고 할 수 있다. 인코더는 CNN을 사용하는데 우리는 처음부터 CNN을 학습시킬 필요 없이 미리 학습된 CNN 모델(vgg, Resnet 등)을 사용하는데 이는 시간을 아끼고 좋은 성능을 가져오는 이점이 있다. 언급했듯이 논문은 디코더에 attention 매커니즘이 작동하므로 이미지가 가진 공간정보가 필요하다. 그래서 CNN의 마지막 fully connected layer가 아닌 convolutional feature map을 사용한다. fully connected layer은 3차원의 컬러이미지를 평면화 시키기 때문에 일종의 차원 축소와 같은 효과가 있어 이미지가 가진 공간 정보가 유실 되기 때문이다.

 

 

 

2. Decoder

디코더는 인코딩된 이미지를 보고 이미지의 설명 문장을 생성한다. 역시나 이전 논문과 같이 LSTM을 사용하며 각 스텝에서 반환된 단어들은 다음 스텝의 입력으로 들어간다. attention을 추가한 LSTM 이므로 각 스텝별로 이미지의 다른 부분을 바라보게 할 수 있다. 

그림출처:  https://github.com/sgrvinod/a-PyTorch-Tutorial-to-Image-Captioning

 

그림에서 볼 수 있듯 ‘man’이라는 단어를 생성할때 이미지에서 남자를 바라보고 ‘football’ 단어를 생성할 때는 남자가 들고있는 공의 부분을 집중해서 보고있다. 기존의 show and tell 의 디코더와 같이 attention 기능이 없는 LSTM 은 이미지의 전체 픽셀을 단순평균처리한다. 그러나 위 논문은 모든 픽셀에 대한 가중 평균을 사용하여 중요하다고 판단되는 픽셀(여기서는 생성할 캡션의 단어와 연관이 있다고 생각하는 이미지 부분)의 가중치를 더 크게 줄 수 있는 것이다. 즉, LSTM의 각 단계에서는 이전에 생선된 단어와 이미지의 가중 표현을 연결하여 다음 단어를 생성한다.

 

 

 

3. Attention

누군가 여러분에게 이 사진을 설명하라고 한다면, 남자를 보고 “man”이라는 단어를, 공을 보고 “football”이라는 단어를, 그리고 그 둘을 보고 “hold”라고 한다. 즉, “A man holds a football” 이라는 문장을 만들기 위해서는 이미지에서 각 객체들을 보고 이전에 언급한 단어들을 참고하여 다음의 객체를 이미지에서 보고 언급해야하는 것이다. attention 매커니즘도 이와 다르지 않다. 아래의 그림을 보자.

 

입력이미지( 정확하게 말하면 CNN을 통해 조금더 요약된 정보만을 뽑은 인코딩된 이미지)의 정보와 지금까지 생성된 단어를 고려하여 다음에 설명할 이미지의 부분을 집중 하는것이다.

 

 

논문에서는 Attention 모델을 두가지 소개한다. 바로 soft attention과 hard attention이다. 

아래의 그림을 보자.

 

 

위 사진은 물위를 나는 새 이미지의 캡션을 생성할때의 attention 작동을 이미지에 표시한 것이다. 윗 줄이 soft attention이고 아랫 줄이 hard attention이다. 한 눈에 봐도 soft attention은 가중치된 전체 feature map을 보기 때문에 지도처럼 비교적 넓은 영역을 바라보고, hard attention은 sampling과정을 통해 0,1로 특정 feature map을 정하기 때문에 국소의 일부영역만 바라본다. 또 한가지 언급하자면 hard atteion은 확률적(stochastic) 매커니즘으로 sampling을 통해 강화 학습으로 학습시킬 수 있고 soft attention은 deterministic한 방법으로 backpropagation으로 훈련이 가능하다는 특징이 있다. 우리는 soft 어탠션을 사용할것이다. 인코딩된 이미지의 픽셀 크기를 최대 P라고 하고 LSTM의 각 타임스텝 t에서 픽셀의 가중치는 1까지 더해진다. 이를 수식으로 표현하면 아래와 같다.

 

 

즉, 이러한 전체 과정은 해당 픽셀이 다음 단어를 생성할때 볼 영역 될 확률을 계산하는 과정이라고 할 수 있다.

 

여기까지 다룬 내용을 한꺼번에 구조화 시키면 아래의 그림처럼 표현할 수 있다. 바로 아래의 그림이 show attend and tell 논문에서 제시하는 모델의 구조도이다.

 

 

정리해보자면 인코더가 인코딩 된 이미지를 생성하고 인코딩을 초기 hidden state ‘h’ 와 cell state ‘c’로 변환하여 디코더에 사용한다. 각 디코더 단계에서는 attention과 LSTM이 작동하는데 먼저 attention은 인코딩된 이미지와 이전 hidden state를 통해 픽셀별 가중치를 생성한다. 이전에 생성된 단어와 attention을 통해 생성된 인코딩의 가중 평균을 LSTM에 넣어 다음에 단어를 생성하는 방식이다. 

 

이제 코드를 통해 살펴보자.

 

 


작성자 홍다혜 ghdek11@gmail.com / 이원재 wonway333@gmail.com