한국어로 대화하는 생성 모델의 학습을 위한 여정

Journey into Korean Dialog Generation System

박채훈 서상우 정다운 | 2020년 08월 12일

최근 Meena[1], Blender[2] 등의 오픈 도메인 챗봇을 제안한 논문들에서는 대량의 대화 데이터로 학습한 대규모 답변 생성 모델이 뛰어난 대화 생성 능력을 가진다고 보고합니다. 이번 포스트에서는 대량의 한국어 데이터를 이용하여 오픈 도메인 답변 생성 모델을 학습한 과정을 소개해드리고자 합니다.

Table of Contents

  1. 개요
  2. 생성 모델의 종류
  3. 데이터 셋
    1. 전처리
    2. 데이터 상세
    3. 외부 데이터 활용
  4. 토크나이저
  5. Decoding Methods
    1. Deterministic Methods
    2. Stochastic Methods
    3. Heuristic Rules
  6. Experiments
    1. 평가 척도
    2. 모델 및 데이터셋에 따른 생성 능력 평가
    3. 디코딩별 성능 평가
  7. 생성 결과
  8. 글을 마치며
  9. References

개요

오픈 도메인 챗봇을 구현하는 일은 NLP 업계에서 제일 도전적인 태스크 중 하나입니다. 기능형 챗봇과 달리 명확한 목표 문장이 없기 때문에 학습이 어려운데다가 사람처럼 유연하게 대화하기 위해서는 사람이라면 당연하게 갖고 있는 상식이나 다방면의 지식, 위트, 공감 능력 등을 갖춰야 하기 때문이죠. 그렇기 때문에 오픈 도메인 챗봇의 구현은 그동안 난공불락의 과제처럼 여겨졌습니다.

하지만 최근에 구글, 페이스북, 바이두, 마이크로소프트 등 다양한 기업에서 오픈 도메인 챗봇에 관한 논문이 계속해서 발표되고 있고, 이들은 이전과는 차원이 다른 오픈 도메인 대화 능력을 실험적으로 보여주고 있습니다 [1], [2], [3], [4], [5].

[1]에서는 대량의 대화 데이터로 사전 학습한 생성 모델 Meena를 제안했고, end-to-end 생성 모델만으로 이전의 오픈 도메인 챗봇들을 크게 웃도는 성능을 보여줬습니다. [2]에서는 Reddit 데이터로 사전 학습한 생성 모델을 소량의 목적성을 갖는 대화 데이터셋들로 파인튜닝하는 방식을 이용하여 Meena 모델의 성능을 웃도는 Blender를 제안했습니다. [3]에서도 역시 대규모 대화 데이터로 생성 모델을 사전학습하고, curriculum learning을 통해 fine-grained한 답변을 생성하는 전략을 이용하는 PLATO-2를 제안했습니다.

이러한 논문에서 제안된 방법들은 하나 같이 대량의 대화 데이터로 학습한 대규모 생성 모델을 기반으로 하고 있습니다. 답변 생성 모델을 크게 키우는 것이 점차 오픈도메인 챗봇을 만들기 위한 기반 기술이 되어가고 있다는 것을 알 수 있습니다.

하지만, 대규모 생성 모델을 학습하는 것은 많은 리소스와 리서치가 요구되는 일이기 때문에 가벼운 마음으로 시도해보기 쉽지 않습니다. 저희의 이번 포스트가 조금이나마 한국어 대화 생성 모델의 연구에 도움이 되었으면 합니다.

생성 모델의 종류

우선, 최근 답변 생성 관련 연구에서 자주 이용되는 생성 모델의 구조에 대해 설명드리겠습니다. Transformer[6] 기반의 답변 생성 모델의 구조는 크게 2가지로 분류됩니다. 아래와 같은 Encoder-Decoder 구조 (Meena형 구조)Decoder Only 구조 (GPT형 구조)입니다. Meena형 구조는 Encoder에 Context를 입력하고 Decoder가 Reply의 다음 단어를 예측하도록 학습합니다. 반면, GPT형 구조는 Context와 Reply를 같이 입력하고 Decoder가 다음 단어를 예측하도록 학습합니다.

