Giter Site home page Giter Site logo

sbr-rs's Introduction

sbr

Crates.io badge Docs.rs badge Build Status

An implementation of sequence recommenders based on the wyrm autdifferentiaton library.

sbr-rs

sbr implements efficient recommender algorithms which operate on sequences of items: given previous items a user has interacted with, the model will recommend the items the user is likely to interact with in the future.

Implemented models:

  • LSTM: a model that uses an LSTM network over the sequence of a user's interaction to predict their next action;
  • EWMA: a model that uses a simpler exponentially-weighted average of past actions to predict future interactions.

Which model performs the best will depend on your dataset. The EWMA model is much quicker to fit, and will probably be a good starting point.

Example

You can fit a model on the Movielens 100K dataset in about 10 seconds:

let mut data = sbr::datasets::download_movielens_100k().unwrap();

let mut rng = rand::XorShiftRng::from_seed([42; 16]);

let (train, test) = sbr::data::user_based_split(&mut data, &mut rng, 0.2);
let train_mat = train.to_compressed();
let test_mat = test.to_compressed();

println!("Train: {}, test: {}", train.len(), test.len());

let mut model = sbr::models::lstm::Hyperparameters::new(data.num_items(), 32)
    .embedding_dim(32)
    .learning_rate(0.16)
    .l2_penalty(0.0004)
    .lstm_variant(sbr::models::lstm::LSTMVariant::Normal)
    .loss(sbr::models::Loss::WARP)
    .optimizer(sbr::models::Optimizer::Adagrad)
    .num_epochs(10)
    .rng(rng)
    .build();

let start = Instant::now();
let loss = model.fit(&train_mat).unwrap();
let elapsed = start.elapsed();
let train_mrr = sbr::evaluation::mrr_score(&model, &train_mat).unwrap();
let test_mrr = sbr::evaluation::mrr_score(&model, &test_mat).unwrap();

println!(
    "Train MRR {} at loss {} and test MRR {} (in {:?})",
    train_mrr, loss, test_mrr, elapsed
);

License: MIT

sbr-rs's People

Contributors

maciejkula avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

sbr-rs's Issues

Not fully backpropagated error

In the example given in readme

use std::time::Instant;

use rand;
use rand::prng::XorShiftRng;
use rand::SeedableRng;
use sbr;

fn main() {
    let mut data = sbr::datasets::download_movielens_100k().unwrap();

    let mut rng = XorShiftRng::from_seed([42; 16]);

    let (train, test) = sbr::data::user_based_split(&mut data, &mut rng, 0.2);
    let train_mat = train.to_compressed();
    let test_mat = test.to_compressed();

    println!("Train: {}, test: {}", train.len(), test.len());

    let mut model = sbr::models::lstm::Hyperparameters::new(data.num_items(), 32)
        .embedding_dim(32)
        .learning_rate(0.16)
        .l2_penalty(0.0004)
        .lstm_variant(sbr::models::lstm::LSTMVariant::Normal)
        .loss(sbr::models::Loss::WARP)
        .optimizer(sbr::models::Optimizer::Adagrad)
        .num_epochs(10)
        .rng(rng)
        .build();

    let start = Instant::now();
    let loss = model.fit(&train_mat).unwrap();
    let elapsed = start.elapsed();
    let train_mrr = sbr::evaluation::mrr_score(&model, &train_mat).unwrap();
    let test_mrr = sbr::evaluation::mrr_score(&model, &test_mat).unwrap();

    println!(
        "Train MRR {} at loss {} and test MRR {} (in {:?})",
        train_mrr, loss, test_mrr, elapsed
    );
}

getting the below error

Train: 82948, test: 17052
thread '<unnamed>' panicked at 'Not fully backpropagated.', /home/nineleaps/.cargo/registry/src/github.com-1ecc6299db9ec823/wyrm-0.9.1/src/nodes.rs:45:9
note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
thread '<unnamed>' panicked at 'Not fully backpropagated.', /home/nineleaps/.cargo/registry/src/github.com-1ecc6299db9ec823/wyrm-0.9.1/src/nodes.rs:45:9
thread '<unnamed>' panicked at 'Not fully backpropagated.', /home/nineleaps/.cargo/registry/src/github.com-1ecc6299db9ec823/wyrm-0.9.1/src/nodes.rs:45:9
thread '<unnamed>' panicked at 'Not fully backpropagated.', /home/nineleaps/.cargo/registry/src/github.com-1ecc6299db9ec823/wyrm-0.9.1/src/nodes.rs:45:9
thread '<unnamed>' panicked at 'Not fully backpropagated.', /home/nineleaps/.cargo/registry/src/github.com-1ecc6299db9ec823/wyrm-0.9.1/src/nodes.rs:45:9
thread '<unnamed>' panicked at 'Not fully backpropagated.', /home/nineleaps/.cargo/registry/src/github.com-1ecc6299db9ec823/wyrm-0.9.1/src/nodes.rs:45:9
thread '<unnamed>' panicked at 'Not fully backpropagated.', /home/nineleaps/.cargo/registry/src/github.com-1ecc6299db9ec823/wyrm-0.9.1/src/nodes.rs:45:9
thread '<unnamed>' panicked at 'Not fully backpropagated.', /home/nineleaps/.cargo/registry/src/github.com-1ecc6299db9ec823/wyrm-0.9.1/src/nodes.rs:45:9

Unable to fit model when num_threads > number of logical cores on machine

Hi, I ran into an issue around multithreading support when running goodbooks-recommender (https://maciejkula.github.io/2018/07/27/recommending-books-with-rust/)

When instantiating hyperparameters with num_threads greater than the number of cores on my CPU - the task never completes, and goodbooks-recommender's CPU usage drops to 0 almost immediately.

After some println!() driven debugging I narrowed down the issue to this section of sbr https://github.com/maciejkula/sbr-rs/blob/master/src/models/sequence_model.rs#L101-L168

I think the issue is caused by a combination of the following factors:


Inserting a println!() before and after this line in wyrm
(https://github.com/maciejkula/wyrm/blob/12715ae99ca531db6557dca786e4a480ec608101/src/optim/mod.rs#L81) illustrates this issue.

...
println!("pre barrier sync");
let _barrier = self.barrier_guard.synchronize();
println!("post barrier sync");
...

With thread count set to 4 all is fine and I see repeated "pre barrier sync", "post barrier sync" messages. If I set thread count to 5 I see 4 "pre barrier sync" messages followed by nothing, and the program hangs.

I'm not sure how to solve this, but hopefully this report is helpful nonetheless.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.