谈论AI 时被经常提及的“嵌入(embedding)”和“向量(Vector)”到底是个啥?
生财有术 ·
2023年06月02日16:35
随着ChatGPT等AI应用的持续火热,讨论到相关话题时,相信大家都经常会听到几个词「嵌入(embedding)、向量(Vector)」,这东西到底是个啥?从很多的交流中可以发现,其实大多数人对这个东西都还是似懂非懂的状态。
我们先来说,什么叫嵌入(embedding),通俗一点讲,就是把文本的意思嵌入向量里,也就是用向量来表示文本的含义。「当然向量里面能存的可不仅仅是文本,我前面只是以文本举例子,像音频、视频都是可以用向量表示的。」
那为啥要转向量呢?因为转向量后,这样我们就可以通过一些算法来计算文本的相似程度「比如余弦相似度(CosineSimilarity)、欧氏距离(EuclideanDistance)等等」
那又如何把文本转化成向量呢?转化的过程其实就是文本特征提取,要用专业名词就是词嵌入。这个过程需要特定的模型「比如词袋模型、TF-IDF等」来帮我们完成。
在上面的这个转化的过程当中,使用的技术方法不同,最终的效果也是不同的,比如为什么ChatGPT会这么智能,就是因为GPT模型使用的并不是传统的嵌入技术,而是一种叫做「上下文词向量表示法」的方法,这个方法的关键在于,每个单词的向量表示不仅取决于这个单词本身,还取决于这个单词在文本中的上下文。也就是说,同一个单词在不同的上下文中可能会有不同的含义,而这种含义的差异能够被GPT的向量表示捕捉到。举个例子,“苹果”这个词在讨论水果时和在讨论电子产品(如苹果电脑)时的含义就完全不同。
这种表示方法被称为Transformer的自注意力机制,可以很好地捕捉和理解复杂的语言模式和语义关系。据说GPT模型就是在大规模的文本数据学习中自己学会的这个方法,现在大家应该有点明白为什么ChatGPT的理解能力和逻辑能力很强了吧?
那说了这么多的“向量”,“向量”到底是个啥?
在数学中,向量是一种表示有大小和方向的量的工具。如果把向量想象成一支箭头,那箭头的长度代表了大小,箭头的指向就代表了方向。
但在机器学习中,向量就变得更抽象了,抽象在哪呢?它会被用来表示更复杂的信息「不像数学中只有大小和方向」,如词语的意思、句子的含义、甚至整篇文章的主题等等。
比如,我们可以把一个单词转化成一个向量,这个向量的元素可能表示这个单词的语法角色(比如它是名词、动词还是形容词)、语义特性(比如它是表示快乐的,还是表示悲伤的)、甚至是它和其他单词的关联程度等等。
我们可以简单把向量理解为一种数据的编码方式,每个维度都可以被认为是一个特性或属性,这些特性或属性共同描述了一个数据点(例如,一个词、一个句子或一个文档),要注意的是,这些信息并不是直接编码的,因此我们不能直接从一个词向量中读出这个词是一个名词还是动词,或者这个词表示的是快乐还是悲伤。相反,这些信息是通过词向量在高维空间中的位置和方向隐含的。如果觉得这里不好理解,我们尝试把向量想象成一种复杂的密码。这个密码是一串数字,但你不能直接看着这串数字就知道它代表的意思。相反,你需要一种特殊的工具或者方法才能解读这个密码。
最后我们通过一个实例来进行说明,我们使用OpenAI的embedding-ada-002模型「接口https://api.openai.com/v1/embeddings」来创建三个向量,一个表示‘苹果’,一个表示‘梨子’,一个表示‘电脑’:
‘梨子’如下
‘电脑’如下
使用OpenAI的embedding-ada-002模型创建的向量有1536个维度,我们日常讨论空间的时候,通常都说二维、三维,在这我们就可以简单做个类比,二维空间就好比是一个二维向量,三维空间就是一个三维向量,那么我们前面创建的向量是1536维的,也就是说它构成了一个1536维的空间,我们的向量就分布在这个空间里,如果两个词的向量表示在这个1536维的向量空间中很接近,那么我们可以认为这两个词在某种意义上是相似的。现在大家应该也能感受到什么是‘高维向量’了吧?
通过前面我们获取到的向量表示,看起来‘苹果’、‘梨子’和‘电脑’的向量,分别是一个长度为1536的数字列表「数组」,很显然我们是没有办法看向量就知道它代表的是‘苹果’还是‘梨子’,但是我们可以使用一个叫做‘余弦相似度’的算法来比较两个向量,发现它们两个的向量比较相似,并且它们两个都与水果类型的非常接近「在空间中的位置比较近」,所以ChatGPT就大概知道了它们两个应该是水果,应该都能吃。但是‘电脑’的向量表示跟他们并不相似,所以ChatGPT也就知道了电脑应该不是水果类的,跟它们有比较大的不同。
我们简单实现一个“余弦相似度”的算法,用来分别比较一下‘苹果’、‘梨子’和‘电脑’的值,我们就可以直观的看到向量之间的差异
‘苹果’和‘梨子’的余弦相似度:
0.8703165905925271
“余弦相似度”主要度量的是两个向量间的角度,是一个-1到1之间的数字:
•值越接近1表示越相似•值越接近-1表示越相反•值越接近0表示越不相关
"苹果"和"梨子"的余弦相似度为0.8703,这表示在多维向量空间中,这两个词的距离比较接近,这意味着模型认为"苹果"和"梨子"在语义上更为相似。这与我们在现实生活中的感觉是一致的,因为它们都是水果,有很多相似的地方。
"苹果"和"电脑"的余弦相似度为0.8479,它的值比"苹果"和"梨子"的要小,说明"苹果"和"梨子"的相似度比"苹果"和"电脑"的要高。这与我们在现实生活中的感受也是吻合的。
但要注意的是,"苹果"和"电脑"的余弦相似度为0.7973,这个值依然较高,从数值的角度来看表明它们也有一定的相似性,但是一个是电器一个是水果,这两个感觉一点都不相似啊?这恰恰就是我们前面说的,GPT用的是「上下文词向量表示法」,因为我们都知道有一个东西叫「苹果电脑」,所以"苹果"和"电脑"也经常一起出现,因此它们也有一定的语义关联性。
最后再说一点,向量有个很神奇的地方,就是它是和语言无关的。什么意思呢?举个例子,我把一组英文数据集进行向量转化并存储在向量数据库,然后用户提问的时候,是可以使用中文进行匹配和返回的。这好像是间接性的实现了多语言,已经有不少的开源项目在利用这个特性提供自己的帮助手册,它们把自己的帮助手册向量化,然后可以让用户进行提问,你用什么语言提问,它最后就可以给你返回什么语言。比如我在文中使用langchain框架
「https://js.langchain.com/docs/」、supabase
docs「https://supabase.com/docs/guides/database/overview」,大家可以去体验一下。
注意事项:
有一点注意的是,使用不同的向量嵌入模型以及比对算法,最终的效果是差异很大的。以上的示例是使用的OpenAI的embedding-ada-002模型创建的向量,比对是使用的余弦相似度算法。你使用的方案不同,最终的效果可能会跟本文不同。
关于「嵌入(embedding)、向量」的相关概念就说到这了,希望本次分享能对大家的理解有所帮助。