Meena형 구조
GPT형 구조

Encoder의 유무에서 오는 두 모델의 차이점은 아래와 같습니다.

  1. Meena형 구조는 Context를 양방향으로 이해하지만, GPT형 구조는 Context를 단방향으로밖에 이해하지 못합니다. (단, Uni-LM [7]처럼 GPT형 구조로도 마스킹 트릭을 이용하여 Context를 양방향 인코딩할 수는 있습니다.)
  2. Meena형 구조는 인코더의 마지막 레이어와 디코더의 각 레이어가 Cross-Attention으로만 연결되어 있기 때문에, 인코더와 디코더가 레이어별로 상호작용하지 못합니다. 반면에 GPT형 구조는 별도의 인코더가 없기 때문에, 답변 생성 과정에서 Context에 대한 Attention이 레이어별로 부여됩니다.
  3. Meena형 구조는 Context를 인코더에 입력하고 Reply가 디코더에서 생성되는 방식이기 때문에, Reply를 생성하는 능력만을 학습합니다. 반면에 GPT형 구조는 Context와 Reply가 별도로 입력되는 방식이 아니기 때문에, Context와 Reply 모두를 생성 능력 학습에 이용합니다.

다만, 이러한 두 모델의 구조 차이에 기인한 답변 생성 능력의 차이를 명확히 규명한 논문은 현재까지는 거의 없습니다 [8]. 따라서, 저희는 두 가지 구조의 모델을 모두 학습하여 성능을 검증해보기로 결정했습니다.

데이터 셋

이 섹션에서는 답변 생성 모델을 학습하기 위한 데이터가 어떤 형태로 구성되어 있는지 알아보고, 저희가 생성용 데이터를 구축하기 위해 어떠한 전처리 방식을 거쳤는지, 이를 통해 구축된 데이터가 어떤 특성을 가지는지 분석하겠습니다.

전처리

최근의 답변 생성 관련 논문들에 의하면, 대량의 학습 데이터가 답변 생성 능력에 결정적임을 알 수 있습니다. 하지만, 이러한 논문들에서도 정제되지 않은 대화 데이터를 그대로 사용하지 않고, 적절한 전처리 과정을 통해 정제된 데이터를 학습에 이용합니다 [2], [5].

저희 핑퐁팀은 연애의 과학 어플리케이션을 통해 수집한 대량의 대화 데이터를 학습 데이터로 이용하였습니다. 수집된 데이터에는 가지각색의 사람들이 제각각으로 말하는 패턴이 정제되지 않은 형태로 존재하기 때문에 이 데이터를 학습에 유의미하게 활용하기 위해서는 전처리가 필수적입니다. 예컨대 욕설이나 선정적인 표현, 혹은 “아니”, “몰라”와 같은 너무 단순한 답변을 전처리로 걸러내지 않는다면, 학습된 모델이 실제로 추론 시에 욕설이나 뻔한 답변을 생성할 확률은 높아지게 됩니다. 따라서, 저희는 이번 생성 모델을 만들 때 상대방을 불쾌하게 하는 답변이나 응답의 다양성을 해치는 답변을 학습에서 제외하기 위한 필터링 작업을 진행하였습니다.

구체적으로 욕설이나 카카오톡 시스템 토큰, 그리고 의미 없는 말들 및 욕설을 포함하여 생성되면 안되는 답변들을 필터링하기로 하였습니다. 어떻게 보면 서비스 관점에서도 생성되면 안되는 문장들을 포함하고 있다고 볼 수 있는데요. 필터링 대상이 되는 문장 리스트는 아래와 같습니다.

  1. 카카오톡의 시스템 토큰 및 이모티콘이 포함된 문장
  2. 비속어나 선정적인 단어가 포함된 문장
  3. 3회 이상 반복되는 패턴이 존재하는 문장 (ex: “아니 아니 아니”)
  4. 불필요한 자모 문자가 포함된 문장
  5. 전체 문장 길이 대비 띄어쓰기의 비율이 10% 미만인 문장

