模型:

dkleczek/bert-base-polish-cased-v1

英文

Polbert - 波兰Bert

波兰版的BERT语言模型来了!现在有大小写两个变体可供下载和使用,都可以通过HuggingFace transformers库使用。我建议使用大小写模型,下面有关差异和基准结果的更多信息。

大小写变体

  • 我最初训练了小写模型,语料库和训练细节如下。发布小写模型后,我发现了以下一些问题:
    • 当应用小写时,BERT分词器无法正确标记一些波兰字符和重音符号。这对于序列分类影响不大,但可能会对标记分类任务产生重大影响。
    • 我注意到在开放字幕数据集中有很多重复内容,这主导了训练语料库。
    • 我没有使用整词掩蔽。
  • 大小写模型在以下方面改进了小写模型:
    • 现在所有波兰字符和重音符号应该都能被正确标记。
    • 我从开放字幕数据集中删除了重复内容。语料库变小了,但现在更平衡了。
    • 该模型采用整词掩蔽进行训练。

预训练语料库

以下是使用的语料库列表,以及wc命令的输出结果(统计行数、单词数和字符数)。这些语料库经过srxsegmenter分句(参见参考文献),并使用HuggingFace BERT Tokenizer进行标记。

小写

Tables Lines Words Characters
1233321 236635408 1431199601 7628097730
1234321 8470950 176670885 1163505275
1235321 9799859 121154785 938896963
1236321 8014206 132067986 1015849191
Total 262920423 1861093257 10746349159

大小写

Tables Lines Words Characters
1237321 41998942 213590656 1424873235
1234321 8470950 176670885 1163505275
1235321 9799859 121154785 938896963
1236321 8014206 132067986 1015849191
Total 68283960 646479197 4543124667

预训练细节

小写

  • Polbert使用Google BERT的github存储库中提供的代码进行训练( https://github.com/google-research/bert
  • 当前发布的模型遵循bert-base-uncased模型架构(12层,768隐藏层,12个头部,110M参数)
  • 训练设置:总共100万个训练步骤:
    • 100,000个步骤 - 128个序列长度,批量大小512,学习速率1e-4(10,000个步骤预热)
    • 800,000个步骤 - 128个序列长度,批量大小512,学习速率5e-5
    • 100,000个步骤 - 512个序列长度,批量大小256,学习速率2e-5
  • 该模型是在单个Google Cloud TPU v3-8上训练的

大小写

  • 与小写模型相同的方法,以下是区别:
    • 整词掩蔽
  • 训练设置:
    • 100,000个步骤 - 128个序列长度,批量大小2048,学习速率1e-4(10,000个步骤预热)
    • 100,000个步骤 - 128个序列长度,批量大小2048,学习速率5e-5
    • 100,000个步骤 - 512个序列长度,批量大小256,学习速率2e-5

用法

Polbert可通过 HuggingFace Transformers library 发布。

关于如何将其用作语言模型的示例,请参见此笔记本文件。

小写

from transformers import *
model = BertForMaskedLM.from_pretrained("dkleczek/bert-base-polish-uncased-v1")
tokenizer = BertTokenizer.from_pretrained("dkleczek/bert-base-polish-uncased-v1")
nlp = pipeline('fill-mask', model=model, tokenizer=tokenizer)
for pred in nlp(f"Adam Mickiewicz wielkim polskim {nlp.tokenizer.mask_token} był."):
  print(pred)
# Output:
# {'sequence': '[CLS] adam mickiewicz wielkim polskim poeta był. [SEP]', 'score': 0.47196975350379944, 'token': 26596}
# {'sequence': '[CLS] adam mickiewicz wielkim polskim bohaterem był. [SEP]', 'score': 0.09127858281135559, 'token': 10953}
# {'sequence': '[CLS] adam mickiewicz wielkim polskim człowiekiem był. [SEP]', 'score': 0.0647173821926117, 'token': 5182}
# {'sequence': '[CLS] adam mickiewicz wielkim polskim pisarzem był. [SEP]', 'score': 0.05232388526201248, 'token': 24293}
# {'sequence': '[CLS] adam mickiewicz wielkim polskim politykiem był. [SEP]', 'score': 0.04554257541894913, 'token': 44095}

大小写

model = BertForMaskedLM.from_pretrained("dkleczek/bert-base-polish-cased-v1")
tokenizer = BertTokenizer.from_pretrained("dkleczek/bert-base-polish-cased-v1")
nlp = pipeline('fill-mask', model=model, tokenizer=tokenizer)
for pred in nlp(f"Adam Mickiewicz wielkim polskim {nlp.tokenizer.mask_token} był."):
  print(pred)
# Output:
# {'sequence': '[CLS] Adam Mickiewicz wielkim polskim pisarzem był. [SEP]', 'score': 0.5391148328781128, 'token': 37120}
# {'sequence': '[CLS] Adam Mickiewicz wielkim polskim człowiekiem był. [SEP]', 'score': 0.11683262139558792, 'token': 6810}
# {'sequence': '[CLS] Adam Mickiewicz wielkim polskim bohaterem był. [SEP]', 'score': 0.06021466106176376, 'token': 17709}
# {'sequence': '[CLS] Adam Mickiewicz wielkim polskim mistrzem był. [SEP]', 'score': 0.051870670169591904, 'token': 14652}
# {'sequence': '[CLS] Adam Mickiewicz wielkim polskim artystą był. [SEP]', 'score': 0.031787533313035965, 'token': 35680}

有关Polbert在下游任务中的示例用法,请参见下一节。

评估

感谢Allegro,我们现在有了 KLEJ benchmark ,这是一组用于波兰语理解的九个评估任务。以下结果是通过运行标准的评估脚本(没有任何技巧!)来利用大小写和小写两个变体的Polbert实现的。

Model Average NKJP-NER CDSC-E CDSC-R CBD PolEmo2.0-IN PolEmo2.0-OUT DYK PSC AR
Polbert cased 81.7 93.6 93.4 93.8 52.7 87.4 71.1 59.1 98.6 85.2
Polbert uncased 81.4 90.1 93.9 93.5 55.0 88.1 68.8 59.4 98.8 85.4

注意,小写模型在某些任务上的表现优于大小写模型?我猜这是因为开放字幕数据集的过采样及其与某些任务中的数据的相似性。所有这些基准任务都是序列分类,因此在这里大小写模型的相对优势不太明显。

偏差

用于训练模型的数据存在偏差。它可能反映了与性别、种族等有关的刻板印象。在使用模型进行下游任务时,请谨慎考虑这些偏见并予以缓解。

致谢

  • 我要对Google TensorFlow Research Cloud (TFRC) 提供免费的TPU积分表示感谢-谢谢你!
  • 也感谢 deepset 的Timo Möller分享了他们在训练德语BERT模型方面的经验,并分享了一些提示和脚本。
  • 非常感谢Allegro发布KLEJ基准测试,并特别感谢Piotr Rybak在评估方面的帮助,并指出了一些标记化的问题。
  • 最后,感谢 fastai 的Rachel Thomas,Jeremy Howard和Sylvain Gugger提供的他们的自然语言处理和深度学习课程!

作者

Darek Kłeczek-在Twitter上联系我 @dk21

参考文献