開啟一切可能性的鑰匙,8K Text Embedding Model

閱讀時間約 20 分鐘

前言:

要檢查兩段長篇文字,內容是否雷同,長久以來困擾著大家,沒有好的嵌入模型,會耗費大量人力,需要對長篇文檔進行人工閱讀然後人工分類。本文除了展示如何能完美的解決這個痛點以外,也提供一些延伸應用思路,學習CP值很高。期待你能從本文取得許多新的應用思路與應用潛力!

技術說明:

嵌入模型能藉由計算抽取出一段文字的特徵值向量 [a1,a2,...an],每一個a1~an都相當於是投影在抽取出來的特徵向量上的投影長度,藉由比較兩段文字各自的嵌入特徵值向量,能夠快速得知其內容是否雷同。

本篇介紹的Text Embedding Model基於 Bert 架構,支援 Attention with Linear Biases (ALiBi) 的 symmetric bidirectional variant,允許用較短的序列長度訓練,用更長的序列長度來測試。

使用 512 序列長度進行訓練,可以推斷到 8196序列長度(甚至更長),當需要處理長文檔時,這個模型特別好用。

用途包括長文檔檢索、語義文本相似性、文本重新排名、推薦、RAG 和 LLM 的生成搜索,等等,可以拿來做各種應用!

該模型的Backbone是在 C4 數據集上預先訓練的,然後進一步在 Jina AI 的超過 4 億對正負樣本上進行訓練。這些句子對來自各種領域,通過徹底的清理與精心選擇。模型具有 1.37 億參數的標準大小,可以實現快速推斷,建議使用單個 GPU 進行推斷。

簡單用例嘗試:

測試語意非常相近的例子

預計要得到很高的Cosine Similarity分數

(為了簡化展示篇幅,這邊測試的皆是英文單句,其實可以輸入兩篇長篇文章做比對)

How is the weather today? vs. What is the current weather like today?

這兩句問的都是今天的天氣,得到Cosine相似度分數0.934的高分 (分數介於0~1之間)

順便得到Embedding向量的長度為768

from transformers import AutoModel
from numpy.linalg import norm
import numpy as np

cos_sim = lambda a, b: (a @ b.T) / (norm(a) * norm(b))
model = AutoModel.from_pretrained(
"jinaai/jina-embeddings-v2-base-en", trust_remote_code=True
) # trust_remote_code is needed to use the encode method
embeddings = model.encode(["How is the weather today?",
"What is the current weather like today?"])

print(np.shape(embeddings[0]))
print(cos_sim(embeddings[0], embeddings[1]))

output:

(768,)
0.9341313

測試語意不相干的例子

預計要得到很低的Cosine Similarity分數

(為了簡化展示篇幅,這邊測試的皆是英文單句,其實可以輸入兩篇長篇文章做比對)

I drew a dog. vs. The storm is coming.

這兩句話,表達完全不相干的語意,經過計算得到的分數較低,0.7以下顯示這兩句話相關性非常低。

embeddings = model.encode(["I drew a dog.", 
"The storm is coming."])
print(cos_sim(embeddings[0], embeddings[1]))

output:

0.6212821

打造推薦系統:

範例中的Keras Embedding layer輸入必須是int數字,如果輸入是電影名稱與分類的文字描述細節,則可以用model.encode來做嵌入編碼,把關於電影的描述轉成768維度的特徵值向量,然後和原本的Used_Id Embedding做內積,充分活用以下範例,可以打造商品推薦系統。至於資料集方面,要想辦法蒐集使用者的偏好度,可以藉由發問卷來達成。

model = AutoModel.from_pretrained(
"jinaai/jina-embeddings-v2-base-en", trust_remote_code=True
) # trust_remote_code is needed to use the encode method
embeddings = model.encode(movie_input)
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from tensorflow import keras
from keras.layers import Input, Embedding, Flatten, Dot, Dense
from keras.models import Model
from zipfile import ZipFile
from pathlib import Path

# Download the actual data from http://files.grouplens.org/datasets/movielens/ml-latest-small.zip"
# 使用 ratings.csv 檔案
movielens_data_file_url = (
"http://files.grouplens.org/datasets/movielens/ml-latest-small.zip"
)
movielens_zipped_file = keras.utils.get_file(
"ml-latest-small.zip", movielens_data_file_url, extract=False
)
keras_datasets_path = Path(movielens_zipped_file).parents[0]
movielens_dir = keras_datasets_path / "ml-latest-small"

# 只有在沒有DATA的時候才會進行下載
if not movielens_dir.exists():
with ZipFile(movielens_zipped_file, "r") as zip:
# 解壓縮
print("Extracting all the files now...")
zip.extractall(path=keras_datasets_path)
print("Done!")

ratings_file = movielens_dir / "ratings.csv"

# 取得電影評分數據
data = pd.read_csv(ratings_file)
print("Columns of data: ", data.columns)

# 創建用户和電影的索引
user_ids = data["userId"].unique()
movie_ids = data["movieId"].unique()

