Hugging face快速入门

Hugging face

Introduction

Hugging face 是一家总部位于纽约的聊天机器人初创服务商,开发的应用在青少年中颇受欢迎,相比于其他公司,Hugging Face更加注重产品带来的情感以及环境因素。官网链接在此 https://huggingface.co/

但更令它广为人知的是Hugging Face专注于NLP技术,拥有大型的开源社区。尤其是在github上开源的自然语言处理,预训练模型库 Transformers,已被下载超过一百万次,github上超过24000个star。Transformers 提供了NLP领域大量state-of-art的 预训练语言模型结构的模型和调用框架。以下是repo的链接(https://github.com/huggingface/transformers

这个库最初的名称是pytorch-pretrained-bert,它随着BERT一起应运而生。pytorch-pretrained-bert 用当时已有大量支持者的pytorch框架复现了BERT的性能,并提供预训练模型的下载,使没有足够算力的开发者们也能够在几分钟内就实现 state-of-art-fine-tuning。

直到2019年7月16日,在repo上已经有了包括BERT,GPT,GPT-2,Transformer-XL,XLNET,XLM在内六个预训练语言模型,这时候名字再叫pytorch-pretrained-bert就不合适了,于是改成了pytorch-transformers,势力范围扩大了不少。这还没完!2019年6月Tensorflow2的beta版发布,Huggingface也闻风而动。为了立于不败之地,又实现了TensorFlow 2.0和PyTorch模型之间的深层互操作性,可以在TF2.0/PyTorch框架之间随意迁移模型。在2019年9月也发布了2.0.0版本,同时正式更名为 transformers 。到目前为止,transformers 提供了超过100种语言的,32种预训练语言模型,简单,强大,高性能,是新手入门的不二选择。

Installation

该repo是在Python3.6+, Pytorch 1.0.0+,以及Tensorflow2.0 上进行测试的。如果你已经配置好了Tensorflow2.0或Pytorch,Transformers可可以按照以下pip的方式进行安装:

pip install transformers

Quick tour

使用原生bert模型
  1. 导入相应模块

    from transformers import BertModel, BertTokenzier
    
  2. 加载预训练文件,bert包含的预训练文件包括:

    PRETRAINED_INIT_CONFIGURATION = {
        "bert-base-uncased": {"do_lower_case": True},
        "bert-large-uncased": {"do_lower_case": True},
        "bert-base-cased": {"do_lower_case": False},
        "bert-large-cased": {"do_lower_case": False},
        "bert-base-multilingual-uncased": {"do_lower_case": True},
        "bert-base-multilingual-cased": {"do_lower_case": False},
        "bert-base-chinese": {"do_lower_case": False},
        "bert-base-german-cased": {"do_lower_case": False},
        "bert-large-uncased-whole-word-masking": {"do_lower_case": True},
        "bert-large-cased-whole-word-masking": {"do_lower_case": False},
        "bert-large-uncased-whole-word-masking-finetuned-squad": {"do_lower_case": True},
        "bert-large-cased-whole-word-masking-finetuned-squad": {"do_lower_case": False},
        "bert-base-cased-finetuned-mrpc": {"do_lower_case": False},
        "bert-base-german-dbmdz-cased": {"do_lower_case": False},
        "bert-base-german-dbmdz-uncased": {"do_lower_case": True},
        "TurkuNLP/bert-base-finnish-cased-v1": {"do_lower_case": False},
        "TurkuNLP/bert-base-finnish-uncased-v1": {"do_lower_case": True},
        "wietsedv/bert-base-dutch-cased": {"do_lower_case": False},
    }
    
  3. 利用预训练文件初始化Tokenizer和Model

    tokenizer = BertTokenizer.from_pretrained('bert-base-chinese', cache_dir='./transformers/')	// cache_dir表示将预训练文件下载到本地指定文件夹下
    model = BertModel.from_pretrained('bert-base-chinese', cache_dir='./transformers/')
    
  4. 将输入文本转化为id值,并输入到模型中

    input_ids = torch.tensor(tokenizer.encode("遇见被老师提问问题", add_special_tokens=True)).unsqueeze(0)	// 增加一个维度因为输入到Bert模型中要求二维(Batch_size, seq_len)
    print("input_ids: ", input_ids)
    
    output = model(input_ids=input_ids)
    last_hidden_states_0 = output[0]
    print("last_hidden_states_0.shape: ", last_hidden_states_0.shape)
    last_hidden_states_1 = output[1]
    print("last_hidden_states_1.shape: ", ast_hidden_states_1.shape)
    

    输出

    input_ids:  tensor([[ 101, 6878, 6224, 6158, 5439, 2360, 2990, 7309, 7309, 7579,  102]])
    last_hidden_states_0.shape: torch.Size([1, 11, 768]
    last_hidden_states_1.shape: torch.Size([1, 768]
    

    可见输出结果分为两部分,第一部分是最后一层对应每个token_id的输出,其长度对应于input_ids的输入长度。第二部分是最后一层[CLS]位置的输出,所以Size只为[1, 312]。

使用Albert模型

导入相应模块,只需改成AlbertTokenizer和AlbertModel就可以,其余流程与上述过程基本类似。

from transformers import AlbertTokenizer, AlbertModel

tokenizer = AlbertTokenizer.from_pretrained("albert-base-v2", cache_dir="./transformers/")
model = AlbertModel.from_pretrained("albert-base-v2", cache_dir="transformers/")

还有其它多种模型,如XLNet、DistilBBET、RoBERTa等模型都可以以同样的方式进行导入。

Other Tips

获取Bert模型结构参数(config.json文件)
from transformers import BertConfig

bert_config = BertConfig.from_pretrained('bert-base-uncased')
print(bert_config.get_config_dict('bert-base-uncased'))

输出:

({'architectures': ['BertForMaskedLM'], 'attention_probs_dropout_prob': 0.1, 'hidden_act': 'gelu', 'hidden_dropout_prob': 0.1, 'hidden_size': 768, 'initializer_range': 0.02, 'intermediate_size': 3072, 'layer_norm_eps': 1e-12, 'max_position_embeddings': 512, 'model_type': 'bert', 'num_attention_heads': 12, 'num_hidden_layers': 12, 'pad_token_id': 0, 'type_vocab_size': 2, 'vocab_size': 30522}, {})

可以看出原生Bert的模型结构的各种参数。

获取预训练的模型词典和输入词向量嵌入矩阵

通过在模型中载入预训练文件,我们可以获取到预训练模型中的词表和输入词向量嵌入矩阵,方便我们可以深入理解或再其它位置使用其预训练结果。这些方法可以通过阅读源码找到,有兴趣的可以深入了解,这样可以更灵活的使用huggingface提供的预训练模型。

获取词表
vocab = tokenizer.get_vocab()
print("vocab: ", len(vocab))

输出:

vocab:  30522
获取输入词向量矩阵
word_embedding = model.get_input_embeddings()
embed_weights = word_embedding.weight
print("embed_weights: ", embed_weights.shape, type(embed_weights))

输出:

embed_weights: torch.Size([30522, 768]

获取词向量矩阵后可以转换为Numpy数组保存到本地,可以后续在其它地方进行使用。

针对pair_text进行处理

对于将两个文本输入Bert中的情况,在编码token的时候,除了上述使用到的tokenizer.encode方法外,还可以使用encode_plus方法。

该方法的参数列表为:

def encode_plus(
        self,
        text,
        text_pair=None,
        add_special_tokens=True,
        max_length=None,
        stride=0,
        truncation_strategy="longest_first",
        ...

例如:

text_a = "EU rejects German call to boycott British lamb ."
text_b = "This tokenizer inherits from :class: transformers.PreTrainedTokenizer"

tokens_encode = tokenizer.encode_plus(text=text, text_pair=text_b, max_length=20, truncation_strategy="longest_first", truncation=True)
print("tokens_encode: ", tokens_encode)

输出

tokens_encode:  {'input_ids': [2, 2898, 12170, 18, 548, 645, 20, 16617, 388, 8624, 3, 48, 20, 2853, 11907, 17569, 18, 37, 13, 3], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

输出以列表的形式保存,input_ids的内容与encode()方法返回的结果相同,为token转化为id之后的表示。token_type_ids的内容表示用来区别两个文本,为0表示第一个文本,为1表示第二个文本。attention_mask表示文本padding的部分(这里没有,所有全为1)。每个部分分别对应于BertModel的输入参数,使用时取出对应键值的内容输入到相应参数即可:

forward(input_ids=None, attention_mask=None, token_type_ids=None, position_ids=None, head_mask=None, inputs_embeds=None, output_attentions=None, output_hidden_states=None, return_dict=None)[SOURCE]

详细内容大家可以阅读官网或源码了解更多。

如何将下载的预训练文件保存到本地

即在from_pretrained的函数中添加cache_dir参数。初次使用会将结果下载到指定目录中,下次使用会从该文件中继续查找。

model = AlbertModel.from_pretrained("albert-base-v2", cache_dir="transformers/")
其它组件

除了预训练模型,transformers还包含了很多模型训练里常用的优化方法,比如AdamW的optimizer,get_linear_schedule_with_warmup来设定在模型训练过程中更新学习率时,采用wamup的方式进行。

比如:

from transformers import AdaW, get_linear_schedule_with_warmup

warmup_steps = int(args.warmup_proportion * num_train_optimization_steps)	// 定义warmup方式的步长
    optimizer = AdamW(optimizer_grouped_parameters, lr=args.learning_rate, eps=args.adam_epsilon)	// 定义优化器
    scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=warmup_steps, num_training_steps=num_train_optimization_steps)		// 更新学习率的方式

详细的warmup原理可以参考 [ Optimization — transformers 3.5.0 documentation (huggingface.co) ](https://huggingface.co/transformers/main_classes/optimizer_schedules.html?highlight=get_linear_schedule_with_warmup#transformers.get_linear_schedule_with_warmup)

Reference

Transformers — transformers 3.5.0 documentation (huggingface.co)

Hugging Face – On a mission to solve NLP, one commit at a time.

该链接包含了多种模型下的多种预训练文件,如果某些模型的预训练文件没有在官方内容中给出,则可以在这里进行搜索

https://github.com/huggingface/transformers 官方github文档

  • 20
    点赞
  • 132
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 我推荐您阅读 Hugging Face 官网上的入门教程。这些教程将帮助您了解如何使用 Hugging Face 的不同预训练模型,包括如何训练和部署自己的模型。此外,您还可以在 GitHub 上阅读 Hugging Face 示例代码和教程。 ### 回答2: Hugging Face是一个流行的自然语言处理(NLP)平台,提供了许多强大的工具和模型。对于初学者而言,了解Hugging Face的使用,可以从以下入门教程开始: 1. 官方文档:Hugging Face的官方文档是学习的最佳资源之一。它提供了全面的介绍和指南,包括了解Hugging Face的首选库"transformers",以及相关工具和概念。 2. Hugging Face的示例代码库:Hugging Face维护了一个GitHub代码库,其中包含丰富的示例代码和教程。您可以通过阅读和运行这些代码来学习如何使用Hugging Face的模型和工具。 3. Hugging Face的模型hub:Hugging Face的模型hub是一个集中存储各种预训练模型和示例任务的库。您可以通过模型hub了解各种模型的用法,并从中获取灵感来解决自己的NLP任务。 4. 社区贡献的教程和博客:Hugging Face的用户社区非常活跃,许多用户会分享自己的使用经验、教程和技巧。您可以在Hugging Face的论坛、博客或社交媒体上搜索相关主题,来获取更多的入门教程推荐和学习资源。 总结:对于入门Hugging Face的最佳教程推荐,我建议首先阅读官方文档,然后尝试运行一些示例代码来熟悉常见的用例。同时,积极参与Hugging Face的社区和讨论,从其他用户的经验中学习。这样的综合学习方式将帮助您快速入门Hugging Face并从中受益。 ### 回答3: Hugging Face 是自然语言处理领域的一家知名公司,他们开发了许多先进的模型和工具,其中最著名的是 Transformer 模型和相关的库 Transformers。 要学习使用 Hugging Face,我推荐开始阅读他们的官方文档。官方文档提供了详细的介绍和实例代码,让初学者能够快速入门。 在官方文档中,有一个以 "Getting Started"(入门指南)为标题的部分,这是一个非常好的起点。其中介绍了如何安装 Hugging Face 的库,以及如何在不同任务中使用预训练模型。 除了官方文档,Hugging Face 还提供了一系列的教程和示例代码,可以通过他们的 GitHub 上的教程库来获取。这些教程涵盖了从文本分类到机器翻译等不同任务的应用。 另外,Hugging Face 还维护了一个名为 "Transformers" 的库,里面包含了大量的预训练模型和工具函数。文档中对这些模型进行了详细的介绍,并提供了示例代码来演示如何使用这些模型。 除了官方文档和教程,Hugging Face 还有一个非常活跃的社区。你可以通过他们的论坛和 GitHub 上的问题区来提问和交流。社区中的其他用户和开发人员经常会分享他们的经验和解决方案,这对于学习和解决问题非常有帮助。 总结来说,Hugging Face 的官方文档、教程和社区都是学习和入门的好资源。通过阅读官方文档并参考教程和示例代码,你将能够快速上手使用 Hugging Face 的模型和工具。同时,参与社区交流也能够帮助你解决问题并学习到更多相关知识。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JermeryBesian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值