预训练任务

news2024/11/28 12:51:06

预训练任务 - Mask Language Model

  1. jieba预分词
  2. 长度小于4的词直接mask(mask_ids就是input_ids)
if rands > self.mask_rate and len(word) < 4:
	word = word_list[i]
	word_encode = tokenizer.encode(word, add_special_tokens=False)
	for token in word_encode:
	    mask_ids.append(token)
	    labels.append(self.ignore_labels)
	record.append(i)
  1. 剩余的词按照ngrams随机抽取mask,mask_rate为0.8
else:
	n = np.random.choice(self.ngrams, p=self.pvals)
	for index in range(n):
	    ind = index + i
	    if ind in record or ind >= len(word_list):
	        continue
	    record.append(ind)
	    word = word_list[ind]
	    word_encode = tokenizer.encode(word, add_special_tokens=False)
	    for token in word_encode:
	        mask_ids.append(self.token_process(token))
	        labels.append(token)
  1. Mask机制:80%mask,10%不变,10%随机替换
def token_process(self, token_id):
        rand = np.random.random()
        if rand <= 0.8:
            return self.tokenizer.mask_token_id
        elif rand <= 0.9:
            return token_id
        else:
            return np.random.randint(1, self.vocab_length)
  1. 结果
#     print('sentence:',sample['text'])
#     print('input_ids:',mask_ids)
#     print('decode inputids:',self.tokenizer.decode(mask_ids))
#     print('labels',labels)
#     print('decode labels:',self.tokenizer.decode(labels))
#     print('*'*20)
      return {
           'input_ids': torch.tensor(input_ids), # mask_ids
           'labels': torch.tensor(batch_labels), # labels
           'attention_mask': torch.tensor(attention_mask),
           'token_type_ids': torch.tensor(token_type_ids)
       }

预训练任务 - Sentence Order Predict

  1. 把输入文本分割成两个部分A和B
def get_a_and_b_segments(sample, np_rng):
    """Divide sample into a and b segments."""

    # Number of sentences in the sample.
    n_sentences = len(sample)
    # Make sure we always have two sentences.
    assert n_sentences > 1, 'make sure each sample has at least two sentences.'

    # First part:
    # `a_end` is how many sentences go into the `A`.
    a_end = 1
    if n_sentences >= 3:
        # Note that randin in numpy is exclusive.
        a_end = np_rng.randint(1, n_sentences)
    tokens_a = []
    for j in range(a_end):
        tokens_a.extend(sample[j])

    # Second part:
    tokens_b = []
    for j in range(a_end, n_sentences):
        tokens_b.extend(sample[j])

    # Random next:
    is_next_random = False
    if np_rng.random() < 0.5:
        is_next_random = True
        tokens_a, tokens_b = tokens_b, tokens_a

    return tokens_a, tokens_b, is_next_random
  1. max_seq_length - 3因为还需要拼上[CLS] ,[SEP] ,[SEP]
  2. 每一个句子内按照字进行Mask
# Masking.
max_predictions_per_seq = self.masked_lm_prob * len(tokens)

(tokens, masked_positions, masked_labels, _, _) = create_masked_lm_predictions(
     tokens, self.vocab_id_list, self.vocab_id_to_token_dict, self.masked_lm_prob,
     self.tokenizer.cls_token_id, self.tokenizer.sep_token_id, self.tokenizer.mask_token_id,
     max_predictions_per_seq, self.np_rng,
     masking_style='bert')
  • 注意需要考虑Bert的WordPiece的分词格式,兼容以前##的形式,如果后面的词是##开头的,那么直接把后面的拼到前面当作一个词
  • 如何抽取词进行Mask,需要采样,几何分布
if not geometric_dist:
       n = np_rng.choice(ngrams[:len(cand_index_set)],
                          p=pvals[:len(cand_index_set)] /
                          pvals[:len(cand_index_set)].sum(keepdims=True))
