Hash特徵編碼在推薦系統的應用

本文來之不易,學習hash的起源是我在客戶交流現場被問到hash衝突。其實這個是我的知識短板,但是因爲我隱約記得有個murmurhash的東西,然後矇混過去了。然後今天抓緊找各位大牛學習了hash在推薦系統中的作用,總結了這篇筆記。感覺自己還是太文盲了,另外也感謝客戶老師以及公司內的大牛老師的指導。

01 推薦系統中數據如何轉成稀疏數據

 

先來一句話概括下,Hash解決的是一個空間匹配的效率問題。理解這一句話首先要了解稠密數據和稀疏數據的區別,大家可以看看臺灣某大學開源的libsvm數據格式,這個格式是目前稀疏數據的行業規範,稀疏數據的好處就是可以減少計算過程中的非0元的計算量。

ok,接下來用一個例子說明爲什麼在推薦領域要用Hash做特徵編碼。假設我們有一份推薦場景稠密數據,第一列是ID列,第二、三列是Feature列,最後一列是Label列。

這份數據轉成稀疏格式(libsvm)後會是這樣:

F1和F2這兩個特徵列變成了K:V結構,以樣本A爲例,它的F1這個特徵是7,在F1這三個特徵中(7,5,2)排名第3,所以K值爲2。它的F2這個特徵是6,在F2三個特徵中(6,9,2)排名第2,所以K爲1。

 

02 Hash的作用

 

如果按照以上思路去把稠密數據轉稀疏數據需要例如如下的這樣的代碼:

for(i=0; i<len(feature),i++ )

{

#找到特徵的排位確定k值

}

每一個樣本的特徵轉換都需要遍歷全部樣本,如果樣本數很大,效率非常差。因爲這個稠密轉稀疏無非是找到一個空值空間,把數據插入內存,這個時候就可以利用Hash的方式提升效率。

還以上文例子爲例,我們可以把特徵空間區分爲兩份,比如1~100的位置給到特徵F1,1000~10000的位置給到特徵F2。然後用一個HashFunction自動把數值映射到對應的位置上。

比如:

HashFunction(F1,7)=010

HashFunction(F2,9)=01000

這樣就不需要遍歷全部樣本,大大提升了效率。

 

03Hash衝突問題

 

在推薦領域,往往樣本量非常大,每個特徵的可能性也很多。比如某個特徵表示的是平臺的所有商品,那麼如果用HashFunction的方法需要巨大的空間表示這個特徵,這樣才能避免相同的特徵值落在相同的範圍內,形成Hash衝突。但是巨大的空間意味着模型的寬度增加,對於計算效率也是有挑戰。

 

變成一個博弈問題,Hash衝突風險越小,模型越大,人們希望風險小而且模型小。爲了解決這個問題,業內有很多優質的Hash方法,比如MurmurHash、CityHash。

推薦MurmurHash,目前Redis數據庫主鍵就是用的這個方案。因爲這個Hash算法非常複雜,以我的智商應該很難理解,所以MurmurHash的詳細原理,建議移步某乎。謝謝~

發佈了279 篇原創文章 · 獲贊 681 · 訪問量 124萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章