基于韩语的BERT预训练模型 (KR-BERT)
这是由首尔大学计算语言学实验室开发的韩语特定、小规模BERT模型的发布版本,性能相当或更优,详见论文KR-BERT: A Small-Scale Korean-Specific Language Model。
词汇量、参数和数据
多语言BERT (Google) | KorBERT (ETRI) | KoBERT (SKT) | KR-BERT 字符 | KR-BERT 子字符 | |
---|---|---|---|---|---|
词汇量 | 119,547 | 30,797 | 8,002 | 16,424 | 12,367 |
参数大小 | 167,356,416 | 109,973,391 | 92,186,880 | 99,265,066 | 96,145,233 |
数据大小 | - (104种语言的维基百科数据) | 23GB 47亿形态素 | - (2500万句, 2.33亿词) | 2.47GB 2000万句, 2.33亿词 | 2.47GB 2000万句, 2.33亿词 |
模型 | 掩码语言模型准确率 |
---|---|
KoBERT | 0.750 |
KR-BERT 字符 双向WordPiece | 0.779 |
KR-BERT 子字符 双向WordPiece | 0.769 |
子字符
韩语文本基本上由谚文音节字符表示,这些字符可以分解为子字符或石墨。为了适应这些特点,我们在两种不同的语料表示上训练了新的词汇表和BERT模型:音节字符和子字符。
如果使用我们的子字符模型,你应该使用以下代码预处理数据。
from transformers import BertTokenizer
from unicodedata import normalize
vocab_url = 'https://raw.githubusercontent.com/snunlp/KR-BERT/master/krbert_pytorch/pretrained/vocab_snu_subchar12367.txt'
tokenizer_krbert = BertTokenizer.from_pretrained(vocab_url, do_lower_case=True)
# 将字符串转换为子字符
def to_subchar(string):
return normalize('NFKD', string)
sentence = '토크나이저 예시입니다.'
print(tokenizer_krbert.tokenize(to_subchar(sentence)))
分词
双向WordPiece分词器
我们使用双向WordPiece模型来减少搜索成本,同时保持选择的可能性。该模型在正向和反向两个方向应用BPE以获得两个候选项,并选择频率较高的那个。
多语言BERT | KorBERT 字符 | KoBERT | KR-BERT 字符 WordPiece | KR-BERT 字符 双向WordPiece | KR-BERT 子字符 WordPiece | KR-BERT 子字符 双向WordPiece | |
---|---|---|---|---|---|---|---|
냉장고 nayngcangko "refrigerator" | 냉#장#고 nayng#cang#ko | 냉#장#고 nayng#cang#ko | 냉#장#고 nayng#cang#ko | 냉장고 nayngcangko | 냉장고 nayngcangko | 냉장고 nayngcangko | 냉장고 nayngcangko |
춥다 chwupta "cold" | [UNK] | 춥#다 chwup#ta | 춥#다 chwup#ta | 춥#다 chwup#ta | 춥#다 chwup#ta | 추#ㅂ다 chwu#pta | 추#ㅂ다 chwu#pta |
뱃사람 paytsalam "seaman" | [UNK] | 뱃#사람 payt#salam | 뱃#사람 payt#salam | 뱃#사람 payt#salam | 뱃#사람 payt#salam | 배#ㅅ#사람 pay#t#salam | 배#ㅅ#사람 pay#t#salam |
마이크 maikhu "microphone" | 마#이#크 ma#i#khu | 마이#크 mai#khu | 마#이#크 ma#i#khu | 마이크 maikhu | 마이크 maikhu | 마이크 maikhu | 마이크 maikhu |
模型
TensorFlow | PyTorch | |||
---|---|---|---|---|
字符级 | 子字符级 | 字符级 | 子字符级 | |
WordPiece 分词器 | WP 字符 | WP 子字符 | WP 字符 | WP 子字符 |
双向 WordPiece 分词器 | BiWP 字符 | BiWP 子字符 | BiWP 字符 | BiWP 子字符 |
环境要求
- transformers == 2.1.1
- tensorflow < 2.0
下游任务
Naver 情感电影语料库 (NSMC)
-
如果你想使用我们模型的子字符版本,请将
subchar
参数设置为True
。 -
你可以通过为
tokenizer
参数输入bert
来使用原始的BERT WordPiece分词器,如果使用ranked
,则可以使用我们的双向WordPiece分词器。 -
tensorflow: 下载我们的预训练模型后,将它们放在
krbert_tensorflow
目录下的models
目录中。 -
pytorch: 下载我们的预训练模型后,将它们放在
krbert_pytorch
目录下的pretrained
目录中。
# pytorch
python3 train.py --subchar {True, False} --tokenizer {bert, ranked}
# tensorflow
python3 run_classifier.py \
--task_name=NSMC \
--subchar={True, False} \
--tokenizer={bert, ranked} \
--do_train=true \
--do_eval=true \
--do_predict=true \
--do_lower_case=False\
--max_seq_length=128 \
--train_batch_size=128 \
--learning_rate=5e-05 \
--num_train_epochs=5.0 \
--output_dir={output_dir}
PyTorch代码结构参考了https://github.com/aisolab/nlp_implementation 的结构。
NSMC 准确率
多语言BERT | KorBERT | KoBERT | KR-BERT 字符级 WordPiece | KR-BERT 字符级 双向 WordPiece | KR-BERT 子字符级 WordPiece | KR-BERT 子字符级 双向 WordPiece | |
---|---|---|---|---|---|---|---|
pytorch | - | 89.84 | 89.01 | 89.34 | 89.38 | 89.20 | 89.34 |
tensorflow | 87.08 | 85.94 | n/a | 89.86 | 90.10 | 89.76 | 89.86 |
引用
如果您使用这些模型,请引用以下论文:
@article{lee2020krbert,
title={KR-BERT: A Small-Scale Korean-Specific Language Model},
author={Sangah Lee and Hansol Jang and Yunmee Baik and Suzi Park and Hyopil Shin},
year={2020},
journal={ArXiv},
volume={abs/2008.03979}
}