Giter Site home page Giter Site logo

monologg / koelectra Goto Github PK

View Code? Open in Web Editor NEW
592.0 10.0 136.0 55.3 MB

Pretrained ELECTRA Model for Korean

Home Page: https://huggingface.co/monologg/koelectra-base-v3-discriminator

License: Apache License 2.0

Python 100.00%
electra korean-nlp pytorch transformers tensorflow2 tensorflow nlp language-model

koelectra's Introduction

한국어 | English

KoELECTRA

ELECTRAReplaced Token Detection, 즉 generator에서 나온 token을 보고 discriminator에서 "real" token인지 "fake" token인지 판별하는 방법으로 학습을 합니다. 이 방법은 모든 input token에 대해 학습할 수 있다는 장점을 가지며, BERT 등과 비교했을 때 더 좋은 성능을 보였습니다.

KoELECTRA는 34GB의 한국어 text로 학습하였고, 이를 통해 나온 KoELECTRA-BaseKoELECTRA-Small 두 가지 모델을 배포하게 되었습니다.

또한 KoELECTRA는 Wordpiece 사용, 모델 s3 업로드 등을 통해 OS 상관없이 Transformers 라이브러리만 설치하면 곧바로 사용할 수 있습니다.

Download Link

Model Discriminator Generator Tensorflow-v1
KoELECTRA-Base-v1 Discriminator Generator Tensorflow-v1
KoELECTRA-Small-v1 Discriminator Generator Tensorflow-v1
KoELECTRA-Base-v2 Discriminator Generator Tensorflow-v1
KoELECTRA-Small-v2 Discriminator Generator Tensorflow-v1
KoELECTRA-Base-v3 Discriminator Generator Tensorflow-v1
KoELECTRA-Small-v3 Discriminator Generator Tensorflow-v1

About KoELECTRA

Layers Embedding Size Hidden Size # heads
KoELECTRA-Base Discriminator 12 768 768 12
Generator 12 768 256 4
KoELECTRA-Small Discriminator 12 128 256 4
Generator 12 128 256 4

Vocabulary

  • 이번 프로젝트의 가장 큰 목적은 Transformers 라이브러리만 있으면 모델을 곧바로 사용 가능하게 만드는 것이었고, 이에 Sentencepiece, Mecab을 사용하지 않고 원 논문과 코드에서 사용한 Wordpiece를 사용하였습니다.
  • 자세한 내용은 [Wordpiece Vocabulary] 참고
Vocab Len do_lower_case
v1 32200 False
v2 32200 False
v3 35000 False

Data

  • v1, v2의 경우 약 14G Corpus (2.6B tokens)를 사용했습니다. (뉴스, 위키, 나무위키)
  • v3의 경우 약 20G의 모두의 말뭉치를 추가적으로 사용했습니다. (신문, 문어, 구어, 메신저, 웹)

Pretraining Details

Model Batch Size Train Steps LR Max Seq Len Generator Size Train Time
Base v1,2 256 700K 2e-4 512 0.33 7d
Base v3 256 1.5M 2e-4 512 0.33 14d
Small v1,2 512 300K 5e-4 512 1.0 3d
Small v3 512 800K 5e-4 512 1.0 7d
  • KoELECTRA-Small 모델의 경우 원 논문에서의 ELECTRA-Small++동일한 옵션을 사용하였습니다.

    • 이는 공식 ELECTRA에서 배포한 Small 모델과 설정이 동일합니다.
    • 또한 KoELECTRA-Base와는 달리, Generator와 Discriminator의 모델 사이즈(=generator_hidden_size)가 동일합니다.
  • Batch sizeTrain steps을 제외하고는 원 논문의 Hyperparameter와 동일하게 가져갔습니다.

    • 다른 hyperparameter를 변경하여 돌려봤지만 원 논문과 동일하게 가져간 것이 성능이 가장 좋았습니다.
  • TPU v3-8을 이용하여 학습하였고, GCP에서의 TPU 사용법은 [Using TPU for Pretraining]에 정리하였습니다.

KoELECTRA on 🤗 Transformers 🤗

  • Transformers v2.8.0부터 ElectraModel을 공식 지원합니다.

  • Huggingface S3에 모델이 이미 업로드되어 있어서, 모델을 직접 다운로드할 필요 없이 곧바로 사용할 수 있습니다.

  • ElectraModelpooled_output을 리턴하지 않는 것을 제외하고 BertModel과 유사합니다.

  • ELECTRA는 finetuning시에 discriminator를 사용합니다.

