例如,在高维空间中表示低维向量。
什么是向量?
我须要刷新我对矢量的影象,因此在这里添加这些注释,以便让任何有相同想法的人都能理解-
还记得标量吗?一个没有方向但代表大小的数值(比如温度这样的值),例如整数、常量等……
矢量是标量的凑集,它既有大小(或长度),也有方向。例如:力
图片作者:Canva 设计
上图中的红线代表一个矢量,它有长度(大小)并且还显示方向(箭头)。
由于这个向量从 (0,0) 开始,目前位于 (2,2),因此我们利用勾股定理得出向量的长度。红线上的箭头表示方向。这是二维空间中向量的一个例子。
利用勾股定理获取矢量的长度(幅度)
什么是文本嵌入?“嵌入”一词借用了数学中向量空间中的嵌入观点。
例如,用户用大略的英语发送查询或提示,但打算机不理解文本。因此,我们须要一个流程来以机器理解的措辞来表示文本和其他输入格式。
这个过程称为文本嵌入。
文本嵌入便是将原始文本数据表示在向量空间中。它的官方阐明是这样的——“将文本数据表示在连续的高维向量空间中的过程”。
正如我们在之前的图中看到的,向量可以在二维空间中表示,在文本嵌入中也是如此,为了保留文本的含义和高下文,它们被表示在 n 维空间中,维度范围从数百到数千乃至更高。这是一个高维空间。
文本嵌入的目标是捕捉句子、段落等大块文本的含义和高下文。
对付初学者来说,文本嵌入和词嵌入可能听起来是同一件事,但事实并非如此。
虽然我们现在知道什么是文本嵌入,但是词嵌入是一种表示形式,个中具有相似含义的词具有相似的表示形式。
天生词嵌入的常用技能包括Word2Vec,GloVe和FastText。
斯坦福的单词表示全局向量 (GloVe)是一个可下载的预演习向量数据库。这些高维向量包含在 spaCy 中。
文本嵌入是利用循环神经网络 (RNN)、卷积神经网络 (CNN) 和 Transformer 等技能天生的。例如,BERT、GPT 和 Universal Sentence Encoder 等预演习模型可以天生高质量的文本嵌入。
一些盛行的文本表示根本技能是独热编码和 BoW。
怎么运行的?嵌入用于许多用例,如搜索、聚类推举、分类等。它们用于查找文本字符串之间的相似性(干系性)。
由于文本字符串表示为向量,因此可以利用两个向量之间的间隔来打算不同字符串的干系性。
欧氏间隔和余弦间隔(或相似度)是用于丈量两个向量之间的间隔或相似度的不同方法。
余弦相似度是一种度量方法,通过打算两个向量之间的角度的余弦来确定它们的相似度。余弦相似度的打算方法是将向量的点积除以两个向量幅度的乘积。
它是两个向量之间角度的余弦,用于丈量方向,而不是幅度。余弦值越靠近 1,向量越相似。
余弦间隔源自余弦相似度。其打算办法为 1 减去余弦相似度。它用于衡量两个向量之间的差异,在向量的方向比其大小更主要时利用。余弦间隔越靠近 0,向量越相似。
欧氏间隔打算两点之间的“直线”间隔。
我们没有欧几里得相似性的观点,由于在大多数情形下“相似性”不是通过间隔来定义的,而是通过角度来定义的。
OpenAI官方文档建议利用余弦相似间隔函数。
例子在 OpenAI 的官方文档中,示例利用了 OpenAI 最新版本中不存在的 utils 包,因此我们可以选择利用 Numpy 或 Scipy Python 库来获取向量的余弦相似度。
Numpy 和 Scipy 都是用于数学和数值剖析的 Python 库。Numpy(数值 Python)用于低级科学打算。Scipy(科学 Python)扩展了 Numpy 的功能,并供应了更高等、用户友好的功能。
让我们探索一些超级大略的用例来理解嵌入的一些基本观点。
我们将利用 OpenAI 的嵌入 API 来获取我们作为输入通报的一些示例文本的嵌入。得到嵌入后,我们将打算向量之间的余弦相似度和欧几里得间隔。
余弦相似度作者图片
client = OpenAI(api_key=os.environ.get("OPEN_AI_KEY"))response1 = client.embeddings.create( input="cat is a pet animal", model="text-embedding-3-small")embedding1 = response1.data[0].embeddingresponse2 = client.embeddings.create( input="cat drinks milk", model="text-embedding-3-small")embedding2 = response2.data[0].embeddingresponse3 = client.embeddings.create( input="rose is a flower", model="text-embedding-3-small")embedding3 = response3.data[0].embeddingcosine1 = np.dot(embedding1, embedding2) / (norm(embedding1) norm(embedding2))print(cosine1)cosine2 = np.dot(embedding1, embedding3) / (norm(embedding1) norm(embedding3))print(cosine2)
利用“text-embedding-3-small”模型的相应
from openai import OpenAIimport osimport numpy as npfrom numpy.linalg import normclient = OpenAI(api_key=os.environ.get("OPEN_AI_KEY"))response1 = client.embeddings.create( input="cat is a pet animal", model="text-embedding-3-large")embedding1 = response1.data[0].embeddingresponse2 = client.embeddings.create( input="cat drinks milk", model="text-embedding-3-large")embedding2 = response2.data[0].embeddingresponse3 = client.embeddings.create( input="rose is a flower", model="text-embedding-3-large")embedding3 = response3.data[0].embeddingcosine1 = np.dot(embedding1, embedding2) / (norm(embedding1) norm(embedding2))print(cosine1)cosine2 = np.dot(embedding1, embedding3) / (norm(embedding1) norm(embedding3))print(cosine2)
利用“text-embedding-3-large”模型的相应
从余弦相似度的定义我们知道,余弦值越靠近1,向量越相似。
在上面两个回答中,我们可以看到句子 1 和句子 2 之间的余弦相似度比句子 1 和句子 3 之间的余弦相似度更靠近 1。
2.欧氏间隔
作者图片:欧氏间隔公式
from openai import OpenAIimport osimport numpy as npclient = OpenAI(api_key=os.environ.get("OPEN_AI_KEY"))response1 = client.embeddings.create( input="cat is a pet animal", model="text-embedding-3-large")embedding1 = response1.data[0].embeddingresponse2 = client.embeddings.create( input="cat drinks milk", model="text-embedding-3-large")embedding2 = response2.data[0].embeddingresponse3 = client.embeddings.create( input="rose is a flower", model="text-embedding-3-large")embedding3 = response3.data[0].embeddingprint("euclidean distance between 1 and 2")print(np.linalg.norm(np.array(embedding1) - np.array(embedding2)))print("euclidean distance between 1 and 3")print(np.linalg.norm(np.array(embedding1) - np.array(embedding3)))
句子间欧氏间隔的相应
在欧几里得间隔的背景下,值越小,表示它们所代表的向量(或嵌入)之间的相似性越高。这是由于欧几里得间隔丈量的是空间中两点之间的“直线”间隔;点越近,它们就越相似。
给定两个欧氏间隔:
0.98485965872946831.1928713360751884间隔越小,0.9848596587294683,表示文本相似度越高。
与上述示例类似,我们可以在各种用例中利用 Embeddings API,例如分类、聚类等。请查看 OpenAI 官方页面上给出的示例。
参考:https://levelup.gitconnected.com/what-are-text-embeddings-and-how-do-they-work-6107bd52998b