关于transformers中bert api结构描述

BERT的结构说明

关于bert网络结构叙述比较清楚的博客

总结一下:

在原始的bert模型中,有两个训练任务,masked prediction(M)和next sentence prediction(NSP),所以针对这两个任务,在基本的BertModel主体后面接有两个branch,分别负责一个任务。最后算两个支路的损失之和。

结构总结:

先说BertModel这个基础的主体机构,在上面的链接文章中已经说得比较详细了,就是分为embedding,encoder,pooler这三部分,输出是encoder和pooler两个输出。(这里具体说一下,pooler就是一个全连接层和激活层,对encoder输出的feature的第一个词向量,即[CLS]对应的输出,进行一个全连接的计算,输出还是768维。而encoder输出就是全部的词向量)。

在BertModel的基础上,NSP分支就是一个全连接,称为seq_relationship(在权重命名中体现),将pooler输出的向量变成2维(是/否下一句话)。M分支是称为predictions,它包括transform,decoder两部分,transform是768->768的全连接,decoder是768->21128的反embedding层,实现嵌入到稀疏编码的转换。

最后,我们做损失时,对于NSP分支,就是二分类损失,对于M分支,就是对应mask位置的独热码的交叉熵损失。总的损失就是两者之和。(之前不理解两个预训练任务是怎么做的,这里说明是同时做的,多任务学习)

transformers api调用细节:

然后,关于我们使用pytorch的transformers调用bert模型api时,很多调用方式,比如AutoModel,BertModel等,这里的话,两者是等效的,AutoModel最后也是找到bertmodel调用。还有就是,我们需要注意有几种结构调用,比如
BertModel.from_pretrained(),
BertForNextSentencePrediction.from_pretrained(),
BertModelForMaskedLM.from_pretrained(),
BertModelForSequenceClassification.from_pretrained(),

我们先说第一个,第一个调用的是我们上面说的BertModel主体,不含两个branch。
第二个和第三个就是调用的整个Model的每个分支,即NSP和M分支。
最后一个跟第二个很像,都是做一个分类任务,但是不一样的地方在于,最后一个模型做的是通用的分类,比如情感,主题等,而第二个是原生bert模型里的那个分支,预训练为上下句预测任务,所以两者在权重加载时会有区别。
我们加载的预训练模型都是bertmodel带两个分支的(2022.10更正)。

对于加载预训练模型,有如下两种方式,一种是直接在.from_pretrained()中放模型的名字。另一种是放预先下载好的模型权重的路径,但是在此之前要预先加载模型的config文件,这个在下载权重时会有。然后,对于上面的前三个调用模式,可以直接加载预训练权重,只不过有些是用不到的,但是对于最后一个,最后的分类全连接权重是不能直接从权重中获得的,是随机初始化。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值