关于自然语言处理:利用Hugging-Face中的模型进行句子相似性实践

34次阅读

共计 7293 个字符,预计需要花费 19 分钟才能阅读完成。

  Hugging Face 是什么?它作为一个 GitHub 史上增长最快的 AI 我的项目,创始人将它的胜利归功于补救了迷信与生产之间的鸿沟。什么意思呢?因为当初很多 AI 研究者写了大量的论文和开源了大量的代码,然而 AI 工程师又不能间接很好的应用,而 Hugging Face 将这些 AI 模型进行了更好的封装,满足了 AI 工程师的生产实践须要,大大降低了 AI 模型应用的门槛。Hugging Face 曾经共享了超 100,000 个预训练模型,10,000 个数据集,涵盖了 NLP、计算机视觉、语音、工夫序列、生物学、强化学习等畛域,以帮忙科学家和相干从业者更好地构建模型,并将其用于产品或工作流程。最近发表融资 1 亿美元,这使其估值达到了 20 亿美元。

一.Hugging Face 模型

  模型页面包含各种 AI 工作,应用的深度学习框架,各种数据集,语言品种,许可证类型等。重点说下各种类型的工作如下:

1.计算机视觉工作
Image Classification,Image Segmentation,Image-to-Image,Unconditional Image Generation,Object Detection
2. 自然语言解决工作
Translation,Fill-Mask,Token Classification,Sentence Similarity,Question Answering,Summarization,Zero-Shot Classification,Text Classification,Text2Text Generation,Text Generation,Conversational,Table Question Answering
3. 音频工作
Automatic Speech Recognition,Audio Classification,Text-to-Speech,Audio-to-Audio,Voice Activity Detection
4. 多模态工作
Feature Extraction,Text-to-Image,Visual Question Answering,Image-to-Text
5.Tabular 工作
Tabular Classification,Tabular Regression
6. 强化学习工作
Reinforcement Learning

二.Hugging Face 文档

1.Hub:在 Hugging Face Hub 上托管基于 Git 的模型、数据集和空间。
2.Transformers:Pytorch、TensorFlow 和 JAX 的最新 ML。
3.Datasets:拜访和共享 CV、Audio 和 NLP 工作的数据集。
4.Tokenizers:疾速 tokenizers,针对钻研和生产进行了优化。
5.Gradio:用几行 Python 构建机器学习演示和其它 Web 应用程序。
6.Hub Client Library:HF Hub 的客户端库:从 Python 运行时治理存储库。
7.API Inference:通过推理 API 能够应用超过 30k 个模型,并且内置可伸缩性。
8.Accelerate:应用 multi-GPU,TPU,混合精度容易的训练和应用 PyTorch 模型。
9.Amazon SageMaker:应用 Amazon SageMaker 和 Hugging Face DLCs 训练和部署 Transformer 模型。
10.Optimum:容易的应用硬件优化工具,来实现 HF Transformers 的疾速训练和推理。
11.Course:这个课程教你应用 HF 生态系统的类库来解决 NLP 问题。
12.Evaluate:更加容易和标准化的评估和报告模型的性能。
13.Tasks:对于机器学习工作的所有:演示,应用例子,模型,数据集和更多。
14.Datasets server:拜访 Hugging Face Hub 数据集的内容、metadata 和根本统计。

三.huggingface/transformers 源码

  这个库 Transformers 次要是对于 Pytorch、TensorFlow 和 JAX 的机器学习最新进展。Transformers 提供了数以千计的预训练模型,反对 100 多种语言的文本分类、信息抽取、问答、摘要、翻译、文本生成。它的主旨让最先进的 AI 技术人人易用。源码构造如下:

四. 抉择句子相似性模型

1. 装置 transformers 库

通过 pip 命令装置 transformers 库:

pip install transformers

2. 抉择模型

工作抉择句子相似性,类库抉择 PyTorch,语言选择中文:

3. 模型信息介绍

这个页面次要对模型形容,训练数据,训练过程,在线演示等进行了介绍:

  这是通过 UER-py 我的项目预训练的句子嵌入模型 9,训练数据应用的[11],在预训练模型 chinese_roberta_L-12_H-768 的根底上微调了 5 个 epochs,序列长度为 128。在每个 epoch 完结时,保留在 development set 上性能最好的模型。微调脚本如下:

