談?wù)揂I 時被經(jīng)常提及的“嵌入(embedding)”和“向量(Vector)”到底是個啥?
隨著 ChatGPT 等 AI 應(yīng)用的持續(xù)火熱,討論到相關(guān)話題時,相信大家都經(jīng)常會聽到幾個詞「嵌入(embedding)、向量(Vector)」,這東西到底是個啥?從很多的交流中可以發(fā)現(xiàn),其實大多數(shù)人對這個東西都還是似懂非懂的狀態(tài)。
我們先來說,什么叫嵌入(embedding),通俗一點講,就是把文本的意思嵌入向量里,也就是用向量來表示文本的含義?!府?dāng)然向量里面能存的可不僅僅是文本,我前面只是以文本舉例子,像音頻、視頻都是可以用向量表示的?!?/p>
那為啥要轉(zhuǎn)向量呢?因為轉(zhuǎn)向量后,這樣我們就可以通過一些算法來計算文本的相似程度「比如余弦相似度(Cosine Similarity)、歐氏距離(Euclidean Distance)等等」
那又如何把文本轉(zhuǎn)化成向量呢?轉(zhuǎn)化的過程其實就是文本特征提取,要用專業(yè)名詞就是詞嵌入。這個過程需要特定的模型「比如詞袋模型、TF-IDF等」來幫我們完成。
在上面的這個轉(zhuǎn)化的過程當(dāng)中,使用的技術(shù)方法不同,最終的效果也是不同的,比如為什么 ChatGPT 會這么智能,就是因為 GPT 模型使用的并不是傳統(tǒng)的嵌入技術(shù),而是一種叫做「上下文詞向量表示法」的方法,這個方法的關(guān)鍵在于,每個單詞的向量表示不僅取決于這個單詞本身,還取決于這個單詞在文本中的上下文。也就是說,同一個單詞在不同的上下文中可能會有不同的含義,而這種含義的差異能夠被GPT的向量表示捕捉到。舉個例子,“蘋果”這個詞在討論水果時和在討論電子產(chǎn)品(如蘋果電腦)時的含義就完全不同。
這種表示方法被稱為 Transformer 的自注意力機(jī)制,可以很好地捕捉和理解復(fù)雜的語言模式和語義關(guān)系。據(jù)說 GPT 模型就是在大規(guī)模的文本數(shù)據(jù)學(xué)習(xí)中自己學(xué)會的這個方法,現(xiàn)在大家應(yīng)該有點明白為什么 ChatGPT 的理解能力和邏輯能力很強(qiáng)了吧?
那說了這么多的“向量”,“向量”到底是個啥?
在數(shù)學(xué)中,向量是一種表示有大小和方向的量的工具。如果把向量想象成一支箭頭,那箭頭的長度代表了大小,箭頭的指向就代表了方向。
但在機(jī)器學(xué)習(xí)中,向量就變得更抽象了,抽象在哪呢?它會被用來表示更復(fù)雜的信息「不像數(shù)學(xué)中只有大小和方向」,如詞語的意思、句子的含義、甚至整篇文章的主題等等。
比如,我們可以把一個單詞轉(zhuǎn)化成一個向量,這個向量的元素可能表示這個單詞的語法角色(比如它是名詞、動詞還是形容詞)、語義特性(比如它是表示快樂的,還是表示悲傷的)、甚至是它和其他單詞的關(guān)聯(lián)程度等等。
我們可以簡單把向量理解為一種數(shù)據(jù)的編碼方式,每個維度都可以被認(rèn)為是一個特性或?qū)傩裕@些特性或?qū)傩怨餐枋隽艘粋€數(shù)據(jù)點(例如,一個詞、一個句子或一個文檔),要注意的是,這些信息并不是直接編碼的,因此我們不能直接從一個詞向量中讀出這個詞是一個名詞還是動詞,或者這個詞表示的是快樂還是悲傷。相反,這些信息是通過詞向量在高維空間中的位置和方向隱含的。如果覺得這里不好理解,我們嘗試把向量想象成一種復(fù)雜的密碼。這個密碼是一串?dāng)?shù)字,但你不能直接看著這串?dāng)?shù)字就知道它代表的意思。相反,你需要一種特殊的工具或者方法才能解讀這個密碼。
最后我們通過一個實例來進(jìn)行說明,我們使用 OpenAI 的 embedding-ada-002 模型「接口 https://api.openai.com/v1/embeddings」來創(chuàng)建三個向量,一個表示‘蘋果’,一個表示‘梨子’,一個表示‘電腦’:
‘蘋果’如下
[
? ? 0.011903401, ?-0.023080304, -0.0015027695, ? ?-0.0205655, ?0.0051274044,
? ?0.0037442625, ?-0.031882115, ?0.0006243348, ? 0.009241901, ?-0.022675142,
? ?0.0007037956, ? 0.021054491, ? 0.004872431, ? 0.011023221, ?-0.015689578,
? ? 0.012203781, ?0.0112467585, ?-0.003702349, ? 0.016304307, ?-0.026642943,
? ?-0.034089554, ?-0.004407891, ?0.0075863227, ?-0.012175838, ?-0.009521324,
? ? 0.011190874, ? 0.016625643, ?-0.021403769, ? 0.010296722, ?0.0012652603,
? ? ?0.03674407, -0.0036534502, ?-0.016402105, -0.0072230734, -0.0049632434,
? ?-0.018092612, ?-0.016485931, ?-0.015186616, ? 0.010422462, ?-0.013950172,
? ?0.0046873135, ? 0.012413348, ?-0.014208637, ? 0.003814118, ?-0.016416077,
? ? 0.014865281, ?-0.027090019, ? 0.007830817, ?-0.025818646, ? 0.006203181,
? ?-0.011344557, ?-0.010841596, ?-0.029982042, -0.0002543182, -0.0004846235,
? ?-0.003670914, ?-0.010275765, ? 0.008124211, ?-0.028040055, ?0.0004093104,
? ? 0.005979643, ? 0.023513408, ?-0.034955762, ? 0.033670418, ?-0.010939393,
?-0.00084699964, ? -0.01784113, ?-0.022381747, ? 0.020509617, ? 0.028556986,
? ? ?0.02414211, ? 0.028277565, ? 0.023261929, ? 0.012140911, ? 0.002916473,
? 0.00079024193, ? -0.02945114, ?-0.011309628, ? 0.009633093, ?-0.001005048,
? ? 0.028123882, ?-0.025469366, ? 0.005839932, ?-0.006524517, ? 0.015284414,
? ? ?0.01244129, ?-0.036604356, ? 0.020872867, ?-0.011079105, -0.0115191955,
? ? ?0.01497705, ? 0.025287742, ? 0.006845853, ? ?0.02514803, ?-0.018092612,
? ? 0.034760166, ? 0.013461182, ? 0.033195402, ?0.0012268397, ?-0.025525251,
?... 1436 more items
]
‘梨子’如下
[
? ?0.011790048, ?-0.017644417, ?-0.014175162, ? -0.02421703, ?0.0018853913,
? ?0.020137945, -0.0070401495, ? 0.005607049, ?-0.007636428, ? -0.04531715,
? -0.004983667, ? 0.013877022, ? -0.02009729, ? 0.007372168, ? -0.02002953,
? 0.0035234627, ? ?0.03434021, ?-0.009228762, ? 0.030491505, ?-0.024433859,
? -0.003804662, ? -0.03130461, ?0.0062439824, ?-0.023959545, -0.0015609956,
? -0.009750505, ? 0.037944984, ? -0.02009729, ? 0.013809264, ? 0.017779935,
? ?0.027699837, ? 0.009581109, ? ? -0.012759, -0.0033049402, ?-0.022658575,
? ?-0.03030178, -0.0010307822, ?-0.004001163, ?0.0017617313, ? 0.002893305,
? 0.0019904177, ?0.0012281301, -0.0066742515, -0.0049023563, ?-0.023661407,
? ? 0.00872057, ? -0.03531594, ?-0.015096682, ?-0.016546723, ? 0.014283576,
? -0.004688916, ?-0.008842536, -0.0069859424, ?0.0011519012, ?-0.007053701,
? ?0.009757281, ? 0.019202871, ?-0.014934061, ?-0.004472087, ?0.0044551473,
? ?0.019582322, ? 0.022441747, ? -0.03325607, ? 0.010035093, ?0.0015889462,
? ?0.016262135, ?-0.014825647, -0.0006335457, ? 0.011356391, ? 0.004970115,
? ?0.013036812, ? 0.023187095, ? ?0.02542314, ? 0.014879854, ? 0.006958839,
?-0.0004156585, ? -0.03244296, ?-0.008083637, ?-0.014080299, ?-0.019921117,
? ?0.018836973, ?-0.014283576, ?-0.012650587, ?-0.008137844, ? 0.015882686,
? 0.0011417374, ?-0.033337377, ? 0.003994387, -0.0034573977, ?-0.012901294,
? ?0.025626415, ?0.0056714197, ? 0.011762945, ? 0.025572209, ? -0.00921521,
? ?0.011417374, ? 0.008280138, ? 0.013890574, ?-0.012305016, ?-0.024176374,
?... 1436 more items
]
‘電腦’如下
[
?-0.0089573935, -0.018338805, ? 0.004793398, ? -0.030820854, -0.0116141355,
? ?0.015277921, -0.022181474, ?-0.017225757, ?0.00021987685, ?-0.019915625,
? ? 0.02231398, ? 0.03206641, ?0.0019511482, ? ?0.010388456, ?-0.014747898,
? ?0.018352056, ?0.009282033, ?-0.010567339, ? ?0.028117735, ?-0.015662188,
? -0.024844842, ?0.009686176, ? 0.018484563, ? -0.023599287, ?-0.024831591,
? 0.0011610823, ?0.018511062, ?-0.017888285, ? -0.017490769, ?-0.005240605,
? ?0.033788983, -0.022737999, ?-0.016284965, ? -0.025202608, ?-0.029177781,
?-0.0026318969, -0.001831893, ? 0.008858014, ? 0.0029167845, ?-0.011753267,
? ?0.014098619, ? 0.02210197, -0.0020869668, ? ?0.028568255, -0.0064894725,
? ?0.023281273, ?-0.02341378, ? -0.00956692, ? -0.015211668, ?0.0054923664,
?-0.0026087083, ?0.013217456, -0.0027163692, ? ?-0.01955786, ?-0.008268363,
? -0.019080838, -0.013157828, -0.0036207216, ? 0.0063768425, ?-0.014005865,
? 0.0037598526, ?0.007983476, ?-0.033444468, ? ?0.021439442, ?0.0009358224,
? ?0.018723072, 0.0048994026, ?0.0013159484, ? 0.0065524126, -0.0053863614,
? ?0.025229108, ? 0.04441595, ? 0.012309791, ? ?0.011534631, ? 0.016443972,
? 0.0037532274, ? -0.0204854, ? 0.015370675, ? 0.0064563463, ? 0.019186843,
? ?0.014217875, -0.022366982, ? 0.005823631, ?-0.0071089375, ?0.0057606907,
?-0.0025424554, -0.021929713, ?0.0018799263, -0.00092754076, ?-0.014694896,
? ?0.014774399, ?0.028329745, ?0.0029383167, ? ?0.041050304, -0.0045813886,
? ?0.015185167, ?0.006446408, ? 0.024208814, ?-0.0094410395, ?-0.023864299,
?... 1436 more items
]
使用 OpenAI 的 embedding-ada-002 模型創(chuàng)建的向量有 1536 個維度,我們?nèi)粘S懻摽臻g的時候,通常都說二維、三維,在這我們就可以簡單做個類比,二維空間就好比是一個二維向量,三維空間就是一個三維向量,那么我們前面創(chuàng)建的向量是 1536 維的,也就是說它構(gòu)成了一個 1536 維的空間,我們的向量就分布在這個空間里,如果兩個詞的向量表示在這個1536維的向量空間中很接近,那么我們可以認(rèn)為這兩個詞在某種意義上是相似的?,F(xiàn)在大家應(yīng)該也能感受到什么是‘高維向量’了吧?
通過前面我們獲取到的向量表示,看起來‘蘋果’、‘梨子’和‘電腦’的向量,分別是一個長度為 1536 的數(shù)字列表「數(shù)組」,很顯然我們是沒有辦法看向量就知道它代表的是‘蘋果’還是‘梨子’,但是我們可以使用一個叫做‘余弦相似度’的算法來比較兩個向量,發(fā)現(xiàn)它們兩個的向量比較相似,并且它們兩個都與水果類型的非常接近「在空間中的位置比較近」,所以 ChatGPT 就大概知道了它們兩個應(yīng)該是水果,應(yīng)該都能吃。但是‘大象’的向量表示跟他們并不相似,所以 ChatGPT 也就知道了大象應(yīng)該不是水果類的,跟它們有比較大的不同。
我們簡單實現(xiàn)一個“余弦相似度”的算法,用來分別比較一下‘蘋果’、‘梨子’和‘電腦’的值,我們就可以直觀的看到向量之間的差異
‘蘋果’和‘梨子’的余弦相似度:
0.8703165905925271
‘蘋果’和‘電腦’的余弦相似度:
0.8479234895482726