1. Pytorch Model & Tokenizer

from transformers import ElectraModel, ElectraTokenizer

model = ElectraModel.from_pretrained("monologg/koelectra-base-discriminator")  # KoELECTRA-Base
model = ElectraModel.from_pretrained("monologg/koelectra-small-discriminator")  # KoELECTRA-Small
model = ElectraModel.from_pretrained("monologg/koelectra-base-v2-discriminator")  # KoELECTRA-Base-v2
model = ElectraModel.from_pretrained("monologg/koelectra-small-v2-discriminator")  # KoELECTRA-Small-v2
model = ElectraModel.from_pretrained("monologg/koelectra-base-v3-discriminator")  # KoELECTRA-Base-v3
model = ElectraModel.from_pretrained("monologg/koelectra-small-v3-discriminator")  # KoELECTRA-Small-v3

2. Tensorflow v2 Model

from transformers import TFElectraModel

model = TFElectraModel.from_pretrained("monologg/koelectra-base-v3-discriminator", from_pt=True)

3. Tokenizer Example

>>> from transformers import ElectraTokenizer
>>> tokenizer = ElectraTokenizer.from_pretrained("monologg/koelectra-base-v3-discriminator")
>>> tokenizer.tokenize("[CLS] 한국어 ELECTRA를 공유합니다. [SEP]")
['[CLS]', '한국어', 'EL', '##EC', '##TRA', '##를', '공유', '##합니다', '.', '[SEP]']
>>> tokenizer.convert_tokens_to_ids(['[CLS]', '한국어', 'EL', '##EC', '##TRA', '##를', '공유', '##합니다', '.', '[SEP]'])
[2, 11229, 29173, 13352, 25541, 4110, 7824, 17788, 18, 3]

Result on Subtask

config의 세팅을 그대로 하여 돌린 결과이며, hyperparameter tuning을 추가적으로 할 시 더 좋은 성능이 나올 수 있습니다.

코드 및 자세한 내용은 [Finetuning] 참고

Base Model

NSMC
(acc)
Naver NER
(F1)
PAWS
(acc)
KorNLI
(acc)
KorSTS
(spearman)
Question Pair
(acc)
KorQuaD (Dev)
(EM/F1)
Korean-Hate-Speech (Dev)
(F1)
KoBERT 89.59 87.92 81.25 79.62 81.59 94.85 51.75 / 79.15 66.21
XLM-Roberta-Base 89.03 86.65 82.80 80.23 78.45 93.80 64.70 / 88.94 64.06
HanBERT 90.06 87.70 82.95 80.32 82.73 94.72 78.74 / 92.02 68.32
KoELECTRA-Base 90.33 87.18 81.70 80.64 82.00 93.54 60.86 / 89.28 66.09
KoELECTRA-Base-v2 89.56 87.16 80.70 80.72 82.30 94.85 84.01 / 92.40 67.45
KoELECTRA-Base-v3 90.63 88.11 84.45 82.24 85.53 95.25 84.83 / 93.45 67.61

Small Model

NSMC
(acc)
Naver NER
(F1)
PAWS
(acc)
KorNLI
(acc)
KorSTS
(spearman)
Question Pair
(acc)
KorQuaD (Dev)
(EM/F1)
Korean-Hate-Speech (Dev)
(F1)
DistilKoBERT 88.60 84.65 60.50 72.00 72.59 92.48 54.40 / 77.97 60.72
KoELECTRA-Small 88.83 84.38 73.10 76.45 76.56 93.01 58.04 / 86.76 63.03
KoELECTRA-Small-v2 88.83 85.00 72.35 78.14 77.84 93.27 81.43 / 90.46 60.14
KoELECTRA-Small-v3 89.36 85.40 77.45 78.60 80.79 94.85 82.11 / 91.13 63.07

Updates

April 27, 2020

  • 2개의 Subtask (KorSTS, QuestionPair)에 대해 추가적으로 finetuning을 진행하였고, 기존 5개의 Subtask에 대해서도 결과를 업데이트하였습니다.

June 3, 2020

  • EnlipleAI PLM에서 사용된 vocabulary를 이용하여 KoELECTRA-v2를 제작하였습니다. Base 모델과 Small 모델 모두 KorQuaD에서 성능 향상을 보였습니다.