하지만 이러한 문장들을 데이터에서 모두 필터링해 버린다면, 실제 이런 문장이 입력되었을 때 모델이 그 의미를 이해하지 못하고 엉뚱한 말을 하게 됩니다. 저희가 원하는 모델은 ‘욕설을 하지 않는 모델’이지, ‘욕설을 이해하지 못하는 모델’은 아니니까요. 따라서, 저희는 모델의 입력이 되는 과거 Context는 필터링을 거치지 않고, 모델이 생성해야 하는 Reply만 필터링을 거쳐 학습용 코퍼스를 구성하였습니다.

또한 저희는 답변의 품질을 높이기 위해 필터링을 추가적으로 적용하는 것이 모델의 답변 능력을 얼마나 향상시키는지를 확인해보기로 하였습니다. 기본적인 필터링을 적용한 코퍼스와 추가 답변 필터링까지 적용한 코퍼스를 이용해 생성 모델을 학습해본다면 해본다면 코퍼스에 따른 성능 평가를 해볼 수 있겠죠.

답변 능력 향상을 위한 추가 필터링

추가적으로 답변 능력 향상을 위한 필터링은 기본적인 욕설과 같은 필터링 이외에 응답에 부정적인 영향을 주는 문장들을 배제하기 위한 필터링 규칙입니다. 예를 들어 Meena에서 언급된 \(GenericBot\)처럼 “Ok”와 “I don’t know”만을 남발하는 봇을 생각해봅시다. 그런 챗봇과 이야기한다면 정말 재미없는 대화가 될 것입니다. 이처럼 절대로 생성되면 안되는 것은 아니지만 좋은 답변이 아닌 문장들을 제외시켜 답변 능력을 향상시켜보고자 하였습니다. 필터링 대상이 되는 문장 리스트는 아래와 같습니다.

  1. 완전한 한글 기준으로 길이가 3 이하인 문장 (짧은 문장은 의미가 없거나 뻔할 가능성이 높습니다.)
  2. 문장 내의 3-gram 중 90% 이상이 전체 코퍼스에서 Top-10000 이상으로 반복된 3-gram인 문장 (높은 빈도로의 3-gram으로만 구성된 문장은 의미가 뻔할 가능성이 높습니다.)
  3. 전체 문장 길이 대비 띄어쓰기의 비율이 20% 미만인 문장

저희는 추가적으로 답변 능력 향상을 위한 필터링을 만들었고 기존 데이터를 필터링하여 생성 모델을 학습하기 위한 두 가지의 코퍼스를 만들었습니다.

데이터 상세

이제 최종적으로 생성 모델 학습에 사용된 대화 데이터의 세부 사항에 대해 설명드리겠습니다. 기본적으로 전처리 이전의 원 데이터 크기는 약 350 GB였으며, 이를 필터링하여 얻은 데이터의 사양은 아래와 같습니다.

데이터 종류 용량 대화 세션 개수 평균 답변 길이
기본 필터링 적용 코퍼스 300 GB 3B 세션 16.44
+ 추가 필터링 적용 180 GB 1.5B 세션 21.06

원 데이터에 기본적인 필터링을 적용한 코퍼스의 대화 세션 개수는 약 3B 세션이었고, 15% 정도의 데이터가 필터링 로직으로 제거되었습니다. 이는 GPT2와 Meena에서 사용한 학습 데이터셋 크기에 견주어도 큰 차이가 없을 정도로 매우 많은 양의 데이터입니다. 답변 능력 향상을 위한 추가 필터링을 함께 적용하였을 때, 남는 세션은 그 절반인 15B 정도였으며 길이가 짧은 문장이 제거되었기 때문에 평균 답변의 길이는 5 정도 상승했습니다.

외부 데이터 활용

대화 코퍼스를 구성하면서 고민했던 점 중 하나는 “일상대화 데이터만으로 단순한 답변 능력뿐만 아니라 다양한 지식과 상식을 학습할 수 있을까?”였습니다. 이러한 궁금증을 해소하기 위해서, 저희는 위키피디아나무 위키와 같이 정보량이 풍부한 외부 데이터도 학습에 활용해보기로 결정했습니다.

