Data/ML & DL

[Pytorch] 토크나이저에 vocab 추가하기

sennysideup 2023. 6. 18. 11:46
반응형

오늘은 이전에 했던 미니프로젝트에 대해 포스팅해보려고 합니다. 미니프로젝트에서 사용했던 토크나이저는 사전학습된 RoBERTa-small로, huggingface를 이용했습니다. 

 

Huggingface tokenizer

huggingface의 토크나이저는 subwords 기반입니다. subwords 기반 토크나이저는 알려진 글자나 subword를 기반으로 토크나이징을 합니다. subwords 기반 토크나이저는 빈번하지 않은 단어를 잘 인식하지 못한다는 한계가 있습니다. subwords 알고리즘은 빈번하게 사용하는 단어는 subword로 분할하지 않고 그대로 사용하지만, 빈번하지 않은 단어는 subwords로 분할하기 때문입니다. 한국어 같은 교착어에 효과적이라고 합니다.
그치만 저희 데이터에 적용해본 결과, 질환을 질/환으로 토크나이징하는 등 잘못 토큰화된 단어가 다수 발견되었습니다. 그래서 subwords 기반 토크나이저를 개선하고자 KoNLPy 적용을 시도했습니다. KoNLPy는 dict 기반 토크나이저로, 알려진 단어/형태소 및 단어와 형태소의 결합을 기반으로 토크나이징을 합니다. KoNLPy의 작동 원리를 변경하는 것은 한계가 있었기 때문에, 토크나이저의 vocab에 단어를 추가하는 방식으로 진행했습니다.

Vocab

vocab을 추가할 경우, 토크나이저는 추가된 단어를 새로운 단어로 인식하고 토크나이징을 합니다. okt를 적용해서 토크나이징을 한 뒤, 토큰화된 단어를 hugging face의 vocab에 넣었습니다.

# okt 적용하기
okt = Okt()
train['okt'] = [okt.morphs(s) for s in train['문장']]

# 추가할 vocab list 생성
vocab_list = sum(train['okt'], [])

# 생성한 vocab list에서 기존 vocab에 있는 단어 제외
new_tokens = set(vocab_list) - set(tokenizer.vocab.keys())

# vocab 추가
tokenizer.add_tokens(list(new_tokens))

# token embedding reize
model.resize_token_embeddings(len(tokenizer))

결과

일부 단어의 토크나이징 결과가 달라지는 것을 확인할 수 있었지만, 전반적인 모델 성능은 개선되지 않았습니다. 오히려 하락한 결과를 보였습니다. 아마 overfitting으로 인한 문제가 아닐까 싶어요

 

Github에서 보기

 

GitHub - Sennysideup/Team-project

Contribute to Sennysideup/Team-project development by creating an account on GitHub.

github.com

Reference