๐ฆ How to build a State-of-the-Art Conversational AI
on
How to build a State-of-the-Art Conversational AI with Transfer Learning
์ด ๊ธ์ ConvAI2 NeurIPS(2018) ๋ํ์์ SOTA(state-of-the-art)๋ฅผ ๊ธฐ๋กํ Hugging Face ์ Conversation AI์ ๋ํ ํํ ๋ฆฌ์ผ๋ฅผ ๋ฒ์ญํ ํฌ์คํธ์ ๋๋ค. ์กธ์ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ํ๋ถ์ ์์ค์์ ์์ฑํ ๊ธ์ด๋ ์ฐธ๊ณ ํ๊ณ ๋ด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.๐
๋ค์ ์ฌ์ดํธ์์ Hugging Face๊ฐ ์ ์ํ ๊ฐ๋จํ ๋ฐ๋ชจ๋ฅผ ์ฒดํ ํด ๋ณด์ค ์ ์์ต๋๋ค.๐ฎconvai.huggingface.co.
๊ธ์ ์ฃผ์ ๋ชฉํ
- OpenAI์ธ GPT ์ GPT-2 Transformer language ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์ ์ดํ์ต์ ํตํ ์ต์ ๋จ ๋ํ ์์ด์ ํธ๋ฅผ ์ ์
- ConvAI2์์ ์ฐ์นํ NeurIPS 2018 ๋ํ๋ฅผ ์ฌ์ฉ
์ด ํํ ๋ฆฌ์ผ์ ๋ํ ์์ธํ ์ฝ๋๋ ๋ค์ Git ๋ ํฌ์งํ ๋ฆฌ์์ ํ์ธ ํ ์ ์์ต๋๋ค.
Personality๋ฅผ ์ง๋ AI ๐ค
๋ณธ ํ๋ก์ ํธ์ ๋ชฉ์ ์ Persona ๋ฅผ ์ง๋ Conversaional AI ๋ฅผ ์ ์ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
๋ณธ ํ๋ก์ ํธ์ ๋ํ ์์ด์ ํธ(Dialog Agent)๋ ์ด๋ค persona๊ฐ ์ด๋ค ๋ํ ๊ธฐ๋ก(History)์ ์ค๋ช ํ๋ ์ง์ ๋ํ Knowledge Base๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค. ์ฌ์ฉ์๋ก๋ถํฐ ์๋ก์ด ๋ํ๊ฐ ์ ๋ ฅ๋๋ฉด ๋ํ ์์ด์ ํธ๋ ๋ํ๋ฅผ ๋ถ์ํ์ฌ Persona๋ฅผ ์ง๋ ๋ํ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
ํ๋ก์ ํธ์ ๊ณํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฅ ๋ฌ๋์ผ๋ก ๋ํ ์์ด์ ํธ๋ฅผ ํ์ต ์ํฌ๋์ ๋ฌธ์ ์
-
๋ํ ๋ฐ์ดํฐ ์ ์ด ์๊ฑฐ๋, ์ ์ฐฝํ๊ฑฐ๋ ๊ด๋ จ์๋ ๋ต๋ณ์ ํ๊ธฐ์ ํ์ต๋์ด ๋ถ์กฑํจ
โ ์ด์ ๋ํ ํด๊ฒฐ๋ฐฉ์์ผ๋ก โSmart Beam Searchโ ๋ฐฉ์์ด ๊ณ ๋ ค ๋์ง๋ง ํด๋น ๊ธ์์๋ โ์ ํ ํ์ตโ(transfer-learning) ์ ํ์ฉํ๋ค.
ํด๊ฒฐ์ฑ
- ๊ธด ์ฐ์์ ์ผ๋ก ๊ด๋ จ ์๋ ํ ์คํธ๋ฅผ ์์ฑํ ์ ์๋๋ก, ๋งค์ฐ ํฐ ํ ์คํธ ๋ง๋ญ์น(very large corpus of text)์ ์ธ์ด ๋ชจ๋ธ์ ๋ฏธ๋ฆฌ ๊ต์กํ๋ ๊ฒ๋ถํฐ ์์ํ๋ค.
- ํ์ธํ๋(Fine-Tune)์ ํตํ์ฌ ๋ํ์ ๋ง๊ฒ ๋ฏธ์ธ ์กฐ์ ํ๋ค.
์ธ์ด ๋ชจ๋ธ์ ์ฌ์ ํ์ต(Pretraining)์ผ๋ก ๊ตฌ์ถ ํ๋ ๋ฐฉ๋ฒ์ ์๊ฐ ๋น์ฉ์ด ๋ง์ด ์์๋๊ธฐ์, ์คํ์์ค๋ฅผ ํ์ฉํ๋ค. ๋ํ ๋ฐ์ดํฐ ์ ์ด ํฌ๊ณ , ์ข์ ๋ฐ์ดํฐ(The bigger the better)๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ง๋ง ๋ฌธ์ฅ ์ฆ, ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ ๋ชฉ์ ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก, ์ฌ์ ํ์ต(pretraining)๋ NPL ๋ชจ๋ธ๋ก BERT๋ฅผ ๋ง์ด ์ฌ์ฉํ์ง๋ง, ์๋ฒฝ ๋ฌธ์ฅ(Masking์ด ์๋ ๋ฌธ์ฅ)์์๋ ํ์ต์ด ๋์์ง๋ง, unfinished sentences(Masking์ด ์๋ ๋ฌธ์ฅ)์์๋ ํ์ต์ด ๋์ง ์์๊ธฐ ๋๋ฌธ์ GPT & GPT-2๋ฅผ ์ฌ์ฉํ๋ค.
๐ฆ OpenAI GPT and GPT-2 models
2018๋ ๊ณผ 2019๋ , ์๋ ๋๋ํฌ๋, ์ ํ๋ฆฌ ์ฐ, ์คํ์ ๋๋ฃ๋คAI๋ ๋งค์ฐ ๋ง์ ์์ ๋ฐ์ดํฐ์ ๋ํด ํ๋ จ๋ ๋ ๊ฐ์ง ์ธ์ด ๋ชจ๋ธ์ธ GPT์ GPT-2(Generative Pre-trained Transformer) ์์ฑํ๋ค.
GPT์ GPT-2๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค. decoder ํน์ causal ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ชจ๋ธ์ด ๋ค์ ๋จ์ด๋ฅผ ์์ธกํ๊ธฐ ์ํด ์ผ์ชฝ ๋ฌธ๋งฅ์ ์ฌ์ฉํ๋ค.
Decoder/Casual ํธ๋์คํฌ๋จธ๋ ์ผ์ชฝ์์ ๋ถํฐ ๋ค์ ๋จ์ด๋ฅผ ์์ฑ์ ์์ธกํ๋ค. ์ดํ ์ ๋ฉ์ปค๋์ฆ (Attention Mechanism) ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. ์ดํ ์ ๋งค์ปค๋์ฆ์ ๋ค์ ์ฌ์ดํธ์์ ์์ธํ ๋ด์ฉ์ ์ฐพ์ ๋ณผ ์ ์๋ค .The Illustrated Transformer
๋ณธ ํ๋ก์ ํธ๋ฅผ ์ํํ๊ธฐ ์ํด์, ์ธ์ด ๋ชจ๋ธ(Language Model)์ ๋จ์ํ ์ ๋ ฅ ์ํ์ค(Input Sequence)๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ๋ฟ๋ง ์๋๋ผ, ์ ๋ ฅ ์ํ์ค ๋ค์์ ์ด์ด์ง๋ ํ ํฐ์ ๋ํ ์ดํ์ ๋ํ ํ๋ฅ ๋ถํฌ๋ฅผ ์์ฑ ํด์ผํ๋ค. ์ธ์ด ๋ชจ๋ธ์ ๋๊ฐ ์์ ๊ทธ๋ฆผ์ ํ์๋ ๊ฒ์ฒ๋ผ ๊ธด ์ ๋ ฅ ์ํ์ค์์ ๊ฐ ํ ํฐ์ ๋ฐ๋ฅด๋ ํ ํฐ์ ์์ธกํ์ฌ ๋ณ๋ ฌ ๋ฐฉ์์ผ๋ก ํ๋ จ๋๋ค.
๋๊ท๋ชจ ๋ง๋ญ์น์์ ์ด๋ฌํ ๋ชจ๋ธ์ ์ฌ์ ๊ต์กํ๋ ๊ฒ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ด๊ธฐ ๋๋ฌธ์ Open AI์์ Pre-trained๋ ๋ชจ๋ธ๊ณผ ํ ํฐ๋ผ์ด์ ๋ฅผ ์ฌ์ฉํ๋ค. Tonkenizer๋ ์ ๋ ฅ ๋ฌธ์์ด์ ํ ํฐ(๋จ์ด/ํ์ ๋จ์ด)์ผ๋ก ๋ถํ ํ๊ณ , ์ด๋ฌํ ํ ํฐ์ ๋ชจ๋ธ ์ดํ๋ฅผ ๋ณํํ๋ค.
ํ๋ก์ ํธ ๋ชฉ์
- ํ ํฐ ์ํ์ค(a sequence of tokens)๋ฅผ ์ธํ์ผ๋ก ๋ฐ๊ณ ,
- ์ ๋ ฅ ์์์ ๋ฐ๋ผ ๋ค์ ํ ํฐ์ ์ดํ์ ๋ํ ํ๋ฅ ๋ถํฌ๋ก ์์ฑ
- ์ธ์ด ๋ชจ๋ธ์ ์ผ๋ฐ์ ์ผ๋ก ์์ ๊ทธ๋ฆผ์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ๊ธด ์ ๋ ฅ ์ํ์ค์์ ๊ฐ ํ ํฐ์ ๋ฐ๋ฅด๋ ํ ํฐ์ ์์ธกํ์ฌ ๋ณ๋ ฌ ๋ฐฉ์์ผ๋ก ํ๋ จ๋ฉ๋๋ค.
๋ง๋ญ์น๊ฐ ํฐ ๊ฒฝ์ฐ ํ ํฐํ์ ๋ง์ ๋น์ฉ์ด ๋ฐ์ํ๋ค. ๊ทธ๋์ OpenAI์์ ์ฌ์ ํ์ต๋ tokenizer๋ก ์ฐ๋ฆฌ ๋ชจ๋ธ์ ์ ์ฉํด ๋ณด์๋ค.
pytorch-pretrained-BERT OpenAI GPT ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ๊ณผ ํ ํฌ๋์ด์ ๋ฅผ ๋ถ๋ฌ์จ๋ค.
from pytorch_pretrained_bert import OpenAIGPTDoubleHeadsModel, OpenAIGPTTokenizer
model = OpenAIGPTDoubleHeadsModel.from_pretrained('openai-gpt')
tokenizer = OpenAIGPTTokenizer.from_pretrained('openai-gpt')
OpenAI GPT Double Heads Model ๋ผ๋ ๋ชจ๋ธ๋ฅผ ๋ถ๋ฌ์ด
๐ป ๋ํ์์ญ์ ์ธ์ด ๋ชจ๋ธ ์ ์ฉ
์ฐ๋ฆฌ ๋ชจ๋ธ์ ๋จ์ผ์ ๋ ฅ(Single Input) ์ ํ๋ จ๋์๋ค: ์ผ๋ จ์ ๋จ์ด๋ค(a sequence of words)
์ถ๋ ฅ ์ํ์ค๋ฅผ ์์ฑํ๋ ์ฌ๋ฌ ์ ํ์ ์ปจํ ์คํธ(Context)๋ฅผ ์ฌ์ฉํ๋ค:
- ํ ๊ฐ ๋๋ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ธ ์ค์ ๋ฌธ์ฅ,
- ์ฌ์ฉ์๋ก๋ถํฐ ์ต์ํ ๋ง์ง๋ง ๋ง์ ํ ๋ํ ๊ธฐ๋ก,
- ์ถ๋ ฅ ์ํ์ค ๋จ์ด๋ฅผ ๋จ์ด๋ณ๋ก(word by word) ์์ฑํ ์ดํ ์ด๋ฏธ ์์ฑ๋ ์ถ๋ ฅ ์ํ์ค์ ํ ํฐ(?)
์ด๋ป๊ฒ ์์ ๊ฐ์ ๋ค์ํ ๋งฅ๋ฝ(Context)์ ๊ณ ๋ คํ ์ ๋ ฅ์ ๋ง๋ค ์ ์์๊น?
๋ฌธ๋งฅ(Context) ์ธ๊ทธ๋จผํธ(๋ถ๋ถ)๋ฅผ ํ๋์ ์ํ์ค๋ก ์ฐ๊ฒฐ(Concatenate)์์ผ, ๊ทธ ๋๋ต์ ๋ง์ง๋ง์ ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฐ ๋ค์, ๋ค์ ์ํ์ค๋ฅผ ๊ณ์ ์์ฑํ์ฌ ํ ํฐ์ผ๋ก ์๋ต ํ ํฐ ์์ฑํ ์ ์๋ค.
(ํ๋์): ๋ณํฉ๋ ํ๋ฅด์๋, (ํํฌ), (๋ น์): ์ด์ ๋ํ ํ์คํ ๋ฆฌ
ํ์ง๋ง, ์์ ๊ฐ์ ๋ฐฉ์์๋ ๋ ๊ฐ์ง ๋ฌธ์ ์ ์ด ์กด์ฌ:
- โํธ๋์คํฌ๋จธ๋ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์๊น๋ก ๊ตฌ๋ถ ํ์ง ๋ชปํ๋ค.โ ๊ตฌ๋ถ ํ ํฐ(The delimiter tokens)์ ๊ฐ ๋จ์ด๊ฐ ์ด๋ค ๋ถ๋ถ์ ์ํ๋์ง ๊ฐ๋จํ ์๋ ค์ค๋ค. ์๋ฅผ ๋ค์ด, โNYCโ๋ผ๋ ๋จ์ด๋ ์ฐ๋ฆฌ์ ๊ทธ๋ฆผ์์ ํ๋์์ผ๋ก ํ์๋์ง๋ง, ์ฐ๋ฆฌ์ ๋ชจ๋ธ์ ๊ตฌ๋ถ์(delimiter)๋ก๋ง Persona์ธ์ง, History์ธ์ง ์ฌ๋ถ๋ฅผ ์ถ์ถํ๋๋ฐ ์ด๋ ค์์ด ์๋ค: ๊ทธ๋ฌ๋ฏ๋ก ์ธ๊ทธ๋จผํธ์ ๋ํ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
- โํธ๋์คํฌ๋จธ๋ ๋จ์ด์ ์์น๋ฅผ ์ ์ ์๋คโ ์ฌ๊ธฐ์ ์ดํ ์ (Attention)์ Dot-Product Attention์ ์ฌ์ฉํ๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ํ ํฐ ๋ง๋ค ์์น ์ ๋ณด๋ฅผ ์ถ๊ฐ ํด์ผํ๋ค.
-
Dot-Product Attention์ ๋ํ ์ ๋ณด
์ด๋ฅผ ํด๊ฒฐ ํ๊ธฐ ์ํด ๋จ์ด, ์์น ๋ฐ ์ธ๊ทธ๋จผํธ(word, position and segments)์ ๋ํด ์ ๋ ฅ์ ๋ฐ๋ 3๊ฐ์ ๋ณ๋ ฌ ์ ๋ ฅ ์ํ์ค๋ฅผ ๋ง๋ค๊ณ , ์ด๋ค์ ํ๋์ ๋จ์ผ ์ํ์ค(Single Sequence)๋ก ๊ฒฐํฉํ๋ค. ์ฆ, ๋จ์ด ์์น ๋ฐ ์ธ๊ทธ๋จผํธ ์๋ฒ ๋ฉ์ ์ธ ๊ฐ์ง ์ ํ์ ํฉ์ฐํ๋ ๊ฒ์ ๋๋ค.
์คํ
์ฒซ๋ฒ์งธ๋ก, ๊ตฌ๋ถ ๊ธฐํธ ๋ฐ ์ธ๊ทธ๋จผํธ ํ์๊ธฐ์ ํน์ ํ ํฐ(special Token)์ ์ถ๊ฐํ๋ค. ์ด ํน์ ํ ํฐ์ ์ฌ์ ํ์ต ๋ชจ๋ธ์ ํฌํจ ๋์ง ์์์, ์๋ก ํ๋ จํ๊ณ , ์๋ฒ ๋ฉํ ํ์ฌ ์์ฑํ๋ค. (create and train new embeddings)- pytorch-pretrained-BERT ์ฌ๊ธฐ์์ ์ฝ๊ฒ ๊ฐ๋ฅํจ.
# ๋ค์๊ณผ ๊ฐ์ด 5 ๊ฐ์ง special tokens์ ์ฌ์ฉํจ:
# - <bos> the sequence์ ์ฒ์์ ๊ฐ๋ฅดํด
# - <eos> the sequence์ ๋์ ๊ฐ๋ฅดํด
# - <speaker1> ์ ์ ์ ๋ฐํ(utterance) ์ฒซ๋ถ๋ถ์ ๊ฐ๋ฅดํด
# - <speaker2> ์ฑ๋ด์ ๋ฐํ(utterance) ์ฒซ๋ถ๋ถ์ ๊ฐ๋ฅดํด
# - <pad> as a padding token to build batches of sequences
SPECIAL_TOKENS = ["<bos>", "<eos>", "<speaker1>", "<speaker2>", "<pad>"]
# We can add these special tokens to the vocabulary and the embeddings of the model:
tokenizer.set_special_tokens(SPECIAL_TOKENS)
model.set_num_special_tokens(len(SPECIAL_TOKENS))
from itertools import chain
# Let's define our contexts and special tokens
persona = [["i", "like", "playing", "football", "."],
["i", "am", "from", "NYC", "."]]
history = [["hello", "how", "are", "you", "?"],
["i", "am", "fine", "thanks", "."]]
reply = ["great", "to", "hear"]
bos, eos, speaker1, speaker2 = "<bos>", "<eos>", "<speaker1>", "<speaker2>"
def build_inputs(persona, history, reply):
words, segments, position, sequence = build_inputs(persona, history, reply)
# >>> print(sequence) # Our inputs looks like this:
# [['<bos>', 'i', 'like', 'playing', 'football', '.', 'i', 'am', 'from', 'NYC', '.'],
# ['<speaker1>', 'hello', 'how', 'are', 'you', '?'],
# ['<speaker2>', 'i', 'am', 'fine', 'thanks', '.'],
# ['<speaker1>', 'great', 'to', 'hear', '<eos>']]
# Tokenize words and segments embeddings:
words = tokenizer.convert_tokens_to_ids(words)
segments = tokenizer.convert_tokens_to_ids(segments)
๐ Multi-tasks losses
์ฐ๋ฆฌ๋ ์ด์ ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ์ ์ด๊ธฐํํ๊ณ ํ๋ จ ์ ๋ ฅ์ ๊ตฌ์ถํ์ผ๋ฉฐ, ๋จ์ ๊ฒ์ ํ์ธ ํ๋ ์ค์ ์ต์ ํํ ์์ค์ ์ ํํ๋ ๊ฒ๋ฟ์ด๋ค
๋ฌธ์ฅ ์์ธก(Next-sentence prediction)์ ์ํด ์ธ์ด์ ๊ฒฐํฉ๋ multi-task loss์ ์ฌ์ฉํ๋ค.
๋ฌธ์ฅ ์์ธก ๋ชฉํ๋ BERT ์ฌ์ ํ์ต ๋ถ๋ถ์ด๋ค. ๊ทธ๊ฒ์ ๋ฐ์ดํฐ ์ธํธ์์ ๋ฌด์์๋ก distactor(์ ๋ต ์ด์ธ์ ์ ํ์ง)๋ฅผ ์ถ์ถํ๊ณ , ์ ๋ ฅ ์ํ์ค๊ฐ gold reply(?)๋ก ๋๋๋์ง ์๋๋ฉด distactor๋ก ๋๋๋์ง ๊ตฌ๋ณํ๊ธฐ ์ํ ๋ชจ๋ธ์ ํ๋ จํ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ๋๋ค. Local ๋ฌธ๋งฅ(Context) ์ด์ธ์, Global ์ธ๊ทธ๋จผํธ ์๋ฏธ๋ฅผ ์ดํด๋ณด๋ ๋ชจ๋ธ์ ๊ต์กํ๋ค.
![https://miro.medium.com/max/5326/1945IpgUS9MGLB6gchoQXlw.png](https://miro.medium.com/max/5326/1945IpgUS9MGLB6gchoQXlw.png)
Multi-Task Training ๋ชฉ์ - ๋ชจ๋ธ์ ์ธ์ด ๋ชจ๋ธ๋ง ์์ธก์ ์ํด ๋ ๊ฐ์ ํค๋๋ฅผ ์ ๊ณต(์ค๋ ์ง), ์์ธก ๋ฌธ์ฅ ๋ถ๋ฅ๊ธฐ(ํ๋์)
Total Loss๋ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐ๋๋ค. language modeling loss ๊ณผ next-sentence prediction loss๋ฅผ ํตํด(์ดํด ์๋จ)
- Language modeling: we project the hidden-state on the word embedding matrix to get logits and apply a cross-entropy loss on the portion of the target corresponding to the gold reply (green labels on the above figure).
- Next-sentence prediction: we pass the hidden-state of the last token (the end-of-sequence token) through a linear layer to get a score and apply a cross-entropy loss to classify correctly a gold answer among distractors.
๐ป Decoder ์ธํ
์ธ์ด ์์ฑ์ ์ํด์๋ greedy-decoding ๊ณผ beam-search ๋ฐฉ๋ฒ์ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
Greedy-decoding์ ๋ฌธ์ฅ์ ๋ง๋๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด๋ค. ๋งค ๋จ๊ณ๋ง๋ค ์์์ ๋ ํ ํฐ์ ๋๋ฌํ ๋๊น์ง ๋ชจ๋ธ์ ๋ฐ๋ผ ๊ฐ์ฅ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ค์ ํ ํฐ์ ์ ํํ๋ค. Greedy-decoding์ ํ ๊ฐ์ง ์ํ์ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ ํ ํฐ์ด ๋ฎ์ ํ ํฐ ๋ค์ ์จ์ด ์๋ค๊ฐ ๋์น ์ ์๋ค๋ ๊ฒ์ด๋ค.
Beam-search๋ ๋จ์ด๋ณ๋ก ๊ตฌ์ฑํ๋ ๋ช ๊ฐ์ง ๊ฐ๋ฅํ ์์์ Beam(ํ๋ผ๋ฏธํฐ: ๋๋น์ ์)๋ฅผ ์ ์งํจ์ผ๋ก์จ ์ด ๋ฌธ์ ๋ฅผ ์ํํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ค. ๊ทธ ๊ณผ์ ์ด ๋๋๋ฉด Beam ์ค์์ ๊ฐ์ฅ ์ข์ ๋ฌธ์ฅ์ ๊ณ ๋ฅธ๋ค. ์ง๋ ๋ช ๋ ๋์ ๋น ๊ฒ์์ ๋ํ ์์๋ฅผ ํฌํจํ ๊ฑฐ์ ๋ชจ๋ ์ธ์ด ์์ฑ ์์ ์์ ํ์ค ๋์ฝ๋ฉ ์๊ณ ๋ฆฌ์ฆ์ด์๋ค.
๊ธฐ์กด ๋ฌธ์ ์
์ต๊ทผ ๋ ผ๋ฌธ(Ari Holtzman et al.)์ ๋ฐ๋ฅด๋ฉด โ๋น ๊ฒ์๊ณผ ํ์์ค๋ฌ์ด ํด๋ ๋ฒ์ ์ฌ์ฉํ์ฌ ์์ฑ๋ ํ ์คํธ์ ๋จ์ด ๋ถํฌ๋ ์ธ๊ฐ์ด ๋ง๋ ํ ์คํธ์ ๋จ์ด ๋ถํฌ์ ๋งค์ฐ ๋ค๋ฅด๋ค.โ ๋ผ๊ณ ํ๋ค. ๋ถ๋ช ํ ๋น ๊ฒ์๊ณผ ํ์์ค๋ฌ์ด ํด๋ ์ ๋ํ ์์คํ ์ ๋งฅ๋ฝ์์ [7, 8]์์๋ ์ธ๊ธ๋์๋ฏ์ด ์ธ๊ฐ ๋ฐํ์ ๋ฌธ์ ๋ถํฌ ์ธก๋ฉด์ ์ฌํํ์ง ๋ชปํ๋ค.
![https://miro.medium.com/max/2830/1yEX1poMDsiEBisrJcdpifA.png](https://miro.medium.com/max/2830/1yEX1poMDsiEBisrJcdpifA.png)
์ผ์ชฝ: ์ฌ๋์ด ์์ฑํ ํ ํฐ๊ณผ GPT-2๋ฅผ ์ฌ์ฉํ ๋น ๊ฒ์์ ํ ๋น๋ ํ๋ฅ (๋น ๊ฒ์์ผ๋ก ์ฌํ๋์ง ์์ ์ธ๊ฐ ํ ์คํธ์ ๊ฐํ ์ฐจ์ด๋ฅผ ์ฐธ๊ณ ) ์ค๋ฅธ์ชฝ: ์ธ๊ฐ๊ณผ ๊ธฐ๊ณ๋ก ์์ฑ๋ ํ ์คํธ์ N-๊ทธ๋จ ๋ถํฌ(Greedy/Beam Search).
ํด๊ฒฐ์ฑ
ํ์ฌ Beam Search/Greedy ๋์ฝ๋ฉ์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ๋ก ์ top-k์ nuclear(๋๋ top-p) ์ํ๋ง์ด๋ค. ์ด ๋ ๋ฐฉ๋ฒ๋ก ์ ๋ถํฌ๋ฅผ ํํฐ๋งํ ํ ๋ค์ ํ ํฐ ๋ถํฌ์์ ํ๋ณธ์ ์ถ์ถํ์ฌ ๋์ ํ๋ฅ ์ด ์๊ณ๊ฐ(nucleus/top-p) ๋ณด๋ค ๋์ ์๋ ์์ ํ ํฐ(top-k) ๋๋ ์์ ํ ํฐ๋ง ์ ์งํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก, top-k ์ nucleus/top-p ์ํ๋ง์ ๋์ฝ๋๋ก ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์๋ค.
๊ฒฐ๋ก
๋ณธ ํฌ์คํ ์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ, Hugging Face์์๋ Conversational AI๋ฅผ ๊ตฌํ ํ๊ธฐ ์ํด ๋์ฉ๋ ์ธ์ด ๋ชจ๋ธ(large-scale language model)์ธ OpneAI์ GPT-2๋ฅผ ์ฌ์ฉํ๋ค
๋ณธ ํ๋ก์ ํธ์ ๋ฐ๋ชจ์ ์์ธํ ์ฝ๋๋ ๋ค์ ๋งํฌ์์ ์ฐพ์ ๋ณผ ์ ์๋ค.
References
-
[^](https://medium.com/huggingface/how-to-build-a-state-of-the-art-conversational-ai-with-transfer-learning-2d818ac26313#c7f2) Importance of a Search Strategy in Neural Dialogue Modelling by Ilya Kulikov, Alexander H. Miller, Kyunghyun Cho, Jason Weston (http://arxiv.org/abs/1811.00907)
-
[^](https://medium.com/huggingface/how-to-build-a-state-of-the-art-conversational-ai-with-transfer-learning-2d818ac26313#5aac) Correcting Length Bias in Neural Machine Translation by Kenton Murray, David Chiang (http://arxiv.org/abs/1808.10006)
-
[^](https://medium.com/huggingface/how-to-build-a-state-of-the-art-conversational-ai-with-transfer-learning-2d818ac26313#5aac) Breaking the Beam Search Curse: A Study of (Re-)Scoring Methods and Stopping Criteria for Neural Machine Translation by Yilin Yang, Liang Huang, Mingbo Ma (https://arxiv.org/abs/1808.09582)
-
[^](https://medium.com/huggingface/how-to-build-a-state-of-the-art-conversational-ai-with-transfer-learning-2d818ac26313#97f9) Hierarchical Neural Story Generation by Angela Fan, Mike Lewis, Yann Dauphin (https://arxiv.org/abs/1805.04833)
-
[^](https://medium.com/huggingface/how-to-build-a-state-of-the-art-conversational-ai-with-transfer-learning-2d818ac26313#97f9) Language Models are Unsupervised Multitask Learners by Alec Radford, Jeff Wu, Rewon Child, David Luan, Dario Amodei, and Ilya Sutskever (https://openai.com/blog/better-language-models/)
-
[^](https://medium.com/huggingface/how-to-build-a-state-of-the-art-conversational-ai-with-transfer-learning-2d818ac26313#6ea4) The Curious Case of Neural Text Degeneration by Ari Holtzman, Jan Buys, Maxwell Forbes, Yejin Choi (https://arxiv.org/abs/1904.09751)
-
Retrieve and Refine: Improved Sequence Generation Models For Dialogue by Jason Weston, Emily Dinan, Alexander H. Miller (https://arxiv.org/abs/1808.04776)
-
[^](https://medium.com/huggingface/how-to-build-a-state-of-the-art-conversational-ai-with-transfer-learning-2d818ac26313#6ea4) The Second Conversational Intelligence Challenge (ConvAI2) by Emily Dinan et al. (https://arxiv.org/abs/1902.00098)