위키피디아와 나무 위키는 대화 데이터처럼 두 사람이 말을 주고받는 형식이 아니기 때문에 대화 문맥과 답변을 입력으로 함께 넣어주어야하는 Meena형 구조에는 사용하지 않고, GPT형 구조에서만 학습 데이터에 포함하기로 했습니다. 대화 데이터의 크기에 비해 외부 데이터의 양이 적기 때문에 외부 데이터를 10배로 늘려 학습에 사용하였습니다

토크나이저

토크나이징은 텍스트 처리의 첫 단계로, 모델의 최종 성능에 큰 영향을 끼치는 요소입니다. 하지만 아직까지는 한국어 생성 태스크에서는 어떤 토크나이징 방식이 최적의 성능을 내는지 분명하게 알려져있지 않습니다. 따라서 저희는 잘 알려진 토크나이저 중 어떤 것이 가장 적합한지 실험해보았습니다.

저희가 실험에 이용한 토크나이저는 다음과 같습니다.

  1. Mecab-ko: Vocab size 50000
    • Mecab-ko는 한국어용 형태소 분석기로, 다양한 한국어 NLP 태스크에서 범용적으로 사용되고 있습니다. 단, 한국어 생성 태스크에서 Mecab-ko를 사용할 때는 띄어쓰기를 조심해야합니다. 토크나이징 시점에서 띄어쓰기 정보가 사라지면 디코딩 시에 띄어쓰기를 복원할 수 없기 때문이죠. 그렇기 떄문에 Mecab-ko를 활용할 때에는 원 문장의 띄어쓰기 자리에 특수 토큰을 삽입하여 띄어쓰기 정보도 함께 인코딩할 수 있게 하였습니다.
  2. Sentencepiece: Vocab size 8000, 16000, 32000
    • Sentencepiece는 subword 단위의 토크나이저가 구현되어 있는 라이브러리입니다. 저희는 Unigram LM 방식의 토크나이저를 이용했습니다. Sentencepiece의 기본값으로 설정된 NFKC unigram 정규화가 한국어 채팅체에 적절하지 않기 때문에 identity옵션을 주어 훈련시키고 사용하였습니다.
  3. Morpheme-aware Sentencepiece: Vocab size 8000, 16000, 32000
    • [8], [9], [10] 등에 따르면, 어형 변화가 풍부한 언어에 서브워드 토크나이징을 적용할 때 형태소 단위로 pre-tokenization하는 것이 성능 향상에 도움이 됩니다. Morpheme-aware Subword 토크나이징을 할 때는 Sentencepiece 모델의 학습, 추론 시 모두 pre-tokenization을 하는 것이 일반적이지만, 저희는 실제 추론 시의 편리성을 고려하여 Sentencepiece를 학습할 때에만 Mecab-ko로 pre-tokenization을 하고, 추론 시에는 Sentencepiece만으로 토크나이징하는 방식을 이용했습니다.
  4. Byte-Level BPE: Vocab size 16000, 32000
    • Byte-Level BPE는 일반적인 유니코드 문자 단위의 BPE와는 달리 입력 문장을 바이트 시퀀스로 간주해 BPE를 수행하는 방식입니다. Byte-Level BPE는 학습 시에 seed vocabulary가 256개밖에 되지 않아 multi-lingual 모델 등을 학습할 때 특히 유리합니다.

각 토크나이저를 이용하여 “안녕하세요 저는 핑퐁입니다.”라는 문장을 토크나이징한 예시는 아래의 표와 같습니다.

토크나이저 종류 토크나이징 결과
Mecab-ko 50K 안녕 / 하 / 세요 / ▁ / 저 / 는 / ▁ / 핑퐁 / 입니다 / .
Sentencepiece 32K ▁안녕하세요 / ▁저는 / ▁핑 / 퐁 / 입니다 / .
Morpheme-aware Sentencepiece 32K ▁안녕 / 하 / 세요 / ▁저 / 는 / ▁핑 / 퐁 / 입니다 / .
Byte-Level BPE 32K ìķĪëħķíķĺìĦ¸ìļĶ / ĠìłĢëĬĶ / Ġíķij / íIJģ / ìŀħëĭĪëĭ¤ / .

