대화의 Context를 반영한 답변을 생성할 수 있을까? - Dialog-BERT 만들기 4편

How can we train a Multi-Turn Dialogue System?

정다운 백영민 | 2020년 01월 22일

지난 Dialog-BERT 만들기 1, 2, 3편에서는 채팅 데이터를 정제하는 과정, Dialog-BERT에 적합한 Tokenizer를 조사하는 과정, 대화 시스템에 적합한 Dialog-BERT를 학습하는 과정을 소개했습니다. 이번 포스트에서는 학습한 Dialog-BERT를 이용하여 여러 턴 (Multi-turn)의 대화 문맥 (Context)을 고려한 답변을 예측할 수 있는 일상 대화 답변 모델을 모델링하는 과정을 살펴보겠습니다.

Contents

  1. 들어가며
    1. 일상 대화 인공지능이란 무엇인가요
    2. 일상 대화 인공지능에게 멀티턴 대화는 왜 중요한가요
  2. 멀티턴 일상대화 답변 모델
    1. 모델 개요
    2. Classification Model
    3. Reranking Model
  3. 실험
    1. 데이터셋
    2. 모델 설정 및 학습 전략
    3. 평가 방법
    4. 실험 결과
    5. 분석
  4. 이 글을 마치며

들어가며

일상 대화 인공지능이란 무엇인가요

저희 핑퐁 팀은 사람들과 일상 대화를 잘 나눌 수 있는 일상 대화 인공지능을 만드는 것을 목표로 하고 있습니다. 일상 대화 인공지능은 개인 AI 비서나 고객센터 챗봇 등과 같은 기능 대화형 인공지능과 달리 다양한 분야에 대해 자유롭게 이야기하면서 사람들과 친구와 같은 관계를 맺는 것을 목표로 하는 인공지능입니다. 기능형 대화 인공지능과 일상 대화 인공지능의 대표적인 차이를 비교하자면 아래의 표와 같습니다.

  기능형 대화 인공지능 일상 대화 인공지능
목적 유저가 원하는 정보를 얻거나 원하는 행동을 하도록 하는 것 대화를 하며 관계를 맺는 것
대화 도메인 미리 정해진 기능 해당하는 도메인 모든 도메인
입력 문장 형태 주로 명령형, 질문형 가능한 모든 문장형
정답의 유무 명확한 정답이 존재 명확한 정답이 존재하지 않거나 정답이 여러 개 존재

한편, NLP 분야에서 대화형 인공지능이란, 주어진 대화 문맥 (Context) 다음에 올 답변을 생성 (Generate)하거나 답변 후보군 중 가장 그럴싸한 답변을 검색 (Retrieve)하여 다음 문장을 예측하는 모델을 말합니다. 일반적으로 일상 대화 (Open-domain Conversation)를 모델링하는 것은 기능형 대화 (Functional Conversation)를 모델링하는 것에 비해 훨씬 어려운 과제입니다. 위의 표와 같이 기능형 대화 인공지능은, 한정된 도메인 질의에 대한 명확한 정답을 모델링하면 유저가 만족할 만한 대화 경험을 보여줄 수 있는 반면, 일상 대화 인공지능은, 폭 넓은 도메인 지식이 필요하고 다양한 형태로 입력되는 문장들을 이해할 수 있어야 하며 가능한 모든 응답 중에서 대화 문맥상 가장 적절한 응답을 고르는 능력을 필요로 하기 때문입니다. 이 외에도 대화 상대에 대한 배경 지식이나 봇의 일관된 페르소나 등 수많은 요소들이 복합적으로 작용하여 균형을 맞출 때 일상 대화 인공지능은 최고의 대화 경험을 보여줄 수 있기 때문에, 아직까지 일상 대화 인공지능을 구현하는 것은 기능 대화형 인공지능을 구현하는 것에 비해 발전이 더디고 더 어려운 과제라 할 수 있습니다.

일상 대화 인공지능에게 멀티턴 대화는 왜 중요한가요

일반적으로 사람들은 이전 대화의 문맥을 의식하면서 대화를 합니다.즉, ‘좋은’ 답변은 그 주제나 내용에 있어서 기존에 나눴던 대화의 문맥과 일관성이 있어야 합니다. 마찬가지로 ‘좋은’ 대화형 인공지능은, 직전 사용자의 발화만 고려한 싱글턴 (Single-Turn) 답변보다 여러 턴의 대화 문맥을 반영하는 멀티턴 (Multi-Turn) 답변을 할 수 있어야 합니다.

