title: HuggingFace-Transformers手册
subtitle: HuggingFace-Transformers手册
date: 2020-10-13
author: NSX
catalog: true
tags:
- Transformers


Transformers(以前称为pytorch Transformers和pytorch pretrained bert)为自然语言理解(NLU)和自然语言生成(NLG)提供了最先进的通用架构(bert、GPT-2、RoBERTa、XLM、DistilBert、XLNet、CTRL…),其中有超过32个100多种语言的预训练模型并同时支持TensorFlow 2.0和Pythorch两大深度学习框架。

设计结构


2020-10-13-HuggingFace-Transformers手册 - 图1

  • 使用每个模型只需要三个标准类:configuration,models 和tokenizer 。model用于指定使用transformers库中的哪一种模型及提供的预训练权重,例如model为bert,则相应的网络结构为bert的网络结构;configuration是模型具体的结构配置,例如可以配置多头的数量等,这里配置需要注意的地方就是,如果自定义配置不改变核心网络结构的则仍旧可以使用预训练模型权重,如果配置涉及到核心结构的修改,例如前馈网络的隐层神经元的个数,则无法使用预训练模型权重,这个时候transformers会默认你要重新自己预训练一个模型从而随机初始化整个模型的权重,这是是一种半灵活性的设计;Tokenizer类例如BertTokenizer,存储每个模型的词汇表,并提供用于编码/解码要馈送到模型的令牌嵌入索引列表中的字符串的方法。

  • 所有这些类都可以使用通用的 from_pretrained() 函数来实现加载,以简单统一的方式从预训练的实例中初始化。transformers会处理下载、缓存和其它所有加载模型相关的细节。

  • 基于上面的三个类,提供更上层的pipeline和Trainer/TFTrainer,从而用更少的代码实现模型的预测和微调。pipeline()用于在给定任务上快速使用模型(及其关联的tokenizer和configuration)和 Trainer或者TFtrainer 快速训练或微调给定模型。

  • 因此它不是一个基础的神经网络库来一步一步构造Transformer,而是把常见的Transformer模型封装成一个building block,我们可以方便的在PyTorch或者TensorFlow里使用它。

使用教程

1、如何安装

Huggingface Transformer 4.5.0需要安装Tensorflow 2.0+ 或者 PyTorch 1.1.0+,

Mac下安装PyTorch:

  • 安装pytorch,去pytorch官网,选择你需要的环境(cuda 10.1),会根据你的选择,在下方出现相应的安装命令
  • 安装GPU版本pytorch教程(避坑)
    1. pip install torch==1.6.0 torchvision==0.7.0 -f https://download.pytorch.org/whl/cu101/torch_stable.html

transformers库安装:

  • Hugging Face 提供了两个主要的库,用于模型的transformers 和用于数据集的datasets 。可以直接使用 pip 安装它们。
    1. pip install transformers datasets

如果要安装transformers, transformers主要依赖tokenizers,安装tokenizers依赖rust,所以需要先安装rust。

https://blog.csdn.net/qq_42346574/article/details/120822974 https://github.com/huggingface/transformers/issues/2831

  1. curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  2. Restart the terminal
  3. pip install transformers
  4. conda install -c conda-forge tokenizers
  5. conda install -c conda-forge transformers
  6. #如果需要还可以安装huggeface的datasets,安装方法如下
  7. conda install -c conda-forge pyarrow
  8. conda install -c conda-forge datasets


2、使用pipeline

使用预训练模型最简单的方法就是使用pipeline函数,它支持如下的任务:

  • 情感分析(Sentiment analysis):一段文本是正面还是负面的情感倾向
  • 文本生成(Text generation):给定一段文本,让模型补充后面的内容
  • 命名实体识别(Name entity recognition):识别文字中出现的人名地名的命名实体
  • 问答(Question answering):给定一段文本以及针对它的一个问题,从文本中抽取答案
  • 填词(Filling masked text):把一段文字的某些部分mask住,然后让模型填空
  • 摘要(Summarization):根据一段长文本中生成简短的摘要
  • 翻译(Translation):把一种语言的文字翻译成另一种语言
  • 特征提取(Feature extraction):把一段文字用一个向量来表示

