지난 시간의 KoBART를 활용한 카카오톡 대화 요약 서비스_2(feat.모델과 평가)에 이어서 생성 전략과 허깅페이스 업로드에 대해서 다루어보도록 하겠다.
텍스트 생성 전략에는 대표적으로 Sampling와 Beam Search가 있다.
샘플링이란 기본적으로 다음 단어를 무작위로 선택하는 것을 의미한다. 이러한 샘플링에는 Top_K, Top_P를 지정할 수 있는데 이 두 가지 기법은 모두 공통적으로 사용할 토큰의 개수를 줄인다는 개념이다. 하지만 토큰의 개수를 줄이는 방법은 각각 다르다. Top_K는 확률이 가장 높은 K 개의 토큰에서만 샘플링해서 확률이 낮은 토큰을 피한다. Top_P는 샘플링에서 누적 확률이 확률 P를 초과하는 가능한 가장 작은 단어 집합에서 선택한다. 즉 확률에 따라 내림차순으로 모든 토큰을 정렬하고 선택한 토큰의 확률이 P에 도달할 때까지 리스트의 맨 위부터 토큰을 하나씩 추가한다.
샘플링 기법의 경우는 다음 토큰이 랜덤하게 선택되기 때문에 창의적인 창작에 적합하다. 하지만 현재 진행하는 Task는 요약이기 때문에 샘플링 기법은 적합하지가 않다. 실제로 실험해 본 결과 샘플링 했을 때의 경우 Rouge가 현저하게 떨어지는 것을 확인할 수 있었다.
outputs = model.generate(input_ids,
do_sample=True,
top_k=50,
top_p=0.95,
)
빔서치는 각 스텝에서 가장 높은 확률을 가진 토큰을 탐욕적으로 선택하는 그리디 서치를 보완하여 확률이 가장 높은 상위 b개의 다음 토큰을 추적하여 보다 더 정밀한 결과를 얻을 수 있다. 빔서치의 경우는 랜덤하게 토큰을 선택하는 샘플링과 달리 확률이 높은 상위 b개의 토큰을 추적하기 때문에 입력 토큰을 잘 표현한다. 따라서 추상 요약에서 유리한 전략으로 판단된다. 실제로 학습한 결과 샘플링보다 월등히 높은 Rouge를 달성하였다.
참고로 no_repeat_ngram_size는 연속적으로 반복되는 n-gram의 길이를 제한하도록 하는 것이다. 나는 이를 3으로 설정하였고 문장에서 동일한 3-gram이 반복되지 않는 것이다. 이를 통해서 문장의 반복성을 줄 일 수 있다. 요약문이기에 3번 연속 동일한 문장이 반복된다는 것을 정량적 평가를 해본 결과 성능 저하를 일으킨 다는 것을 확하였기 때문이다.
outputs = model.generate(input_ids,
num_beams=5,
no_repeat_ngram_size=3,
attention_mask=attention_mask,
)
post-pretrain과 fine-tuning 한 모델을 HuggingFace에 업로드 하였다.
모델을 HuggingFace에 업로드하는 방법은 아래에 기재해 놓았다.
model.push_to_hub(
Name,
use_temp_dir=True,
use_auth_token=HuggingFace_Token
)
tokenizer.push_to_hub(
Name,
use_temp_dir=True,
use_auth_token=HuggingFace_Token
)
세 번째 포스팅은 텍스트 생성 전략과 HuggingFace 업로드에 대해서 살펴보았다. 마지막으로 다음 포스팅에서는 Flask를 활용한 모델 배포에 대해서 알아보도록 하겠다.
github로 이동 : KoBART를 활용한 카카오톡 대화 요약 서비스