October 9, 2020

  • 모두의 말뭉치를 추가적으로 사용하여 KoELECTRA-v3를 제작하였습니다. Vocab도 MecabWordpiece를 이용하여 새로 제작하였습니다.
  • Huggingface TransformersElectraForSequenceClassification 공식 지원 등을 고려하여 기존 Subtask 결과를 새로 Update하였습니다. 또한 Korean-Hate-Speech의 결과도 추가했습니다.
from transformers import ElectraModel, ElectraTokenizer

model = ElectraModel.from_pretrained("monologg/koelectra-base-v3-discriminator")
tokenizer = ElectraTokenizer.from_pretrained("monologg/koelectra-base-v3-discriminator")

May 26, 2021

  • torch<=1.4 에서 로딩이 되지 않는 이슈 해결 (모델 수정 후 재업로드 완료) (Related Issue)
  • huggingface hub에 tensorflow v2 모델 업로드 (tf_model.h5)

Oct 20, 2021

  • tf_model.h5에서 바로 로딩하는 부분이 여러 이슈가 존재하여 제거 (from_pt=True로 로딩하는 것으로 되돌림)

Acknowledgement

KoELECTRA은 Tensorflow Research Cloud (TFRC) 프로그램의 Cloud TPU 지원으로 제작되었습니다. 또한 KoELECTRA-v3모두의 말뭉치의 도움으로 제작되었습니다.

Citation

이 코드를 연구용으로 사용하는 경우 아래와 같이 인용해주세요.

