본문 바로가기

NLP 자연어 처리, Natural Language Processing/Summary, 요약

BART 학습 및 예측

다음은 Fairseq를 이용하여 학습을 하는 방법입니다.

 

먼저 저는 Fairseq의 2번째 방법을 이용합니다. 다음 코드를 이용합니다.

# Download bart.large model
wget https://dl.fbaipublicfiles.com/fairseq/models/bart.large.tar.gz
tar -xzvf bart.large.tar.gz

# Load the model in fairseq
from fairseq.models.bart import BARTModel
bart = BARTModel.from_pretrained('/path/to/bart.large', checkpoint_file='model.pt')
bart.eval()  # disable dropout (or leave in train mode to finetune)

BART 모델을 불러왔습니다.

 

이제 BART모델에 들어갈 입력을 넣어줘야합니다. 각 Pretrain 모델은 각 tokenizer를 사용하여 입력을 tokenize 해 주어야 합니다. 위의 모델은 tokenizer를 이용할 수 있는 모델입니다. tokenizer는 한번 직접 확인해보시면 될 것 같습니다.

# tokenizer
a = bart.encode("입력")
print(a)
b = bart.decode(a.tolist())
print(b)

 

 

BART는 다양한 언어를 token으로 바꿀 수 있는 능력을 가지고 있습니다. 한글의 경우에는 자음과 모음의 조합으로 글자를 만들어낼 수 있고, 중국어, 일본어 등등도 자세히 알 수는 없지만 무엇의 조합을 통해 다국어를 지원합니다.

 

따라서 다양한 언어로 Fine-Tunning 할 수 있습니다. 당연하지만 해당 언어로 Fine-Tunning하려면 해당 언어에 대해 많은 데이터 셋이 필요합니다. (기존은 영어로 학습되어 있기 때문)

 

Sequence-to-Sequence 방식으로 출력을 원한다면 입력은 model(input, input_sequence_length, target)을 입력하면 됩니다. 학습한 모델의 출력은 model(input, sequence_length, start_token)을 이용하여 start토큰을 기준으로 다음 단어가 나올 확률들을 계산하여 기존의 타겟의 token수만큼 반복하여 예측을 하면 됩니다.

# train 코드
output = model(x, x_len, y)

# predict 결과 확인
# unsqueeze는 배치사이즈를 없애 하나의 결과만을 확인하기 위해서입니다.
# for _ in y.size(1): #를 이용하여 해당 인풋에대해 타겟이 들어왔을 때 최대확률을 반복해서 구함
output = model(x.unsqueeze(0), x_len.unsqueeze(0), start_token)

 

반응형