위와 같이 토크나이징한 대화 데이터로 작은 크기의 Transformer 모델을 학습하여 생성 능력을 비교해보았습니다. 생성 모델의 성능을 정량적으로 판단하기 위한 지표로는 Perplexity가 일반적으로 사용됩니다만, 토크나이저마다 사전 크기나 토큰이 서로 다르기 때문에 대신 Total Negative Log-Likelihood를 사용했습니다. 자세한 내용은 [11]을 참조해주세요.

토크나이저 종류 Vocab Size Total NLL OOV Rate (%)
Mecab-ko 50000 39.79 0.480 %
Sentencepiece 8000 41.24 0.022 %
Sentencepiece 16000 41.05 0.025 %
Sentencepiece 32000 40.71 0.026 %
Morpheme-aware Sentencepiece 8000 40.75 0.018 %
Morpheme-aware Sentencepiece 16000 40.38 0.019 %
Morpheme-aware Sentencepiece 32000 40.17 0.019 %
Byte Level BPE 16000 41.83 0.0 %
Byte Level BPE 32000 41.53 0.0 %

실험 결과 Mecab-ko의 성능이 제일 우수했고, Morpheme-aware Sentencepiece (vocab 32000)이 그 다음으로 우수하였습니다. 하지만 Mecab-ko는 사전에 정한 Vocab에 포함되지 않은 신조어 및 오타에 유연하게 대처하지 못한다는 단점과 Subword 방식에 비해 더 많은 어휘가 필요하기 때문에 모델의 파라미터를 늘린다는 치명적인 단점을 가지고 있습니다. 실행 속도 또한 일반 Sentencepiece에 비해 느립니다. 따라서 저희는 성능이 두번째로 좋았던 Morpheme-aware Sentencepiece (vocab 32000)를 사용하기로 결정했습니다.

Decoding Methods

답변 생성 모델은 온전한 문장이 만들어질 때까지 한 스텝, 한 스텝을 반복하며 단어를 선택합니다. 예측된 단어의 확률 분포에서 단어를 선택하는 디코딩 과정에서 어떤 전략을 선택하느냐는 좋은 문장을 만들기 위해 풀어야 하는 매우 중요한 문제입니다. 동일한 모델이라도 디코딩 전략에 따라 결과의 특성과 품질이 달라진다는 점은 기존 연구에서 널리 알려져 있습니다 [12], [13]. 다음 문단에서 먼저 디코딩의 핵심이 되는 2개의 서로 다른 접근법을 설명하고(deterministic vs. stochastic), 이후 품질 향상을 위해 추가로 설정한 규칙을 제시합니다.

Deterministic Methods (결정론적 방법)

결정론적 방법은 각 스텝마다 출력되는 단어가 무작위성에 의존하지 않고 언제나 동일하게 결정되는 방법을 말합니다. 그런 방법으로는 Beam Search를 들 수 있습니다. Beam Search는 매 스텝마다 기존에 있던 \(Beam\) \(size\)개의 후보와 새롭게 계산된 모든 단어의 확률을 곱한 뒤, 확률이 가장 높은 상위 \(Beam\) \(size\)개의 후보를 선택하는 알고리즘입니다. 이 알고리즘은 기계 번역, 문서 요약 등 여러 자연어 생성 태스크에서 좋은 성능을 보여줍니다. 그러나 일반적으로 자주 등장하는 문장을 선택한다는 특징 때문에 오픈 챗봇에서 의미가 다양한 답변을 생성하기 어렵다는 문제점이 있습니다.

Stochastic Methods (확률론적 방법)

확률론적 방법은 각 스텝마다 확률 분포에 따른 샘플링으로 다음 단어가 결정되는 방법을 말합니다. 결정론적 방법과 다르게 매번 샘플링 결과가 달라지기 때문에 상대적으로 더 다양한 문장이 만들어집니다. 대표적인 알고리즘들은 다음과 같습니다.

