上一节通过词汇表将 token 文本转换为数值,也就是转换为 token ID ,这之后计算机便可以进行下一步的操作了。
但是这里我抛出一个问题:计算机在进行运算时,可以基于 token ID 进行计算吗?
你可以先思考5秒钟,然后继续往下看。
答案是不行的。原因先不说,直接举个例子。
假设有以下三个 token ,以及它们在词汇表中分别对应的 token ID 。
yaml
dog : 100
cat : 101
run: 1
如果直接按照这个 token ID 来计算的话,很显然 cat = dog + run,这样可以翻译为:会跑的狗等于猫。
这个逻辑显然不对,虽然上面的 token 以及 token ID 是我编的,但是在真实的词汇表的 token ID 中,会很容易出现类似的问题。
因此,计算机要理解 token 之间的语义关系(比如两个单词是近义词还是反义词),以 token ID 这种简单的数值来运算是肯定不行的。
这里就需要将 token ID 做进一步的转换,使其可以更好的表达 token 之间的语义关系。
一个更好地表示方法,便是将 token ID 转换为向量,使得一个数值可以在多维空间进行表示,从而丰富其含义和特征。
这个过程便是对文本转换的第二个过程,也就是词嵌入(Embedding)。
怎么理解这个过程呢?请往下看。
什么是词嵌入向量?
首先,词嵌入的作用,是将整数(这里就理解为 token ID 就好了)转换为一个固定大小的向量。
这些转换过程可以通过模型的大规模训练来完成。转换完之后的向量可以捕获以及表达 token 之间的复杂关系,比如语义关系、语法关系等。
这些向量通常被称为嵌入向量,用多维数据进行表示,每一维都代表 token 的一些隐含特征。
举个例子,假设 cat 转换为词嵌入向量后为 [100, 200, 300]。
这里是为了举例子,用了一个仅包含3个特征(通常情况下为512个特征)的向量。其中,100 可能代表" cat 是动物",200 可能代表" cat 属于猫科",300 可能代表" cat 会跑"。
也就是说,向量中的每一个数字都代表 cat 的一种特征。如此一来,一个包含了很多特征的向量,就可以较为丰富的代表这个 token 了。
将数值转换为词嵌入向量这个过程,有很多成熟的算法(模型)可以实现,这个过程需要对大量的文本进行训练才能正确完成转换。这里的算法和模型在后面章节会介绍,这里先介绍概念。
这里有一个全程一站式的 Transformer 讲解和实战辅导,带你从零手写一个可对话的大模型,点击链接查看详情从零手写大模型实战
词嵌入的通俗理解
看完上面,可能有些同学还不能完全理解词嵌入的含义。这里再通俗的讲解一下将一个 token 转换为向量的动机。
首先,我们作为人类是可以理解 cat 这个单词的,并且人类在理解这个单词的时候,会默认施加给这个单词很多属性:比如会跑、会爬树、会叫、粘人、会抓老鼠等等。
但是计算机不会。
一个单词拥有如此丰富的含义和属性,这绝对不是一个简单的数值可以表示的,因此,必须将一个 token 单词转换为更加丰富的数学表示。
在数学里,能够表达一个单词丰富属性的结构就是数组了,比如可以认为:
cat = [会跑、会爬树、会叫、粘人、会抓老鼠,...],也就是说 cat 是这些属性的集合,只要数组中的属性给的足够多,那么就能非常精确的将 cat 这个单词给表达出来。
因此,在数学上需要一个数组来表示一个单词( token ),这个过程就是嵌入层(Word Embedding) 做的事情。
再了解了这个过程后,另一个可能不太好理解的是:为什么这个过程叫做嵌入(Embedding)呢?
在数学或者物理科学中,"嵌入"指的是一种操作,它是将一个对象(比如一个点)放置到另外一个更高维度的空间中,同时还要保持这个对象的属性。
对应到 NLP 模型处理 token 的场景:便是将一个 token "嵌入"到了一个更高维度的空间中,并且可以在更高维度的空间中,利用多个特征来表示该 token ,并且还可以使其保持丰富的属性和含义。
我创建了一个《小而精的AI学习圈》知识星球,星球上有几十万字原创高质量的技术专栏分享,同时你也可以在星球向我提问。 点击这里,我们星球见! >>>
点击这里查看所有 AI 技术专栏