KoBERT-Transformers
KoBERT & DistilKoBERT on 🤗 Huggingface Transformers 🤗
KoBERT 모델은 공식 레포의 것과 동일합니다. 본 레포는 Huggingface tokenizer의 모든 API를 지원하기 위해서 제작되었습니다.
🚨 중요! 🚨
🙏 TL;DR
transformers는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되어 있었습니다. (아래 코드 참고)
class BertEmbeddings(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 을 추가 가능하여 이를 해결할 수 있게 하였습니다.
class BertEmbeddings(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
>>> from transformers import BertModel, DistilBertModel
>>> model = BertModel.from_pretrained("monologg/kobert")
>>> model.embeddings.word_embeddings
Embedding(8002, 768, padding_idx=0)
>>> model = DistilBertModel.from_pretrained("monologg/distilkobert")
>>> model.embeddings.word_embeddings
Embedding(8002, 768, padding_idx=0)
### Transformers v2.9.1
>>> from transformers import BertModel, DistilBertModel
>>> model = BertModel.from_pretrained("monologg/kobert")
>>> model.embeddings.word_embeddings
Embedding(8002, 768, padding_idx=1)
>>> model = DistilBertModel.from_pretrained("monologg/distilkobert")
>>> model.embeddings.word_embeddings
Embedding(8002, 768, padding_idx=1)
KoBERT / DistilKoBERT on 🤗 Transformers 🤗
Dependencies
- torch>=1.1.0
- transformers>=3,<5
How to Use
>>> from transformers import BertModel, 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)
>>> from tokenization_kobert import KoBertTokenizer
>>> 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-Transformers
pip3 install kobert-transformers
How to Use
>>> import torch
>>> from kobert_transformers import get_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>)
>>> from kobert_transformers import get_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]
Reference
Release files for kobert-transformers 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| kobert_transformers-0.6.0.tar.gz | 14.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| kobert_transformers-0.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 26.5 kB
Release files / kobert_transformers-0.6.0.tar.gz
| Download URL | kobert_transformers-0.6.0.tar.gz |
|---|---|
| Size | 14.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
47ecd26031e1ed500645d0bb7f773bcdc43086640f264b4eaef2032cdf49120c
|
|
BLAKE2b-256 checksum How to use checksums |
e37caa6dd2025bf09fa235614962a8d0d7cb27ea739985f5788a05105200b7fb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.1 CPython/3.8.19
|
Release files / kobert_transformers-0.6.0-py3-none-any.whl
| Download URL | kobert_transformers-0.6.0-py3-none-any.whl |
|---|---|
| Size | 12.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4d5c170b53ff5256f0c8bffa98f2b2554f1fd4b0d38c3fdc549a17df5a9adb4f
|
|
BLAKE2b-256 checksum How to use checksums |
77af2a85216d5a4faf2d29fa8325cfdda9f29f8b4d3ad56040162dfb8fca6992
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.1 CPython/3.8.19
|