본문 바로가기

머신러닝/[논문으로 짚어보는 딥러닝의 맥]

이미지와 질문이 주어졌을 때 답을 맞추는 Visual QnA

학습목표

 이번 강의에서 살펴볼 Visual QnA는 이미지와 질문이 함께 있는 문제입니다. 이 문제를 해결하는 대표적인 두 가지 방법인 DPPnet(Dynamic Parameter Prediction)과 MCB(Multimodal Compact Bilinear) Pooling for VQA를 알아보도록 하겠습니다.

핵심 키워드

  • Visual QnA (VQA)
  • DPPnet
  • Multimodal Compact Bilinear Pooling for VQA

학습하기

 VQA 이건 말 그대로, 이미지가 주어졌을 때, 이미지에 대한 질문을 찾는 뭐 그런 문제입니다. 대표적인 MSCOCO의 VQA데이터셋에는 25만장의 이미지, 76만개의 질문이 있었습니다. 뭐 이건 무슨 동물이냐 하는 간단한 문제부터, 사람은 할 수 있는데 로봇은 구분하지 못하는 이미지를 찾아봐라 라는 이상한 것까지, 질문은 다양합니다. 사진 속에 개가 몇 마리 있는지 뭐 이런것도 포함됩니다. 물론 대부분의 문제는 18세 미만의 사람이 풀 수 있을 법한 문제로 구성되어 있습니다. 

 우리가 어떠한 문제가 어떠한 이미지에 대한 질문에 대한 답이 결국은 그 이미지를 설명하는 속성이라고 볼 수 있겠습니다. 이제 단순히 어떤 물체가 강아지냐 고양이냐, 그게 어디있냐 이건 쉽습니다. 우리가 원하는 건 사람이 생각하는 바를 기계가 생각할 수 있게 하는 거겠죠. 사람 옆에 강아지가 있습니까? 이런게 쉬워야되는데, 이런 관계적인 문제를 푸는게 어렵고, 그래서 VQA가 필요한거에요. 그래서 그에 맞는 다양한 질문이 데이터셋에 들어가있습니다.

 첫번째 "Classification with complex setting"은 "Multi domain classification"이라고 합니다. 어떤 이미지가 어떤 카테고리로 분류될 거라는건 질문에 의존되겠죠? 그러니까 이게 뭐냐? 라는 질문에 대해서는 사람, 개, 고양이이런 식이고, 이게 뭐하는거냐? 는 뭐 자고 있다, 뛰고 있다 이런거죠. 그래서 Object classification과 Action classification이 존재합니다. 또 Objection classification을 자세히 보면, 모델이 출력해야할 결과는, 또다시 질문에 의존합니다. 이게 사람이냐? 라고 물으면 yes or no 겠고, 이게 뭐냐? 하면 사람입니다 라고 해야겠죠. 또 "Zero shot learning" 일반적으로 이건 한 번도 보지 못한 이미지를 어떻게 판단하냐 이런 겁니다. 개 고양이 곰 이런거 막 학습시켜놓고 펭귄이 들어오면 어떻게 학습시킬 것인가? 이런 문제입니다. 세상에는 무한한 가짓수의 물체가 존재할텐데, 이걸 다 학습시킬 순 없고, 처음본 걸 어떻게 판단시키게만들지, 이걸 조정해줘야하는 겁니다.

 "Reference Problem" 이건 뭐냐면, ~의 색은 뭐냐 이런 겁니다. ~에 해당하는 물체에 따라 답이 달라지겠죠. 모델은 일단 ~에 해당하는 물체가 어딨는지 찾고, 뒤에 답을 찾아야할 겁니다. "Spatial relation problem" 이건 앞서 말했지만, 어떤 물체와 어떤 물체 사이의 관계를 학습시켜야하는 거죠. "Visual semantic role labeling" 이거도 남자가 뭘 타고 있냐? 하는 질문처럼 질문에 대한 답을 출력하기 위해 여러 다른 물체를 인지하고 관계를 학습시켜야하겠죠. "Weakly supervised learning to count" 사진 속에 얼마나 많은 사람이 있냐 하는 질문에 관한 내용입니다. Counting이 특별히 어려운 이유는 일반적으로 이미지를 처리할 때 CNN으로 하는데, 이건 Counting에 적합하지가 않습니다. 동일한 Conv 필터가 이미지를 훑고 Fully conn로 들어가면 정보가 뒤섞여버리기 때문에, 그래서 적합하지가 않습니다. "Data efficiency problem" 이건 Compositionality에 관한 문제인데요, 만약 모델이 A는 뭐냐 그건 몇개 있냐, B는 뭐냐 그건 몇개 있냐 이런 질문들로 학습되었을 때 C는 몇개 있냐? 하는 문제를 풀게하는 겁니다. 같은 Operation을 학습했다면 Any class(object)에도 적용이 가능해야한다는 거죠. 물론 어렵습니다. 잘 되지가 않아요. 그리고 가장 중요하죠. 이게 안되면, 모든 경우의 수를 다 데이터셋에 넣어야하니까, 데이터가 엄청 커지겠죠. 그리고 이런 VQA과정에서 당연히 질문을 알아먹어야하니까 Natural Language Understanding 도 잘 진행되어야합니다.

 자, 결국 VQA를 생각해보면, 이미지가 있고, 문장이 있는거죠. 그리고 이 문장은 LSTM을 통해 나온 마지막 Cell state의 데이터를 질문을 설명하는 Feature로써 쓰고, 이미지는 CNN을 통과시키는게 일반적입니다.

 DPPnet / Attention based method 에서 설명하는건 뭐냐면요. Dynamic parameter prediction network. 우리가 이미지가 주어졌을때 이걸 분류하는 네트워크를 어떻게 만드냐면 질문에 의존하게 만들자는거죠. 당연히 같은 이미지지만 질문이 달라지면 모델도 달라져야죠. DPPnet이 어디서 영감을 받았냐면, 보통 이미지 처리 모델을 구성한다하면, 이미지넷에서 Pretrained model가져오고, 뒷 단만 이어붙여서 transfer learning을 시키는거죠. VQA에서는 Task가 Question에 의존하기때문에, 질문에 의존하게 뒷 단을 만들자는 거죠. 그렇게 뒷 단의 Dynamic parameter layer가 생겼고, 이 Layer의 Parameter(Weight)를 예측하기 위한 Parameter prediction network가 필요해졌습니다. Q에서 Feature를 뽑고, 이 Feature를 Regression을 통해 Parameter를 뽑자. Question에서 Feature를 뽑는게 뭘까요. 대표적으로 BOW가 있겠죠. 이건 뭐 빈도도 안세리고 뭐 복잡한 내용 없이, 그냥 각 단어의 존재유무만 퉁치는 그런 방법론이죠. 그런데 재밌는건 Text classification 같은 간단한 문제에서, 이게 굉장히 잘 작동해요. 쨋든 이걸 조금더 개선한게 CBOW. 그리고 CNN도 가능하겠죠. 이것도 괜찮구요. 그다음에 RNN이 등장합니다. 앞의 방법론들은 문장의 순서를 고려하지 못하지만 RNN부터는 그게 가능합니다. 그리고 개선한 LSTM. 이 논문에선 GRU를 사용했습니다. 쨋든 그렇게 만들어진 Feature를 보고, 이걸 질문에 대한 특성으로 쓰게 되는 거죠. 그리고 파라미터를 회귀로 뽑습니다. 근데 여기서 문제는, 이 과정에 필요한 파라미터의 수가 상상이상으로 많다는 겁니다. 정의할 수 조차 없을 정도로. 그래서 Parameter prediction network의 Output을 줄이고, 그 작은 출력으로부터 많은 Parameter를 예측해 보자는 거죠. 예를 들어 숫자 10개로 100개의 Param을 예측해보자는 거에요. 이걸 위해 Hashing trick이라는 걸 씁니다. 우리가 어떤 Net을 정의하는데, 이게 4x4라고 합시다. 이 모델을 학습시키려면 분명 4x4=16개의 Parameter가 필요할텐데, 이걸 3개의 Param으로 정의하는거에요. 그렇게 하려면 당연히 3개의 숫자들이 겹치는 곳이 생기겠죠. 이러면 우리가 원하는 바가 가능해지죠.

 

 물론 처음에 각각의 숫자들이 어디에 공통되게 들어갈지는 정해줘야겠죠. 쨋든 이렇게 만든 DPPnet의 결과를 보면, 가장 기본적인 모델로 시작해, Dynamic parameter prediction을 추가하고, GRU를 사용하고, CNN Fine tuning을 진행해서 점진적으로 성능을 개선시켰습니다. 그렇게 당시의 state-of-the-art를 찍었습니다.

 그 다음에 살펴볼 논문은 "Multimodal Compact Bilinear Pooling for VQA" 입니다. VQA는 근본적으로, 어떤 이미지 속에서, 내가 하는 질문에 대한, 어떤 특성을 뽑을 수 있는 알고리즘입니다. 그리고 이게 되려면 Multimodal 이 중요해 지는겁니다. 왜냐면 이미지와 질문은 굉장히 다른 Modality가 있겠죠. 이걸 잘 섞는게 중요한거구요. 자 어떻게 이미지와 질문을 잘 섞을까요.

 가장 간단한 방법이 있죠. 두개를 병합하는 것. 이렇게하면 모든 정보가 고려되지만, 이미지와 질문 사이의 상호 연결성(Interaction)이 전혀 나타나지 않잖아요. 그래서 잘 안됩니다. 그럼 또 어떤 방법?

 이런식으로, Elementwise Multiplication을 하는 겁니다. 곱해서 그냥 값 쓰는 거에요. 그런데 이건 결국 같은 인덱스에 위치한 이미지와 질문의 특성만 연결될 뿐입니다. 나머지는 무시당해요 그래서 쓰는게 바로

 이렇게 무식하게, 안전하게, Outer product를 하는 겁니다. 모든 원소를 Interaction시키는거죠. 다만 CNN도 2048, LSTM도 2048 Output을 냈다면, 저 빨간 부분이 2048*2048. 너무 많아요. 그래서 어떻게 접근하냐면,

 외적해서 나온 저 큰 매트릭스를, Low dimension으로 보내버리자는 거죠. 그리고 이게바로 Compact bilinear pooling입니다. 그리고 이걸 CNN을 통해 구현합니다. 이걸 위해서 복잡한 수식이 필요한데, 그 중 중요한건 Count sketch operation입니다. 이게 뭐냐면, 어떤 벡터를 다른 벡터로 보내버리는 거에요. 

 예를 들자면 위와 같은 그림이 되겠습니다. 어려운 개념은 아니에요.

 그리고 이 논문에서는 추가로 Attention 구조라는 걸 냈습니다. Attention이라는 건 내가 무언가를 쓸 때 어떤 이미지나 질문에서 어디를 더 중요하게 볼지를 학습하는 거겠죠. 당연히 Attention을 추가했을 때 정확도가 더 좋았습니다. 

 CNN과 LSTM을 통해 나온 같은 사이즈의 벡터를 MCB를 통해 합치고, 이건 Conv를 통과시키고 처음의 CNN 벡터와 Weighted Sum을 함으로써 Attention을 찾고, 이걸 다시 LSTM 벡터와 MCB시켜서 최종적으로 분류하는거죠. 여기까지 DPPnet, MCB를 봤는데, 두 개의 공통된 특징은 어떻게 해야 질문과 이미지를 잘 섞을 수 있냐는 거겠죠. MCB는 VQA뿐만 아니라 여러 Multimodal한 데이터를 섞어야하는 상황에 굉장히 유용히 쓸 수 있습니다. 거기에 Attention을 적용하는 것. 이걸 잘 사용하시면 좋은 결과가 나오실 것 같습니다. 이상입니다.