@misc{park2020koelectra,
  author = {Park, Jangwon},
  title = {KoELECTRA: Pretrained ELECTRA Model for Korean},
  year = {2020},
  publisher = {GitHub},
  journal = {GitHub repository},
  howpublished = {\url{https://github.com/monologg/KoELECTRA}}
}

Reference

koelectra's People

Contributors

beomi avatar jongwon-jay-lee avatar monologg avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

koelectra's Issues

vocab, [unused] token에 대하여

WPM로 vocab을 만드는 과정에서 아래와 같이 unused 토큰을 추가하셨다고 했는데, 어떤 목적으로 추가하신건가요?

vocab을 다 만든 후, [unused]token 200개를 vocab에 추가적으로 붙였습니다.

WordPiece Vocabulary 예제 코드 에러

예제 코드를 그대로 실행했을 때 아래와 같은 에러가 발생합니다.

Traceback (most recent call last):
  File "WordPiece_Vocabulary.py", line 28, in <module>
  File "...\tokenizers\implementations\base_tokenizer.py", line 332, in save
    return self._tokenizer.save(path, pretty)
TypeError

에러가 발생하는 함수의 내용은 다음과 같으므로,

    def save(self, path: str, pretty: bool = False):
        """ Save the current Tokenizer at the given path

        Args:
            path: str:
                A path to the destination Tokenizer file
        """
        return self._tokenizer.save(path, pretty)

인자를 쉼표로 구분하지 말고 한꺼번에 써줘야 합니다.

tokenizer.save("./ch-{}-wpm-{}".format(args.limit_alphabet, args.vocab_size))

사전학습 모델 파일 문의

Checklist

  • I've searched the project's [issues]

❓ Question

안녕하세요. 좋은 모델 공유에 감사드립니다.

KoELECTRA에 추가 사전학습을 수행해보려 합니다.

ELECTRA = Discriminator + Generator 라고 명명했을 때, 공유해주신 모델들은 ELECTRA가 아닌, DiscriminatorGenerator 뿐일까요?

Tensorflow-v1의 경우에도 DiscriminatorTF1 버전일 뿐인지 문의드립니다.

📎 Additional context

image

Finetuning 에 대해서 질문드립니다.

nsmc 데이터로 finetuning을 하게 되면 small-v3 모델을 불러오는 과정에서 에러가 발생합니다.

small-v2나 base 모델의 경우는 잘 작동이 됩니다.

"Unable to load weights from pytorch checkpoint file. "
OSError: Unable to load weights from pytorch checkpoint file. If you tried to load a PyTorch model from a TF 2.0 checkpoint, please set from_tf=True.

위와 같은 에러가 발생하네요

vocab.txt

안녕하세요! 우선 KoELECTRA 소스코드를 공유해 주셔서 감사합니다.

저는 딥러닝 관련해서 공부하고 있는 학생입니다.

공유해주신 소스코드를 차근차근 보고 있는데 preprocessing하신 코드가 없는건지 아님 제가 못찾는건지 모르겠어서 이슈 남기게 됐습니다.

position embedding 크기 수정

안녕하세요 만들어주신 모델과 제가 가진 데이터셋을 이용해 파인튜닝을 진행하고 있는 학생입니다 🙂

혼자 이것저것 검색해보면서 코드를 다루다가 (word_embeddings): Embedding(a, 128, padding_idx=0)의 a 값과 (position_embeddings): Embedding(512, 128)부분에서 : The size of tensor a (35000) must match the size of tensor b (512) at non-singleton dimension 1 에러를 만나게 되었습니다.

word_embeddings 사이즈를 줄이면 out of bounds가 떠서 일단 vocab_size로 맞춰 놓은 상태입니다. 저기에 맞춰 position embedding 차원을 늘이고 싶은데 가능한지+가능하다면 어떤 식으로 해야 할지 여쭤봅니다.

한국어 데이터로 좋은 모델 만들어주셔서 감사합니다!

단일 GPU 사전학습 이슈

안녕하세요. 단일 GPU(GTX 1080 / 11GB)로 ELECTRA BASE 모델을 학습시켜보고 있습니다.

사전학습 원본 소스(google/electra)의 base, large 부분 주석은 푼 상태이며,

    # defaults for different-sized model
    if self.model_size == "small":
      self.embedding_size = 128
    # Here are the hyperparameters we used for larger models; see Table 6 in the
    # paper for the full hyperparameters
    else:
      self.max_seq_length = 512
      self.learning_rate = 2e-4
      if self.model_size == "base":
        self.embedding_size = 768
        self.generator_hidden_size = 0.33333
        self.train_batch_size = 4
      else:
        self.embedding_size = 1024
        self.mask_prob = 0.25
        self.train_batch_size = 2048

그 외 파라미터는 다음과 같습니다. (vocab_size는 32,000으로 새로 만들었습니다.)

{
  "model_size": "base",
  "train_batch_size": "4",
  "vocab_size": "32000",
  "do_lower_case": "False",
}

문제는 사전학습에선 loss가 어느정도 내려가는데,
image

파인튜닝(NSMC)에선 loss가 전혀 내려가지 않고 있습니다. (Acc: 50)
image

장원님께서 올려주신 koelectra-base-v3 사전학습 모델로 같은 파인튜닝 코드를 돌렸을땐 loss가 줄어들어 Acc가 91.34까지 나오는걸 확인했습니다.

현재 이슈는 TPU / GPU 차이와 이로 인한 train-batch size밖에 없는데...
혹시 이 외 다른 곳에서 신경쓰신 부분이 있을까요?

허깅페이스 파이프라인

안녕하세요 !
먼저 좋은 자료 공유 너무 감사합니다.
리소스가 부족한 스타트업에서 아주 요긴하게 사용될 것 같습니다 😆

다름이 아니라 다운스트림 태스크로 감정 분석, 개체명 인식을 수행해주셨는데,
혹시 해당 모델들을 허깅페이스 파이프라인으로 구축하실 의향이 있으신가요?

KoELECTRA를 활용해 개체명 인식 결과를 활용하는 관련한 토이 프로젝트를 해보려고 하는데
파이프라인으로도 구축하실 계획이 있으신지 궁금합니다 !

멀티 클래스 repo

이진분류가 아닌 멀티 클래스 분류를 위한 예시가 있을까요?

ElectraForSequenceClassification -> ElectraForMultiSequenceClassification

vocab 생성 문의

안녕하세요~ 좋은정보 잘 보고 있습니다!

vocab 관련해서 궁금한 점이 있습니다.
KoELECTRA-v3 모델에서 Mecab과 Wordpiece를 이용하여 새로 제작하셨다고 했는데 단순히 wordpiece만 사용하지 않고 mecab을 쓰신 이유가 있나요?
mecab을 사용하지 않고 vocab을 생성한 후 학습하여 do_eval한 결과 disc_precision = 0.0, disc_recall = 0.0로 학습이 잘 되지 않았습니다.
그 후에 mecab으로 자른 후 vocab을 생성한 후 학습하였더니 학습이 잘 되었습니다. 2가지 경우 모두 똑같은 코드를 사용하여 학습을 했는데 이런 결과가 나오게 되었는데 한국어 특성상 그런걸까요?
도움 주시면 감사하겠습니다.

모델 로딩 warning 질문

Checklist

  • [Y] I've searched the project's [issues]

❓ Question

안녕하세요, 우선 좋은 프로젝트를 공유해주셔서 감사합니다.
제가 만드신 모델을 로드할 때 아래와 같은 경고 메세지가 뜨는데요

Some weights of the model checkpoint at monologg/koelectra-small-v2-discriminator were not used when initializing ElectraModel: ['discriminator_predictions.dense_prediction.bias', 'discriminator_predictions.dense.bias', 'discriminator_predictions.dense_prediction.weight', 'discriminator_predictions.dense.weight']

위 메세지는 ElectraModel이 아닌 ElectraForPreTraining을 import 하면 생기지 않는 것을 확인했고, ElectraConfig.get_config_dict('monologg/koelectra-small-v2-discriminator') 를 수행해서 나오는 결과도 {architectures: ElectraForPreTraining} 였습니다.

혹시 huggingface 없데이트에 따라 생긴 변화일까요?

ElectraModel로서 모델을 로드하고 받는 output은 {logits, output of [batch_size * sequence_len]} 이고,
ElectraForPreTraining로서 모델을 로드하고 받는 output은 {last_hidden_state, output of [batch_size * sequence_len * hidden_size]} 입니다.

저는 discirinator를 사용하고 싶은데, 위 메세지가 나오더라도 ElectraModel로 로드하는게 옳은 사용법 일까요?

[NER finetune] pad_token_label_id = -100에 대한 loss 계산 질문.

안녕하세요.
@monologg 님, KoELECTRA 모델을 공유해주셔서 정말 감사드립니다.
koBERT 때부터 항상 발빠르게 transformers로 포팅해주셔서 정말 많은 도움이 되고 있습니다.~!

제가 이슈를 남긴 이유는 다름이 아니라 fine-tuning task로 NER코드를 살펴보고 있는데, pad_token_label_id = -100에 대해서 loss를 계산하는 부분이 이해가 안되서 질문을 남깁니다.

예를 들면, 아래와 같은 데이터가 있다고 할 때,

text: 금석객잔 여러분, 감사드립니다 .	
labels : ORG-B O O O

processor.ner.py를 사용해서 위 데이터를 전처리하면 아래와 같습니다.

tokens: tokens: [CLS] 금 ##석 ##객 ##잔 여러분 , 감사 ##드립니다 . [SEP]
input_ids: 2 465 6038 6050 6115 17067 16 12027 17282 18 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
attention_mask: 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
token_type_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
label: -100 7 -100 -100 -100 0 -100 0 -100 0 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 -100 

여기서 pad_token_label_id = -100이 하는 역할에 대해서 다음의 두 가지로 이해했습니다.

  1. token이 tokenizer에 의해 sub-token으로 분리될 경우 sub-token의 첫번째 이외의 나머지들을 패딩.
    • e.g.) [금, ##석, ##객, ##잔] -> [7, -100, -100, -100]
  2. [PAD] token에 대응하는 label 패딩값.

그러면 token classification의 loss를 계산할 때, 당연히 pad_token_label_id을 제외한 부분에 대해서만 loss 계산이 되어야된다고 생각했습니다.

그런데 ElectraForTokenClassification의 foward 부분에 대한 코드를 뜯어보니 2)번 부분은 마스킹이 되고 있지만 1)번 부분은 마스킹이 되지 않은채 계산되고 있었습니다.