这种最简单,不进行finetune,直接完成任务。下面我们来看一个情感分析的例子:

  1. from transformers import pipeline
  2. classifier = pipeline('sentiment-analysis', model="nlptown/bert-base-multilingual-uncased-sentiment")
  3. classifier('We are very happy to show you the Transformers library.')

当第一次运行的时候,它会下载预训练模型和分词器(tokenizer)并且缓存下来。分词器的左右是把文本处理成整数序列。最终运行的结果为:

  1. [{'label': 'POSITIVE', 'score': 0.9997795224189758}]

3、使用autoXXX

我们需要两个类,一个是AutoTokenizer,我们将使用它来下载和加载与模型匹配的Tokenizer。另一个是AutoModelForSequenceClassification(如果用TensorFlow则是TFAutoModelForSequenceClassification)。注意:模型类是与任务相关的,我们这里是情感分类的分类任务,所以是AutoModelForSequenceClassification。

  1. from transformers import AutoConfig, AutoModel, AutoTokenizer, AutoModelForSequenceClassification
  2. model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
  3. # Download model and configuration from huggingface.co and cache.
  4. model = AutoModelForSequenceClassification.from_pretrained(model_name)
  5. # or Download configuration from huggingface.co and cache.
  6. config = AutoConfig.from_pretrained(model_name)
  7. model = AutoModel.from_config(config)
  8. # 使用前面的from_pretrained函数加载Tokenizer和模型
  9. tokenizer = AutoTokenizer.from_pretrained(model_name)
  10. # classifier = pipeline('sentiment-analysis', model=model, tokenizer=tokenizer)
  11. # 使用Tokenizer分词
  12. # 一次传入一个batch的字符串,这样便于批量处理,指定padding为True并且设置最大的长度
  13. pt_batch = tokenizer(
  14. ["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."],
  15. padding=True,
  16. truncation=True,
  17. max_length=512,
  18. return_tensors="pt"
  19. )
  20. # 查看分词结果
  21. for key, value in pt_batch.items():
  22. print(f"{key}: {value.numpy().tolist()}")
  23. #input_ids: [[101, 2057, 2024, 2200, 3407, 2000, 2265, 2017, 1996, 100, 19081, 3075, 1012, 102], [101, 2057, 3246, 2017, 2123, 1005, 1056, 5223, 2009, 1012, 102, 0, 0, 0]]
  24. #attention_mask: [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]]
  25. # 使用模型
  26. # Tokenizer的处理结果可以输入给模型,对于TensorFlow来说直接输入就行,而对于PyTorch则需要使用**来展开参数:
  27. # PyTorch
  28. pt_outputs = pt_model(**pt_batch)
  29. # TensorFlow
  30. tf_outputs = tf_model(tf_batch)
  31. print(pt_outputs)
  32. #(tensor([[-4.0833, 4.3364],
  33. # [ 0.0818, -0.0418]], grad_fn=<AddmmBackward>),)
  34. # 转换概率输出
  35. import torch.nn.functional as F
  36. pt_predictions = F.softmax(pt_outputs[0], dim=-1)
  37. # 如果传入分类标签,除了会计算logits还会loss:
  38. import torch
  39. pt_outputs = pt_model(**pt_batch, labels = torch.tensor([1, 0]))
  40. #SequenceClassifierOutput(loss=tensor(0.3167, grad_fn=<NllLossBackward>), logits=tensor([[-4.0833, 4.3364],
  41. # [ 0.0818, -0.0418]], grad_fn=<AddmmBackward>), hidden_states=None, attentions=None)

具体的模型类

AutoModel和AutoTokenizer只是方便我们使用,但最终会根据不同的模型(名字或者路径)构造不同的模型对象以及与之匹配的Tokenizer。前面的例子我们使用的是distilbert-base-uncased-finetuned-sst-2-english这个名字,AutoModelForSequenceClassification 会自动的帮我们加载DistilBertForSequenceClassification模型。

参考

https://yuanxiaosc.github.io/2019/12/30/HuggingFace-Transformers%E6%89%8B%E5%86%8C/

Huggingface Transformer教程(一)