关于句子嵌入Sentence Embeddings 你想知道的一切(也许更多)

时间:2025-05-08 07:23:15

1、这是有合理的!由于b和c具有相同的角度,因此a和b以及a和c之间的余弦相似度相同。然而,a和c的点积较高,因为c比b长。

2、

3、笔记

4、还有其他距离函数,例如曼哈顿距离,但这些都是常见的函数,对我们的用例很有用!

5、要快速查看Dataset对象中的数据,我们可以将其转换为PandasDataFrame并查看第一行。

6、现在我们加载了一个模型,让我们用它来编码一些句子。我们可以使用encode方法来获取句子列表的嵌入。我们来尝试一下吧!

7、图解Word2vec,读这一篇就够了

8、让我们首先创建常见问题映射。

9、在Lee’sblogpost中阅读有关该项目的更多信息。这是一个很好的示例,说明如何在浏览器中使用嵌入!

10、让我们绘制两个向量。正如您所看到的,它们在方向上非常相似,但大小不同。

11、我希望这能让您了解什么是词嵌入。现在我们了解了词嵌入,让我们看看句子嵌入!

12、Word2Vec和GloVe的训练目标是确保相似上下文中出现的单词具有相似的嵌入。

13、因此,我们希望通过对token4和5进行平均来池化它们的嵌入。我们首先获取token的嵌入。

14、让我们将其包装在一个函数中!

15、何时使用每种池化策略?这取决于任务。

16、在这种情况下,A和B的点积如下所示

17、回顾一下:

18、我们再次使用encode方法来获取所有问题的嵌入。

19、下图是一个很好的示例,说明如何使用嵌入来查找可以回答用户问题的代码。

20、最后,我们可以通过以下方式计算余弦相似度

21、这个方法如何运作?语料库被分为更小的块,这使我们能够管理内存和计算使用情况。分块发生的方式有两种:

22、

23、要理解为什么我们要进行归一化,重新审视一些向量数学会很有帮助。对于具有分量(v1,v2,…,vn)的向量v,其长度定义为

24、我们得到了相同的结果,太棒了!现在让我们重复之前的搜索示例。

25、现在,让我们看一个有趣的应用程序,其中扩展问题变得更加明显。

26、通过嵌入,我们可以轻松找到相似的问题,而无需实现任何这些系统并获得出色的结果!

27、这与我们上面的结果相符。

28、一旦用户提出问题,我们就获得其嵌入。我们通常将这种嵌入称为查询嵌入。

29、

30、笔记

31、让我们从安装库开始:

32、在实践中,您可以使用平方欧几里得(L2-Squared)

33、NLP的美好时光

34、嗯……这里看起来有些不对劲????人们会期望它能开箱即用。

35、在实践中,池化方法将与模型一起存储,您不必担心它。如果没有指定方法,均值池化通常是一个很好的默认值。

36、查看MTEB中涵盖的不同任务以更好地了解潜在的句子嵌入应用程序很有趣。

37、MTEB为我们提供了保障。该排行榜包含针对各种任务的多个评估数据集。让我们快速看看选择模型时我们感兴趣的一些标准。

38、更多阅读:

39、

40、笔记你能想到余弦相似度为1的两个向量吗?考虑具有相同方向但不同大小的向量。

41、与CLStoken对应的隐藏状态/嵌入可用于微调分类模型。

42、让我们尝试一下西班牙语吧!

43、笔记

44、Imageofcodesearch

45、SentenceEmbeddings.Cross-encodersandRe-ranking句子嵌入。交叉编码器和重新排名

46、

47、

48、Wordembeddings词嵌入

49、不要太担心这里的细节。我们的主要目标是了解这个项目的高层想法;因此,如果这是您第一次听到“量化”这个词,请不要害怕!

50、您可以在此处阅读内容,也可以通过单击页面顶部的徽章在GoogleColab中执行内容。让我们深入研究嵌入!

51、对向量进行归一化时,我们会缩放值以使向量长度为​​1。这是通过将每个向量元素除以向量的大小来完成的。

52、这相对容易,但是sentence-transformers库使我们更容易完成所有这一切!这里的代码与TL;DR部分中的代码相同。

53、

