HuggingFace镜像/kcbert-base
模型介绍文件和版本分析
下载使用量0

KcBERT: Korean comments BERT

2021年4月7日更新

  • KcELECTRA已发布!🤗
  • KcELECTRA通过更多的数据集以及更大的通用词汇表,相比KcBERT在所有任务上都表现出更高的性能。
  • 请在下面的GitHub链接中亲自尝试使用!
  • https://github.com/Beomi/KcELECTRA

2021年3月14日更新

  • 已添加KcBERT论文引用标记。(bibtex)
  • 已在正文中添加KcBERT微调性能分数。

2020年12月4日更新

随着Huggingface Transformers更新至v4.0.0,教程中的代码已部分更改。

更新后的KcBERT-Large NSMC微调Colab: Open In Colab

2020年9月11日更新

我们提供了可在Google Colab上通过TPU训练KcBERT的教程!请点击下面的按钮。

在Colab上使用TPU进行KcBERT预训练: Open In Colab

文本量已从全部12G文本缩减为部分(144MB)进行训练。

我们使用了能更轻松地使用韩语数据集/语料库的Korpora包。

2020年9月8日更新

已通过Github Release上传训练数据。

但由于每个文件2GB以内的限制,已进行分卷压缩。

请通过以下链接下载。(无需注册即可下载。分卷压缩)

如果您想下载单个文件或在Kaggle上查看数据,请使用以下Kaggle数据集。

  • Github发布:https://github.com/Beomi/KcBERT/releases/tag/TrainData_v1

2020年8月22日更新

预训练数据集公开

  • Kaggle:https://www.kaggle.com/junbumlee/kcbert-pretraining-corpus-korean-news-comments(可下载单个文件)

我们已在Kaggle上公开了为训练而整理的(经过下面clean处理的)数据集!

请自行下载并在各种任务上进行训练吧 :)


已公开的韩语BERT大多是基于韩语维基百科、新闻报道、书籍等精心整理的数据进行训练的模型。另一方面,像NSMC这样的评论型数据集实际上未经整理,具有口语特点,包含许多新造词,并且像错别字等在正式写作中不会出现的表达频繁出现。

为了将KcBERT应用于具有上述特性的数据集,我们从Naver新闻收集了评论和回复,从头开始训练了分词器和BERT模型,这就是预训练的BERT模型KcBERT。

KcBERT可以通过Huggingface的Transformers库轻松加载使用。(无需单独下载文件。)

KcBERT 성능

  • 파인튜닝 코드는 https://github.com/Beomi/KcBERT-finetune 에서 확인하실 수 있습니다.
Size
(용량)
NSMC
(acc)
Naver NER
(F1)
PAWS
(acc)
KorNLI
(acc)
KorSTS
(spearman)
Question Pair
(acc)
KorQuaD (Dev)
(EM/F1)
KcBERT-Base417M89.6284.3466.9574.8575.5793.9360.25 / 84.39
KcBERT-Large1.2G90.6885.5370.1576.9977.4994.0662.16 / 86.64
KoBERT351M89.6386.1180.6579.0079.6493.9352.81 / 80.27
XLM-Roberta-Base1.03G89.4986.2682.9579.9279.0993.5364.70 / 88.94
HanBERT614M90.1687.3182.4080.8983.3394.1978.74 / 92.02
KoELECTRA-Base423M90.2186.8781.9080.8583.2194.2061.10 / 89.59
KoELECTRA-Base-v2423M89.7087.0283.9080.6184.3094.7284.34 / 92.58
DistilKoBERT108M88.4184.1362.5570.5573.2192.4854.12 / 77.80

*HanBERT의 Size는 Bert Model과 Tokenizer DB를 합친 것입니다.

*config의 세팅을 그대로 하여 실행한 결과이며, 하이퍼파라미터 튜닝을 추가적으로 할 경우 더 좋은 성능이 나올 수 있습니다.

使用方法

环境要求

  • pytorch <= 1.8.0
  • transformers ~= 3.0.1
    • 也兼容 transformers ~= 4.0.0。
  • emoji ~= 0.6.0
  • soynlp ~= 0.0.493
from 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 链接汇总

预训练数据

  • 数据集下载(Kaggle,单文件,需登录)
  • 数据集下载(Github,多个压缩文件,无需登录)

