预训练细节

数据处理

1. 切分大文件

执行auto_split.sh文件,作用是分割大文件,超过1GB的文件,会自动分割未300M的小文件

使用split命令将文件分割成300M一份的小文件,并将分割后的文件以两位数字结尾,保存在原文件所在目录下,然后使用ls命令获取当前目录下所有文件,通过grep和正则表达式找到带有两位数字结尾的文件,并使用xargs -n1 -i{
   
   } mv {
   
   } {
   
   }.json命令将这些文件重命名为.json文件。
split -a 2 -C 300M $p $file/$name- && ls|grep -E "(-[a-zA-Z]{2})" |xargs -n1 -i{
   
   } mv {
   
   } {
   
   }.json

2. 分句

执行preprocessing.py文件,该文件的作用主要是分句,为什么不嵌入到collate_fn中做,是发现那样效率会慢一些,所以单独拿出来做了

3. 加载数据

load.py文件是用fsdata的方式加载数据集,也是执行即可。执行一遍,后续的加载可以实现180GB的数据秒入

token实现Mask

NSP任务,只做mask任务,具体mask策略如下:

  • 15%随机mask
    • 80% mask
    • 10% 随机替换
    • 10% 保持不变
  • 全词mask (wwm)
  • n-gram mask
class DataCollate(object):

    def __init__(self, tokenizer, max_length, mask_rate=0.15, max_ngram=3, if_padding=True) -> None:
        self.tokenizer = tokenizer	
        self.max_length = max_length
        self.word_cuter = jieba.cut		#分词器
        self.vocab_length = len(tokenizer)	#词表长度
        self.mask_rate = mask_rate	#mask的比例
        self.ignore_labels = -100	#忽略计算的label
        self.ngrams = np.arange(1, max_ngram + 1, dtype=np.int64) # 最大的grams
        pvals = 1. / np.arange(1, max_ngram + 1)
        pvals /= pvals.sum(keepdims=True)  # p(n) = 1/n / sigma(1/k)
        self.pvals = pvals
        self.padding = if_padding

    def token_process(self, token_id):
        rand = np.random.random()
        if rand <= 0.8:  # 80% mask
            return self.tokenizer.mask_token_id
        elif rand <= 0.9: # 10%保持不变
            return token_id
        else: # 10%随机替换
            return np.random.randint(1, self.vocab_length)

    def __call__(self, samples):
        input_ids = []
        attention_mask = []
        token_type_ids = []
        batch_labels = []
        # print('^-^ batch size :',len(samples))
        for sample in samples:
            word_list = list(self.word_cuter(sample['text'])) #句子分词后列表
            mask_ids, labels = [], []

            record = []
            for i in range(len(word_list)): #遍历
                rands = np.random.random()
                if i in record:
                    continue
                word = word_list[i]
                if rands > self.mask_rate and len(word) < 4: # 全词mask
                    word = word_list[i]
                    word_encode = tokenizer.encode(word, add_special_tokens=False)
                    for token in word_encode:
                        mask_ids.append(token
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值