else:
    # Sampling "n" from the geometric distribution and clipping it to
    # the max_ngrams. Using p=0.2 default from the SpanBERT paper
    # https://arxiv.org/pdf/1907.10529.pdf (Sec 3.1)
    n = min(np_rng.geometric(0.2), max_ngrams)
  1. Span Mask
# 合并[MASK] 因为这里用的是Bert的mask函数,Bert是按字mask的,
# 这里把连续的mask合并成一个MASK从而达到span mask的效果
span_mask_souce = []
for t in source:
    # 如果是连续的多个mask,则跳过
    if len(span_mask_souce) > 0 \
            and t is self.tokenizer.mask_token_id \
            and span_mask_souce[-1] is self.tokenizer.mask_token_id:
        continue
    span_mask_souce.append(t)

source = torch.LongTensor(span_mask_souce)

预训练任务 - BART自回归掩码

  • 注意BART的任务,自回归掩码
prev_output_tokens = torch.zeros_like(target)
# match the preprocessing in fairseq
prev_output_tokens[0] = self.tokenizer.sep_token_id
prev_output_tokens[1:] = target[:-1]

source_ = torch.full((self.max_seq_length,),
                     self.tokenizer.pad_token_id, dtype=torch.long)
source_[:source.shape[0]] = source
target_ = torch.full((self.max_seq_length,), -100, dtype=torch.long)
target_[:target.shape[0]] = target
prev_output_tokens_ = torch.full(
    (self.max_seq_length,), self.tokenizer.pad_token_id, dtype=torch.long)
prev_output_tokens_[:prev_output_tokens.shape[0]] = prev_output_tokens
attention_mask = torch.full((self.max_seq_length,), 0, dtype=torch.long)
attention_mask[:source.shape[0]] = 1
model_inputs.append({
    "input_ids": source_,
    "labels": target_,
    "decoder_input_ids": prev_output_tokens_,
    "attention_mask": attention_mask,
})
  • 除了算loss,还可以算acc
def comput_metrix(self, logits, labels):
    label_idx = labels != -100
    labels = labels[label_idx]
    logits = logits[label_idx].view(-1, logits.size(-1))
    y_pred = torch.argmax(logits, dim=-1)
    y_pred = y_pred.view(size=(-1,))
    y_true = labels.view(size=(-1,)).float()
    corr = torch.eq(y_pred, y_true)
    acc = torch.sum(corr.float())/labels.shape[0]
    return acc

预训练任务 - Next Token Predict

  • https://github.com/Morizeyao/GPT2-Chinese/blob/old_gpt_2_chinese_before_2021_4_22/train.py
  • https://medium.com/@akash.kesrwani99/understanding-next-token-prediction-concept-to-code-1st-part-7054dabda347

outputs = model.forward(input_ids=batch_inputs, labels=batch_inputs)
# forward
transformer_outputs = self.transformer(
            input_ids,
           ...
        )
hidden_states = transformer_outputs[0]
lm_logits = self.lm_head(hidden_states)
loss = None
 if labels is not None:
     labels = labels.to(lm_logits.device)
     shift_logits = lm_logits[..., :-1, :].contiguous()
     shift_labels = labels[..., 1:].contiguous()
     loss_fct = CrossEntropyLoss()
     loss = loss_fct(
         shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1)
     )

loss, logits = outputs[:2]


shift_logits = lm_logits[..., :-1, :].contiguous()  # sequence[:n-1] 
shift_labels = labels[..., 1:].contiguous()	# sequence[1:n]

自己写的代码:

model.train()
losses = []
for idx, data in enumerate(tqdm(loader, desc = f"Epoch {epoch}"), 0):
    y = data["target_ids"].cuda()
    y_ids = y[:, :-1].contiguous()
    lm_labels = y[:, 1:].clone().detach()
    lm_labels[y[:, 1:] == tokenizer.pad_token_id] = -100 # lm pad mask
    
    ids = data["source_ids"].cuda()
    mask = data["source_mask"].cuda()

    outputs = model(
        input_ids=ids, # 【0,n】
        attention_mask=mask,
        decoder_input_ids=y_ids, # 【0,n-1】
        labels=lm_labels, # 【1,n】
    )
    loss = outputs[0].sum()


