1. HugBert系列
最近计划写一个HugBert系列。这个系列主要关注NLP中以BERT/Transformer为代表的预训练语言模型技术,以及由huggingface所维护的一系列开源库的应用和实现。
HugBert = Huggingface {transformers, tokeninizers, distilbert, conversational AI...} + Bert {PTMs, BERT, ALBERT, RoBERTa, ...}
这篇【HugBert01】算是先开个头吧,后续会边研究边实践边分享,从安装到主要应用实验,从源码解析到背景理论知识。水平有限,抛砖引玉。
在这个时点上,最火的深度学习自然语言处理技术加上最火的社区实现,相信一定会有值得一挖的宝藏。Let's hug BERT together.
2. Huggingface
Huggingface(抱抱脸)总部位于纽约,是一家专注于自然语言处理、人工智能和分布式系统的创业公司。他们所提供的聊天机器人技术一直颇受欢迎,但更出名的是他们在NLP开源社区上的贡献。Huggingface一直致力于自然语言处理NLP技术的平民化(democratize),希望每个人都能用上最先进(SOTA, state-of-the-art)的NLP技术,而非困窘于训练资源的匮乏。
除了官网,他们在http://medium.com上也时常有高质量的分享,这里是他们的medium主页。
https://medium.com/huggingface/aboutmedium.com/huggingface/about
3. Transformer结构和BERTology家族
2020年,NLP最前沿的研究领域基本上已经被大型语言模型+迁移学习这一范式所垄断了。
2017年6月,研究人员提出了Transformer编码解码结构, 这一结构也成为了后续一系列工作的基石。2018年10月,基于Transformer,Google的研究人员发布了“全面超越人类”的BERT,一种融合了双向上下文信息预训练语言模型,该模型当时一举打破了11项纪录。从此之后,BERT的继任者们百花齐放,不断刷新各leaderboard最高成绩。现在,这些研究被称为BERTology,不完全的名单包括:Transformer-XL, XLNet, Albert, RoBERTa, DistilBERT, CTRL, ...
Mars:解读“深度学习最新进展(2020)” Part 325 赞同 · 0 评论文章正在上传…重新上传取消
BERTs模型虽然很香,但是用起来还是有一些障碍,比如:
- 预训练需要大量的资源,一般研究者无法承担。以RoBERTa为例,它在160GB文本上利用1024块32GB显存的V100卡训练得到,如果换算成AWS上的云计算资源的话,但这一模型就需要10万美元的开销。
- 很多大机构的预训练模型被分享出来,但没有得到很好的组织和管理。
- BERTology的各种模型虽然师出同源,但在模型细节和调用接口上还是有不少变种,用起来容易踩坑
4. Transformers名字的历史沿革
为了让这些预训练语言模型使用起来更加方便,Huggingface在github上开源了Transformers。这个项目开源之后备受推崇,截止2020年5月,已经累积了26k的star和超过6.4k的fork。
Transformers最早的名字叫做pytorch-pretrained-bert,推出于google BERT之后。顾名思义,它是基于pytorch对BERT的一种实现。pytorch框架上手简单,BERT模型性能卓越,集合了两者优点的pytorch-pretrained-bert自然吸引了大批的追随者和贡献者。
其后,在社区的努力下,GPT、GPT-2、Transformer-XL、XLNET、XLM等一批模型也被相继引入,整个家族愈发壮大,这个库适时地更名为pytorch-transformers。
深度学习框架上一直存在着pytorch和tensorflow两大阵营,为了充分利用两个框架的优点,研究人员不得不经常在两者之间切换。Transformers的开发者们也敏锐地抓住了这一个痛点,加入了pytorch和TF2.0+的互操作性,模型之间可以方便地互相转换,算法的实现也是各自最native的味道。此举显然笼络了更多的自然语言研究人员和从业者投入麾下。而项目的名字,也顺理成章地改成了现在的Transformers。时至今日,Transformers已经在100+种人类语言上提供了32+种预训练语言模型。作为NLP的从业者,真的很难抵制住去一探究竟的诱惑。
5. Transformers的设计理念
了解一下Transformers库的设计理念有助于更好地使用它。
- 分享及关爱。我们把各种模型和代码汇集到一处,从而使得更多人可以共享昂贵的训练资源。我们提供了简单一致的API,遵循经典的NLP Pipeline设计。
- 性能优异且易于访问。一方面我们会尽可能让模型复现论文中的最优结果,一方面我们也尽力降低使用的门槛。我们的三大组件configuration, tokenizer和model都可以通过一致的from_pertrained()方法来实例化。
- 注重可解释性和多样性。我们让使用者能够轻松访问到hidden states, attention weights和head importance这样的内部状态,从而更好地理解不同的模型是如何运作的。我们提供了类似GLUE, SuperGLuE, SQuAD这样的基准测试集的接入,方便对不同模型效果进行比较。
- 推进传播最佳实践。在贴近原模型作者意图的基础上,我们的代码实现会尽可能地规范化,遵循业界的最佳实践,比如对于PyTorch和TensorFlow 2.0的完全兼容。
- 从学界到业界。在工业级支持上,Transformers的模型支持TorchScript,一种PyTorch中创建可序列化可优化模型的方式,也能够和Tensorflow Extended框架相兼容。
5. Transformers的组件和模型架构
Transformers提供了三个主要的组件。
- Configuration配置类。存储模型和分词器的参数,诸如词表大小,隐层维数,dropout rate等。配置类对深度学习框架是透明的。
- Tokenizer分词器类。每个模型都有对应的分词器,存储token到index的映射,负责每个模型特定的序列编码解码流程,比如BPE(Byte Pair Encoding),SentencePiece等等。也可以方便地添加特殊token或者调整词表大小,如CLS、SEP等等。
- Model模型类。提供一个基类,实现模型的计算图和编码过程,实现前向传播过程,通过一系列self-attention层直到最后一个隐藏状态层。在最后一层基础上,根据不同的应用会再做些封装,比如XXXForSequenceClassification,XXXForMaskedLM这些派生类。
Transformers的作者们还为以上组件提供了一系列Auto Classes,能够从一个短的别名(如bert-base-cased)里自动推测出来应该实例化哪种配置类、分词器类和模型类。
Transformers提供两大类的模型架构,一类用于语言生成NLG任务,比如GPT、GPT-2、Transformer-XL、XLNet和XLM,另一类主要用于语言理解任务,如Bert、DistilBert、RoBERTa、XLM.
6. 相关资源
Write With Transformers,这是Huggingface官方提供的一个web app,它展示了语言生成类模型的写作天赋,像GPT-2/XLNet等等。蛮有趣的一个应用,你可以体验一下和机器人一起创作的乐趣,当你才思枯竭的时候,只要按一下Tab键,就可以唤起AI来为你有模有样地写几段。
Write With Transformertransformer.huggingface.co/正在上传…重新上传取消
迁移学习在对话AI上的SOTA应用,也是huggingface官方出品,后续我们有机会重点介绍一下。
几个和Transformers有着类似使命的自然语言处理建模框架。
- fast-bert,Super easy library for BERT based NLP models
- FARM,Fast & easy transfer learning for NLP. Harvesting language models for the industry
- pytext,A natural language modeling framework based on PyTorch
- spaCy,spaCy pipelines for pre-trained BERT, XLNet and GPT-2
参考
- Huggineface官网,https://huggingface.co/
- Arxiv上的官方白皮书,HuggingFace's Transformers: State-of-the-art Natural Language Processing
- Transformers文档,https://huggingface.co/transformers/
- Transformers github主页,https://github.com/huggingface/transformers