Heuristic Rules

생성된 응답의 품질 향상을 위해 추가로 건 제약은 다음과 같습니다.

Experiments

위에서 언급한 데이터셋을 이용하여 Meena형 답변 생성 모델과 GPT형 답변 생성 모델을 각각 학습했습니다. 학습은 Google Cloud Platform (GCP) 환경에서 TPU를 이용하여 진행했습니다. TPU 사용 방법은 이전에 홍승환 님이 작성한 포스트를 참고해주세요.

평가 척도

학습한 모델을 평가하기 위해 [1]에서 제안한 SSA (Sensibleness and Specificity Average)라는 지표를 사용하였습니다. 이 지표는 문장의 품질을 적합성(Sensibleness)과 구체성(Specificity)으로 나타내는 방식입니다. 적합성은 답변이 얼마나 조리있게 문맥과 맞는지 나타낸 것이며, 구체성은 얼마나 답변이 구체적인지 여부를 나타낸 것입니다. 이 지표는 사람이 적합성과 구체성 유무를 직접 1과 0으로 나타낸 후 평균한 것입니다.

모델 및 데이터셋에 따른 생성 능력 평가

저희는 먼저 위에서 언급한 Meena형 구조와 GPT형 구조 간의 성능 차이 및 데이터셋의 크기에 따른 성능 차이를 확인해보았습니다. 학습한 모델은 모델 종류와 크기에 따라 \(Meena_{Base}\), \(Meena_{Large}\), \(GPT_{Base}\), \(GPT_{Large}\)로 기재하겠습니다. 모델의 사양은 아래와 같습니다.

모델 Encoder Layers Decoder Layers D_{emb} N_{head} 파라미터 개수
\(Meena_{Base}\) 2 12 768 12 152M
\(Meena_{Large}\) 2 24 1024 16 461M
\(GPT_{Base}\) - 12 768 12 109M
\(GPT_{Large}\) - 24 1024 16 335M

이 실험에서는 디코딩 전략으로 beam size 10의 beam search를 이용했으며, 최소 토큰 개수는 5, 3-gram에 대한 blocking을 하여 답변을 생성했습니다.

\(Meena_{Base}\)모델에 대한 실험 결과는 아래와 같습니다.

모델 답변 능력 향상을 위한 추가 필터링 학습한 step SSA Sensibleness Specificity PPL
\(Meena_{Base}\) X 4M 0.55 0.64 0.46 42.95
\(Meena_{Base}\) O 4M 0.57 0.69 0.45 40.99

\(Meena_{Large}\)모델에 대한 실험 결과는 아래와 같습니다.

모델 답변 능력 향상을 위한 추가 필터링 학습한 step SSA Sensibleness Specificity PPL
\(Meena_{Large}\) X 2M 0.54 0.63 0.45 46.65
\(Meena_{Large}\) O 2M 0.58 0.66 0.51 43.58

표를 보면 \(Meena_{Base}\)와 \(Meena_{Large}\) 모델은 SSA 0.57 ~ 0.58 정도의 결과를 얻었습니다. 여기서 주목할 점은 추가 필터링을 적용한 경우가 적용하지 않은 경우에 비해 0.2 ~ 0.4 정도 SSA가 높다는 점입니다. 즉, 이 결과는 추가적인 필터링이 지나치게 일반적인 문장과 의미없는 문장을 응답 대상에서 배제하였으며 그 과정이 실제 생성 결과에도 긍정적인 영향을 미친다는 것을 말합니다. 생성 모델 학습 시 데이터 전처리의 중요성을 알 수 있는 결과였습니다.

Meena 실험 결과 데이터셋을 필터링한 경우가 성능이 좋았기 때문에 GPT 실험에서는 답변 능력 향상을 위한 추가 필터링을 기본적으로 적용하고, 위키 코퍼스(위키피디아+나무위키)의 사용 유무에 따른 효과를 검증해보았습니다. \(GPT_{Base}\)에 대한 실험 결과는 아래와 같습니다.

