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
Metadata
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 | Provenance | |
|---|---|---|---|---|
| kobert_transformers-0.6.0.tar.gz | 14.0 kB | Without provenance | 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
|
Security for kobert-transformers 0.6.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.