利用Hugging Face中的模型進行句子相似性實踐

2022-08-31 12:01:50

  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][10],訓練資料使用的[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/2021/05/11/huggingface-transformers-1/
[2]huggingface transformers的trainer使用指南:https://zhuanlan.zhihu.com/p/358525654
[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/how-to-generate
[6]深度學習理論與實戰:提高篇:http://fancyerii.github.io/2019/03/14/dl-book/
[7]Pytorch-Transformers:https://huggingface.co/transformers/v1.2.0/
[8]huggingface/transformers:https://github.com/huggingface/transformers
[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/liuhuanyong/ChineseTextualInference/
[12]HuggingFace Transformers最新版本原始碼解讀(一):https://zhuanlan.zhihu.com/p/360988428
[13]HuggingFace Transformers最新版本原始碼解讀(二):https://zhuanlan.zhihu.com/p/363014957
[14]如何評價微軟提出的BEIT-3:通過多路Transformer實現多模態統一建模:https://www.zhihu.com/question/549621097/answer/2641895293
[15]google-research/bert:https://github.com/google-research/bert
[16]教育類資料集彙總:https://aistudio.baidu.com/aistudio/projectdetail/3435637
[17]UKPLab/sentence-transformers:https://github.com/UKPLab/sentence-transformers
[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/p/12874409.html
[21]jamescalam/transformers:https://github.com/jamescalam/transformers/blob/main/course/similarity/03_calculating_similarity.ipynb

吾愛DotNet 右邊的圖片 專注於.NET領域的技術分享

人工智慧乾貨推薦 左邊的圖片1 專注於人工智慧領域的技術分享