모델 위키 코퍼스 학습한 step SSA Sensibleness Specificity PPL
\(GPT_{Base}\) X 4M 0.525 0.66 0.39 55.97
\(GPT_{Base}\) O 4M 0.54 0.65 0.43 58.58

\(GPT_{Large}\)에 대한 실험 결과는 아래와 같습니다.

모델 위키 코퍼스 학습한 step SSA Sensibleness Specificity PPL
\(GPT_{Large}\) X 2M 0.58 0.73 0.44 55.37
\(GPT_{Large}\) O 2M 0.59 0.69 0.49 57.85

두 번째 실험에서 위키 코퍼스를 학습에 포함했을 때의 결과 또한 사용하지 않았을 때에 비해 SSA가 소폭 상승함을 알 수 있습니다. 특히 Specificity가 0.03 ~ 0.06 정도 증가하는데, 이는 정보량이 많은 위키 코퍼스를 학습한 효과라고 볼 수 있습니다.

디코딩별 성능 평가

두 번째로는 디코딩 전략에 따른 생성 능력을 평가해보았습니다. 이전 실험에서는 생성 답변의 최소 길이를 5로 설정해두었으나, 생성 결과를 살펴보니 값이 작다고 판단하여 문장의 최소 토큰 개수를 10으로 증가시켰습니다. 또한 입력 세션에서 등장한 단어들을 그대로 가져오는 beam search 특유의 문제를 완화하고자, 입력 컨텍스트에 포함된 단어의 생성 확률을 낮추었습니다(repetition penalty).

결과는 아래와 같습니다. 표에는 Meena 구조의 Beam Search 결과와 함께, 사전 실험에서 Stochastic 디코딩 전략 중 가장 좋은 성능을 보인 Nucleus decoding의 결과만 기재했습니다.

모델 디코딩 방법 SSA Sensibleness Specificity
\(Meena_{Base}\) beam search (beam size 10) 0.64 0.68 0.61
\(Meena_{Base}\) nucleus(\(p=0.2\)) 0.50 0.57 0.43
\(Meena_{Base}\) nucleus(\(p=0.4\)) 0.58 0.70 0.47
\(Meena_{Base}\) nucleus(\(p=0.6\)) 0.53 0.47 0.40
\(Meena_{Base}\) nucleus(\(p=0.8\)) 0.40 0.47 0.33
\(Meena_{Large}\) beam search (beam size 10) 0.73 0.77 0.69
\(Meena_{Large}\) nucleus(\(p=0.2\)) 0.73 0.83 0.63
\(Meena_{Large}\) nucleus(\(p=0.4\)) 0.57 0.67 0.47
\(Meena_{Large}\) nucleus(\(p=0.6\)) 0.56 0.63 0.50
\(Meena_{Large}\) nucleus(\(p=0.8\)) 0.53 0.63 0.43

Nucleus sampling은 하이퍼파라미터인 p의 값에 따라 성능이 크게 변화하였으며, p가 0.2에서 0.4 정도인 작은 확률에서 좋은 성과를 냈습니다. 이렇게 p를 최적화하면 beam search와 유사한 수준의 성능을 보여주었습니다.

생성 결과

이 섹션에서는 모델이 생성한 답변의 예시를 다루고 있습니다. 특히 동일한 모델이라도 디코딩 전략에 따른 답변의 특징이 크게 달랐기 때문에, beam search와 nucleus sampling의 결과 비교에 초점을 두었습니다.

먼저 \(Meena_{Large}\) 모델의 beam search 디코딩 결과 예시입니다.

Input
A: 나 야나두 해보려고ㅋㅋ

Bot Reply
야나두? 그게 뭐야? 야나두가 뭐야??
Input
A: 넌 닭다리파야 아님 닭가슴살파야?
B: 난 닭다리! 넌?
A: 난 닭가슴살ㅋㅋ
B: 퍽퍽한 살을 좋아한다니.. 신기하다
A: 퍽살이 얼마나 맛있는데!

Bot Reply
퍽퍽살 좋아하는 사람도 있구나..
Input
A: 너 어디 살아?
B: 나 한남동
A: 좋은 동네 사네
B: ㅋㅋㅋ 교통이 불편해
A: 맞아 거기 지하철도 애매하지

