2021年4月7日更新
2021年3月14日更新
2020年12月4日更新
随着Huggingface Transformers更新至v4.0.0,教程中的代码已部分更改。
2020年9月11日更新
我们提供了可在Google Colab上通过TPU训练KcBERT的教程!请点击下面的按钮。
文本量已从全部12G文本缩减为部分(144MB)进行训练。
我们使用了能更轻松地使用韩语数据集/语料库的Korpora包。
2020年9月8日更新
已通过Github Release上传训练数据。
但由于每个文件2GB以内的限制,已进行分卷压缩。
请通过以下链接下载。(无需注册即可下载。分卷压缩)
如果您想下载单个文件或在Kaggle上查看数据,请使用以下Kaggle数据集。
2020年8月22日更新
预训练数据集公开
我们已在Kaggle上公开了为训练而整理的(经过下面clean处理的)数据集!
请自行下载并在各种任务上进行训练吧 :)
已公开的韩语BERT大多是基于韩语维基百科、新闻报道、书籍等精心整理的数据进行训练的模型。另一方面,像NSMC这样的评论型数据集实际上未经整理,具有口语特点,包含许多新造词,并且像错别字等在正式写作中不会出现的表达频繁出现。
为了将KcBERT应用于具有上述特性的数据集,我们从Naver新闻收集了评论和回复,从头开始训练了分词器和BERT模型,这就是预训练的BERT模型KcBERT。
KcBERT可以通过Huggingface的Transformers库轻松加载使用。(无需单独下载文件。)
| 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의 Size는 Bert Model과 Tokenizer DB를 합친 것입니다.
*config의 세팅을 그대로 하여 실행한 결과이며, 하이퍼파라미터 튜닝을 추가적으로 할 경우 더 좋은 성능이 나올 수 있습니다.
pytorch <= 1.8.0transformers ~= 3.0.1
transformers ~= 4.0.0。emoji ~= 0.6.0soynlp ~= 0.0.493from transformers import AutoTokenizer, AutoModelWithLMHead
import torch
import torch_npu
device = torch.device('npu:0')
# Base Model (108M)
tokenizer = AutoTokenizer.from_pretrained("beomi/kcbert-base")
model = AutoModelWithLMHead.from_pretrained("beomi/kcbert-base").to(device)
# Large Model (334M)
tokenizer = AutoTokenizer.from_pretrained("beomi/kcbert-large")
model = AutoModelWithLMHead.from_pretrained("beomi/kcbert-large").to(device)在 Colab 中使用 TPU 进行 KcBERT 预训练:
KcBERT-Base 使用 PyTorch-Lightning 进行 NSMC 微调(Colab)
KcBERT-Large 使用 PyTorch-Lightning 进行 NSMC 微调(Colab)
上述两个代码仅预训练模型(base、large)和 batch size 不同,其余代码完全一致。
训练数据是 2019 年 1 月 1 日至 2020 年 6 月 15 日期间发表的评论量大的新闻文章的评论及回复的全部收集数据。
仅提取文本时,数据大小约为 15.4GB,由超过 1.1 亿个句子组成。
为进行 PLM 训练而执行的预处理过程如下:
韩语及英语、特殊字符,乃至表情符号(🥳)!
通过正则表达式将韩语、英语、特殊字符以及表情符号都纳入了训练范围。
同时,将韩语范围指定为 ㄱ-ㅎ가-힣,排除了 ㄱ-힣 内的汉字。
评论内重复字符串缩减
将 ㅋㅋㅋㅋㅋ 等重复字符合并为 ㅋㅋ 等形式。
大小写敏感模型(Cased Model)
KcBERT 对于英文是保留大小写的 Cased model。
字符单位 10 字以下去除
10 字以下的文本大多由单个单词组成,因此将这部分排除。
去重
为去除重复的评论,将重复评论合并为一条。
通过以上处理得到的最终训练数据为 12.5GB,8900 万个句子。
使用以下命令通过 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 的库进行训练的。
其中,我们使用 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 Model Config沿用了Base、Large的默认设置(如MLM 15%等)。
我们使用TPU v3-8分别进行了3天(Base)和N天(Large,训练进行中)的训练,目前在Huggingface上公开的模型已上传了经过1m(100万)步训练的检查点。
模型训练损失(Loss)随步数变化的情况为:在初始200k步时损失下降最快,400k步之后则呈现缓慢下降趋势。


训练使用的是GCP的TPU v3-8,Base Model的训练时间约为2.5天。Large Model则进行了约5天的训练,并选定损失最低的检查点作为最终模型。
可按以下方式进行测试。

当然,也可以在kcbert-large模型上进行测试。

我们以네이버 영화평 코퍼스数据集为对象进行了微调(Fine Tuning),以简单测试模型性能。
KcBERT-Base Model 实验结果:验证集准确率(Val acc).8905

KcBERT-Large Model 实验结果:验证集准确率(Val acc).9089

我们计划在更多下游任务(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 Model 的 GCP/TPU 环境得到了 TFRC 项目的支持。
感谢在模型训练过程中提供诸多建议的 Monologg 先生 :)