一、大模型業務全流程
-
AI叢集建置:運算、通訊、儲存建置
-
大型模型資料:大型模型資料集、資料處理、向量資料庫
-
大型模型演算法:從傳統NLP到預訓練LLM大型模型
-
大型模型訓練:大型模型訓練一般演算法手段與穩定性分析
-
分散式平行處理:模型平行、資料平行、最佳化器平行等
-
大模型微調:全參數微調、低參數微調、指令微調演算法
-
大型模型推論:量化壓縮、長序列擴充推論、快取方法
-
大型模型評測:NLP 下游任務、CV 下游任務、評測方案
-
大型模型智慧代理:RLHF流程、智慧代理、終身學習
二、向量
熟悉犬類的人能夠很快地區分牠們的品種,之所以能做到這一點,是因為我們從牠們不同的角度觀察牠們的特徵,比如體型的大小。
如果我們用一個座標軸來表示牠們的大小特徵,這些狗將落在不同的座標上。然而,單純依靠體型這一個特徵還不夠,有的體型十分接近。
我們再觀察牠的特徵,比如毛髮的長短,我們再做一個座標軸,這樣就區分了一部分大小特徵相同的犬類
但還是有一部分有重疊的,所以要繼續從更多的角度來觀察,比如鼻子的長短。
我們還可以增加更多的維度,比如眼睛的大小。我們無法在四維空間上作圖,但在座標點的數值上卻很容易實現,繼續往後附加就好了。
我們還可以從更多的角度,或者說維度來觀察一隻狗的特徵,比如腿的粗細,毛髮的捲曲,甚至是一些抽象的角度,比如服從性,工具性等等。我們使用的維度越多,對狗的區分能力就越強。同時座標點所在的空間維度也就越高。
不僅是狗,實際上幾乎任何事物都可以被這樣表述。可以是具象的,
也可以是抽象的喜怒哀樂,悲歡離合。不同事物在不同的特徵維度中有著不同的表現,或者說不同的數值,所以最終都會在一個高維的特徵空間中對應著一個座標點。只不過在這些更大的範圍內,我們可能需要更高的特徵維度才能很好地對事物進行區分。可能幾百幾千,也可能上萬。
但是由於我們無法作出超過三維的圖,所以用二維座標來講解。
我們會發現那些概念上更為接近的點將在空間中更為聚集,而那些概念上非常不同的點則距離很遠。更進一步,如果以座標原點為起點,這些座標點為終點。這就是帶有方向和大小的向量。
如果將圖片向量化,透過搜尋相似的向量,實現以圖搜圖的功能
如果將影片向量化,透過搜尋相似的向量,實現相似影片的推薦
如果將商品向量化,透過搜尋相似的向量,針對使用者目前瀏覽的商品進行相關推薦
如果對文字進行向量化,就能在一個智慧問答系統中,根據使用者目前的問題,找到一些已經解決過的相似問題以供參考
三、向量資料庫
伴隨著AI的到來,向量將成為一種重要的資料形式。而傳統的資料庫並不適合用來儲存和檢索向量資料,因此需要一種專門設計的資料庫來處理這些問題,這或許會成為未來資料層面的基礎設施。和儲存資料表,然後用查詢語句精準搜尋的傳統資料庫不同,向量資料庫儲存的是向量資料,而查詢過程則是從資料庫中搜尋出和查詢向量最為相似的一些向量,具有一定的模糊性。

1、向量查詢
向量資料的一個主要應用情境就是:給定一個查詢向量,然後從眾多向量中找到最為相似的一些向量。這就是所謂的最近鄰問題,而實現這一點的叫最近鄰演算法,一種最容易想到的方法可能就是暴力搜尋,依次比較所有向量和查詢向量的相似度,挑選出相似度最高的幾個,而比較兩個向量相似度的具體方法有很多,歐氏距離和餘弦相似度。
-
歐氏距離是指計算兩個向量之間的直線距離。在二維座標系中,假設有兩個向量p和q,歐氏距離就是計算p到q中間連的這條直線的距離。在三維座標系裡,每一個向量包含x、y、z三個座標點,根據公式計算任意兩點之間的距離。而在n維座標系裡,有100個座標點,根據公式計算任意兩點之間的距離。距離越短,說明這兩個向量在某些維度上相似性越高

-
另一種方式是餘弦相似度。除了距離,我們還可以透過向量之間的夾角來描述它們之間的關係。在二維座標系中,如果夾角越小,說明兩個向量之間的關聯性越高。我們可以使用公式計算任意兩個向量之間的餘弦相似度。在三維座標系裡,也可以用同樣的原理來計算任意兩個向量之間的夾角和餘弦相似度。

