본문 바로가기

AI

[논문리뷰] DialogBERT: Discourse-Aware Response Generation via Learning to Recover and Rank Utterances

논문: arxiv.org/pdf/2012.01775.pdf


IDEA

BERT, GPT 등 사전학습 모델은 언어 AI 모델링에 필수적인 요소가 되었다.

특히 [대화모델] 부문에서 사전학습된 언어모델은 자연스러운 발화를 생성함에 있어 큰 발전을 가져왔다.

 

하지만, 지금까지의 연구는 대부분 대화의 맥락을 <시퀀스에 대한 선형 결합>으로 처리했다.

이 나이브한 방법에서는 이어진 대화를 쭉 이어붙인 후 트랜스포머에 인풋으로 넣어 발화를 생성하는데,

이렇게 되면 모델은 토큰을 생성함에 있어 주어진 문맥에 대해 토큰 단위의 self-attention을 계산하게 된다.

 

<예. GPT를 사용한 답변 생성 인풋 개요 / 출처=https://www.groundai.com/>

(www.groundai.com/www.groundai.com/project/hello-its-gpt-2-how-can-i-help-you-towards-the-use-of-pretrained-language-models-for-task-oriented-dialogue-systems/1)

 

DialogBERT에서는 이러한 토큰단위의 인코딩 방식으로는 발화 간의 담화수준의 일관성을 탐색하지 못함을 지적한다.

이에 계층적인 트랜스포머 구조를 도입하고, 담화 수준의 일관성을 모델링하기 위한 목적함수를 제안하였다.

 

세 가지 멀티턴 대화 데이터셋에 태스트해본 결과, BART, DialoGPT보다 좋은 점수를 거두었고,

사람이 평가하기에도 DialogBERT가 더 일관적이고 정보가 풍부하며 사람같은 답변을 리턴한 것으로 조사되었다.

 


METHOD

대화 D = (u_1, ...., u_T) 에 대해 C = (u_1, ..., u_T-1)을 대화 맥락(히스토리), u_T를 답변(리스폰스)라고 표기하자.

C에 있는 각각의 u_i = (w1^i, ..., w|u_i|^i)는 발화이고, wj^i는 i번째 발과의 j번째 토큰이라고 표기한다. 

이제 맥락 C가 주어질 때 모델의 목적은 C에 대해 일관성을 가지는 다음 답변 u_T를 생성하는 것이 된다.

 

따라서 이 태스크에는 다음의 두 가지 목표가 존재한다고 볼 수 있다 :

  1) 대화 맥락 C를 represent하는 방법을 학습할 것

  2) 맥락 C가 주어질 때 u_T를 생성하는 조건부 확률을 학습할 것

 

Hierarchical Transformer Encoder

대화 맥락에 대해 좋은 representation을 만들기 위해 계층적인 트랜스포머 구조를 도입한다.

두 개의 트랜스포머 인코더를 계층적으로 구성하는데

  a) 발화인코더 f : C에 있는 각각의 발화를 벡터로 인코딩

  b) 맥락 인코더 g: 맥락 내에 있는 발화들에 대해 각각의 발화 representation을 학습한다.

 

<figure 1. 계층적인 트랜스포머 아키텍처>

 

a) Utterance Encoder: 발화 인코더는 각각의 발화 정보를 담은 vector를 인코딩한다. ([CLS]에 해당하는 벡터, 그림을 간소화하기 위해 각 발과의 끝에 오는 [SEP]토큰은 생략됨)

b) Context Encoder: 문맥 인코더는 인코딩된 발화 벡터에 대해 self attention을 통해 문맥을 고려한 발화 representation을 생성한다

 

 

 

구체적으로 DialogBERT는 다음과 같은 단계를 따른다.

(0) 인풋은 C에 있는 각각의 발화 앞뒤에는 BERT 페이퍼에서 그랬듯 [CLS]와 [SEP] 스페셜 토큰을 추가해 준비한다.

(1) 임베딩 레이어가 각 발화에 있는 토큰를 연속적인 공간으로 매핑한다. (토큰에 대한 임베딩 + 위치 임베딩) 

(2) 발화 인코더는 임베딩을 인풋으로 받아 self-attention을 수행하고, 각 발화에 대한 첫 번째 토큰([CLS] 해당)에 대한 벡터를 발화에 대한 representation으로 사용한다. 발화에 있어서도 순서를 고려하기 위해, 아웃풋 representation에 위치 임베딩을 더해 최종 representation을 얻는다 (u_i = u1^i + p_i)

(3) 문맥 인코더는 발화에 대한 representation을 인풋으로 받아 문맥을 고려한 hidden state를 반환한다(H). 이 벡터들은 계층적인 트랜스포머가 생성한 최종적인 대화 맥락 인코딩 결과로 해석할 수 있다.

Training Objectives

담화 레벨에서의 일관성을 모델링하기 위해 논문에서는 생성 loss에 더해 두가지 새로운 목적함수를 제안한다.

 