54、现在让我们获取每个token的嵌入。

55、这是该算法的一些伪代码:

56、到目前为止,我们只处理了几句话。在实践中,您可能需要处理数百万个嵌入,并且我们不能总是计算到所有嵌入的距离(这称为暴力搜索)。

57、Example1.示例1:king和queen嵌入在双方都angry的上下文中的相似性。

58、我们还需要计算向量的点积。点积定义为相应向量分量的乘积之和

59、AsaTL;DR作为一名TL;DR

60、我们刚刚了解了点积、余弦相似度和欧氏距离。什么时候用哪个?

61、让我们将所有内容包装在一个函数中,以便稍后可以轻松使用它。

62、让我们深入研究它的数学。余弦相似度定义为向量的点积除以其模的乘积:

63、

64、漂亮!我们获得了模型输出的第一个嵌入,对应于[CLS]token。让我们将这段代码封装到一个函数中。

65、好吧,看起来他们在这个上下文中非常相似!现在我们来看看“happy”这个词。

66、好多了!我们刚刚获得了最接近“Todayisasunnyday”的句子。

67、现在让我们看看同一个单词如何根据上下文具有不同的值:

68、这是有道理的;与happy嵌入相比,queen嵌入更类似于king。

69、

70、好吧,还是很快!让我们看看其他一些值

71、综上所述,不要过度关注单个数字。您应该始终查看任务的具体指标以及特定的资源和速度要求

72、正如词嵌入是词的向量表示一样,句子嵌入是句子的向量表示。我们还可以计算段落和文档的嵌入!我们来看看吧。

73、准备数据

74、

75、最后一步是执行标准化。归一化确保嵌入向量具有单位长度,这意味着其长度(或模)为1。

76、您可以使用max_pairs来限制返回的对的数量。

77、我们已经在博客文章的开头讨论了模。我们需要计算向量分量平方和的平方根

78、让我们看一下句子的tokenization:

79、好的!我们只是1.计算100,000个问题的嵌入2.获得最相似的句子,以及3.对它们进行排序

80、现在让我们编写一个函数来搜索语料库中最相似的问题。

81、在实践中,您可能会对批量句子进行编码,因此我们需要进行一些更改

82、耶!正如您所看到的,嵌入的前十个元素是相同的!现在让我们使用这种新的嵌入技术重新计算距离:

83、以下是一些有用的资源:

84、现在我们更好地了解了嵌入是什么以及如何使用它们,让我们更深入地研究它们!

85、第一个值是分数,第二个值是语料库问题的索引,第三个值是语料库问题的另一个索引。分数表明两个问题的相似程度。

86、围绕嵌入的生态系统非常庞大。

87、现在让我们看看这对应于哪些问题和答案:

88、在推理时

89、就像以前一样,我们可以加载模型和tokenizer,对句子进行分词并将其传递给模型

90、这一切都在20秒内完成!让我们看看相似度最高的5场比赛

91、我们刚刚计算了10个嵌入与10个嵌入的距离。速度相当快。现在让我们尝试1000个查询。

92、点积定义为相应向量分量的乘积之和(这就是我们之前所做的!)

93、什么是归一化?

94、

95、二维嵌入的表示

96、这取决于model!某些模型将以产生归一化嵌入的方式进行训练。在这种情况下,点积、余弦相似度和欧氏距离都将产生相同的结果。

97、我们可以采取相同的方法,使用[CLS]token的嵌入代表句子嵌入。让我们看看它在代码中是如何工作的。我们将使用与之前相同的句子。

98、这可能听起来令人困惑,所以让我们重复一下这里发生的事情。

99、MTEB任务图片来自论文

100、

101、我们可以采取三种方法:[CLS]池化、最大池化和均值池化。

102、

103、如果您不确定“向量”、“语义相似性”、向量大小或“预训练”等词的含义,请不要担心!我们将在以下部分中解释它们。首先关注高层理解。

104、现在让我们使用torch.mean对它们进行平均。

105、注意,使用此模型,每个嵌入都更小(384个值而不是768个值)。我们现在可以计算嵌入的平均值以获得句子嵌入。

106、我们的第一步是加载数据-为此,我们将使用datasets库。