傳統的CTR或推薦系統擁有高維特徵和稀疏數據,轉向深度學習如何高效實現?
例如推薦系統以user id為特徵,維度可以到幾千萬到億,但數據非常稀疏,邏輯回歸處理非常高效,但單層神經網路表達能力有限。
目前像TensorFlow對稀疏矩陣支持不如稠密矩陣,甚至稀疏矩陣乘法也不支持,目前主要支持word2vec用到的tf.embedding_lookup,如何處理高維特徵和稀疏數據。
謝邀,如果在模型層面上不能得到很好的解決,那自然這就是特徵工程該做的事情了。
如果計算資源足夠,可以先通過聚類的方式對 user 打上標籤,這樣在之後建模的時候就可以用該 user 對應的標籤取代 user_id,畢竟我們建模後的演算法目的是針對一類人,而不是一個個體。在降維的同時,也在一定程度上避免了 Overfitting。
這個問題其實在 DMP 中非常常見,具體可以查查關於 look-alike 人群擴散相關的演算法論文,比如這篇:
Implicit Look-alike Modelling in Display Ads: Transfer Collaborative Filtering to CTR by Weinan Zhang, Lingxi Chen, Jun Wang. ECIR 2016.如果計算資源有限,可以把單一的目標人群作為訓練的正樣本,把候選人群作為負樣本,來訓練一個分類器對所有候選對象進行篩選。方法可能簡單粗暴了點,也存有不少理論上的缺陷,但卻是實實在在的短平快策略。
深度學習模型處理前,一般是先把高維稀疏特徵用embedding的方式,轉成低維稠密特徵。可以先用一些降維的辦法對embedding做初始化,以提高訓練效果,例如word2vec,svd等等。
還沒解決,不用GPU還好,用了GPU感覺更難解決
問題1. 稀疏特徵使用Embedding表達是怎麼處理的?
具體描述:比如特徵中有商品ID,商品ID值的範圍很大,可能有1000萬,但可能當前只有10萬左右的商品ID還是生效的。現在的問題是 使用embedding_lookup(params,ids)函數中的ids如何產生
做法1:直接在預處理的時候對每一個商品id編連續的id,這種做法感覺不太好,因為要將商品id-&>連續id這個詞表同步到tensorflow serving的機器上,比較麻煩。
做法2:使用tf.string_to_hash_bucket_strong將商品id在計算時轉成ids,因為操作是在graph中,所以模型同步到tensorflow serving時只需要export模型,但tf.string_to_hash_bucket_strong無法在gpu上計算,所以速度比較慢
問題2. sparse多值的問題是在使用TFRecordDataset如何處理的?
具體描述:比如特徵中的一個特徵是用戶購買過的商品,每個用戶購買過的商品數是不一樣的,我們想用tf.nn.embedding_lookup_sparse對用戶購買過的商品embedding求mean
解決方式:tf.contrib.data.Dataset seems does not support SparseTensor
其中這種方式,In the _parse_function_train() function, iterate over tensor_dict and produce a new version where any tf.SparseTensor objects have been converted to a tf.Tensor using tf.serialize_sparse(),通過timeline看,速度真的很慢。另外sparse tensor的梯度也不能在gpu上計算,所以速度提不起來。
現在也有可以直接接受sparse feature的NN的(本質還是embedding),你可以搜索一下
有興趣可以了解一下Amazon的DSSTNE,一個針對推薦系統稀疏數據場景下的開源深度學習框架。GitHub - amznlabs/amazon-dsstne: Deep Scalable Sparse Tensor Network Engine (DSSTNE) is an Amazon developed library for building Deep Learning (DL) machine learning (ML) models
參考Youtube的Paper,有講怎麼弄這個:
http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/45530.pdf思路就是embedding蓋坤的Deep Interest Network算一個吧。。
TensorFlow支持SparseTensor的運算,但一般還是將高緯度數據轉換成低緯embedding
目前的主流做法也都還是embedding。
這個不太了解,不過深度學習,還有其他模型,處理不好高維的,應該要盡量避免高維。像把id二值化後得到的一連串的二值化特徵之間可以認為是相互獨立的,並沒有什麼相關性,這種應該不太適合作為深度神經網路的輸入吧…如果是評分比較稀疏的,那可能就是對評分的維度在隱層的進行維度壓縮,得到高階特徵個人看法
推薦閱讀:
※老師木的機器學習水平,帶實習生的水平,以及當爸爸的水平怎麼樣?
※Deepmind的Alpha Zero是如何把各種棋類規則融入神經網路的?
※NIPS 2016有什麼值得關注的呢?
※為什麼CNTK知名度和普及率不如Tensorflow、Theano、caffe、Torch?
※faster rcnn中rpn的anchor,sliding windows,proposals?
TAG:機器學習 | 推薦系統 | 深度學習DeepLearning | TensorFlow |