57 lines
1.7 KiB
C
57 lines
1.7 KiB
C
/*
|
|
Follow-the-regularized-leader (FTRL) Proximal inference
|
|
|
|
This is a regularization scheme for online gradient descent
|
|
which produces sparse solutions.
|
|
|
|
From: https://research.google.com/pubs/archive/41159.pdf
|
|
*/
|
|
|
|
#ifndef FTRL_H
|
|
#define FTRL_H
|
|
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
#include <math.h>
|
|
|
|
#include "float_utils.h"
|
|
#include "matrix.h"
|
|
#include "sparse_matrix.h"
|
|
|
|
typedef struct ftrl_trainer {
|
|
// Dense weights matrix, only needed to store at training time
|
|
double_matrix_t *z;
|
|
// Whether to consider feature_id=0 the intercept
|
|
bool fit_intercept;
|
|
// number of features (may change)
|
|
size_t num_features;
|
|
// alpha hyperparameter
|
|
double alpha;
|
|
// beta hyperparameter
|
|
double beta;
|
|
// Coefficient for L1 regularization
|
|
double lambda1;
|
|
// Coefficient for L2 regularization
|
|
double lambda2;
|
|
// Vector of learning rates
|
|
double_array *learning_rates;
|
|
} ftrl_trainer_t;
|
|
|
|
ftrl_trainer_t *ftrl_trainer_new(size_t m, size_t n, bool fit_intercept, double alpha, double beta, double lambda1, double lambda2);
|
|
|
|
bool ftrl_trainer_reset_params(ftrl_trainer_t *self, double alpha, double beta, double lambda1, double lambda2);
|
|
|
|
bool ftrl_trainer_extend(ftrl_trainer_t *trainer, size_t m);
|
|
|
|
bool ftrl_set_weights(ftrl_trainer_t *trainer, double_matrix_t *w, uint32_array *indices);
|
|
|
|
double ftrl_reg_cost(ftrl_trainer_t *self, double_matrix_t *theta, uint32_array *indices, size_t batch_size);
|
|
|
|
bool ftrl_update_gradient(ftrl_trainer_t *self, double_matrix_t *gradient, double_matrix_t *weights, uint32_array *indices, size_t batch_size);
|
|
|
|
double_matrix_t *ftrl_weights_finalize(ftrl_trainer_t *trainer);
|
|
sparse_matrix_t *ftrl_weights_finalize_sparse(ftrl_trainer_t *trainer);
|
|
|
|
void ftrl_trainer_destroy(ftrl_trainer_t *self);
|
|
|
|
#endif |