...

        if labels is not None:
            loss_fct = nn.CrossEntropyLoss()
            # Only keep active parts of the loss
            if attention_mask is not None:
                active_loss = attention_mask.view(-1) == 1 
                active_logits = logits.view(-1, self.config.num_labels)[active_loss]
                active_labels = labels.view(-1)[active_loss]
                loss = loss_fct(active_logits, active_labels)
            else:
                loss = loss_fct(logits.view(-1, self.config.num_labels), labels.view(-1))

attention_mask가 1인 부분만 active loss로 판단하면 label이 아래처럼 나올 것 같습니다.

label:  -100 7 -100 -100 -100 0 -100 0 -100 0 -100

이렇게 나오면 CrossEntropyLoss가 정상적으로 계산되지 않을것 같은데요... 제 생각에는 단순히 attention mask를 기준으로 active_loss를 정하는 것이 아니라 pad_token_label_id를 기준으로 active_loss를 판단해야 될 것 같습니다.

제가 NER-task는 많이 해보지 않아서 조심스럽게 질문드립니다ㅠㅠ 혹시 제가 놓친 부분이 있다면, 설명 부탁드릴 수 있을까요??

감사합니다~!

hugging face 모델 로드 관련.

Pytorch로 하면 잘 불러오는데,
TF에서는 불러오지 못하고 에러가 발생합니다.

