Package: kobert-transformers
KoBERT-TransformersKoBERT&DistilKoBERTon 🤗 Huggingface Transformers 🤗KoBERT 모델은공식 레포의 것과 동일합니다. 본 레포는Huggingface tokenizer의 모든 API를 지원하기 위해서 제작되었습니다.🚨 중요! 🚨🙏 TL;DRtransformers는v3.0이상을 반드시 설치!tokenizer는 본 레포의kobert_transformers/tokenization_kobert.py를 사용!1. Tokenizer 호환Huggingface Transformers가v2.9.0부터 tokenization 관련 API가 일부 변경되었습니다. 이에 맞춰 기존의tokenization_kobert.py를 상위 버전에 맞게 수정하였습니다.2. Embedding의 padding_idx 이슈이전부터BertModel의BertEmbeddings에서padding_idx=0으로Hard-coding되어 있었습니다. (아래 코드 참고)classBertEmbeddings(nn.Module):def__init__(self,config):super().__init__()self.word_embeddings=nn.Embedding(config.vocab_size,config.hidden_size,padding_idx=0)self.position_embeddings=nn.Embedding(config.max_position_embeddings,config.hidden_size)self.token_type_embeddings=nn.Embedding(config.type_vocab_size,config.hidden_size)그러나 Sentencepiece의 경우 기본값으로pad_token_id=1,unk_token_id=0으로 설정이 되어 있고 (이는 KoBERT도 동일), 이를 그대로 사용하는 BertModel의 경우 원치 않은 결과를 가져올 수 있습니다.Huggingface에서도 최근에 해당 이슈를 인지하여 이를 수정하여v2.9.0에 반영하였습니다. (관련 PR #3793) config에pad_token_id=1을 추가 가능하여 이를 해결할 수 있게 하였습니다.classBertEmbeddings(nn.Module):def__init__(self,config):super().__init__()self.word_embeddings=nn.Embedding(config.vocab_size,config.hidden_size,padding_idx=config.pad_token_id)self.position_embeddings=nn.Embedding(config.max_position_embeddings,config.hidden_size)self.token_type_embeddings=nn.Embedding(config.type_vocab_size,config.hidden_size)그러나v.2.9.0에서DistilBERT,ALBERT등에는 이 이슈가 해결되지 않아 직접 PR을 올려 처리하였고 (관련 PR #3965),v2.9.1에 최종적으로 반영되어 배포되었습니다.아래는 이전과 현재 버전의 차이점을 보여주는 코드입니다.# Transformers v2.7.0>>>fromtransformersimportBertModel,DistilBertModel>>>model=BertModel.from_pretrained("monologg/kobert")>>>model.embeddings.word_embeddingsEmbedding(8002,768,padding_idx=0)>>>model=DistilBertModel.from_pretrained("monologg/distilkobert")>>>model.embeddings.word_embeddingsEmbedding(8002,768,padding_idx=0)### Transformers v2.9.1>>>fromtransformersimportBertModel,DistilBertModel>>>model=BertModel.from_pretrained("monologg/kobert")>>>model.embeddings.word_embeddingsEmbedding(8002,768,padding_idx=1)>>>model=DistilBertModel.from_pretrained("monologg/distilkobert")>>>model.embeddings.word_embeddingsEmbedding(8002,768,padding_idx=1)KoBERT / DistilKoBERT on 🤗 Transformers 🤗Dependenciestorch>=1.1.0transformers>=3,<5How to Use>>>fromtransformersimportBertModel,DistilBertModel>>>bert_model=BertModel.from_pretrained('monologg/kobert')>>>distilbert_model=DistilBertModel.from_pretrained('monologg/distilkobert')Tokenizer를 사용하려면,kobert_transformers/tokenization_kobert.py파일을 복사한 후,KoBertTokenizer를 임포트하면 됩니다.KoBERT와 DistilKoBERT 모두 동일한 토크나이저를 사용합니다.기존 KoBERT의 경우 Special Token이 제대로 분리되지 않는 이슈가 있어서 해당 부분을 수정하여 반영하였습니다. (Issue link)>>>fromtokenization_kobertimportKoBertTokenizer>>>tokenizer=KoBertTokenizer.from_pretrained('monologg/kobert')# monologg/distilkobert도 동일>>>tokenizer.tokenize("[CLS] 한국어 모델을 공유합니다. [SEP]")>>>['[CLS]','▁한국','어','▁모델','을','▁공유','합니다','.','[SEP]']>>>tokenizer.convert_tokens_to_ids(['[CLS]','▁한국','어','▁모델','을','▁공유','합니다','.','[SEP]'])>>>[2,4958,6855,2046,7088,1050,7843,54,3]Kobert-Transformers (Pip library)tokenization_kobert.py를 랩핑한 파이썬 라이브러리KoBERT, DistilKoBERT를 Huggingface Transformers 라이브러리 형태로 제공v0.5.1에서는transformers v3.0이상으로 기본 설치합니다. (transformers v4.0까지는 이슈 없이 사용 가능)Install Kobert-Transformerspip3installkobert-transformersHow to Use>>>importtorch>>>fromkobert_transformersimportget_kobert_model,get_distilkobert_model>>>model=get_kobert_model()>>>model.eval()>>>input_ids=torch.LongTensor([[31,51,99],[15,5,0]])>>>attention_mask=torch.LongTensor([[1,1,1],[1,1,0]])>>>token_type_ids=torch.LongTensor([[0,0,1],[0,1,0]])>>>sequence_output,pooled_output=model(input_ids,attention_mask,token_type_ids)>>>sequence_output[0]tensor([[-0.2461,0.2428,0.2590,...,-0.4861,-0.0731,0.0756],[-0.2478,0.2420,0.2552,...,-0.4877,-0.0727,0.0754],[-0.2472,0.2420,0.2561,...,-0.4874,-0.0733,0.0765]],grad_fn=<SelectBackward>)>>>fromkobert_transformersimportget_tokenizer>>>tokenizer=get_tokenizer()>>>tokenizer.tokenize("[CLS] 한국어 모델을 공유합니다. [SEP]")['[CLS]','▁한국','어','▁모델','을','▁공유','합니다','.','[SEP]']>>>tokenizer.convert_tokens_to_ids(['[CLS]','▁한국','어','▁모델','을','▁공유','합니다','.','[SEP]'])[2,4958,6855,2046,7088,1050,7843,54,3]ReferenceKoBERTDistilKoBERTHuggingface Transformers