Bot Reply
응ㅋㅋ 그래서 버스타고 다니고 있어 넌 어디 사는데?
Input
A: 너 텀블러 써?
B: 웅 나 엄청 잘써
A: 나 텀블러 남는거 있는데 줄까?

Bot Reply
아니아니 나 텀블러 많아서 괜찮아

결과를 보면, 확률이 높은 답변을 생성하는 beam search의 특성상 참신한 답변보다는 안정적인 형태의 답변들이 많습니다. 야나두? 그게 뭐야? 야나두가 뭐야??와 같이 context의 내용을 되묻거나, 퍽퍽살 좋아하는 사람도 있구나.. 와 같이 이전의 말과 비슷한 이야기를 하는 경우도 있었습니다. 그럼에도 길이가 긴 context도 잘 이해하여 응답을 생성하는 능력을 확인했습니다.

두 번째로는 Stochastic 디코딩 전략 중 가장 좋은 성능을 보인 \(Meena_{Large}\) 모델의 nucleus(\(p=0.2\)) 디코딩 결과 예시입니다.

Input
A: 최근에 영화 본 거 있어?

Bot Reply
아니 없어 ㅠㅠ 요즘 뭐하지??
Input
A: 넌 닭다리파야 아님 닭가슴살파야?
B: 난 닭다리! 넌?
A: 난 닭가슴살ㅋㅋ
B: 퍽퍽한 살을 좋아한다니.. 신기하다
A: 퍽살이 얼마나 맛있는데!

Bot Reply
퍽퍽살은 다 좋아! 근데 퍽퍽살도 좋아해
Input
A: 너 어디 살아?
B: 나 한남동
A: 좋은 동네 사네
B: ㅋㅋㅋ 교통이 불편해
A: 맞아 거기 지하철도 애매하지

Bot Reply
응ㅋㅋ 근데 버스타고 다니면 금방가
Input
A: 넌 노래방 가면 뭐 불러?
B: 임재범의 고해
A: 세상에...
B: 왜?
A: 그거 노래방에서 부르면 안되는 노래 아냐?

Bot Reply
아 그런가? 근데 내가 좋아하는거라

샘플링 기반의 디코딩 특성상 nucleus sampling이 beam search에 비해 더 다채로운 답변이 생성됨을 알 수 있습니다. 특히 과거 context를 복사하는 문제가 많이 해결된 모습이지만, 동시에 퍽퍽살은 다 좋아! 근데 퍽퍽살도 좋아해와 같이 특정 context에서는 엉뚱한 답변을 생성하기도 합니다.

[1]에서 언급된 바와 같이 beam search는 답변 후보들끼리 비교해보면 다양성이 떨어지지만 안정적인 답변을 하고, nucleus sampling은 참신한 답변을 생성할 수 있지만 간혹 안정성이 떨어지는 답변을 생성하는 경향을 보입니다. 정리하자면, 두 디코딩 전략에는 각각 장단점이 존재하기 때문에 제일 안정적인 답변 1개가 필요한 경우와 다양한 답변 후보를 생성하고 싶은 경우 등 상황에 맞게 디코딩 전략을 선택할 필요가 있다고 할 수 있습니다.

글을 마치며

이번 포스트에서는 핑퐁팀에서 대규모 답변 생성 모델을 학습하는 과정과 실험 결과를 살펴보았습니다. 처음 시도해본 생성 프로젝트였기에 시행착오도 있었지만 기대보다 좋은 결과를 얻었고, 앞으로 더 발전할 가능성도 확인했습니다. 이번 포스트가 한국어 답변 생성 모델을 학습하려는 분들께 조금이나마 도움이 되었으면 좋겠고, 여러분의 좋은 성과를 기대하겠습니다. 이번에 학습한 생성 모델은 데모로 공개할 예정이고 실제 서비스에도 적용할 예정이니 앞으로 더욱 발전하는 핑퐁도 많은 기대 부탁드립니다. :)

References

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

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