주어진 문맥 문단에 관해 질문(query)에 답변하는 것을 의미하는 기계독해(Machine comprehension, MC)는 문맥과 질문 간 복잡한 상호작용의 모델링을 필요로 합니다. 최근, 어텐션(attention) 메커니즘들은 기계독해 분야로 성공적으로 확장되어 왔습니다. 전형적으로 이러한 방법론들은 어텐션을 이용하여 문맥의 작은 부분에 집중하도록 해 정해진 길이의 벡터로 이를 요약하거나, 시간적 흐름에 따라 어텐션들을 묶거나, 그리고/혹은 단방향성 어텐션을 구성하였습니다. 이 논문에서 우리는 각기 다른 수준의 세분성(granularity)으로 문맥을 나타내고, 양방향 어텐션 흐름을 사용하여 조기의 요약이 필요없이 질문에 관한 문맥 표현을 얻을 수 있도록 하는 다단계(multi-stage) 계층적(hierarchical) 절차인 양방향성 어텐션 흐름(BiDAF)을 소개합니다. 우리의 실험결과 평가는 위 모델이 스탠포드 질문응답 데이터셋(SQuAD) 및 CNN/DailyMail cloze test에서 최첨단(state-of-the-art) 성능을 달성했음을 보여줍니다.
위 논문은 기계독해(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)에서도 소개되어 있는 대표적인 발견을 꼽아보면 아래와 같습니다.
문맥을 정해진 길이의(fixed-length) 벡터로 요약하는 대신, 개별 레이어에서 사전에 미리 계산된 attention이 차후 레이어로 흘러 들어가서 필요한 정보를 추출해내는 방식으로 모델의 학습이 이루어집니다. 결과적으로, 이는 early-summerization으로 인한 정보의 손실을 막는 데 역할을 합니다.
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과 무관합니다.
BiDAF 모델은 아래의 총 6개 레이어들로 구성됩니다.
아래의 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 주피터 노트북 파일은 아래 링크로 공유합니다.
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)