code: https://github.com/chijames/Poly-Encoder (ParlAI에서도 poly-encoder를 쓸 수는 있는데, 보기 좋은 코드는 위를 확인하는 게 좋을 듯)
DisplayData
커맨드를 이용해 txt, json 파일 등을 좀 더 보기 쉽게 제공받을 수 있음
__Silence__ token: 대화가 시작함을 의미하는 token
ODDS에서는 화자가 2명이므로 각각을 모델이 학습하여 한 대화를 이용해 2배의 학습데이터로 쓸 수 있음
DisplayData
# notebook
from parlai.scripts.display_data import DisplayData
DisplayData.main(task = "blended_skill_talk", num_examples = 5, datatype = "test")
# terminal
!parlai display_data --task personachat --num-examples 5
그런데 데이터 저장은 어떻게 하는거지..?
TrainModel
from scratch
-rm -rf from_scratch_model
~mkdir -p from_scratch_model
from parlai.scripts.train_model import TrainModel
TrainModel.main(
# 모델을 저장할 경로를 반드시 적어야합니다
model_file='from_scratch_model/model',
# dailydialog 데이터셋에 대해 학습합니다
task='dailydialog',
# 학습 시간은 1분으로 제한하고, batchsize는 16으로 지정하겠습니다
# max_train_time=60,
num_epochs=2, # num_epoch parameter 있더라
batchsize=16,
# 모델 타입은 seq2seq로 지정해줍니다
model='seq2seq',
# 이후의 선택은 hyperparameter입니다
# 오늘 실습에서는 attention을 사용합니다
# embedding_type='fasttext',를 지정해주면 pretrained embedding도 사용할 수 있지만
# 다운로드에 시간이 걸리므로 오늘 실습에서는 생략하도록 하겠습니다
attention='dot',
# encoder/decoder/softmax 레이어에서 word embedding을 공유하도록 합니다
lookuptable='all',
# 메모리와 시간을 아끼기 위해서 text와 label을 64토큰에서 자릅니다
truncate=64,
)
generative model은 규모가 커서 3-4 epoch 정도, response selection model은 8 epoch 정도 돌린다고 함
그런데 seq2seq이긴 한데 encoder와 decoder는 무엇을 쓰는지?
TrainModel
finetuning
!rm -rf from_pretrained
!mkdir -p from_pretrained
from parlai.scripts.train_model import TrainModel
TrainModel.main(
# 이전에 학습시킬때와 거의 동일합니다
task='empathetic_dialogues',
model='transformer/generator',
model_file='from_pretrained/model',
# pretrained model로 initialize합니다
init_model='zoo:tutorial_transformer_generator/model',
# pretrained model을 사용하기위한 argument입니다
# 이는 모델의 종류에 따라 다르게 설정해주어야 합니다
n_heads=16, n_layers=8, n_positions=512, text_truncate=512,
label_truncate=128, ffn_size=2048, embedding_size=512,
activation='gelu', variant='xlm',
dict_lower=True, dict_tokenizer='bpe',
dict_file='zoo:tutorial_transformer_generator/model.dict',
learn_positional_embeddings=True,
# fine-tuning에 사용되는 training argument입니다
# Adam optimizer와 작은 learning rate를 사용하도록 하겠습니다
lr=1e-5, optimizer='adam',
warmup_updates=100,
# perplexity를 사용하여 validation하도록 합니다
validation_metric='ppl',
# 이번에도 이전과 동일하게 1분 학습시키도록 하겠습니다
# validation은 0.25에폭마다 진행합니다
max_train_time=60, validation_every_n_epochs=0.25,
# 이 argument는 gpu에 맞게 설정해주시면 됩니다
batchsize=12, fp16=True, fp16_impl='mem_efficient',
# validation을 빠르게 하기 위해서 설정하는 argument입니다
skip_generation=True,
# gpu에서 한번에 최대한의 예시를 볼 수 있도록 설정합니다
dynamic_batching='full',
)
init_model
: ParlAI의 model zoo에서 나온 링크 참고from parlai.scripts.display_model import DisplayModel
DisplayModel.main(
task='dailydialog',
model_file='/content/from_scratch_model/model',
num_examples=2,
)
generative model: 학습 데이터에서 많이 나온 sequence (Oh no
등) 가 많이 나옴
model interaction: Interactive
from parlai.scripts.interactive import Interactive
Interactive.main(
model_file='zoo:tutorial_transformer_generator/model'
)