而如果向量資料過多,這種毫無技術含量的暴力方法將導致極長的搜尋時間。但這種搜尋品質確實是完美的,因為它真的比較了每一個向量,所以如果資料庫中的資料規模比較小,遍歷全部向量的時間可以接受,這也不失為一種好的方法,然而實際應用中的資料規模往往都不會太小,所以必須找出一些方法進行最佳化。
2、向量索引
前面講述了向量資料庫的檢索原理,但實際上,在向量資料庫中進行相似度比對時,不能完全按照公式計算,因為向量資料庫的資料量通常很大,維度也很高。如果使用公式計算兩個1000維向量之間的相似度,計算量比較大,而且對CPU的運算密集需求很高。那如果有一億個向量,每個都要計算一遍的話,時間和計算成本都會更高。因此,我們在此引入一個概念,叫做向量索引。
向量索引與關聯式資料庫中的索引類似,但有一點不同。在向量資料庫中,透過向量索引找到的是近似結果,而不是100%準確的結果。向量索引描述的是相似度的高低。因此,我們稱之為近似最近鄰搜尋(ANS)。 如果沒有向量索引的話,尋找一個向量的相似度就類似於關聯式資料庫中的全表搜尋。但是,在全表搜尋之上還要多加一層運算,因此成本比關聯式資料庫中的全表搜尋要高很多。
根據實作的方式,ANNS 向量索引可分為四大類:
-
基於樹的索引
-
基於圖的索引
-
基於雜湊的索引
-
基於量化的索引
1、基於樹的方法
以樹為基礎的方法,主要思想是將資料進行劃分,類似二元搜尋樹,搜尋時縮小了搜尋空間,達到快速檢索的目的。但是這種方法不適合高維空間。以樹為基礎的方法主要有KDTree(K-Dimensional Tree)和Annoy(Approximate
Nearest Neighbors Oh Yeah)。
1.1
KDTree
KDTree 的建構同樣基於遞迴劃分的思路,首先選取變異數最大的維度,以該維度上所有資料的中位數作為切分點,將超矩形區域切割成兩個子區域,小於中位數的劃分到左邊,小於中位數的劃分到右邊,遞迴建構左右子樹,直到所有資料都劃分完成為止。
基於KDTree的搜尋流程:
1、查詢資料p,目前節點的劃分維度d,判斷資料p在維度d的座標值與節點值的大小,如果大於則走左子節點,小於則走右子節點;
2、直到遍歷到葉節點,標記為已造訪,計算與葉節點的距離為最近距離;
3、在葉節點進行回溯操作,每次回溯都判斷p與父節點中尚未被存取的分支之間的距離。
a)假如該分支節點與p的距離大於目前最近距離,則繼續向上回溯,直至根節點;
b)假如該分支節點與p距離小於目前最近距離,則使用該分支,走步驟1和步驟2直到葉節點,更新葉節點與Q的最近距離。
1.2Annoy
Annoy使用超平面來對空間進行劃分,超平面是藉助KMeans(k=2)來尋找兩個分群中心,中心連線的法平面即為劃分的超平面,不斷迭代,直到每個子空間的資料個數低於指定閾值。


要搜尋這個空間中的任何一點,可以從根開始遍歷二元樹。每個中間節點(上面樹中的小方塊)都定義了一個超平面,因此可以根據超平面來判斷接下來繼續的是左子節點還是右子節點。搜尋一個點可以在對數時間內完成,即樹的高度。
優點:低維資料準確率較高 缺點:無法充分捕捉資料複雜性,高維資料準確性較低
2、基於圖的方法
基於圖的方法主要是使用圖這種資料結構,利用相鄰節點之間的連通性建構高速公路,將問題轉化為圖的遍歷,能快速縮小搜尋範圍,加快檢索速度。但是圖這種資料結構比較複雜,為了達到極致的檢索速度,一般會將整個圖載入記憶體,造成其記憶體占用非常高,但是檢索快,召回率高。
目前常用的圖搜尋演算法主要是 HNSW(Hierarchical Navigating Small World),而 NSW(Navigating Small World)則是其前置演算法,也需要了解一下。
2.1 NSW
NSW在樸素建圖的基礎上,增加了如下約定:所有的節點必須有相鄰的節點;相鄰的節點必須有連線;鄰近友元的個數作為超參數,由使用者指定。主要用來解決樸素建圖法的一些限制。
NSW建圖過程:
插入一個新節點時,先尋找與新節點最近的m個節點,連接新節點與這m個節點。
NSW搜尋過程:
查詢資料q,從圖中隨機尋找一個入口
節點以及其相鄰節點,計算入口節點以及相鄰節點與p的距離,如果有相鄰節點與p的距離小於p與入口
節點的距離,設定最小距離點,直到最後找到一個點,其所有相鄰節點和查詢點的距離都大於這個點。
如上圖所示,要從建置好的近鄰圖中搜尋與綠色節點query最近的節點,從隨機挑選的entry
points開始,一開始透過紅色的long-link迅速到達query附近的節點,再透過黑色的short-link找到符合條件的點。
NSW同樣也是一種近似計算,不能保證是真正的最近鄰。先插入的點冗餘邊多,更有可能形成高速公路,越往後插入的點,擁有高速公路的可能性越低。
2.1 HNSW
HNSW是一種基於NSW的改進方案,主要是利用跳躍串列的概念,使用分層來實現,每層都是一個NSW,即也可以叫做分層的NSW方法。越上層,節點數越稀疏,節點之間距離越遠,越往下,節點變多,連線也增加,平均距離越近。
優點:能在高維資料中找到相似的近鄰,從而提高搜尋效能,缺點:建圖方式複雜,影響記憶體效率。
3、基於雜湊的方法
基於雜湊的方法主要是利用雜湊函數的特性,相似度高的資料其雜湊值也相似。雜湊函數可以將高維資料轉換成低維資料,大幅提高建置效率。但是雜湊函數同樣也有另一個侷限性,雜湊值相似的資料並不一定相似,導致這種方法的召回率並不是很高。基於雜湊的方法主要是LSH(局部敏感
雜湊)。假設兩個向量相似,那麼它們的雜湊值也是相似的。利用雜湊函數將相似的向量映射到相同的桶裡面。查詢時先找到與查詢向量最相似的桶,再對桶內的資料進行查詢計算最相似的前k個結果。
LSH(位置敏感hash)也是一種基於空間劃分的方式,實作方法,如下圖,隨機生成一條直線,這條線區分正反兩側,如果一個向量在這條線的正側,那麼它就是1,反側就是0,然後再隨機生成一條直線,同樣正側是1,反側是0;如此我們生成多條這樣的直線,
就為每個向量算出了4個0或者1,各自得到一個4位的二進位編碼。現在我們觀察一下這4個二進位編碼的相似程度。





