[ 
https://issues.apache.org/jira/browse/SYSTEMML-1437?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16090445#comment-16090445
 ] 

Mike Dusenberry commented on SYSTEMML-1437:
-------------------------------------------

[~return_01] Thanks for working on this!  It will be awesome to have FM models 
in SystemML!  I've copied the below message from GitHub:

Since FM models can be used for several types of ML tasks, as seen in section 
III.B, I would suggest we integrate the FM model in a modular way.  I'm a bit 
biased, but I think the modular framework used for neural nets is quite 
powerful, and I think we could make use of it here.  Basically, in that 
framework, each module exposes a `forward/backward/init` API, and modules can 
be mixed together.  An FM model exposing this API could then be mixed with an 
L2 loss layer in the `nn` library for regression problems, or with `sigmoid` 
and `log_loss` layers for binary classification problems.  Basically, we would 
have an FM module, and then separate algorithm files for training a regression 
FM, a binary-classification FM, etc.

If we go that route, I would suggest having a core `FM` module (i.e., `fm.dml`) 
that has the `forward/backward/init` API that the neural net layers have.  This 
module would be for the core FM model, i.e., the equations in section III.A, as 
you've been implementing.  The `forward` function would accept the input data 
`X`, and the parameters `w0`, `W`, and `V`, and would return the FM outputs 
`y`, which is a vector containing a single output for each example.  The 
`backward` function would accept the upstream gradients w.r.t. `y` (i.e., 
`dloss/dy`, the gradient of the loss function w.r.t. `y`), which is the same 
shape as `y`, as well as `X`, `w0`, `W`, and `V`, and would return the 
gradients of the loss w.r.t. the parameters, i.e., `dw0`, `dW`, and `dV`.  The 
`init` function would accept the number of features `n` (or `d` if we update 
the notation to be more common, where `d` would not be the same as the "degree" 
from the paper) and the factorization dimensionality `k`, and would return 
initialized `w0`, `W`, and `V` values.  Thus, the core FM model would be 
modularized.

Given this modularized FM model in `fm.dml`, we could then have separate files 
for training specific types of FM models, such as a regression FM (maybe in 
`fm_regression.dml`) that has a `train` (or `fit`) function, and uses the 
`forward/backward/init` API from `fm.dml` and `nn/layers/l2_loss.dml` to build 
a regression FM.  We could then optimize it with the Adam optimizer.  That file 
could have a `train` (or `fit`) function, as well as `predict` and `eval` 
functions for training, prediction, and accuracy evaluation (and other 
metrics).  We could also create another file for binary classification FM 
models that uses `nn/layers/sigmoid/dml` and `nn/layers/log_loss.dml`.

If you like this approach, I would suggest looking at the layers in 
[`nn/layers`](https://github.com/apache/systemml/tree/master/scripts/nn/layers) 
for the `forward/backward/init` API for inspiration for the core FM module, and 
the [MNIST LeNet 
example](https://github.com/apache/systemml/blob/master/scripts/nn/examples/mnist_lenet.dml)
 for the `train/predict/eval` API for the specific types of FM models.

The modularized implementation will allow others to build DML scripts that 
import the FM models and train them within a larger DML script that perhaps 
does preprocessing, etc.  For command line training of the specific FM models 
only, you could create separate scripts, similar to the 
[train](https://github.com/apache/systemml/blob/master/scripts/nn/examples/mnist_lenet-train.dml)
 and 
[predict](https://github.com/apache/systemml/blob/master/scripts/nn/examples/mnist_lenet-predict.dml)
 LeNet scripts, which just call functions in the main MNIST LeNet file.

> Implement and scale Factorization Machines using SystemML
> ---------------------------------------------------------
>
>                 Key: SYSTEMML-1437
>                 URL: https://issues.apache.org/jira/browse/SYSTEMML-1437
>             Project: SystemML
>          Issue Type: Task
>            Reporter: Imran Younus
>              Labels: factorization_machines, gsoc2017, machine_learning, 
> mentor, recommender_system
>
> Factorization Machines have gained popularity in recent years due to their 
> effectiveness in recommendation systems. FMs are general predictors which 
> allow to capture interactions between all features in a features matrix. The 
> feature matrices pertinent to the recommendation systems are highly sparse. 
> SystemML's highly efficient distributed sparse matrix operations can be 
> leveraged to implement FMs in a scalable fashion. Given the closed model 
> equation of FMs, the model parameters can be learned using gradient descent 
> methods.
> This project aims to implement FMs as described in the first paper:
> http://www.algo.uni-konstanz.de/members/rendle/pdf/Rendle2010FM.pdf
> We'll showcase the scalability of SystemML implementation of FMs by creating 
> an end-to-end recommendation system.
> Basic understanding of machine learning and optimization techniques is 
> required. Will need to collaborate with the team to resolve scaling and other 
> systems related issues.
> Rating: Medium
> Mentors:  [~iyounus], [~nakul02]



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to