[ Next Utterance Generation(NUG) ]

모델의 목적이 답변을 생성하는 것이기 때문에, 대화 맥락이 주어졌을 때 다음 발화를 생성하는 것을 목적함수로 한다.

계층적 트랜스포머 인코더를 통해 문맥 C에 대해 맥락의 의미를 담은 발화 representation (h_1, ..., h_|C|)을 얻을 수 있다.

 

이제, 다음 담화를 생성하기 위해 트랜스포머 디코더를 사용한다. (이때 첫 번째 토큰은 [CLS]를 사용)

디코더는 디코더가 생성한 기존 단어와 맥락 representation을 조건부로 다음에 올 토큰을 예측한다.

 

NLG 태스크는 디코더에서 cross-entropy loss를 최소화하는 것을 목적함수로 한다.

 

 

여기서 N은 생성할 수 있는 최대 길이를 의미한다.

 

 

[ Masked Utterance Regression (MUR) ]

BERT에서는 MLM 태스크가 주어졌듯, DialogBERT에서는 MUR 태스크를 보조 태스크로 수행한다.

대화 맥락 C=(u_1, ..., u_T-1)이 주어질 때, 랜덤하게 하나의 발화를 선택한 후

 1) 80%의 확률로, Mask utterance [CLS, MASK, SEP]로 대체

 2) 10%의 확률로, 변화를 주지 않음

 3) 10%의 확률로, 학습 데이터에 있는 랜덤환 발화로 대체 한다.

그리고 마스킹된 발화에 대한 벡터를 reconstruct하도록 한다.

 

마스킹된 문맥 C_tilda가 주어질 때, 모델은 C_tilda로부터 원래의 발화 벡터를 예측해야 한다.

먼저 계층 인코더를 C_tilda에 대해 적용하여 문맥의 의미를 담은 발화 representation을 얻는다.

이후 이 representation을 원래 utterance vector로 매핑하는 FC layer을 연결한다.

이후 예측한 hidden vector와 원래 C에 대해 얻어진 hidden vector의 MRS loss를 최소화하도록 모델을 학습한다.

 

 

기존의 사전학습 LM기반의 대화모델에서 대화 답변 생성 기능을 강화한 방법론을 제안한다. 

 

 

[ Distributed Utterance Order Ranking (DUOR)]

대화 모델링에서 일관성은 아주 중요한 특성이다.

 

일관성있는 담화에서 발화들은 관계성이나 로직에 따라 특정 순서를 가지게 된다.

즉, 발화의 순서는 대화의 의미적은 부분(semantic)을 담아낸다고 할 수 있다.

따라서 논문에서는 대화의 순서를 맞추는 태스크가 모델이 발화의 일관성을 학습하는 데에 도움이 된다고 가정하였다.

 

발화 re-ordering 태스크의 목적은 랜덤하게 셔플링된 발화문을 원래 순서로 맞추는 작업이다.

대화문에 n개의 발화가 있을 경우, 섞을 수 있는 발화문의 가지수는 n!가지나 된다.

하지만 이런 랜덤한 공간은 방대하고, 겹치는 부분이 많기 때문에 그대로 사용하면 결과가 좋지 않을 수 있다.

 

논문에서는 distributed order ranking network(DORN)을 디자인하여 문맥 인코더 위에 붙이는 방식을 선택했다.

permutation 인덱스를 전체적인 인코딩에 조건부로 분류하는 대신, DORN은 분산된 순서 인덱스를 예측한다.

 

<figure 3. DUOR>

 

DORN은 context encoder로부터 순서가 섞인 발화문을 입력 받아 각 발화문에 대한 점수를 예측한다. 이제, 이 점수는 re-ordering에 바로 사용된다. (score을 sort하면 순서가 된다는 뜻)

 

Self-attention 매커니즘에서와 같이, order prediction network은 hidden state간의 pairwise inner product를 계산하고, 각 발화문에 대한 점수는 다른 발화문과의 내적에 대한 평균으로 계산한다. (수식 8 참고)

 

학습 과정에서는 learning-to-rank 프레임워크를 도입한다.

예측된 점수를 <어떤 컨텍스트가 첫 번째에 와야하는지>에 대한 지표로 사용해 rank-1 확률을 추정한다:

Ground Truth order의 경우, 원래의 순서를 고려하여 다음과 같이 계산한다:

여기서 y_i는 0과 1 사이의 수인데, y_i = i/|C|로 계산한다.

 

이제, ground truth와 예측된 분포간의 KL divergence를 최소화하는 것을 목적함수로 한다:

전체 Loss는 다음과 같이 쓸 수 있고, 람다 0과 1의 값은 1로 설정하였다. 

🦊 앞에 오는 발화의 ground truth P(u_i)가 크게 하려면 y_i를 (|C|-i)/|C|처럼 설정해야 하는거 아닌가...


실험 결과 (정리 생략)

생성된 대화 예시: