Skip to main content

Transformers library for KoBERT, DistilKoBERT

Project description

DistilKoBERT

Distillation of KoBERT (SKTBrain KoBERT 경량화)

KoBERT for transformers library

  • transformers v2.2.2부터 개인이 만든 모델을 transformers를 통해 직접 업로드/다운로드하여 사용할 수 있습니다
>>> from transformers import BertModel
>>> model = BertModel.from_pretrained('monologg/kobert')
  • Tokenizer를 사용하려면, 루트 디렉토리의 tokenization_kobert.py 파일을 복사한 후, KoBertTokenizer를 임포트하면 됩니다.
    • 기존 KoBERT의 경우 Special Token이 제대로 분리되지 않는 이슈가 있어서 해당 부분을 수정하여 반영하였습니다. (Issue link)
>>> from tokenization_kobert import KoBertTokenizer
>>> tokenizer = KoBertTokenizer.from_pretrained('monologg/kobert')
>>> tokenizer.tokenize("[CLS] 한국어 모델을 공유합니다. [SEP]")
['[CLS]', '▁한국', '어', '▁모델', '을', '▁공유', '합니다', '.', '[SEP]']
>>> tokenizer.convert_tokens_to_ids(['[CLS]', '▁한국', '어', '▁모델', '을', '▁공유', '합니다', '.', '[SEP]'])
[2, 4958, 6855, 2046, 7088, 1050, 7843, 54, 3]

Pretraining DistilKoBERT

  • 기존의 12 layer를 3 layer로 줄였으며, 기타 configuration은 kobert를 그대로 따랐습니다.
  • Layer 초기화의 경우 기존 KoBERT의 1, 5, 9번째 layer 값을 그대로 사용하였습니다.
  • Pretraining Corpus는 한국어 위키, 나무위키, 뉴스 등 약 6GB의 데이터를 사용했으며, 2.5 epoch 학습하였습니다.

DistilKoBERT for transformers library

  • Tokenizer를 사용하려면, 루트 디렉토리의 tokenization_kobert.py 파일을 복사한 후, KoBertTokenizer를 임포트하면 됩니다.
    • KoBERT와 DistilKoBERT 모두 동일한 토크나이저를 사용합니다.
>>> from transformers import DistilBertModel
>>> from tokenization_kobert import KoBertTokenizer
>>> model = DistilBertModel.from_pretrained('monologg/distilkobert')
>>> tokenizer = KoBertTokenizer.from_pretrained('monologg/distilkobert')

What is different between BERT and DistilBERT

  • DistilBert는 기존의 Bert와 달리 token-type embedding을 사용하지 않습니다.

    • Transformers 라이브러리의 DistilBertModel을 사용할 때 기존 BertModel 과 달리 token_type_ids를 넣을 필요가 없습니다.
  • 또한 DistilBert는 pooler를 사용하지 않습니다.

    • 고로 기존 BertModel의 경우 forward의 return 값으로 sequence_output, pooled_output, (hidden_states), (attentions)을 뽑아내지만, DistilBertModel의 경우 sequence_output, (hidden_states), (attentions)를 뽑아냅니다.
    • DistilBert에서 [CLS] 토큰을 뽑아내려면 sequence_output[0][:, 0]를 적용해야 합니다.
# Transformers의 BertModel에서 sequence_output으로부터 pooled_output을 만들기 위해 사용하는 BertPooler
class BertPooler(nn.Module):
    def __init__(self, config):
        super(BertPooler, self).__init__()
        self.dense = nn.Linear(config.hidden_size, config.hidden_size)
        self.activation = nn.Tanh()

    def forward(self, hidden_states):
        # We "pool" the model by simply taking the hidden state corresponding
        # to the first token.
        first_token_tensor = hidden_states[:, 0]
        pooled_output = self.dense(first_token_tensor)
        pooled_output = self.activation(pooled_output)
        return pooled_output

Kobert-Transformers python library

  • tokenization_kobert.py를 랩핑한 파이썬 라이브러리
  • KoBERT, DistilKoBERT를 Huggingface Transformers 라이브러리 형태로 임포트

Install DistilKoBERT

$ pip3 install kobert-transformers

How to Use

>>> import torch
>>> from kobert_transformers import get_distilkobert_model, get_kobert_model

>>> model = get_distilkobert_model(no_cuda=True)
>>> input_ids = torch.LongTensor([[31, 51, 99], [15, 5, 0]])
>>> attention_mask = torch.LongTensor([[1, 1, 1], [1, 1, 0]])
>>> last_layer_hidden_state, _ = model(input_ids, attention_mask)
>>> last_layer_hidden_state
tensor([[[-0.2155,  0.1182,  0.1865,  ..., -1.0626, -0.0747, -0.0945],
         [-0.5559, -0.1476,  0.1060,  ..., -0.3178, -0.0172, -0.1064],
         [ 0.1284,  0.2212,  0.2971,  ..., -0.4619,  0.0483,  0.3293]],

        [[ 0.0414, -0.2016,  0.2643,  ..., -0.4734, -0.9823, -0.2869],
         [ 0.2286, -0.1787,  0.1831,  ..., -0.7605, -1.0209, -0.5340],
         [ 0.2507, -0.0022,  0.4103,  ..., -0.7278, -0.9471, -0.3140]]],
       grad_fn=<AddcmulBackward>)
>>> 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]

Result on Sub-task

KoBERT DistilKoBERT (3 layer) Bert (multilingual) FastText
Model Size (MB) 351 108 681 2
NSMC (%) 89.63 88.28 87.07 85.50

Reference

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for kobert-transformers, version 0.1.0
Filename, size File type Python version Upload date Hashes
Filename, size kobert_transformers-0.1.0-py3-none-any.whl (7.9 kB) File type Wheel Python version py3 Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page