python3 finetune/run_classifier_siamese.py --pretrained_model_path models/cluecorpussmall_roberta_base_seq512_model.bin-250000 \
                                           --vocab_path models/google_zh_vocab.txt \
                                           --config_path models/sbert/base_config.json \
                                           --train_path datasets/ChineseTextualInference/train.tsv \
                                           --dev_path datasets/ChineseTextualInference/dev.tsv \
                                           --learning_rate 5e-5 --epochs_num 5 --batch_size 64

最初把预训练模型转换为 Huggingface 的格局:

python3 scripts/convert_sbert_from_uer_to_huggingface.py --input_model_path models/finetuned_model.bin \                                                 
                                                         --output_model_path pytorch_model.bin \                                                                                            
                                                         --layers_num 12

4. 模型文件介绍

次要介绍了训练好的 AI 模型都有哪些文件组成:

阐明:次要就是模型权重文件,各种配置文件,以及词汇表等组成。

五. 计算句子相似性实际

1. 可能会遇到的问题

遇到的问题:页面文件太小,无奈实现操作。解决方案如下所示:

重启零碎后会遇到一个零碎属性提醒的问题,因为不影响应用,临时先不解决:

2. 相干变体

(1)bert-base-uncased:编码器具备 12 个隐层,输入 768 维张量,12 个自注意力头,共 110M 参数量,在小写的英文文本上进行训练而失去。
(2)bert-large-uncased:编码器具备 24 个隐层,输入 1024 维张量,16 个自注意力头,共 340M 参数量,在小写的英文文本上进行训练而失去。
(3)bert-base-cased:编码器具备 12 个隐层,输入 768 维张量,12 个自注意力头,共 110M 参数量,在不辨别大小写的英文文本上进行训练而失去。
(4)bert-large-cased:编码器具备 24 个隐层,输入 1024 维张量,16 个自注意力头,共 340M 参数量,在不辨别大小写的英文文本上进行训练而失去。
(5)bert-base-multilingual-cased(新的举荐):编码器具备 12 个隐层,输入 768 维张量,12 个自注意力头,共 110M 参数量,在 104 种语言文本上进行训练而失去。
(6)bert-large-multilingual-uncased(原始的不举荐):编码器具备 12 个隐层,输入 768 维张量,12 个自注意力头,共 110M 参数量,在 102 种语言文本上进行训练而失去。
(7)bert-base-chinese:编码器具备 12 个隐层,输入 768 维张量,12 个自注意力头,共 110M 参数量,在简体和繁体中文文本上进行训练而失去。
阐明:uncased 是在预处理的时候都变成了小写,而 cased 是保留大小写。

3. 罕用操作

print(tokenizer.vocab) # 词汇表
print(tokenizer.tokenize("你好,世界!")) #分词,只能输出字符串
print(tokenizer.convert_tokens_to_ids(['你', '好', ',', '世', '界', '!'])) #将词转换成 id
print(tokenizer.convert_ids_to_tokens([872, 1962, 8024, 686, 4518, 8013])) #将 id 转换成词

后果输入如下所示:

['你', '好', ',', '世', '界', '!']
[872, 1962, 8024, 686, 4518, 8013]
['你', '好', ',', '世', '界', '!']

4. 相似性计算

  通过如下代码,失去相似性后果为[0.9864919 0.39011386 0.29779416],和在线演示失去的后果是统一的。代码如下:

from transformers import BertTokenizer, BertModel
from sklearn.metrics.pairwise import cosine_similarity
import torch

model = BertModel.from_pretrained("./sbert-base-chinese-nli")
tokenizer = BertTokenizer.from_pretrained("./sbert-base-chinese-nli")
sentences = [
    "那个人很开心",
    "那个人十分开心",
    "那只猫很开心",
    "那个人在吃货色"
]

# 初始化字典来存储
tokens = {'input_ids': [], 'attention_mask': []}

for sentence in sentences:
    # 编码每个句子并增加到字典
    new_tokens = tokenizer.encode_plus(sentence, max_length=15, truncation=True, padding='max_length', return_tensors='pt')
    tokens['input_ids'].append(new_tokens['input_ids'][0])
    tokens['attention_mask'].append(new_tokens['attention_mask'][0])