举个例子:

input_sequence = 【0,1,2,3,4,5】

Decoder的【:n-1】和【1:n】两个序列
shift_logits =【0,1,2,3,4】
shift_labels = 【1,2,3,4,5】
这两个sequence计算ce loss,效果就是0预测1,1预测2,…

  • 也就是next token predict

在这里插入图片描述

T5的实验结论

预训练对比

迁移学习的核心思想就是两阶段:Pre-Train,Fine-tuning

Preliminary work that applied the transfer learning paradigm of pre-training and fine-tuning all of the model’s parameters to NLP problems used a causal language modeling objective for pre-training

  • 预训练阶段:之前主要是因果语言建模(自回归),但是Bert的MLM做Pre-Train性能更佳
    在这里插入图片描述

MLM的方式又有讲究:
在这里插入图片描述
T5 Denoise的方式:
在这里插入图片描述

  • Token的增删替换打乱
    在这里插入图片描述

  • Mask的比例
    在这里插入图片描述

  • Mask合并成Span,Span的长度(spanbert中的几何分布)
    在这里插入图片描述

三大模型架构对应三大注意力机制:
在这里插入图片描述
在这里插入图片描述
总结一下实验策略:
在这里插入图片描述

训练策略

微调策略

  • adapter layers:在FFN层之后 加入dense-ReLU-dense blocks
  • Gradual unfreezing:只微调最后一层
    在这里插入图片描述

多任务学习

  • 在预训练时运用多任务学习,对下游任务没有增益,采样策略没有大的变化

  • 多任务训练集配比:N个任务,第M个任务训练集大小为K(最大值限制)
    计算公式如下:
    r m = m i n ( e m , K ) ∑ m i n ( e n , K ) r_m = \frac{min(e_m,K)}{\sum{min(e_n,K)}} rm=min(en,K)min(em,K)

  • 温度系数配比: T = 1,不变,T越大越接近等比例
    r m = ( m i n ( e m , K ) ∑ m i n ( e n , K ) ) 1 T r_m =(\frac{min(e_m,K)}{\sum{min(e_n,K)}})^{\frac{1}{T}} rm=(min(en,K)min(em,K))T1

  • 等比例采样


  • 在微调时运用多任务学习
  • 预训练时,一般都是无监督学习,那么CV里面会在预训练时使用有监督数据,这会有增益嘛?

结论:

  1. 多任务预训练后,再FT:和无监督预训练再FT差不多
  2. 不经过预训练直接微调:效果有点差
  3. 监督学习的多任务预训练:除了翻译任务,其他都非常差

在这里插入图片描述

Batch size 和训练step

在这里插入图片描述

Beam search

对于长序列的输出非常关键,对性能有提升

模型参数大小

  • Scaling Law成立,涌现现象也存在
    在这里插入图片描述
  • 关于数据的sclaing law,加大训练语料有增益,但也不完全取决于sclaing law

在这里插入图片描述

最后总结

  1. 对于短序列生成,建议无监督的目标函数
  2. 在领域内无监督的数据上预训练,会对下游任务产生增益,重复的数据会损失性能
  3. 训练生成式模型,需要大量且多样的数据集
  4. 小模型在大量数据上训练,要优于大模型在少量数据上训练

BART的预训练任务

  • 5种denoise的策略
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

BART做机器翻译任务

  • we replace BART’s encoder embedding layer with a new randomly initialized encoder.
    The model is trained end-to-end, which trains the new encoder to map foreign words into an input that BART can de-noise to English.

  • The new encoder can use a separate vocabulary from the original BART model.

