3

這是一個很遠的鏡頭,但我希望有人遇到類似的情況,因爲我正在尋找一些建議,以便如何將一組大型word2vec模型有效地帶入生產環境環境。將Word2Vec模型有效地導入生產服務

我們有一系列維度爲300的訓練好的w2v模型。由於基礎數據 - 帶POS標記詞的龐大語料庫;專業詞彙量高達100萬字 - 這些模型變得相當龐大,我們正在研究如何將這些內容暴露給我們的用戶,而不用花費太高的基礎設施費用。

除了試圖更好地控制詞彙量,顯然,特徵向量的降維是一個選項。有沒有人知道這方面的出版物,特別是關於這將如何影響模型質量,以及如何最好地衡量這一點?

另一種選擇是預先計算每個詞彙詞的前X個最相似的單詞並提供查找表。由於模型尺寸很大,目前這種方法效率很低。是否有任何已知的啓發式方法可以將必要的距離計算的數量從n x n-1減少到更低的數量?

非常感謝!

回答

1

在高維空間中有相似性搜索的預索引技術可以加速最近鄰居發現,但通常是以絕對精確度爲代價的。 (他們還需要更多的索引內存。)

一個示例是ANNOY library。 gensim項目包括一個demo notebook showing its use with Word2Vec

我曾經在Word2Vec模型中使用16位(而不是32位)浮點數做了一些實驗。它在空閒狀態下保存了內存,最近鄰居的前N結果幾乎沒有變化。但是,也許是因爲在一次對所有距離計算過程中仍然發生了一些幕後上升到32位浮點數的情況,實際上運行速度降低了。 (這表明每個距離計算都可能導致暫時的內存擴展,從而抵消任何閒置狀態的節省)。所以這不是一個快速的解決方案,但是這裏的進一步研究 - 可能涉及查找/實現float16陣列操作的正確例程 - 可能可能意味着50%的模型尺寸節省和等同或甚至更好的速度。

對於很多應用程序而言,丟棄最不頻繁的單詞並不會傷害太多 - 甚至在訓練之前完成時,可以提高剩餘矢量的質量。由於許多實現(包括gensim)按照最頻繁至最不頻繁的順序對字 - 矢量數組進行排序,因此可以丟棄數組的尾端以節省內存,或將搜索限制在前N個條目以加速計算。

一旦您最小化了詞彙大小,您想要確保全套存儲在RAM中,並且在(典型)全掃描距離計算期間不會觸發交換。如果您需要多個進程來從同一個向量集中提供答案,如在多核計算機上的Web服務中,gensim的內存映射操作可以防止每個進程加載自己的冗餘向量副本。您可以在此answer about speeding gensim Word2Vec loading time中看到關於此技術的討論。最後,儘管爲較大的詞彙表計算前N個鄰居既費時又耗費內存,但如果您的訪問模式比其他語言檢查得多一些,最近或M最頻繁請求的前N可以提高感知性能 - 使得只有不太頻繁請求的鄰居列表需要對所有其他令牌進行全距離計算。

+1

非常感謝您的詳細解答,想法和鏈接到ANNOY圖書館和相關問題!不幸的是,我們在生產中綁定了Java,無法運行Python服務。不過我會調查float16的操作思路。就我們的目的而言,我們其實對低頻率的類似詞語非常感興趣,所以過濾是......我只會猶豫不決。我會嘗試一些想法,我在本文中找到:https://rd.springer.com/chapter/10.1007/978-3-319-30671-1_15。我認爲我們需要建立我們自己的評估數據集來評估模型的質量變化。 – Matthias