文字向量化模型acge_text_embedding

soreaK發表於2024-05-08

1.背景
文字向量化模型是自然語言處理(NLP)中的一項核心技術,它可以將單詞、句子或影像特徵等高維的離散資料轉換為低維的連續向量,從而將文字資料轉換為計算機能夠處理的數值型向量形式。當文字資訊被轉換為向量形式後,輸出的結果能夠進一步地為多種後續任務提供有力支援,例如:搜尋、聚類、推薦、分類等。
在主體框架上,acge_text_embedding模型主要運用了俄羅斯套娃表徵學習(Matryoshka Representation Learning,以下簡稱MRL)這一靈活的表示學習框架。類似於俄羅斯套娃結構,MRL 產生的嵌入向量也是一個巢狀結構,其旨在建立一個巢狀的、多粒度的表示向量,每個較小的向量都是較大向量的一部分,並且可以獨立用於不同的任務。在訓練時,MRL根據指定維度[64,128,...,2048,3072]的向量來計算多個loss。使得使用者在推理時,可以根據自己的實際需求,輸入維度引數,來得到指定維度的向量。
MRL的最佳化問題可以表示為

這種方法的核心思想是學習不同粒度的資訊,允許一個嵌入向量在保持準確性和豐富性的同時,適應不同計算資源的需求,並可以無縫地適應大多數表示學習框架,並且可以擴充套件到多種標準計算機視覺和自然語言處理任務。
運用MRL技術,實現一次訓練,獲取不同維度的表徵,acge模型實現了從粗到細的層次化表示,從而提供了一種在推理和部署時不需要額外成本的靈活表示。另外,具體實踐上,為做好不同任務的針對性學習,acge模型使用策略學習訓練方式,顯著提升了檢索、聚類、排序等任務上的效能;引入持續學習訓練方式,克服了神經網路存在災難性遺忘的問題,使模型訓練迭代能夠達到相對優秀的收斂空間。
2.特點
acge模型是一個通用的文字編碼模型,是一個可變長度的向量化模型,來自於合合資訊科技團隊,對外技術試用平臺TextIn。其有以下幾個特點:
Token:acge模型支援最大1024 tokens,可以滿足大多數場景的分詞需求;
模型大小:0.65GB,模型較小,佔用資源少,又便於部署和維護;
分類任務效能: acge的平均準確率(Average)為69.07%,在所有模型中排名最高;
向量維度:模型輸入文字長度為1024,可以有效的輸入更豐富的資訊。
acge模型較小,佔用資源少,聚類分數也比較高,支援在不同場景下構建通用分類模型、提升長文件資訊抽取精度,且應用成本相對較低,可幫助大模型在多個行業中快速創造價值,推動科技創新和產業升級,為構建新質生產力提供強有力的技術支援。
3.使用
acge模型提供了預訓練好的模型供試用與效能復現,首先安裝sentence_transformers依賴:
pip install --upgrade sentence_transformers
安裝完成後

from sentence_transformers import SentenceTransformer

sentences = ["資料1", "資料2"]
model = SentenceTransformer('acge_text_embedding')
print(model.max_seq_length)
embeddings_1 = model.encode(sentences, normalize_embeddings=True)
embeddings_2 = model.encode(sentences, normalize_embeddings=True)
similarity = embeddings_1 @ embeddings_2.T
print(similarity)

或者我們可以從acge_text_embedding模型入口使用官網自帶的API來測試

數值代表了表示源文字與目標文字之間的語義相關性,相似度值越接近於1,文字之間的語義相關性越強
從測試中可以看出,與“今天想吃蕃茄炒雞蛋”最相近的是“今天想吃番茄炒雞蛋”,而“昨天吃的是紅燒肉”在語義上也表達出了“日期”,“吃”,“食物”等特點,剩下的語句也僅僅在語義上涉及了“日期”的概念,所以相似度很低。
4.程式碼
在sentence-transformer庫中的使用方法:

from sentence_transformers import SentenceTransformer

sentences = ["資料1", "資料2"]
model = SentenceTransformer('acge_text_embedding')
print(model.max_seq_length)
embeddings_1 = model.encode(sentences, normalize_embeddings=True)
embeddings_2 = model.encode(sentences, normalize_embeddings=True)
similarity = embeddings_1 @ embeddings_2.T
print(similarity) 

在sentence-transformer庫中的使用方法,選取不同的維度:

from sklearn.preprocessing import normalize
from sentence_transformers import SentenceTransformer

sentences = ["資料1", "資料2"]
model = SentenceTransformer('acge_text_embedding')
embeddings = model.encode(sentences, normalize_embeddings=False)
matryoshka_dim = 1024
embeddings = embeddings[..., :matryoshka_dim]  # Shrink the embedding dimensions
embeddings = normalize(embeddings, norm="l2", axis=1)
print(embeddings.shape)

相關文章