一行代码带你随心所欲重新初始化bert的参数(附Pytorch代码详细解读)

2020 年 10 月 11 日 AINLP


之前那个关于  Bert优化的文章[点这里观看此文章]  写完之后,有的同学私下问我怎么做的Bert的权重初始化,吐血...(小朋友,你是不是有很多的问号)

我觉得比直接告诉大家代码更好的方法是告诉大家我之前是怎么想怎么做的,所以,决定详细写一写,把思路和代码都分享给大家,欢迎一起探讨。

Bert我们一般使用方法是,加载预训练模型,在我们自己的任务上进行微调。但是我们有些时候会遇到这种情况,比如说,之前文章提到的,我不想要你预训练模型中最后三层参数,而是使用我自己的方法重新初始化。

首先解释一下为什么需要这么做?有的论文发现,bert越靠后面(越靠近顶层,也就是输出层),学到的知识越是笔记抽象高级的知识,越靠近预训练模型的任务情况,和我们自己的任务就不太相符,所以想要重新初始化,基于我们自己的任务从零学习。

文中涉及到的所有代码都放在了这里:

https://github.com/DA-southampton/NLP_ability

推荐大家用github观看,微信内置链接没有跳转,太影响体验了,之前那个手撕 bert源码的文章也是因为这个我没传到微信上来,那个文章把涉及到的代码链接都列出来了,但是没有跳转功能太坑了。

大家觉得不错的,点个在看叭。

话说,微信有没有考虑过和起点app学一下,加个句评(每句话都可以评论),感觉是个增加互动的一个好方法啊,也方便作者抄书评(遁)


思路和代码

好了,代码是怎么实现?

一般 pytorch 的初始化方法我就不说了,这个比较简单,之后可能有时间写一下,这里专门介绍一下 bert 里面如何去做。

首先,我们看一下源代码,加载模型的时候是怎么加载的:

model = model_class.from_pretrained(args.model_name_or_path, from_tf=bool('.ckpt' in args.model_name_or_path), config=config)

这行代码对应的链接:(见github)

再执行到这里之后,会进入并执行这个函数:

def from_pretrained(cls, pretrained_model_name_or_path, *model_args, **kwargs):

代码链接在这里: (见github)

这个函数就是我们要修改的函数,核心操作是这个操作:

module._load_from_state_dict(state_dict, prefix, local_metadata, True, missing_keys, unexpected_keys, error_msgs)

代码链接在这里: (见github)

我们来重点看一下个函数,最重要的是两个参数:

missing_keys:就是我们自己定义的模型有哪些没在预训练模型中,比如我们的模型现在是 BertForSequenceClassification ,那么这里结果就是 ['classifier.weight', 'classifier.bias']

unexpected_keys: 预训练模型的参数有很多,这里的结果是定义的我们对哪些参数忽视,并不采用,这里的正常结果是这样的:

  • ['cls.predictions.bias', 'cls.predictions.transform.dense.weight', 'cls.predictions.transform.dense.bias', 'cls.predictions.transform.LayerNorm.weight', 'cls.predictions.transform.LayerNorm.bias', 'cls.predictions.decoder.weight', 'cls.seq_relationship.weight', 'cls.seq_relationship.bias']


重点来了!!!接下来教你一行代码初始化参数!!

如果,我们想要对第一层的query的参数进行重新初始化,怎么做??

分两个步骤,第一步,定义你想要重新初始化哪些参数,第二步代入进去,就是这么简单。

直接看代码:

unexpected_keys =['bert.encoder.layer.0.attention.self.query.weight','bert.encoder.layer.0.attention.self.query.bias']

就这么简单,这里定义了你的参数名称就可以!!

代码位置在这里:(见github)

打完收工,点个在看,ball ball you(好老的词了hhh),鞠躬感谢


由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方"AINLP",进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心

欢迎加入AINLP技术交流群
进群请添加AINLP小助手微信 AINLPer(id: ainlper),备注NLP技术交流

推荐阅读

这个NLP工具,玩得根本停不下来

征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)

完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)

从数据到模型,你可能需要1篇详实的pytorch踩坑指南

如何让Bert在finetune小数据集时更“稳”一点

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化

Node2Vec 论文+代码笔记

模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结

中文命名实体识别工具(NER)哪家强?

学自然语言处理,其实更应该学好英语

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


阅读至此了,分享、点赞、在看三选一吧🙏

登录查看更多
6

相关内容

BERT全称Bidirectional Encoder Representations from Transformers,是预训练语言表示的方法,可以在大型文本语料库(如维基百科)上训练通用的“语言理解”模型,然后将该模型用于下游NLP任务,比如机器翻译、问答。
【NeurIPS2020-华为】DynaBERT:具有自适应宽度和深度的动态BERT
还在修改博士论文?这份《博士论文写作技巧》为你指南
专知会员服务
110+阅读 · 2020年3月12日
Transformer文本分类代码
专知会员服务
118+阅读 · 2020年2月3日
BERT进展2019四篇必读论文
专知会员服务
69+阅读 · 2020年1月2日
ExBert — 可视化分析Transformer学到的表示
专知会员服务
32+阅读 · 2019年10月16日
听说你还没读过 Bert 源码?
AINLP
7+阅读 · 2019年8月7日
BERT源码分析PART I
AINLP
38+阅读 · 2019年7月12日
PyTorch模型训练特征图可视化(TensorboardX)
极市平台
33+阅读 · 2019年6月29日
【GitHub】BERT模型从训练到部署全流程
专知
34+阅读 · 2019年6月28日
PyTorch 学习笔记(五):Finetune和各层定制学习率
请快点粘贴复制,这是一份好用的TensorFlow代码集
详解谷歌最强NLP模型BERT(理论+实战)
AI100
11+阅读 · 2019年1月18日
手把手教TensorFlow(附代码)
深度学习世界
15+阅读 · 2017年10月17日
Arxiv
8+阅读 · 2020年10月9日
Arxiv
3+阅读 · 2019年9月5日
Arxiv
5+阅读 · 2019年8月22日
Arxiv
6+阅读 · 2019年8月22日
Star-Transformer
Arxiv
5+阅读 · 2019年2月28日
Conditional BERT Contextual Augmentation
Arxiv
8+阅读 · 2018年12月17日
VIP会员
相关VIP内容
【NeurIPS2020-华为】DynaBERT:具有自适应宽度和深度的动态BERT
还在修改博士论文?这份《博士论文写作技巧》为你指南
专知会员服务
110+阅读 · 2020年3月12日
Transformer文本分类代码
专知会员服务
118+阅读 · 2020年2月3日
BERT进展2019四篇必读论文
专知会员服务
69+阅读 · 2020年1月2日
ExBert — 可视化分析Transformer学到的表示
专知会员服务
32+阅读 · 2019年10月16日
相关资讯
听说你还没读过 Bert 源码?
AINLP
7+阅读 · 2019年8月7日
BERT源码分析PART I
AINLP
38+阅读 · 2019年7月12日
PyTorch模型训练特征图可视化(TensorboardX)
极市平台
33+阅读 · 2019年6月29日
【GitHub】BERT模型从训练到部署全流程
专知
34+阅读 · 2019年6月28日
PyTorch 学习笔记(五):Finetune和各层定制学习率
请快点粘贴复制,这是一份好用的TensorFlow代码集
详解谷歌最强NLP模型BERT(理论+实战)
AI100
11+阅读 · 2019年1月18日
手把手教TensorFlow(附代码)
深度学习世界
15+阅读 · 2017年10月17日
Top
微信扫码咨询专知VIP会员