# 将张量列表从新格式化为一个张量
tokens['input_ids'] = torch.stack(tokens['input_ids'])
tokens['attention_mask'] = torch.stack(tokens['attention_mask'])

outputs = model(**tokens)
# print(outputs.keys()) #odict_keys(['last_hidden_state', 'pooler_output'])

embeddings = outputs.last_hidden_state
# print(embeddings.shape) #torch.Size([4, 15, 768])

attention_mask = tokens['attention_mask']
# print(attention_mask.shape) #torch.Size([4, 15])

mask = attention_mask.unsqueeze(-1).expand(embeddings.size()).float()
# print(mask.shape) #torch.Size([4, 15, 768])

masked_embeddings = embeddings * mask
# print(masked_embeddings.shape) #torch.Size([4, 15, 768])

summed = torch.sum(masked_embeddings, 1)
# print(summed.shape) #torch.Size([4, 768])

summed_mask = torch.clamp(mask.sum(1), min=1e-9)
# print(summed_mask.shape) #torch.Size([4, 768])

mean_pooled = summed / summed_mask
# print(mean_pooled.shape) #torch.Size([4, 768])

mean_pooled = mean_pooled.detach().numpy()
result = cosine_similarity([mean_pooled[0]], mean_pooled[1:])
# print(result) #[[0.9864919  0.39011386 0.29779416]]

输入后果如下所示:

odict_keys(['last_hidden_state', 'pooler_output'])
torch.Size([4, 15, 768])
torch.Size([4, 15])
torch.Size([4, 15, 768])
torch.Size([4, 15, 768])
torch.Size([4, 768])
torch.Size([4, 768])
torch.Size([4, 768])
[[0.9864919  0.39011386 0.29779416]]

5. 局部代码了解

  了解上述代码最重要的就是了解从 last_hidden_state 到 mean_pooled 的计算过程,即通过 BERT 模型提取输出句子的 tensor,转换为可计算句子相似性的 vector 的过程。BERT 模型提取输出句子的 tensor 失去 last_hidden_state 的过程如下:

(1)torch.stack()函数

(2)unsqueeze()和 expand()函数
unsqueeze()示意裁减一个维度,expand()裁减为指定的维度,比方裁减为[4, 15, 768]。如下:

(3)torch.clamp()函数

      | min, if x_i < min
y_i = | x_i, if min <= x_i <= max
      | max, if x_i > max

参考文献:
[1]Huggingface Transformer 教程:http://fancyerii.github.io/20…
[2]huggingface transformers 的 trainer 使用指南:https://zhuanlan.zhihu.com/p/…
[3]Hugging Face 博客:https://huggingface.co/blog
[4]Hugging Face GitHub:https://github.com/huggingface
[5]How to generate text: using different decoding methods for language generation with Transformers:https://huggingface.co/blog/h…
[6]深度学习实践与实战:进步篇:http://fancyerii.github.io/20…
[7]Pytorch-Transformers:https://huggingface.co/transf…
[8]huggingface/transformers:https://github.com/huggingfac…
[9]dbiir/UER-py:https://github.com/dbiir/UER-py/
[10]UER: An Open-Source Toolkit for Pre-training Models:https://arxiv.org/abs/1909.05658
[11]liuhuanyong/ChineseTextualInference:https://github.com/liuhuanyon…
[12]HuggingFace Transformers 最新版本源码解读(一):https://zhuanlan.zhihu.com/p/…
[13]HuggingFace Transformers 最新版本源码解读(二):https://zhuanlan.zhihu.com/p/…
[14]如何评估微软提出的 BEIT-3:通过多路 Transformer 实现多模态对立建模:https://www.zhihu.com/questio…
[15]google-research/bert:https://github.com/google-res…
[16]教育类数据集汇总:https://aistudio.baidu.com/ai…
[17]UKPLab/sentence-transformers:https://github.com/UKPLab/sen…
[18]SentenceTransformers Documentation:https://www.sbert.net/index.html
[19]Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks:https://arxiv.org/abs/1908.10084
[20]Sentence-BERT: 一种能疾速计算句子类似度的孪生网络:https://www.cnblogs.com/gczr/…
[21]jamescalam/transformers:https://github.com/jamescalam…

本文由 mdnice 多平台公布

正文完
 0