user_id_map = {user_id: i for i, user_id in enumerate(user_ids)}
movie_id_map = {movie_id: i for i, movie_id in enumerate(movie_ids)}

data["user"] = data["userId"].map(user_id_map)
data["movie"] = data["movieId"].map(movie_id_map)

# 劃分訓練還有測試集
train, test = train_test_split(data, test_size=0.2, random_state=42)

# 創建模型
EMBEDDING_SIZE = 768
user_input = Input(shape=(1,))
user_embedding = Embedding(len(user_ids), EMBEDDING_SIZE)(user_input)
user_embedding = Flatten()(user_embedding)

movie_input = Input(shape=(1,))
movie_embedding = Embedding(len(movie_ids), EMBEDDING_SIZE)(movie_input)
movie_embedding = Flatten()(movie_embedding)

dot_product = Dot(axes=1)([user_embedding, movie_embedding])
model = Model(inputs=[user_input, movie_input], outputs=dot_product)

model.compile(optimizer="adam", loss="mean_squared_error")

# 訓練模型
model.fit(
[train["user"], train["movie"]],
train["rating"],
epochs=5,
batch_size=64,
validation_data=([test["user"], test["movie"]], test["rating"]),
)

# 進行電影推薦
user_id = 1 # 推薦給誰,用用戶ID來區別

movies_watched = data[data["user"] == user_id]["movie"].unique()
unwatched_movies = data[~data["movie"].isin(movies_watched)]["movie"].unique()

user_ids = [user_id] * len(unwatched_movies)

user_ids_tensor = np.array(user_ids)
unwatched_movies_tensor = np.array(unwatched_movies)

predictions = model([user_ids_tensor, unwatched_movies_tensor])

movie_recommendations = pd.DataFrame(
{"movieId": unwatched_movies, "predicted_rating": np.ravel(predictions)}
)
movie_recommendations = movie_recommendations.sort_values(
by="predicted_rating", ascending=False
)
top_10_recommendations = movie_recommendations.head(10)

print(top_10_recommendations)

利用強化學習:

使機器聽得懂人話,聽到特定概念,轉成嵌入向量以後,當成輸入,經過強化學習,就會開始執行相對應的動作。例如對阿斯拉說,打開推進器,或是讓我們一起進入零的領域,阿斯拉就會根據環境數據,智慧的幫忙準備執行指令的配套,讓主角風見隼人可以放心地推動推進器。

state: 環境數據 / 風見隼人的聲音指令輸入,聲音轉文字,文字轉Embedding (打開推進器)
action: 執行打開推進器​,與其它和環境配套的措施
reward: 瞬時速度高,而且沒有撞到護欄,高速過彎
​state: 環境數據 / 風見隼人的聲音指令輸入,聲音轉文字,文字轉Embedding (風扇騰空過彎)
action: 執行風扇騰空過彎,與其它和環境配套的措施
reward: 瞬時速度高,而且沒有撞到護欄,高速過彎

能夠使用這項技術的論文(不限於這些):

反思的過程有一個反思標籤是檢查相關性,可以用上這裡的嵌入模型
Dall-E3裡面可以對文字升取樣前後計算Cosine distance,收斂表示已經加入足夠多對圖片的描述
同上,蒸餾監督微調步驟可以使用嵌入模型來判別是否可以停止蒸餾迴圈

其他嵌入模型:

V2 (Based on JinaBert, 8K Seq)

引用:

