Introduction

Abstract in Korean

주어진 문맥 문단에 관해 질문(query)에 답변하는 것을 의미하는 기계독해(Machine comprehension, MC)는 문맥과 질문 간 복잡한 상호작용의 모델링을 필요로 합니다. 최근, 어텐션(attention) 메커니즘들은 기계독해 분야로 성공적으로 확장되어 왔습니다. 전형적으로 이러한 방법론들은 어텐션을 이용하여 문맥의 작은 부분에 집중하도록 해 정해진 길이의 벡터로 이를 요약하거나, 시간적 흐름에 따라 어텐션들을 묶거나, 그리고/혹은 단방향성 어텐션을 구성하였습니다. 이 논문에서 우리는 각기 다른 수준의 세분성(granularity)으로 문맥을 나타내고, 양방향 어텐션 흐름을 사용하여 조기의 요약이 필요없이 질문에 관한 문맥 표현을 얻을 수 있도록 하는 다단계(multi-stage) 계층적(hierarchical) 절차인 양방향성 어텐션 흐름(BiDAF)을 소개합니다. 우리의 실험결과 평가는 위 모델이 스탠포드 질문응답 데이터셋(SQuAD) 및 CNN/DailyMail cloze test에서 최첨단(state-of-the-art) 성능을 달성했음을 보여줍니다.

Summary

위 논문은 기계독해(MC) 분야에서 SOTA를 달성한 모델로, 양방향성 어텐션 메커니즘을 사용해 주어진 query에 대한 답을 찾는 것을 목적으로 합니다. 이 논문은 NLP 분야에서 "Seq2Seq with Attention" Review 이래로 기존의 RNN 계열을 이용해 attention을 계산하던 방식을 탈피하고, fixed-length vector representation을 만드는 방식 역시도 해결하였다는 의의가 있습니다. 이후에 나온 "Attention is All You Need" Review 의 경우는 RNN을 모델에서 완전히 제거하여, 높은 성능뿐만 아니라 높은 수준의 병렬화(parallelization)를 달성하였습니다. 따라서, 이 논문의 가치는 RNN의 inductive bias를 적절히 완화하면서도 기존 모델의 한계를 극복해, attention이 어떻게 활용될 수 있는 지를 제시했다는 데에 있습니다. 서문(Introduction)에서도 소개되어 있는 대표적인 발견을 꼽아보면 아래와 같습니다.

  1. 문맥을 정해진 길이의(fixed-length) 벡터로 요약하는 대신, 개별 레이어에서 사전에 미리 계산된 attention이 차후 레이어로 흘러 들어가서 필요한 정보를 추출해내는 방식으로 모델의 학습이 이루어집니다. 결과적으로, 이는 early-summerization으로 인한 정보의 손실을 막는 데 역할을 합니다.

  2. memory-less attention을 사용합니다. 기존의 RNN을 이용한 방식의 attention $\alpha_t$는 이전 스텝의 context vector $\mathbf c_{t-1}$와 이번 스텝의 input(혹은 hidden representation) $\mathbf h_t$의 함수입니다. 이를 수식으로 쓰면 아래와 같습니다. (아래 notation은 수학적으로 옳지 않지만, attention 관련 논문 관례상 아래와 같이 기입합니다.)

    $$ \begin{align*} \alpha_t &= f(\mathbf c_{t-1}, \mathbf h_t) \\ \mathbf c_t &= \sum \alpha_{t} \mathbf h_{t} \end{align*} $$

    하지만 위 BiDAF 모델의 경우는 memory-less 방식으로, attention 계산시 기존까지의 정보에 의존하는 것이 아니라 단순한 query와 context paragraph 사이의 함수가 됩니다. 즉, 이를 수식으로 쓰면 아래와 같습니다. (마찬가지로 수학적 notation은 무시하고, attention 논문의 관례를 따릅니다.)

    $$ \begin{align*} \boldsymbol{a} &= QK^\top \\ \mathbf h &= \sum \boldsymbol{\alpha} V \end{align*} $$

    가장 눈에 띄는 부분은 time 혹은 step을 의미하는 $t$가 사라졌다는 것입니다. 대신에 Query $Q$와 Key $K$를 이용해 attention $\boldsymbol{\alpha}$들을 한번에 계산해버립니다. 논문에서는 이러한 단순함으로 인해 attention layer와 modeling layer의 분업화가 이루어져, attention layer는 attention에만 집중하고, modeling layer는 상호작용을 학습하는 데에만 집중하는 것이 가능하다고 말합니다. 또한, $t-1$일 때 attention이 잘못되었다면 이것이 끝까지 영향을 미칠 수밖에 없는데, memory-less 방식은 서로 독립적으로 계산되므로 $t$번째 단어에 대한 attention은 $t-1$번째 단어의 attention과 무관합니다.

Details

BiDAF 모델은 아래의 총 6개 레이어들로 구성됩니다.

  1. Character Embedding Layer
  2. Word Embedding Layer
  3. Contextual Embedding Layer
  4. Attention Flow Layer
  5. Modeling Layer
  6. Output Layer

아래의 Detail에는 직접 구현한 PyTorch 코드를 설명하고, 이 결과를 시각화합니다. 다만, 1) Character Embedding Layer와 2) Word Embedding Layer는 구현하지 않았습니다. 그 이유는 1)의 경우는 단순한 CNN을 이용하여 구현이 어렵지 않으며, 2)의 경우는 pre-trained된 GloVe를 사용하기 때문입니다. 1)과 2)의 레이어가 two-layer Highway Network (Srivastava et al., 2015)에 의해 concatenation이 되었다고 하는데, 해당 네트워크가 무엇인지도 아직은 모릅니다. 왜 concatenation에 해당 네트워크를 사용한지는 더 공부해야 할 주제입니다.

따라서 3) Contextual Embedding Layer부터 6) Output Layer까지 PyTorch로 구현한 것을 볼 수 있습니다. 해당 구현 내용의 Google Colab 주피터 노트북 파일은 아래 링크로 공유합니다.

Google Colaboratory

Basic Settings

import torch
import torch.nn as nn
import matplotlib.pyplot as plt

### HYPERPARAMETERS ###

# regarding inputs
B = 49 # batch size
D = 16 # word embedding dimension

# regarding models
T = 100 # num words in text
J = 10  # num words in question
d = 16  # embedding dimension

# Generating fake inputs
# assuming pre-trained GloVe is used...
text_input =  torch.randn(B, T, D)
query_input = torch.randn(B, J, D)