ElectraModel.from_pretrained("monologg/koelectra-base-v2-discriminator")
->이거는 잘됨

TFElectraModel.from_pretrained("monologg/koelectra-base-v2-discriminator")
-> 이거는 hugging face에 해당 모델이 없으니 확인해보라고 나옴.

한번 확인부탁드립니다~

base 버전의 tensorflow1 checkpoint 에러

안녕하세요. 구글드라이브 업로드 해주신 체크포인트를 사용하여 tf 1.15 에서 사용을 해보려고 하는데요.

tf.train.init_from_checkpoint(tvars, assign_map)

을 사용하여 가져와보면,

OP_REQUIRES failed at save_restore_v2_ops.cc:184 : Out of range: Read less bytes than requested

와 같은 에러가 다수 발생합니다.

올려주신 small v2 버전으로는 동일코드에서 잘 돌아가는데요. (small v1 은 미확인)

혹시 체크포인트 자체의 이슈인가 싶어

assign_map 변수에 "초기화 할 var name" 의 whitelist 를 정하여 초기화를 진행해보았는데,

특정 variable 들을 포함할때 restore 실패가 발생하는데요.

일일히 var name 하나하나 해봐야해서 전부다 찾아보지는 못하였는데,

확실한건 electra/embedding, layer_0, layer_1, layer_2 까지는 모두 포함하여도 되고,

layer_3 은 다 되다가

electra/encoder/layer_3/attention/output/dense/kernel

tensor 를 포함하는순간부터 read 에러가 발생합니다.

base v1, base v2 모두 그러는데 (위 tensor는 base v2의 경우.. v1은 어떤 tensor에서 에러가 나는지는 못보았습니다.)

재다운로드를 몇번해도 동일한걸로 보아 혹시 업로드도중 손상이 되었나 싶기도 한데요.

혹시 tar.gz 등으로 압축하여 드라이브에 재업로드를 부탁드려도 될까요?

감사합니다.

ElectraForSequenceClassification 사용시 트레이닝 질문

ElectraForSequenceClassification.from_pretrained('monologg/koelectra-base-v3-discriminator') 로 모델을 initialize 했는데요
트레이닝이 안되는 거 같습니다. 같은 코드/데이터셋으로 BertForSequenceClassification로 하면 training loss 가 0.3 정도까지 떨어지는데 1.0 미만으로 떨어지질 않아서 여쭤봅니다.

다음은 워닝 메시지..

iminator_predictions.dense.weight', 'discriminator_predictions.dense.bias', 'discriminator_predictions.dense_prediction.weight']
- This IS expected if you are initializing ElectraForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassific
ation model from a BertForPreTraining model).
- This IS NOT expected if you are initializing ElectraForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model fr
om a BertForSequenceClassification model).
Some weights of ElectraForSequenceClassification were not initialized from the model checkpoint at monologg/koelectra-base-v3-discriminator and are newly initialized: ['classifier.out_proj.weight', 'classi
fier.dense.bias', 'classifier.out_proj.bias', 'classifier.dense.weight']
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.

TFRecord 용량 문의

안녕하세요. 일단 실험을 위해 유익한 정보들을 공유해 주셔서 너무너무 감사드립니다.

다름이 아니라 코드 관련은 아니고 TFRecord 생성하는 부분에 있어서 궁금한 부분이 있어서 여쭤보려고 합니다.

용량이 31G인 corpus를 생성하고 input으로 넣어 max_seq_len=512로 하여 TFRecord를 생성한 결과 29G의 파일이 생성되었습니다.

이렇게 코퍼스에 비해 약간 적은 용량의 TFRecord가 생성되는 것이 맞는 건가요?

추가학습 관련 질문드립니다.

안녕하세요,

KoELECTRA 모델 너무 잘쓰고 있습니다 :)

성능 향상을 위해 특정 도메인의 한국어 말뭉치를 추가 학습하려고 합니다.

처음부터 학습하는 것이 아니라 사전 학습된 KoELECTRA 의 가중치를 어떻게 가져올 수 있을까요?

전처리 관련 문의