预训练代码

在 Colab 中使用 TPU 进行 KcBERT 预训练: 在 Colab 中打开

微调示例

KcBERT-Base 使用 PyTorch-Lightning 进行 NSMC 微调(Colab) 在 Colab 中打开

KcBERT-Large 使用 PyTorch-Lightning 进行 NSMC 微调(Colab) 在 Colab 中打开

上述两个代码仅预训练模型(base、large)和 batch size 不同,其余代码完全一致。

训练数据与预处理

原始数据

训练数据是 2019 年 1 月 1 日至 2020 年 6 月 15 日期间发表的评论量大的新闻文章的评论及回复的全部收集数据。

仅提取文本时,数据大小约为 15.4GB,由超过 1.1 亿个句子组成。

预处理

为进行 PLM 训练而执行的预处理过程如下:

  1. 韩语及英语、特殊字符,乃至表情符号(🥳)!

    通过正则表达式将韩语、英语、特殊字符以及表情符号都纳入了训练范围。

    同时,将韩语范围指定为 ㄱ-ㅎ가-힣,排除了 ㄱ-힣 内的汉字。

  2. 评论内重复字符串缩减

    将 ㅋㅋㅋㅋㅋ 等重复字符合并为 ㅋㅋ 等形式。

  3. 大小写敏感模型(Cased Model)

    KcBERT 对于英文是保留大小写的 Cased model。

  4. 字符单位 10 字以下去除

    10 字以下的文本大多由单个单词组成,因此将这部分排除。

  5. 去重

    为去除重复的评论,将重复评论合并为一条。

通过以上处理得到的最终训练数据为 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 上发布)

您可以在以下 Kaggle 数据集中下载使用上述 clean 函数对原始数据进行清洗后、大小为 12GB 的 txt 文件 :)

https://www.kaggle.com/junbumlee/kcbert-pretraining-corpus-korean-news-comments

分词器训练

分词器是通过 Huggingface 的库进行训练的。

其中,我们使用 BertWordPieceTokenizer 进行训练,词汇表大小设为 30000。

分词器的训练使用了 1/10 比例采样的数据,为了更均匀地采样,我们按日期进行分层后再进行训练。

BERT 模型预训练

  • KcBERT Base 配置
{
    "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"
}
  • KcBERT Large 配置
{
    "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步之后则呈现缓慢下降趋势。

  • Base Model Loss

KcBERT-Base Pretraining Loss

  • Large Model Loss

KcBERT-Large Pretraining Loss

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

示例

HuggingFace MASK LM

可按以下方式进行测试。

오늘은 날씨가 "좋네요", KcBERT-Base

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

image-20200806160624340

NSMC Binary Classification

我们以네이버 영화평 코퍼스数据集为对象进行了微调(Fine Tuning),以简单测试模型性能。

Base Model的微调代码可在 Open In Colab 中直接运行。

Large Model的微调代码可在 Open In Colab 中直接运行。

  • 在GPU P100 x1的配置下,每轮(1epoch)训练需要2-3小时;使用TPU则可在1小时内完成每轮训练。
  • 在GPU RTX Titan x4的配置下,每轮训练约需30分钟。
  • 示例代码基于pytorch-lightning开发。

实验结果

  • KcBERT-Base Model 实验结果:验证集准确率(Val acc).8905

    KcBERT Base finetune on NSMC

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

    image-20200806190242834

我们计划在更多下游任务(Downstream Task)上进行测试并公开结果。

引用格式/Citation

引用 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}
}
  • 论文集下载链接: http://hclt.kr/dwn/?v=bG5iOmNvbmZlcmVuY2U7aWR4OjMy (*或 http://hclt.kr/symp/?lnb=conference )

Acknowledgement

用于训练 KcBERT Model 的 GCP/TPU 环境得到了 TFRC 项目的支持。

感谢在模型训练过程中提供诸多建议的 Monologg 先生 :)

Reference

Github 仓库

  • BERT by Google

  • KoBERT by SKT

  • KoELECTRA by Monologg

  • Transformers by Huggingface

  • Tokenizers by Hugginface

论文

  • BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

博客

  • Monologg 先生的 KoELECTRA 学习笔记
  • 在 Colab 上使用 TPU 从零开始训练 BERT - Tensorflow/Google 版本