用Mxnet實現矩陣分解

在《關於LDA, pLSA, SVD, Word2Vec的一些看法》一文中我們提到了SVD的演算法。之前TensorFlow剛出來時,就聽說可以很容易的用TF實現這個演算法(參考這篇文章)。所以,就一直想著怎麼用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的。

全部的程序見 github.com/xlvector/mxn

數據集就是用的簡單的movielens數據集。

其實,這個程序可以很容易的擴展成word2vec的程序,有興趣的同學可以試一下。

另外,還有一個思路,是關於圖片的。如果我們有一個很大的關於圖片相似度的數據集,那麼我們可以用CNN講圖片embeding到一個vector,然後兩個圖片的vector點擊作為它們的相似度目標,不知道可以train出什麼效果。(不要問我從哪兒弄到很大的圖片相似度的數據集)


推薦閱讀:

當機器學習性能不是很好時,你會如何優化?
少數人的智慧
[論文學習]Deep Learning Based Recommendation: A Survey
關於評分預測和TopN推薦的討論?
如何學習推薦系統?

TAG:mxnet | 深度学习DeepLearning | 推荐系统 |