热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

huggingfacetransformers框架学习

前言该框架可以说非常简单,是基于pytorch的预训练框架,很多开源项目都是基于其开发的,所以学一学很有必要,对我们自己i
前言

该框架可以说非常简单,是基于pytorch的预训练框架,很多开源项目都是基于其开发的,所以学一学很有必要,对我们自己idea的快速落地也有很大的帮助。

关于其简单的用法【比如怎么fintune】,网上一大推,这里不再累述,本篇主要讲一下面对一些较为复杂的需求的时候,我们该怎么办,同时罗列一些案例【一些paper和开源项目】进行参考,以后大家可以仿照这些例子进行魔改自己的需求,这也是本篇区别其他的博客的一个最大亮点。

文档:BERT — transformers 4.11.3 documentation

二次预训练

网上一堆fintune的demo,但是对pretrain的讲解却很少,即使有,也是一些理论分析,假设我现在就是想在我自己领域的语料上继续无监督预训练一下模型,该怎么办呢?甚至我现在有了自己一个新的mask策略【mlm】或者我还想多加几个自己想的辅助性任务【原始bert是mlm和nsp】,这时候怎么使用该框架在公开的预训练模型上热启接着预训练呢?

这方面的demo基本没有,这里分享一个笔者看过的开源项目,这是一个二次预训练的demo,其涉及到mlm实现以及怎么加辅助性任务甚至该transformers源码。

笔者也对其进行了代码解读,感兴趣的可以看一下:

ERICA 代码解读_爱吃火锅的博客-CSDN博客

也可以看:

https://colab.research.google.com/github/huggingface/blog/blob/master/notebooks/01_how_to_train.ipynb#scrollTo=IMnymRDLe0hi

获取各种返回

我们有时候想获得bert的一些中间层的输出,如12层的transformer每一层的输出或者各个attentions的输出等等,其实该框架的API设置都可以返回:

只要要在调用API时将output_hidden_states和output_attentions设置为True如下:

那么返回的结果就有了

随便为了方便取得对应结果,可以将71行的retuen_dict也设置为True,这样在取结果时就很方便,如

取pooler_output:output_dict['pooler_output']

取hidden_states:output_dict['hidden_states']

取attentions:output_dict['attentions']

需要注意,其中hidden_states和attentions返回的都是一个tuple不是tensor,且前者是一个13层【emb+each layer】,后者是一个12层【each layer】,如下:

那什么时候,需要这些结果呢?这里举个例子:蒸馏,蒸馏这个场景下就经常会使用到这些结果,具体怎么在该框架下蒸馏呢?这里也分享一个笔者看过的项目,笔者也对其进行了解读,感兴趣的可以看:

对话系统评价指标QuantiDCE 代码解读_爱吃火锅的博客-CSDN博客

具体蒸馏代码在fintune一节中

当然关于在huggingface框架下进行蒸馏也有一个开源框架即TextBrewer,其是哈工大讯飞联合实验室发布的,感兴趣的也可以用一用

论文:https://arxiv.org/abs/2002.12620

源码:GitHub - airaria/TextBrewer: A PyTorch-based knowledge distillation toolkit for natural language processing

层数的重定义

待更新


推荐阅读
author-avatar
手机用户2602889207
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有