模型:
beomi/kcbert-base
** 2021.04.07 更新 **
** 2021.03.14 更新 **
** 2020.12.04 更新 **
随着Huggingface Transformers更新到v4.0.0,教程中的代码也有所更改。
更新后的KcBERT-Large NSMC微调Colab链接:
** 2020.09.11 更新 **
我们提供了在Google Colab中使用TPU对KcBERT进行训练的教程!请点击下面的按钮。
我们使用了一个小块(144MB)的部分文本数据来进行训练,以便更方便地使用韩语数据集/语料库。
我们使用了一个名为 Korpora 的包来更轻松地使用韩语数据集/语料库。
** 2020.09.08 更新 **
我们通过Github Release上传了训练数据。
由于每个文件的大小限制为2GB,所以已进行了分割压缩。
请通过以下链接下载数据(不需要注册即可下载,分割为多个压缩文件)
如果您想要一个文件或者想在Kaggle上查看数据,请使用下面的Kaggle数据集。
** 2020.08.22 更新 **
公开Pretrain Dataset
我们在Kaggle上发布了经过清理(下面的 clean 处理)的数据集,供您进行训练!
公开的韩语BERT大多基于经过精心清理的数据集,例如韩语维基,新闻文章和书籍等。然而,像NSMC这样的评论数据集未经过处理,其中有很多口语和网络用语,拼写错误等表达。
为了适应这类数据集,KcBERT从Naver新闻中收集了评论和回复,从头开始训练了分词器和BERT模型。
您可以使用Huggingface的Transformers库轻松地加载和使用KcBERT模型(无需单独下载文件)。
| Size (용량) | NSMC (acc) | Naver NER (F1) | PAWS (acc) | KorNLI (acc) | KorSTS (spearman) | Question Pair (acc) | KorQuaD (Dev) (EM/F1) | |
|---|---|---|---|---|---|---|---|---|
| KcBERT-Base | 417M | 89.62 | 84.34 | 66.95 | 74.85 | 75.57 | 93.93 | 60.25 / 84.39 |
| KcBERT-Large | 1.2G | 90.68 | 85.53 | 70.15 | 76.99 | 77.49 | 94.06 | 62.16 / 86.64 |
| KoBERT | 351M | 89.63 | 86.11 | 80.65 | 79.00 | 79.64 | 93.93 | 52.81 / 80.27 |
| XLM-Roberta-Base | 1.03G | 89.49 | 86.26 | 82.95 | 79.92 | 79.09 | 93.53 | 64.70 / 88.94 |
| HanBERT | 614M | 90.16 | 87.31 | 82.40 | 80.89 | 83.33 | 94.19 | 78.74 / 92.02 |
| KoELECTRA-Base | 423M | 90.21 | 86.87 | 81.90 | 80.85 | 83.21 | 94.20 | 61.10 / 89.59 |
| KoELECTRA-Base-v2 | 423M | 89.70 | 87.02 | 83.90 | 80.61 | 84.30 | 94.72 | 84.34 / 92.58 |
| DistilKoBERT | 108M | 88.41 | 84.13 | 62.55 | 70.55 | 73.21 | 92.48 | 54.12 / 77.80 |
*HanBERT大小为Bert模型和Tokenizer数据库的总和。
* 根据config的设置运行的结果,可以进一步进行超参数调整以获得更好的性能。
from transformers import AutoTokenizer, AutoModelWithLMHead
# Base Model (108M)
tokenizer = AutoTokenizer.from_pretrained("beomi/kcbert-base")
model = AutoModelWithLMHead.from_pretrained("beomi/kcbert-base")
# Large Model (334M)
tokenizer = AutoTokenizer.from_pretrained("beomi/kcbert-large")
model = AutoModelWithLMHead.from_pretrained("beomi/kcbert-large")
用PyTorch-Lightning在KcBERT-Base上对NSMC进行微调(Colab):
用PyTorch-Lightning在KcBERT-Large上对NSMC进行微调(Colab):
上述示例仅在预训练模型(基本还是大)和批量大小不同的情况下有所区别,其他代码完全相同。
训练数据是从2019年1月1日至2020年6月15日之间发布的新闻文章中收集的评论数据和回复。
数据大小在提取文本后约为15.4GB,并包含超过1.1亿个句子。
进行PLM训练的预处理过程如下:
韩语和英语,特殊字符,以及表情符号(🥳)!
我们使用正则表达式将韩语、英语、特殊字符和表情符号(Emoji)都包含在了训练中。
鉴于韩语的范围,我们将范围限定为 ㄱ-ㅎ가-힣 ,排除了 ㄱ-힣 范围内的汉字。
缩写评论中的重复字符串
我们将像 ㅋㅋㅋㅋ 这样的重复字符缩写为 ㅋㅋ 。
区分大小写模型
KcBERT对英文保持大小写的cased模型。
删除10个字符以下的文字
由于10个字符以下的文本通常是由单个单词组成的,我们将其剔除。
删除重复评论
为了删除重复评论,我们将重复的评论合并为一个。
通过以上步骤得到的最终训练数据大小为12.5GB,包含890万个句子。
请按照下面的命令安装pip,并使用下面的clean函数来清理文本数据(以减少[UNK]的数量)。
pip install soynlp emoji
请在文本数据上使用下面的clean函数。
import re
import emoji
from soynlp.normalizer import repeat_normalize
emojis = list({y for x in emoji.UNICODE_EMOJI.values() for y in x.keys()})
emojis = ''.join(emojis)
pattern = re.compile(f'[^ .,?!/@$%~%·∼()\x00-\x7Fㄱ-ㅣ가-힣{emojis}]+')
url_pattern = re.compile(
r'https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)')
def clean(x):
x = pattern.sub(' ', x)
x = url_pattern.sub('', x)
x = x.strip()
x = repeat_normalize(x, num_repeats=2)
return x
您可以在下面的Kaggle数据集中下载经过清理(用下面的clean处理)的原始数据(12GB)的txt文件:
https://www.kaggle.com/junbumlee/kcbert-pretraining-corpus-korean-news-comments
我们使用Huggingface的 Tokenizers 库进行分词器训练。
我们使用BertWordPieceTokenizer进行训练,词汇表大小设置为30000。
在训练分词器时,我们对1/10的采样数据进行了采样,并在分层抽样的基础上按日期分层进行了采样,以保持样本的平衡。
{
"max_position_embeddings": 300,
"hidden_dropout_prob": 0.1,
"hidden_act": "gelu",
"initializer_range": 0.02,
"num_hidden_layers": 12,
"type_vocab_size": 2,
"vocab_size": 30000,
"hidden_size": 768,
"attention_probs_dropout_prob": 0.1,
"directionality": "bidi",
"num_attention_heads": 12,
"intermediate_size": 3072,
"architectures": [
"BertForMaskedLM"
],
"model_type": "bert"
}
{
"type_vocab_size": 2,
"initializer_range": 0.02,
"max_position_embeddings": 300,
"vocab_size": 30000,
"hidden_size": 1024,
"hidden_dropout_prob": 0.1,
"model_type": "bert",
"directionality": "bidi",
"pad_token_id": 0,
"layer_norm_eps": 1e-12,
"hidden_act": "gelu",
"num_hidden_layers": 24,
"num_attention_heads": 16,
"attention_probs_dropout_prob": 0.1,
"intermediate_size": 4096,
"architectures": [
"BertForMaskedLM"
]
}
BERT模型配置与Base和Large的默认设置相同(MLM 15%等)。
我们使用TPU v3-8进行训练,每个模型训练了3天和N天(Large模型训练期间),Huggingface上公开的模型是训练了100万步的ckpt。
模型训练的Loss在步骤上,最开始的20万步会迅速减小,然后在40万步后略有下降。
我们使用GCP的TPU v3-8进行了模型训练,基础模型训练时间约为2.5天。Large模型在训练了大约5天后选择了具有最低Loss的checkpoint。
您可以在 HuggingFace kcbert-base 모델 中尝试以下内容:
当然,您也可以在 kcbert-large 모델 中进行测试。
我们对 네이버 영화평 코퍼스 数据集进行了微调以进行简单的性能测试。
您可以在KcBERT-Base上运行Fine Tune的代码为
。
您可以在KcBERT-Large上运行Fine Tune的代码为
。
我们计划在更多的Downstream Task中进行测试并进行公开。
当引用KcBERT时,请使用以下格式进行引用。
@inproceedings{lee2020kcbert,
title={KcBERT: Korean Comments BERT},
author={Lee, Junbum},
booktitle={Proceedings of the 32nd Annual Conference on Human and Cognitive Language Technology},
pages={437--440},
year={2020}
}
训练KcBERT模型时使用了GCP/TPU环境,获得了 TFRC 计划的支持。
感谢 Monologg 先生在模型训练过程中提供的许多建议 :)