아래의 예시는 싱글턴 문맥만을 고려했을 때는 두루뭉술한 답변을 하지만, 멀티턴 문맥을 고려했을 때 조금 더 토픽에 맞는 답변을 해주는 경우를 보여줍니다.

멀티턴 모델의 대화 예시 (1) (출처:<https://demo.pingpong.us/multi-turn-reaction/>)
싱글턴 모델의 대화 예시 (1) (출처:<https://demo.pingpong.us/reaction/>)

또한, 아래의 예시는 싱글턴 문맥만을 고려했을 때와 멀티턴의 문맥을 고려했을 때 전혀 다른 답변이 나오는 경우를 보여줍니다.즉, 바로 전 턴에 대해서 잘 선택된 답변도 문맥에 따라서 이상하게 들릴 수 있습니다.

멀티턴 모델의 대화 예시 (2) (출처:<https://demo.pingpong.us/multi-turn-reaction/>)
싱글턴 모델의 대화 예시 (2) (출처:<https://demo.pingpong.us/reaction/>)

멀티턴 일상대화 답변 모델

저희는 Dialog-BERT 만들기 3편에서 설명드린 대로, 사내에서 보유하고 있는 카톡 채팅 데이터를 이용하여 폭 넓은 도메인 지식과 다양한 대화 형태를 이해할 수 있는 Dialog-BERT를 학습시켰습니다. 이러한 Dialog-BERT를 Fine-Tuning하여 멀티턴 대화 문맥을 입력했을 때 이에 대한 적절한 응답을 할 수 있도록 모델링을 하면, 더 사람다운 답변 모델을 만들 수 있을 것이라고 생각했습니다.

모델 개요

일상 대화 답변 모델을 구상하기에 앞서, 카톡 채팅 데이터의 실제 대화 패턴을 분석해보았습니다.사람들의 일상 대화 패턴은 아래의 두 가지 성격을 동시에 띄고 있었습니다.

  1. 사람들은 하나의 일상 대화 문맥이 주어졌을 때, 다양하게 답변할 수 있습니다 (One-to-Many).
One-to-Many 성격의 예시
  1. 반대로 다양한 일상 대화 문맥이 주어졌을 때, 하나의 답변으로 대답할 수 있습니다 (Many-to-One).
Many-to-One 성격의 예시

이 두 가지 특성 중 저희는 2번 특성에 주목했습니다.일상 대화의 Many-to-One 특성을 이용하면 수많은 문맥을 적은 양의 답변만으로도 다룰 수 있을 거라 생각했죠. 이와 같은 Many-to-One 특성은 Zipf’s Law라는 경험적인 법칙으로도 설명될 수 있습니다. 이러한 고찰로부터 저희는 일상 대화 코퍼스에서 많이 등장하는 발화문 (Utterance)을 분석하여 다양한 Context에서 널리 쓰일만한 답변의 후보군을 만들어, 대화 Context를 입력하면 답변 후보군 중 가장 적절한 답변을 예측하는 모델을 만들기로 했습니다. 조사 결과 이러한 답변 후보군에는 주로 ‘반응형’ 대답에 가까운 Utterance가 많이 포함되어 있었기 때문에, 저희는 이 모델을 ‘멀티턴 리액션 모델 (Multi-turn Reaction Model)’이라고 이름 지었습니다.

멀티턴 리액션 모델의 구조

멀티턴 리액션 모델은 많은 선택지들 (1000개 이상) 중에서 대략적인 후보군 (약 10개)을 선택하는 Classification Model과, (Nogueira and Cho, 2019)에서 제안된 방법과 유사하게 이 후보들의 순위를 재정렬하는 Reranking Model로 구성되어 있습니다. 우선, Classification Model을 이용하여 입력 Context에 대한 답변 후보를 Top-k개 선택합니다. 그 후, Reranking Model을 이용하여 k개의 답변 후보군 중 입력 Context에 대해 가장 적절한 답변 1개를 출력합니다. 각 모델은 사전학습된 Dialog-BERT 모델을 Fine-Tuning하여 구축하였고, Sentence Classification 문제 (하나의 문장을 입력으로 받아 각 클래스의 확률 분포를 예측하는 문제)를 풀기 때문에 아래 그림과 같이 출력 레이어의 [CLS]토큰 Representation에 Linear Classifier를 추가한 모델 구조로 학습을 진행했습니다.

BERT의 분류 모델 Fine-Tuning 방법

Classification Model

앞에서 설명드렸듯이, Classification Model은 입력 Context (여러 턴의 발화) 문장들이 주어졌을 때 해당 문맥에서 이어질 답변을 선택하는 Multi-class Classification 문제를 풉니다. 앞의 내용처럼 일상 대화는 One-to-Many 특성도 갖고 있기 때문에, 하나의 Context에 여러 가지 답변이 가능합니다. 본 모델은 이러한 답변들 중에 해당 Context에 대한 답변이 될 수 있는 후보 Top-k 개를 선택하는 역할을 맡게 됩니다.

단, 이 방법에서는 Context 문장만을 모델에 입력하기 때문에, Reply의 언어적 정보는 모델이 이용할 수 없습니다. 즉, Reply는 Multi-class 레이블로서의 기능만을 하기 때문에, Dialog-BERT의 Encoder 단에서 각 Reply들이 어떠한 의미를 지니고 있는지는 판단할 수 없고, 해당 Context에 대한 대략적인 답변 후보군을 선택하는 기능을 합니다.

Classification 예시

Reranking Model

Reranking Model은 Classification Model에서 얻은 Top-k개 답변 후보군의 순위를 재정렬하여 최종적인 Top-1 Reply를 결정하는 역할을 합니다. Classification 모델은 대략적인 답변 후보군만을 선택할 수 있기 때문에, Top-k개에 속한 답변들은 문맥상 의미는 통하지만 앞의 문맥에 포함된 답변을 반복하거나 어색한 답변을 선택할 수도 있습니다. 이 선택지 중 제일 좋은 답변을 가려내기 위해, Multi-turn contextK개의 답변 후보군 이 주어졌을 때, 어떤 답변이 가장 정확한지 판단하는 Reranking model을 구상하였습니다.

Reranking 예시

Reranking model은 특정 Context와 이에 대한 Reply가 모델에 입력되었을 때, 해당 Context-Reply 쌍이 자연스러운지 판단하는 Binary Classification 문제를 풉니다.이 모델은 Classification 모델과 달리 Reply 문장의 언어적 특성도 고려할 수 있기 때문에 조금 더 자연스럽고 문맥에 맞는 답변을 선택할 수 있습니다.

실험

데이터셋

이 절에서는 멀티턴 리액션 모델을 구축하기 위해 사용한 대화 코퍼스에 대해 설명합니다.

Classification Dataset

Classification Model을 학습하기 위해서는 1.답변 후보군 (이하, 리액션 클래스셋)을 정하는 작업과 2.카톡 채팅 코퍼스로부터 리액션 클래스셋에 속하는 데이터를 추출하여 멀티턴 리액션 모델 학습용 코퍼스를 구축하는 과정이 필요합니다. 저희는 리액션 클래스셋을 정하기 위해, Dialog-BERT 만들기 1편에서 정제한 대화 코퍼스 내에 등장하는 Utterance를 빈도 순으로 정렬해보았습니다. 대화 코퍼스 특성상 ㅋㅋㅋ , ㅎㅎㅎ 등과 같은 초성 문자 및 이모티콘 등이 많이 포함되어 있기 때문에, 아래와 같은 정규 표현식으로 Utterance 내에서 한글 음절 및 물음표만을 추출하여 빈도순으로 정렬했습니다.

import re
message='ㅋㅋㅋ괜찮아요^^'
pattern = re.compile('[^가-힣?]')
print(message, ' -> ', pattern.sub('',message))
# ㅋㅋㅋ괜찮아요^^ -> 괜찮아요

이런 방식으로 상위 빈도의 Utterance를 조사한 결과, 상위 빈도의 Utterance는 ‘응’, ‘그렇구나’, ‘다행이다’, ‘진짜?’ 등과 같이 구체적인 내용을 담고 있지 않은 ‘리액션’과 같은 문장이 많았고, ‘알았어’, ‘알았엉’과 같이 완전히 동일한 의미를 지니고 있는 문장들이 더러 존재했습니다. 따라서, 저희는 아래와 같이 리액션을 대표하는 문장 (Class String)을 Key로 갖고, 데이터셋에 등장하는 실제 문장 (Real String)의 리스트를 Value로 갖는 Dictionary 형태로 클래스셋을 구성하였습니다.이렇게 해서 저희는 빈도 상위 약 10000개의 발화문을 검토하여, 답변으로 적절할 만한 천여 개의 클래스 문장을 갖는 클래스셋을 구성하였습니다.

클래스셋 예시

클래스셋을 구축한 후, Classification Model용 코퍼스를 구축하기 위해서 전체 코퍼스 내에서 Real String이 등장하는 세션을 찾아, 리액션을 Reply로 하고 이 리액션의 앞에 나온 Utterances를 Context로 하는 데이터셋을 구성하였습니다.단, Context의 턴 길이는 최대 5턴으로 지정하여 모델이 최대 5턴까지만 Context로 기억할 수 있도록 했습니다. 이렇게 해서 저희는 약 6, 200만 건의 데이터를 카톡 채팅 코퍼스로부터 수집했고, 이 중 약 1%를 검증용 데이터로 이용하였습니다.

Reranking Dataset

Reranking Model을 학습시키기 위해서는 주어진 (Context, Reply) 쌍이 자연스러운지 (positive: 1) 부자연스러운지 (negative: 0) 레이블링 되어있는 코퍼스를 구축해야 합니다.실제 대화 데이터에 존재하는 (Context, Reply) 쌍은 실제 데이터에 존재하는 쌍이기 때문에 Positive 샘플로 가정합니다.

Negative 샘플을 뽑는 가장 간단한 방법으로, BERT의 Next Sentence Prediction (NSP) 문제와 유사하게 현재 Context와 다른 세션의 발화를 랜덤으로 뽑는 것을 생각할 수 있습니다.최근 연구들 StructBERT, Wang et al., 2019, ALBERT, Lan et al., 2019 에 따르면 단순 NSP 문제는 각 segemnt의 주제만 파악하면 비교적 쉽게 풀 수 있는 문재이고, 문장 사이의 깊은 coherence를 파악하는 것이 아니라는 주장을 합니다.특히 대화에서는 주제가 유사하더라도 미묘한 의미의 차이로 자연스러운 답변 인지 아닌지가 결정되기 때문에 추가적인 sampling 방법을 이용하였습니다.

일반적으로 같은 세션의 발화들은 비슷한 주제에 대해서 얘기하고 있을 가능성이 높습니다.따라서 같은 대화 세션에서 랜덤으로 하나의 발화를 뽑아 이를 Reply로 하는 Negative 샘플을 만듭니다.같은 대화 세션을 뽑는 방식도 다양할 수 있는데, 다음과 같은 방법들을 이용하였습니다.

이 샘플링 방식들과 랜덤 샘플링 방식을 적당한 비율로 섞어 샘플링을 진행하였고, 약 1, 000만 쌍의 학습셋 / 50만 건의 검증 셋을 만들어 실험을 진행했습니다.

모델 설정 및 학습 전략

저희는 멀티턴 리액션 모델을 구성하는 각 모델을 학습하기 위해, Dialog-BERT를 각 모델에 맞게 Fine-Tuning하였습니다. 다음 학습 파라미터는 모든 모델에서 동일하게 적용하였습니다.

저희는 각 모델을 채팅 데이터에 맞게 학습시키기 위해 아래와 같은 학습 전략을 이용했습니다.

Classification Model

Reranking Model - Reply Matching

평가 방법

저희는 모델을 정량적으로 평가하기 위해 다양한 문맥 및 문장 형태로 구성된 테스트용 Context 300개를 직접 작성했습니다.그리고 각 Context에 대하여 30개씩 Reply를 부여한 뒤 각 Context와 Reply가 얼마나 자연스러운지를 0 ~ 3점으로 레이블링하여 총 9, 000건의 테스트셋을 구축하였습니다. 평가 척도로는 NDCG 와 Accuracy@top-K를 이용하였습니다.

또한, 모델을 정성적으로 평가를 위해, 다양한 Context를 직접 모델에 입력해보면서 정성평가를 수행했습니다.정성평가를 할 때는 아래와 같은 사항에 중점을 두어 확인해보았습니다.

  1. Context가 싱글턴인 경우에도 충분히 적절한 답변을 선택할 수 있는가?
  2. Context의 턴 수 변화에 따라 출력되는 답변들에 차이가 있는가?
  3. Top-k 안에 적절하지 않은 답변들이 얼마나 포함되어 있는가?
  4. 참신하고 센스있는 답변들이 진부한 답변들보다 더 높은 순위에 있는가?
  5. Context의 변화에 민감하게 반응할 수 있는가?
  6. 다양한 도메인, 다양한 문장 형태의 Context에도 대응할 수 있는가?

성능 비교를 위한 베이스라인 모델로는 Classification Model에 대해 아래과 같은 HRED (Sordoni et al., 2015) 모델의 Encoder에 Utterance-level, Token-level Attention을 추가한 모델을 이용했습니다.

HRED 모델 구조 (출처: <https://arxiv.org/pdf/1507.02221.pdf)>

실험 결과

우선, 정량적인 성능 비교 결과는 아래와 같습니다.

  NDCG Val Accuracy@top1 Val Accuracy@top15
HRED-based Baseline 0.76 0.19 0.58
제안 모델 - Classification 0.82 0.25 0.67
제안 모델 - (+ Reranking) 0.88 - -

Baseline과 제안 모델 사이의 정성적 비교

  1. Context가 싱글 턴일 때, 베이스라인 모델은 말이 안되는 답변이 Top-k에 다수 포함되어 있던 반면, 제안 모델은 말이 되는 답변 비율이 높았지만, 다소 뻔한 답변이 많았습니다.
  2. Context의 턴 수를 변화시켜가며 모델에 입력해보았을 때, 베이스라인 모델은 턴 수의 변화에 따라 민감하게 반응했지만 이로 인한 부작용으로 말이 안되는 답변의 비율이 높았습니다. 제안 모델은 턴 수에 상관없이 안정적으로 적절한 답변을 내놓았지만, 베이스라인 모델에 비해 마지막 턴의 문장에 크게 의존하는 경향이 있었습니다.
  3. Top-k개의 답변 후보들 중, 베이스라인 모델은 제안 모델보다 말이 안되는 답변의 비율이 더 높았습니다.
  4. 참신한 답변을 얼마나 출력할 수 있는지를 확인해보았을 때, 베이스라인 모델은 제안 모델에 비해 참신한 답변의 비율은 다소 높았습니다. 그러나 그만큼 입력 Context에 대해 적절하지 못한 답변의 비율이 높았습니다. 반면, 제안 모델은 좀 더 뻔한 답변의 비율이 높았지만 그만큼 안정적인 성능을 보였습니다.
  5. Context의 일부를 변경하여 변화에 적절하게 대처할 수 있는지를 확인해보았을 때, 베이스라인 모델은 Context 변화에 민감하게 반응하여 답변이 바뀌는 경우가 많았지만, 제안 모델은 이러한 변화에 상관 없이 사용 가능한 두루뭉술한 답변이 출력되는 경향이 있었습니다.
  6. Context 문장에 고의적인 철자 오류나 특수 기호 등을 추가하여 다양한 문장 형태에 대해서도 로버스트한 성능을 보이는지 확인해보았을 때,

베이스라인 모델은 이러한 오류 포함 문장에 대해서는 올바른 답변을 못하는 경우가 많았습니다.그러나, 제안 모델은 이러한 다양한 문장들에 대해서도 적절한 답변을 출력하는 경우가 많았습니다.

  1. 제안 모델은 BERT의 사전 학습법을 통해 대량의 데이터를 이용하여 대화 자체를 더 잘 이해하기 때문에, 베이스라인 모델에 비해 성능이 높고 일관성 있는 답변을 한다고 볼 수 있습니다.

Reranking 모델의 효과

  1. 정성적 결과를 확인했을 때, classification 모델 상위 10개 정도의 답변은 대부분 해당 Context에 대해서 “말이 되는” 답변이었으나 더 구체적이고 좋은 답변보다는 안전한 답변이 상위에 위치했습니다.
  2. 300개의 테스트 데이터에 대해 유니크한 top-1 답변의 개수를 세어보았을 때, 평균 90개 정도는 3~4개 Context에 대해 같은 답변을 내놓았습니다.
  3. Classification 결과 상위 10개 답변을 Reranking 모델로 재배열 해보면 유니크한 top-1 답변의 개수가 180개 정도로 약 2배 증가했고, NDCG도 약 0.06 정도 대폭 상승함을 볼 수 있습니다.
  4. 리랭킹 모델은 Reply의 언어적 특성을 고려할 수 있을 뿐만 아니라, 자연스러운 답변인지 아닌지를 직접적인 objective로 학습했기 때문에 조금 더 좋은 답변을 골라내는 데 효과적이라고 볼 수 있습니다.

분석

정량적인 성능 비교 표를 보면 제안 모델이 베이스라인 모델의 성능을 뛰어 넘는 것을 확인할 수 있습니다. Dialog-BERT는 사전 학습을 통해 다양한 도메인 지식 및 문장 형태를 학습하였기 때문에 다양한 Context에 대해서 훨씬 잘 대응하는 모습을 보여주었습니다.또한 리랭킹 과정을 거쳐 안전한 답변, 뻔한 답변이 자주 등장하는 문제를 어느 정도 해결할 수 있었습니다.

더 좋은 답변

한편, 저희는 정량적인 성능과 참신한 답변의 비율 사이에는 어느 정도의 Trade-off 관계가 존재한다는 것을 발견했습니다. 이러한 Trade-off는 기본적으로 학습 코퍼스의 큰 class imbalance가 주요 원인으로 작용하기 때문에, 학습 코퍼스의 class간 밸런스를 조절함으로써 안정적인 성능과 참신한 답변 사이의 Trade-off에 적절히 대응할 수 있을 거라 생각하고 있습니다. 또한, 저희는 일상 대화의 Many-to-One 특성에 주목하여 멀티턴 리액션 모델을 구상하였기 때문에, 일상 대화의 One-to-Many 특성은 모델에 크게 고려되지 않았습니다. 따라서, 아래의 예시처럼 단순히 입력 Context만으로는 수 많은 답변 후보 중 가장 적절한 답변을 예측하기 어려운 경우가 존재합니다.

One-to-Many 특성을 지닌 대화 예시

왼쪽 예시는 입력 Context의 시간 정보가 주어지지 않으면 3개의 답변 후보 중 우위를 가리기 어려운 예시입니다.오른쪽 예시는 입력 Context에 대해 다양한 의도를 지닌 답변이 가능하기 때문에 3개의 답변 후보 중 더 나은 답변을 예측하기 어려운 예시입니다. 저희는 시간 정보나 화행 (Dialogue Act) 정보, Entity 정보 등 문맥에 관한 정보를 추가로 입력하여 이러한 문제에 대응할 수 있을거라 생각합니다.

이 글을 마치며

이번 포스트에서는 채팅 데이터를 이용하여 학습한 Dialog-BERT를 Fine-Tuning하여 일상대화 답변 모델을 구축하는 과정에 대해 알아보았습니다. 멀티턴 리액션 모델을 구축하면서 문맥에 맞지 않는 엉뚱한 답변을 만들어내는 비율을 현저하게 줄였고, 이로써 더욱 생동감 있는 챗봇을 만들 수 있었습니다. 물론 여전히 한계는 있습니다.현재의 멀티턴 리액션은 입력 문맥에 담긴 정보를 파악한 구체적인 답변을 만들어 내지는 못합니다.이를 위해서는 추가적인 연구가 필요할 것입니다. 정말로 ‘사람다운’ 챗봇을 만들기 위해서는 사람과 같이 폭넓게 대화 주제를 선택할 수 있는 능력, 꼭 들어맞는 응답을 만들어내는 능력, 상식을 활용할 수 있는 능력, 일관된 어투로 말을 할 수 있는 능력 등 수 많은 요소들을 고려해야 합니다. 저희 핑퐁팀은 최고의 일상 대화 인공지능을 만들기 위해 끊임없이 노력하고 있습니다.앞으로 이 노력의 결과로 나타날 연구 성과도 기대해주세요!

Reference

핑퐁팀이 직접 전해주는
AI에 관한 소식을 받아보세요

능력있는 현업 개발자, 기획자, 디자이너가
지금 핑퐁팀에서 하고 있는 일, 세상에 벌어지고 있는 흥미로운 일들을 알려드립니다.