Overview
之前的文章介绍了一些推荐系统的理论知识,理论虽然很容易理解,但是实际项目当中会有一些细节问题是需要我们去解决的。比如在很多流量很大的电商以及资讯网站的推荐系统中,每天的数据其实是增长很快的,所以模型迭代的频率也是非常高的,甚至于需要每天更新。那么我们就要面临一个很现实的问题,我们每天更新模型,那么每次都要用全量数据去训练模型吗?显然这是不可能的。一来耗费资源,二来时间也不允许。那么,增量学习Incremental Learning
就派上用场了。增量学习是这几年才出来的概念,其目的在于训练新数据的同时也能保留以前模型的效果,即在之前的模型基础上对新增的数据进行训练。
主流的几种机器学习框架,已经实现了增量学习的功能,接下来看一下他们是怎么做到的。
1. XGBoost
我们一般情况下用XGBoost
训练一个全新的模型,其相关方法是这样的:
1 2 3 4 5 | watchlist = [(xgb_train, 'train' ), (xgb_val, 'val' ), (xgb_test, 'test' )] # training model_path = 'init.model' model = xgb.train(params, xgb_train, num_boost, watchlist) model.save_model(model_path) |
如果我们线上已经有一个效果很好的模型,需要在此基础上对新增的数据进行增量训练,那么XGBoost
是这样实现的:
1 2 3 | # 指定基础模型参数,xgb_model # 传入新的增量训练数据,xgb_train_new model_new = xgb.train(params, xgb_train_new, num_boost, xgb_model = model_path) |
我们来看这个参数的作用:
1 2 | xgb_model : file name of stored xgb model or 'Booster' instance Xgb model to be loaded before training (allows training continuation). |
即在指定的模型上继续训练。
更多相关知识请参考:
How can I implement incremental training for xgboost?
dmlc/xgboost
2. LightGBM
1 2 3 4 5 6 7 8 9 | model = lgb.train(params, lgb_train, num_boost_round = 1000 , valid_sets = lgb_eval, feature_name = x_cols, early_stopping_rounds = 10 , verbose_eval = False , init_model = model, # 如果init_model不为None,那么就是在init_model基础上接着训练 keep_training_booster = True ) # 增量训练 |
LightGBM
实现增量训练也很简单,只需要设置init_model
为当前线上的模型,且keep_training_booster
设置为True
即可。
更多相关知识请参考:
Incremental learning using Dataset.subset LightGBM 2.1.1 python API
Standard outputs infos even when disabled
lightgbm.train
3. TensorFlow2.0
我们知道,TensorFlow2.0
已经集成好了Keras
高级API
,所以,我们看看增量学习在Keras
当中是如何实现的。
1 2 3 4 5 6 7 8 9 10 11 | # 加载线上的模型 model_path = 'init.model' loaded_model = tf.keras.models.load_model(model_path) # 新数据上接着训练 history = loaded_model.fit( train_data_gen, steps_per_epoch = total_train / / batch_size, epochs = epochs, validation_data = val_data_gen, validation_steps = total_val / / batch_size ) |
可以看到,TensorFlow2.0
对于增量训练支持也是很完备的。