乐趣区

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

  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 多平台公布

退出移动版