两阶段训练:

  • In the first step, we freeze most of BART parameters and only update the randomly initialized source encoder, the BART positional embeddings, and the self-attention input projection matrix of BART’s encoder first layer

  • In the second step, we train all model parameters for a small number of iterations.

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1577764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode面试经典150_Q122买卖股票的最佳时机II

题目&#xff1a; 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得的 最大…

快速为App打造Android端聊天室,节省80%开发成本(一)

前言 环信 ChatroomUIKit 提供 UIKit 的各种组件&#xff0c;能帮助开发者根据实际业务需求快速搭建聊天室应用&#xff0c;有效节约开发成本&#xff01;通过该 UIKit&#xff0c;聊天室中的用户可实时交互&#xff0c;发送普通弹幕消息、打赏消息和全局广播等功能。 本文详…

紫叶写作能用吗 #微信#知识分享

紫叶写作是一款非常好用、靠谱的论文写作工具&#xff0c;它旨在帮助用户快速高效地完成论文写作任务&#xff0c;并提供查重降重的功能。它不仅操作简单方便&#xff0c;而且功能强大&#xff0c;能够有效提高论文写作的效率和质量。 首先&#xff0c;紫叶写作提供了丰富的模板…

10款白嫖党必备的ai写作神器,你都知道吗? #媒体#人工智能#其他

从事自媒体运营光靠自己手动操作效率是非常低的&#xff0c;想要提高运营效率就必须要学会合理的使用一些辅助工具。下面小编就跟大家分享一些自媒体常用的辅助工具&#xff0c;觉得有用的朋友可以收藏分享。 1.飞鸟写作 这是一个微信公众号 面向专业写作领域的ai写作工具&am…

jmeter压测websocket协议

一、jmeter 安装websocket插件 1、选项--插件管理 2、搜索WebSocket Samplers by Peter Doornbosch插件 进行安装 3、 重启 jmeter 二、jmeter压测websocket协议实战 2.1、以网站为例&#xff1a; websocket在线测试 1、断开连接 2、打开F12&#xff0c;查看WS数据 3、…

基于Socket简单的UDP网络程序

⭐小白苦学IT的博客主页 ⭐初学者必看&#xff1a;Linux操作系统入门 ⭐代码仓库&#xff1a;Linux代码仓库 ❤关注我一起讨论和学习Linux系统 1.前言 网络编程前言 网络编程是连接数字世界的桥梁&#xff0c;它让计算机之间能够交流信息&#xff0c;为我们的生活和工作带来便利…

电路基础-电容-电感

电路基础 电容 通交流阻直流&#xff0c;滤波&#xff0c;旁路&#xff0c;退耦&#xff0c;作驱动电源&#xff08;洗衣机电机启动时需要一个强电启动&#xff09; 电容选型的工程值&#xff1b;参考以往开发板的选型&#xff1b;抄作业。 电源并连多个电容的作用 保证单…

thinkphp6使用阿里云SDK发送短信

使用composer安装sdk "alibabacloud/dysmsapi-20170525": "2.0.24"封装发送短信类 发送到的短信参数写在env文件里面的 #发送短信配置 [AliyunSms] AccessKeyId "" AccessKeySecret "" signName"" templateCode"&…

泛微OA 自定义多选浏览框

1、建模引擎-》应用建模-》表单 2、建模引擎-》应用建模-》模块 3、建模引擎-》应用建模-》查询 4、把查询页面挂到前端页面。 效果展示&#xff1a; 5、建模引擎-》应用建模-》浏览框 6、流程表单中字段应用

Java环境变量配置说明

1、右键点击“此电脑”&#xff0c;选择“属性”项。 2、点击“高级系统设置”&#xff0c;在弹出的系统属性框中&#xff0c;选择“高级”选项卡&#xff08;默认即显示该选项卡&#xff09;&#xff0c;点击“环境变量”。 3、在弹出的“环境变量”框&#xff0c;中选择下方…