優點:擴展到大數據時資料處理非常快,缺點:正確性一般
5、基於量化(Quantized)的索引
5.1、分群
假如能為查詢向量劃定一個大致的範圍,再進行搜尋,可大大提高搜尋速度。我們先選定一個想要分類的數量,比如下圖4個分類,隨機產生4個中心點,然後這些向量離哪個中心點最近,就被分到哪個中心點。然後用目前被分配到一類的向量計算出一個平均向量點,把中心點位置修改為平均向量點,再判斷各向量點離哪個中心點最近,重新分類。如此反覆的過程叫訓練,最後這些中心點將趨於穩定或者叫收斂。在進行搜尋時,只要找出跟查詢向量最近的分群中心,搜尋這個分群中心的向量即可。也就實現了縮小搜尋範圍的目的
5.2、量化(Quantization)
但對於海量的向量資料,除了搜尋速度以外,記憶體開銷也是一個巨大的挑戰。實際上在真實的應用場景中,上千的向量維度和上億的向量資料都不稀奇,所以記憶體的開銷會很嚴重。
從上面的分群中了解到中心點,其實叫質心,我們能不能用質心代表群集中的點呢。應該是可以的,其實這種方法就是典型的有損壓縮 ,如果用圖片舉例就是如下:

這雖然會遺失部分向量值,但考慮到聚類質心和它所在分類中向量的相關程度,所以在很大程度上保留著一些原始的資訊。而相較於這種有損壓縮導致部分細節遺失,所帶來的好處是非常可觀的。可根據下圖進行儲存,如此在使用某個向量的時候,用它的編碼值在碼本中找到對應的質心,再還原出質心對應的具體值,把向量用質心編碼表示,也就是所謂的向量量化(Quantization)
5.3、乘積量化 PQ(Product Quantization)
對向量進行量化處理後,卻多出了一個碼本,向量本身的記憶體開銷肯定是降下來了,但這個碼本會產生新的記憶體開銷,而且相當大。這在低維時還不明顯,但在真實場景中上百上千的向量維度下,這個碼本會變得非常恐怖。在數量一定的情況下,要保證量化的品質,分布越稀疏的向量就需要越多的聚類向量。




對於實際應用中幾百上千的向量維度,資料將非常稀疏,因此在高維的空間中,為了保證量化的品質,我們可能需要非常多的分群數量,一個典型的情況如下圖:一個128維的向量可能需要2的64次方個分群中心,因為這將導致用來記錄質心編碼的碼本變得非常龐大。而為了儲存這個碼本所消耗的記憶體已經遠遠超越了量化本身所節省下來的記憶體
解決這個問題的辦法是先把高維向量分割成若干個低維子向量,然後在這些低維子向量上獨立進行量化。比如把128維的高維向量分割成8個16維的子向量,然後在8個16維的子向量中分別獨立進行分群訓練。
於是每個向量可以用8個子空間的訓練結果對自己對應的8個子向量進行量化,而且每個子向量的維度是16,不是很高,因此每個16維的子空間只需要256個分群就能得到還不錯的量化效果,所以每個子向量的編碼值在0-255範圍,把8個子向量的量化編碼合在一起就得到了原始向量最終的量化編碼值,也就是說現在一個向量被量化成8個編碼值,同樣每個子空間也會建構自己的子碼本,在使用的過程中,用8個編碼值分別從子碼本中查出8個16維的子向量再合併起來,還原出一個128維的向量


