用Mxnet實現矩陣分解
我們先看看公式
r(ui) = dot(p(u), q(i))n
一開始卡在了dot這個操作上,沒有找到mxnet支持的這個操作。後來經人提醒,發現mxnet的python庫中重載了symbol類的運算符。所以elementwise的乘法可以直接寫成
a = b * cn
所以,迅速就可以寫出網路結構了:
def get_net(max_user, max_item):n hidden = 500n user = mx.symbol.Variable(user)n item = mx.symbol.Variable(item)n score = mx.symbol.Variable(score)nn user = mx.symbol.Embedding(data = user, input_dim = max_user, output_dim = 1000)n user = mx.symbol.Flatten(data = user)n user = mx.symbol.FullyConnected(data = user, num_hidden = hidden)n item = mx.symbol.Embedding(data = item, input_dim = max_item, output_dim = 1000)n item = mx.symbol.FullyConnected(data = item, num_hidden = hidden)n item = mx.symbol.Flatten(data = item)n pred = user * itemn pred = mx.symbol.sum_axis(data = pred, axis = 1)n pred = mx.symbol.Flatten(data = pred)n pred = mx.symbol.LinearRegressionOutput(data = pred, label = score)n return predn
這裡user和item各自通過一個embedding和fc層變成了2個latent factor。然後pred是這兩個lantent factor的點積。然後最後通過一個LinearRegressionOutput轉成一個回歸問題。
訓練了一下,發現效果很好,RMSE可以很容易的收斂到0.8x。所以,我們再次領略了自動求導框架的威力。而且這個程序還是GPU就可以train的。
全部的程序見 https://github.com/xlvector/mxnet/blob/svd/example/svd/svd.py
數據集就是用的簡單的movielens數據集。
其實,這個程序可以很容易的擴展成word2vec的程序,有興趣的同學可以試一下。
另外,還有一個思路,是關於圖片的。如果我們有一個很大的關於圖片相似度的數據集,那麼我們可以用CNN講圖片embeding到一個vector,然後兩個圖片的vector點擊作為它們的相似度目標,不知道可以train出什麼效果。(不要問我從哪兒弄到很大的圖片相似度的數據集)
推薦閱讀:
※當機器學習性能不是很好時,你會如何優化?
※少數人的智慧
※[論文學習]Deep Learning Based Recommendation: A Survey
※關於評分預測和TopN推薦的討論?
※如何學習推薦系統?
TAG:mxnet | 深度学习DeepLearning | 推荐系统 |