武汉凯迪正大—红外SF6检漏仪

产品概述 KDWG-III高精度SF6气体检漏仪&#xff08;手持式&#xff09;是测量SF6气体泄漏的新产品&#xff0c;采用进口传感器&#xff0c;它具有灵敏度高、稳定性好、响应速度快、操作简便、移动范围大&#xff0c;可迅速、准确的定性和定量检测SF6断路器和GIS的泄漏点及年泄…

如何利用Anaconda管理ArcGISPro相关环境

1.查看 目标下载scikit-learn以及scikit-image&#xff0c;以下是在ArcGISPro中查询库的结果 我们发现原始环境中不存在这两个库 2.修改 向Anaconda的Channels中添加esri的channel&#xff0c;点击add...直接输入esri即可 3.下载 接下来就可以直接下载自己需要的库了

说说对WebSocket的理解?应用场景?

一、是什么 WebSocket&#xff0c;是一种网络传输协议&#xff0c;位于OSI模型的应用层。可在单个TCP连接上进行全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通迅 客户端和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c…

2024通信技术与航空航天工程国际会议(ICCTAE2024)

2024通信技术与航空航天工程国际会议(ICCTAE2024) 会议简介 通信技术和航空航天领域有着密切的关联和深远的意义。 随着通信技术和航空航天工程的快速发展&#xff0c;这两个领域的交叉融合为学术界和工业界提供了广阔的研究空间和实际应用前景。为了进一步推动相关领域的发…

手把手教你免费领取雨云游戏云服务器

随着云计算技术的快速发展&#xff0c;云服务器已经成为许多开发者和创业者的首选。雨云游戏云服务器作为一款专为游戏开发者打造的高性能、低成本的云服务&#xff0c;吸引了越来越多的用户&#xff0c;本文将手把手教你如何免费领取雨云游戏云服务器。 1、访问雨云官网并注册…

SpringBoot快速入门笔记(5)

文章目录 一、elemetnUI1、main.js2、App.vue3、fontAwesome 一、elemetnUI 开源前端框架&#xff0c;安装 npm i element-ui -S 建议查看官方文档 Element组件&#xff0c;这里是Vue2搭配elementUI&#xff0c;如果是vue3就搭配elementPlus&#xff0c;这里初学就以Vue2为例子…

【JavaWeb】Day32.SpringBootWeb请求响应——分层解耦(二)

3.IOC&DI 3.1 IOC&DI入门 完成Controller层、Service层、Dao层的代码解耦 思路&#xff1a; 1. 删除Controller层、Service层中new对象的代码 2. Service层及Dao层的实现类&#xff0c;交给IOC容器管理 3. 为Controller及Service注入运行时依赖的对象 Controller程序…

健身房如何通过软文获客?媒介盒子告诉你

如今全民健康意识上升&#xff0c;大家越来越重视运动带给人的获得感以及成就感&#xff0c;对于健身房来说&#xff0c;适当进行推广&#xff0c;不仅可以提高品牌知名度&#xff0c;还能吸引更多的潜在客户。今天媒介盒子就从专业角度和大家聊聊&#xff1a;健身房如何通过软…

手机软件何时统一--桥接模式

1.1 凭什么你的游戏我不能玩 2007年苹果手机尚未出世&#xff0c;机操作系统多种多样&#xff08;黑莓、塞班、Tizen等&#xff09;&#xff0c;互相封闭。而如今&#xff0c;存世的手机操作系统只剩下苹果OS和安卓&#xff0c;鸿蒙正在稳步进场。 1.2 紧耦合的程序演化 手机…

Social Skill Training with Large Language Models

Social Skill Training with Large Language Models 关键字&#xff1a;社交技能训练、大型语言模型、人工智能伙伴、人工智能导师、跨学科创新 摘要 本文探讨了如何利用大型语言模型&#xff08;LLMs&#xff09;进行社交技能训练。社交技能如冲突解决对于有效沟通和在工作和…