HuggingFace/transformers系列文章

第一章 huggingface简介



前言

最近需要研究预训练模型,huggingface目前是最火热的自然语言处理框架,为此写此系列文章,边做个学习记录边做个分享


先做个简介开个头吧,后续会边研究边实践边分享,从安装到主要应用实验,从源码解析到背景理论知识。水平有限,敬请谅解(文章主要使用pytorch,做中文任务,对tensorflow版不做详细介绍)

一、Bert简介

在这里插入图片描述
清华大学自然语言处理实验室对预训练语言模型架构的梳理;传送门:https://github.com/thunlp/PLMpapers

BERT
由Google AI在2018年底推出,刚出现就刷新了一大批榜单,甚至在一些任务上超过了人类的表现。
核心贡献:
1.BERT揭示了语言模型的深层双向学习能力在任务中的重要性
2.BERT再次论证了fine-tuning的策略是可以有很强大的效果的,而且再也不需要为特定的任务进行繁重的结构设计。
创新之处:
在预训练的时候使用了两个非监督任务:
1.MLM(掩盖语言模型)
2.NSP(下一句预测)
**有兴趣想具体可查询其他博客,这里不再介绍 **

二、HuggingFace/transformers

Huggingface总部位于纽约,是一家专注于自然语言处理、人工智能和分布式系统的创业公司。他们所提供的聊天机器人技术一直颇受欢迎,但更出名的是他们在NLP开源社区上的贡献。Huggingface一直致力于自然语言处理NLP技术的平民化(democratize),希望每个人都能用上最先进(SOTA, state-of-the-art)的NLP技术,而非困窘于训练资源的匮乏。同时Hugging Face专注于NLP技术,拥有大型的开源社区。尤其是在github上开源的自然语言处理,预训练模型库 Transformers,已被下载超过一百万次,github上超过24000个star。Transformers 提供了NLP领域大量state-of-art的 预训练语言模型结构的模型和调用框架。

官网连接:https://huggingface.co/
GitHub: https://link.zhihu.com/?target=https%3A//github.com/huggingface/transformers

三、安装使用

1.安装库

Transformers库的当前版本基于Python 3.6+,PyTorch 1.0.0+和TensorFlow 2.0+

pip install transformers

另一种方法,从源码安装,如果后续要完整运行transformers自带的最新examples的话,建议用这种方式安装

git clone https://github.com/huggingface/transformers
cd transformers
pip install .

代码更新后升级方式

git pull
pip install --upgrade .

检查安装版本及正确性

import tensorflow as tf; tf.__version__         # 检查tf版本
import torch; torch.__version__                 # 1.6.0
import transformers;transformers.__version__    # 4.8.2

2.简单使用

2.1 准备预训练模型

由于中文任务,我们需要用transformers下载一个中文预训练模型,transformers已经帮我们打包好了这些共享模型,并且可以通过一致的from_pretrained接口下载模型到本地cache;
transformers模型管理的方式是为每一个模型起一个唯一的短名,如果一个模型同时有一个配套的tokenizer模型的话,它们会共用一个短名。因此只要知道模型短名,就能任意加载想要的预训练模型。

短名查询传送门:https://huggingface.co/models

from transformers import AutoModel, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained('bert-base-chinese')
model = AutoModel.from_pretrained('bert-base-chinese')

ps:也可以自行从其他路径下载预训练模型读取,把上述短名参数换成本地模型路径名即可(例如本地文件夹/transformers/hfl内下载了chinese-bert-wwm-ext)

from transformers import AutoModel, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained('./transformers/hfl/chinese-bert-wwm-ext')
model = AutoModel.from_pretrained('./transformers/hfl/chinese-bert-wwm-ext')

2.2 embedding

从nlp基操开始,做个向量编码

from transformers import AutoModel, AutoTokenizer
model = AutoModel.from_pretrained('./transformers/hfl/chinese-bert-wwm-ext')
tokenizer = AutoTokenizer.from_pretrained('./transformers/hfl/chinese-bert-wwm-ext')
input_ids = tokenizer.encode('今天天气真好', return_tensors='pt') #[1,8] tensor([[ 101,  791, 1921, 1921, 3698, 4696, 1962,  102]])
outputs = model(input_ids) # outputs.last_hidden_state [1, 8, 768] outputs.pooler_output [1,768]
v = torch.mean(outputs.last_hidden_stat, dim=1) # shape (1, 768)

PS:
1.tokenizer分词器,对输入序列按字分词,查询词表并添加两个特殊字符[CLS]和[SEP],shape = [1,8] ,而model(input_ids)返回两个值last_hidden_state以及pooler_output。对输入的sequence中的每个token/字都返回了一个768维的向量。。
2. 根据文档的说法,pooler_output向量一般不是很好的句子语义摘要,因此这里采用了torch.mean对last_hidden_state进行了求平均操作

最后得到词向量就能愉快继续后续操作了

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