“余弦相似度”主要度量的是兩個向量間的角度,是一個 -1 到 1 之間的數(shù)字:
值越接近 1 表示越相似
值越接近 -1 表示越相反
值越接近 0 表示越不相關(guān)
"蘋果"和"梨子"的余弦相似度為0.8703,這表示在多維向量空間中,這兩個詞的距離比較接近,這意味著模型認(rèn)為"蘋果"和"梨子"在語義上更為相似。這與我們在現(xiàn)實生活中的感覺是一致的,因為它們都是水果,有很多相似的地方。
"蘋果"和"電腦"的余弦相似度為0.8479,它的值比"蘋果"和"梨子"的要小,說明"蘋果"和"梨子"的相似度比"蘋果"和"電腦"的要高。這與我們在現(xiàn)實生活中的感受也是吻合的。
但要注意的是,"蘋果"和"電腦"的余弦相似度為0.7973,這個值依然較高,從數(shù)值的角度來看表明它們也有一定的相似性,但是一個是電器一個是水果,這兩個感覺一點都不相似啊?這恰恰就是我們前面說的,GPT 用的是「上下文詞向量表示法」,因為我們都知道有一個東西叫「蘋果電腦」,所以"蘋果"和"電腦"也經(jīng)常一起出現(xiàn),因此它們也有一定的語義關(guān)聯(lián)性。
最后再說一點,向量有個很神奇的地方,就是它是和語言無關(guān)的。什么意思呢?舉個例子,我把一組英文數(shù)據(jù)集進(jìn)行向量轉(zhuǎn)化并存儲在向量數(shù)據(jù)庫,然后用戶提問的時候,是可以使用中文進(jìn)行匹配和返回的。這好像是間接性的實現(xiàn)了多語言,已經(jīng)有不少的開源項目在利用這個特性提供自己的幫助手冊,它們把自己的幫助手冊向量化,然后可以讓用戶進(jìn)行提問,你用什么語言提問,它最后就可以給你返回什么語言。比如我在文中使用 langchain 框架「https://js.langchain.com/docs/」、supabase docs「https://supabase.com/docs/guides/database/overview」,大家可以去體驗一下。


注意事項:
有一點注意的是,使用不同的向量嵌入模型以及比對算法,最終的效果是差異很大的。以上的示例是使用的 OpenAI 的 embedding-ada-002 模型創(chuàng)建的向量,比對是使用的余弦相似度算法。你使用的方案不同,最終的效果可能會跟本文不同。
關(guān)于「嵌入(embedding)、向量」的相關(guān)概念就說到這了,希望本次分享能對大家的理解有所幫助。