譯者 | 朱先忠
審校 | 孫淑娟
簡介
神經(jīng)網(wǎng)絡(luò)嵌入能夠?qū)崿F(xiàn)輸入數(shù)據(jù)的低維表示,從而服務(wù)于各種類型的神經(jīng)網(wǎng)絡(luò)應(yīng)用程序。嵌入有一些有趣的功能,因為它們可以捕獲數(shù)據(jù)點的語義。這對于圖像和視頻等非結(jié)構(gòu)化數(shù)據(jù)尤其有用,這樣不僅可以對像素相似性進行編碼,還可以對一些更復雜的關(guān)系進行編碼。
使用FiftyOne和Plotly可視化針對BDD100K數(shù)據(jù)集的嵌入
在這些嵌入上執(zhí)行搜索可以應(yīng)用于許多場景下,如分類任務(wù)、建立推薦系統(tǒng),甚至是異常檢測任務(wù)。對嵌入執(zhí)行最近鄰搜索以完成這些任務(wù)的主要好處之一是,無需為每個新問題創(chuàng)建自定義網(wǎng)絡(luò);您可以經(jīng)常使用預先訓練的模型。而且,使用某些公開可用模型生成的嵌入是完全可能的,而無需任何進一步的微調(diào)。
雖然有很多涉及嵌入的強大使用場景,但在執(zhí)行嵌入搜索的工作流中往往都存在一些不同程度的挑戰(zhàn)。具體而言,在大型數(shù)據(jù)集上執(zhí)行最近鄰搜索,然后有效地對搜索結(jié)果采取行動——例如執(zhí)行自動標記數(shù)據(jù)等工作流,都存在技術(shù)和工具方面的挑戰(zhàn)。為此,借助于Qdrant和FiftyOne這兩個開源軟件可以幫助簡化這些工作流任務(wù)。
- Qdrant是一個開源的向量數(shù)據(jù)庫,旨在對密集的神經(jīng)嵌入執(zhí)行近似最近鄰搜索(ANN),這對于任何預計將擴展到大數(shù)據(jù)量的生產(chǎn)就緒系統(tǒng)都是非常必要的。
- FiftyOne是一個開源數(shù)據(jù)集管理和模型評估工具,允許開發(fā)人員有效地管理和可視化數(shù)據(jù)集,生成嵌入并改進模型結(jié)果。
在本文中,我們將MNIST數(shù)據(jù)集加載到FiftyOne中,并基于ANN進行分類。數(shù)據(jù)點將通過從訓練數(shù)據(jù)集中的K個最近點中選擇最常見的參考答案標簽進行分類。換句話說,對于每個測試樣本,我們將使用選定的距離函數(shù)選擇其K個最近的鄰居,然后通過投票選擇最佳標簽。另一方面,向量空間中的所有搜索都將使用Qdrant來完成,以加快速度。然后,我們將在FiftyOne中評估該分類的結(jié)果。
安裝
如果您想開始使用Qdrant的語義搜索,您需要運行它的一個實例,因為該工具以客戶機—服務(wù)器方式工作。要做到這一點,最簡單的方法是使用一個官方Docker映像,只需一個命令即可啟動Qdrant:
運行該命令后,我們將運行Qdrant服務(wù)器,端口6333處暴露HTTP API,端口6334處暴露gRPC接口。
此外,我們還需要安裝一些Python包。我們將使用FiftyOne來可視化數(shù)據(jù)、它們的參考答案標簽以及嵌入相似性模型預測的數(shù)據(jù)。嵌入將通過torchvision中提供的MobileNet v2創(chuàng)建。當然,我們也需要以某種方式與Qdrant服務(wù)器通信,因為我們將使用Python,所以Qdrant_client是實現(xiàn)這一任務(wù)的首選方式。
整體任務(wù)流程
1. 加載數(shù)據(jù)集
2. 生成嵌入
3. 將嵌入加載到Qdrant
4. 最近鄰分類
5. FiftyOne評估
加載數(shù)據(jù)集
為了使事情順利進行,我們需要采取幾個步驟。首先,我們需要加載??MNIST數(shù)據(jù)集??,并從中提取訓練樣本,因為我們將在搜索操作中使用它們。為了使一切更快,我們不打算使用所有的樣本,只使用2500個樣本。我們可以使用??FiftyOne數(shù)據(jù)集Zoo??,并通過一行代碼來加載所需的MNIST子集。
接下來,讓我們仔細分析一下FiftyOne應(yīng)用程序中所使用的數(shù)據(jù)集。
生成嵌入
下一步是在數(shù)據(jù)集中的樣本上生成嵌入。這始終可以在FiftyOne之外使用您的自定義模型完成。然而,F(xiàn)iftyOne也在其中的FiftyOneModelZoo中提供了各種模型,這些模型可以直接用于生成嵌入。
在本例中,我們使用在ImageNet上訓練的MobileNetv2來計算每個圖像的嵌入。
將嵌入結(jié)果加載到Qdrant
Qdrant不僅可以存儲向量,還可以存儲一些相應(yīng)的屬性——每個數(shù)據(jù)點都有一個相關(guān)的向量,還可以選擇附帶一個JSON類型的屬性項。我們想用這個來傳遞參考答案標簽,以確保我們可以在稍后做出預測。
創(chuàng)建嵌入后,我們可以開始與Qdrant服務(wù)器進行通信了。需要說明的是,QdrantClient有一個類實例比較有用,因為它包含了所有必需的方法。讓我們連接并創(chuàng)建一個名為“mnist”的點集合。向量大小取決于模型輸出;因此,如果我們想在以后使用不同的模型進行實驗,我們需要導入不同的模型,但其余的將保持不變。最終,在確保集合存在后,我們可以發(fā)送所有向量及其包含其真實標簽的有效載荷。
最近鄰分類
現(xiàn)在對數(shù)據(jù)集執(zhí)行推斷。我們可以為測試數(shù)據(jù)集創(chuàng)建嵌入,但忽略基本事實,并嘗試使用ANN找到它,然后比較兩者是否匹配。讓我們一步一步地從創(chuàng)建嵌入開始。
是時候“施展魔法”了。讓我們遍歷測試數(shù)據(jù)集的樣本和相應(yīng)的嵌入,并使用搜索操作從訓練集中找到15個最接近的嵌入。我們還需要選擇有效載荷,因為它們包含找到特定點附近最常見標簽所需的參考答案標簽。借助于Python的Counter類,我們可以避免再重寫任何樣板代碼。最常見的標簽將作為“ann_production”存儲在FiftyOne中的每個測試樣本上。
這些內(nèi)容都體現(xiàn)在下面這個函數(shù)中。該函數(shù)將使用嵌入向量作為輸入,并使用Qdrant搜索功能查找與測試嵌入最近的鄰居,生成類型預測,并返回一個FiftyOne Classification對象,我們可以將其存儲在FiftyOne數(shù)據(jù)集中。
我們通過計算屬于最常見標簽的樣本分數(shù)來估計置信度。這給了我們一種直覺,即我們在預測每種情況的標簽時有多么確定,并且可以在FiftyOne中使用,輕松找出令人困惑的樣本。
FiftyOne評估
現(xiàn)在是取得一些成果的時候了!讓我們從可視化這個分類器的表現(xiàn)開始。我們可以輕松啟動??FiftyOne應(yīng)用程序??來查看參考答案標簽、預測結(jié)果和圖像。
FiftyOne提供了各種內(nèi)置方法來評估模型預測,包括圖像和視頻數(shù)據(jù)集上的回歸、分類、檢測、多邊形、實例和語義分割。通過下面兩行代碼,我們即可以計算并打印分類器的評估報告。
在評估FiftyOne之后,我們可以使用results對象生成一個交互式混淆矩陣(https://voxel51.com/docs/fiftyone/user_guide/plots.html#confusion-matrices),允許我們點擊單元格并自動更新應(yīng)用程序以顯示相應(yīng)的樣本。
我們還可以再深入一點。我們可以使用FiftyOne復雜的??查詢語言??,輕松找到所有與實際情況不匹配的預測,但預測的可信度很高。這些通常是數(shù)據(jù)集中最令人困惑的樣本,不過也是我們可以從中獲得最深刻見解的樣本。
上圖中展示了模型中最令人困惑的樣本,正如您所看到的,與數(shù)據(jù)集中的其他圖像相比,它們非常不規(guī)則。我們可以采取的改進模型性能的下一步可能是使用FiftyOne來添加與這些類似的精確樣本。然后,可以通過FiftyOne與CVAT,以及Labelbox等工具之間的集成對這些樣本進行注釋。此外,我們可以使用更多的向量進行訓練,或者通過相似性學習對模型進行微調(diào),例如,使用三元組損失算法。但現(xiàn)在,這個使用FiftyOne和Quadrant進行向量相似性分類的示例已經(jīng)能夠很好地工作了。
就這么簡單,我們使用FiftyOne和Qdrant作為嵌入后端創(chuàng)建了一個ANN分類模型,因此查找向量之間的相似性可以不再像傳統(tǒng)k-NN那樣成為我們?nèi)蝿?wù)的瓶頸了。
請自己試試看
最后,Github代碼倉庫中的??筆記本文件??包含了你在本文中看到的所有內(nèi)容的源代碼。此外,它還包括該過程的一個實際用例,以在BDD100K道路場景數(shù)據(jù)集上執(zhí)行夜間和白天屬性的預注釋。
總之,F(xiàn)iftyOne和Qdrant兩個開源庫可以一起使用,有效地對嵌入執(zhí)行最近鄰居搜索,并對圖像和視頻數(shù)據(jù)集的結(jié)果進行操作。這個過程的美妙之處在于它的靈活性和可重復性。您可以輕松地將新字段的附加參考答案標簽加載到FiftyOne和Qdrant中,并使用現(xiàn)有嵌入重復此預注釋過程。這可以快速降低注釋成本,并更快地生成更高質(zhì)量的數(shù)據(jù)集。
譯者介紹
朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。
原文標題:??Nearest Neighbor Embeddings Search With Qdrant and FiftyOne??,作者:Eric Hofesmann