안녕하세요. 블로그(https://monologg.kr/2020/05/02/koelectra-part1/) 에 포스팅한 것을 보고 문의 드립니다.

여기서 보면 전처리에 관한 자세한 내용은 preprocessing.md(https://github.com/monologg/KoELECTRA/blob/master/docs/preprocessing.md) 를 참조하도록 되어 있는데, 해당 페이지가 존재하지 않는 것으로 나옵니다.
혹시 원래 있었던 것인데 비공개로 돌리신 것인지요? 아니라면 어디서 확인할 수 있는지 알려 주시면 정말 감사하겠습니다.

Fine-tuning 관련 질문 ( XLM-RoBERT-large 추가 )

안녕하세요.

먼저 공개해주신 코드 유용하게 사용하고 있습니다. 정말 감사합니다.

XLM-RoBERTa-large 모델의 Fine-tuning 관련해서 질문이 있어 글을 남기게 되었습니다.

공개해 주신 코드는 XLM-RoBERTa-base까지 다루지만 추가적으로 실험을 하고 싶어 config와 run_*.py 코드를 약간 수정하여 XLM-RoBERTa-large 모델에 적용해보았습니다.

다른 task에서는 XLM-RoBERTa-base 이상의 성능을 얻었는데, korquad 에서 터무니 없게 거의 0에 가까운 결과가 나왔습니다.

수정 사항은 다음과 같습니다.

  1. config/korquad/xlm-robert-large.json을 추가하였고, 내용은 XLM-RoBERT-base.json에서 모델을 xlm-robert-large로만 바꾸었고 동일한 셋팅을 유지했습니다.

{ "task": "korquad", "data_dir": "data", "ckpt_dir": "ckpt", "train_file": "KorQuAD_v1.0_train.json", "predict_file": "KorQuAD_v1.0_dev.json", "threads": 4, "version_2_with_negative": false, "null_score_diff_threshold": 0.0, "max_seq_length": 512, "doc_stride": 128, "max_query_length": 64, "max_answer_length": 30, "n_best_size": 20, "verbose_logging": true, "overwrite_output_dir": true, "evaluate_during_training": true, "eval_all_checkpoints": true, "save_optimizer": false, "do_lower_case": false, "do_train": true, "do_eval": false, "num_train_epochs": 7, "weight_decay": 0.0, "gradient_accumulation_steps": 1, "adam_epsilon": 1e-8, "warmup_proportion": 0, "max_steps": -1, "max_grad_norm": 1.0, "no_cuda": false, "model_type": "xlm-roberta-large", "model_name_or_path": "xlm-roberta-large", "output_dir": "xlm-roberta-large-korquad-ckpt", "seed": 42, "train_batch_size": 4, "eval_batch_size": 16, "logging_steps": 4000, "save_steps": 4000, "learning_rate": 5e-5 }

  1. run_squad.py 에서는 token_type_ids를 제거하는 부분에 xlm-roberta-large를 추가했습니다.

if args.model_type in ["xlm", "roberta", "distilbert", "distilkobert", "xlm-roberta", "xlm-roberta-large"]: del inputs["token_type_ids"]
3. /src/util.py 에서 CONFIG_CLASSES, TOKENIZER_CLASSES, MODEL_FOR_QUESTION_ANSWERING
에 각각 "xlm-roberta-large": AutoConfig, "xlm-roberta-large":AutoTokenizer, "xlm-roberta-large": AutoModelForQuestionAnswering를 추가했습니다.

모델의 evaluation 결과입니다.

12/24/2020 11:49:46 - INFO - __main__ - ***** Official Eval results ***** 12/24/2020 11:49:46 - INFO - __main__ - official_exact_match = 0.05195704883 962591 12/24/2020 11:49:46 - INFO - __main__ - official_f1 = 6.183122770846761 12/24/2020 11:49:47 - INFO - __main__ - HasAns_exact = 0.05195704883962591 12/24/2020 11:49:47 - INFO - __main__ - HasAns_f1 = 1.1654331969028693 12/24/2020 11:49:47 - INFO - __main__ - HasAns_total = 5774 12/24/2020 11:49:47 - INFO - __main__ - best_exact = 0.05195704883962591 12/24/2020 11:49:47 - INFO - __main__ - best_exact_thresh = 0.0 12/24/2020 11:49:47 - INFO - __main__ - best_f1 = 1.1654331969028693 12/24/2020 11:49:47 - INFO - __main__ - best_f1_thresh = 0.0 12/24/2020 11:49:47 - INFO - __main__ - exact = 0.05195704883962591 12/24/2020 11:49:47 - INFO - __main__ - f1 = 1.1654331969028693

training 시 입력이 제대로 들어오는 지도(tokenizer 문제로 전부 [UNK]로 convert되는 등의 문제) 확인했으나 문제가 없었습니다.

혹시 어떤 부분에서 문제가 발생할 수 있는지 예상 가시는 부분이 있나요?

감사합니다.

maximum sequence length

훌륭한 모델 감사합니다!

저는 이 모델을 이용해서 sentence embedding을 만들어보려고 embedding을 추출하고 있는 학생입니다.

그런데

Token indices sequence length is longer than the specified maximum sequence length for this model (511 > 512). Running this sequence through the model will result in indexing errors

InvalidArgumentError: indices[0,512] = 512 is not in [0, 512) [Op:ResourceGather]

이런 오류가 뜹니다.
제 코드는

image

이구요

도와주시면 너무 감사할 것 같습니다.

Is there any published paper describing your work?

Hello,

First of all, thank you for publishing this repository. Is there any published paper describing your work? I mean a paper in some journal or conference proceedings. This information would help to understand your work a lot.

Thanks in advance!

[WIP] Pipeline for subtask

Reference

Issue

  • Wordpiece Tokenizer는 하나의 word를 여러 개의 token으로 쪼개는 경우가 있음.
  • Electra 쪽에서 아직도 ElectraForTokenClassification만 있음
    • ElectraForSequenceClassification 관련 문의 필요. 개인적으로 PR 올리는 게 더 빠를 수도....

TODO

nsmc

  • Retrain (base, small each)
  • Make ElectraForSequenceClassification
  • config refactor
  • Upload on s3
  • test

naver-ner

  • Retrain (base, small each)
  • Make custom NerPipeline
  • config refactor
  • Upload on s3
  • test

Plan

  • Also make pipeline for other subtask

Pretrain된 모델의 weight loading 이슈

안녕하세요,

KoElectra를 pytorch와 transformer 모듈에서 사용하려고 하는 도중에 에러가 납니다.

제가 사용한 코드는

from transformers import ElectraModel, ElectraTokenizer
PRE_TRAINED_MODEL_NAME = 'monologg/koelectra-base-v3-discriminator'
tokenizer = ElectraTokenizer.from_pretrained(PRE_TRAINED_MODEL_NAME)
electra = ElectraModel.from_pretrained(PRE_TRAINED_MODEL_NAME)

위와 같고 에러의 내용은 다음과 같습니다.

OSError: Unable to load weights from pytorch checkpoint file for 'monologg/koelectra-base-v3-discriminator' at '/home/archon159/.cache/torch/transformers/efc891feb2c6ce810e4350a7fb9d7f9f48d16b78cc24f95c34bd2d5d1d4bb9c4.03eea45db3698b9b1139a0ea93942bdc069b09fd0bb6fd8002f56146135a2cc0'If you tried to load a PyTorch model from a TF 2.0 checkpoint, please set from_tf=True.

혹시 이 현상의 해결법을 알려주시면 감사하겠습니다.
그리고 KoElectra를 implement할 때 사용하셨던 transformers와 pytorch 버전도 알려주시면 좋을 것 같습니다.
감사합니다.

vocab 생성관련 mecab pretokenize 방식

vocab 생성관련 closed된 issue들 확인했습니다. 답변하신대로 KLUE Paper 4.1부분을
확인하였는데, Mecab으로 pretokenize한다는 것이 전체 코퍼스를 단순히 형태소 단위로만
분리하여 wordpiece로 학습한다는 의미인가요?

논문의 예제를 보니 단순히 형태소 단위로 분리하는 것 이상의 전처리가 필요한
것이 아닌가하는 생각이 들어서요. 초보자이다 보니 너무 간단한 질문을 하게
되는 것 같습니다. 감사합니다.

Tensorflow에서 사용가능한 모델도 배포하실 예정이 있으신가요?

안녕하세요. @monologg 님, 자연어처리를 공부중인 학생입니다.
항상 좋은 글들과 모델들을 공유해주셔서 감사드립니다.

이번에 공유해주신 KoELECTRA 모델을 사용해서 fine-tuning을 진행해보고 싶은데요.
기존 사용하던 코드가 Tensorflow로 구현되어있어 Tensorflow 버전용 모델도 공유하실 예정이 있으신지 궁금합니다.
아니면 pytorch 모델을 tensorflow 모델로 바꾸어 사용할 수 있는 방법이 따로 있는지 궁금합니다.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.