@article{DBLP:journals/corr/abs-2108-12409,
author = {Ofir Press and
Noah A. Smith and
Mike Lewis},
title = {Train Short, Test Long: Attention with Linear Biases Enables Input
Length Extrapolation},
journal = {CoRR},
volume = {abs/2108.12409},
year = {2021},
url = {https://arxiv.org/abs/2108.12409},
eprinttype = {arXiv},
eprint = {2108.12409},
timestamp = {Thu, 02 Sep 2021 14:42:29 +0200},
biburl = {https://dblp.org/rec/journals/corr/abs-2108-12409.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}


如果你對 AI 充滿熱情,學習上又不想浪費時間,我能夠以過來人的經驗給你不少想法,歡迎在Facebook群裡面留言。

如果想要用Zoom直接交談,為你直接解惑的,也可以點以下連結預約時間 (1小時)

 https://calendly.com/universe_ai/free_appointment

92會員
128內容數
帶你用上帝視角,針對市面上具有高度價值的影片/論文/書籍,用東方取象,與西方邏輯辯證的角度同時出發,跟著我一起來探討宇宙萬事萬物的本質,隨時隨地都可以來一場說走就走的思維旅行。作者在台積電 / 聯發科等科技產業有累計10年的資歷,近期對於人工智慧,東方易經,西方辯證邏輯,還有佛法向內求有深度興趣。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
[融-49]2022/12/22正式決定臣服一切,開啟靈性版圖再度遇上,幻化同性的雙生靈魂與雙人共舞,已能量合一的彼此和諧、協調狀態。即便這樣的合諧,仍想回歸三維頭腦認知的理想生活,恐懼成為代言人此事,因一部推薦影片,發現木已成舟,無法再逃避,2022/12/22正式決定臣服一切,開啟靈性版圖。也接露「高我」意義真相與真面目。
Thumbnail
avatar
深度覺醒研究院 | Peily
2023-10-25
普丁對烏克蘭為何如此執著?一切得從「蘇聯解體」開始說起有一天,普丁曾經表示,蘇聯解體是「上個世紀最慘烈的地緣政治災難」。從1999年以來,克里姆林宮的強人普丁矢志克服這個「災難」,並讓俄羅斯重拾強國威勢。蘇聯和美國並處冷戰時期的超級強權,是俄羅斯的前身;俄羅斯則是擁有核子武器的國家之一,並在聯合國安全理事會(UNSC)擁有永久席次。
Thumbnail
avatar
寶鼎出版
2023-08-17
20220117催眠故事--即使緣份已經,也不用否定過去的快樂,只要記住拋開過去不開心的一切,從現在起做自己開心的事情。這個她曾以為能交付未來的男人,充份地展現著「愛自己」,對於過去不敢愛自己的小霖來說,或許是個很好的學習對象!當小霖也充份地愛著自己的時候,再回頭看看現在的自己,一定會覺得自己幹嘛這麼委屈、做著那麼多以為別人會開心而自己也不開心的舉動。
Thumbnail
avatar
Elsa
2022-01-17
同一副鑰匙,開啟了故事也結了一切-為何還沒開始就先斷定沒有結果?為何女孩會打從一開始就斷定自己和男孩沒有結果呢?(若沒看過前面的故事的可以先去看{同一副鑰匙,開啟了故事也結了一切}的上下篇喔) 這要從女孩對男孩的第一印象說起… 沒有接觸過彼此前,女孩眼中的男孩還算是個長相帥氣、穿著時尚、很懂得打扮自己的男生,感覺是校園裡的風雲人物之一。可惜總是板著一張臉,看起來
Thumbnail
avatar
Sunny
2021-07-02
同一副鑰匙,開啟了故事也結了一切(下)剩下的故事 男孩和女孩不再見面後,其實也距離大考沒多久了。女孩說不上太難過,似乎甚麼事都沒發生一樣,他只是很努力告訴自己,保持冷靜、在大考前好好的最後衝刺,其他的事等大考完再說了...雖然她偶爾還是會讀書讀到一半,打開筆袋看著男孩和嬉鬧時留下來的紙條… 女孩在大考前的幾天依舊會去以前和男孩一起讀書的
Thumbnail
avatar
Sunny
2021-06-16
同一副鑰匙,開啟了故事也結了一切(上)今天,分享一個故事 一個沒有結局的故事。 有一個男孩突然在某一天靠近了一個女孩,女孩一開始不以為意。而男孩和女孩其實不常見面,見了面能相處的時間也不多,相處時,多半的時間都各自再念各自的書,準備大考。但男孩開始對女孩越來越好,在女孩讀書讀到很晚時,男孩會留下來陪女孩,直到女孩回家。在認識一段時間後,
Thumbnail
avatar
Sunny
2021-06-09
寫文章賺錢?LikeCoin開啟了Blog創作者的收入開關,而且這一切才正要開始...不知道你過去是否也有寫過Blog? 從無名小站、MSN sapce、痞客邦、Wordpress.com,到現在方格子、Matters,過去我從大學開始,十年來寫了200篇的內容,從沒想說要放Google廣告賺錢,只想說在茫茫網路世界中,留下記錄,隨緣地佛系心態寫部落格 你有想過文章也能賺錢嗎??
Thumbnail
avatar
許弘德
2020-05-30
開啟一場「不花費的旅行 」關於旅行,有很多方式,一定才要花大錢才能有大享受? OH!不~你想想看,假設今天出門,你身上剛好只帶100元,你是不是會想儘辦法善用這100元,來解決你的開銷。 旅行也一樣,預算有限,或是根本沒預算,你就會絞盡腦汁你要用什麼方式來完成這趟旅行?如果還沒想到,來我這,我有方法要告訴你!
Thumbnail
avatar
逆商教主Jinjin Wen
2020-03-02
開啟將太壽司之路的壽司 : 一開始其實是米發酵的保久食品很多到日本旅遊的朋友都會發下豪語 : 去日本就是要吃壽司 ! 在台灣可以看到 : 壽司捲、握壽司、散壽司。 但是你知道嗎? 壽司一開始其實是保久食品,是一種乳酸發酵的保存食物。 說起乳酸發酵,大家一定不陌生。從騙小孩的養樂多、我們常吃的泡菜 還有辣椒醬等,其實都是乳酸發酵的產品。
Thumbnail
avatar
走吧 我們一起旅行
2019-10-02
開啟男人情與欲的開關,就能使他愛上你 每個男人心中都有一個開關,不論妳年紀如何、長相客觀來說是否真的很正、身材是否真的很好,只要瞭解要怎麼去按下男人心中欲與情的開關,每個人都可以變成自己喜歡的對象的夢中情人。 男人的愛情是以「欲」為基礎
Thumbnail
avatar
文飛(Dana)
2018-11-03