Learner0x5a's Studio.

Huggingface笔记

Word count: 261Reading time: 1 min
2021/11/03 Share

需求1: 自定义tokenizer

官方文档给出了很好的说明。
但都是要训练的tokenizer,如果想要实现一个完全自定义的,
需要参考这里

如果无法魔改,那么可以先用自己的方法分完词,用分好词之后的预料训练一个huggingface的WhiteSpace pretokenizer。

wsf:直接自己把token转成id,把id序列给bert即可。(这样不能用huggingface了)

要用huggingface的话,传一个vocab_file给BertTokenizerFast。

或者参考
# Loading from a JSON file

1
2
from transformers import PreTrainedTokenizerFast
fast_tokenizer = PreTrainedTokenizerFast(tokenizer_file="tokenizer.json")

需求2: 自定义mask

需要修改DataCollatorForLanguageModeling
源码
的torch_mask_tokens方法,官方代码利用伯努利分布随机采样得到mask:

1
2
3
4
5
6
7
8
9
...
probability_matrix.masked_fill_(special_tokens_mask, value=0.0)
masked_indices = torch.bernoulli(probability_matrix).bool()
labels[~masked_indices] = -100 # We only compute loss on masked tokens; ~表示按位取反

# 80% of the time, we replace masked input tokens with tokenizer.mask_token ([MASK])
indices_replaced = torch.bernoulli(torch.full(labels.shape, 0.8)).bool() & masked_indices
inputs[indices_replaced] = self.tokenizer.convert_tokens_to_ids(self.tokenizer.mask_token)
...

注:huggingface的attention mask是用来处理多序列的padding的情况。
参考:
https://cloud.tencent.com/developer/article/1885829
https://huggingface.co/transformers/glossary.html

CATALOG
  1. 1. 需求1: 自定义tokenizer
  2. 2. 需求2: 自定义mask