Overview
之前的文章介绍了一些推荐系统的理论知识,理论虽然很容易理解,但是实际项目当中会有一些细节问题是需要我们去解决的。比如在很多流量很大的电商以及资讯网站的推荐系统中,每天的数据其实是增长很快的,所以模型迭代的频率也是非常高的,甚至于需要每天更新。那么我们就要面临一个很现实的问题,我们每天更新模型,那么每次都要用全量数据去训练模型吗?显然这是不可能的。一来耗费资源,二来时间也不允许。那么,增量学习Incremental Learning
就派上用场了。增量学习是这几年才出来的概念,其目的在于训练新数据的同时也能保留以前模型的效果,即在之前的模型基础上对新增的数据进行训练。
主流的几种机器学习框架,已经实现了增量学习的功能,接下来看一下他们是怎么做到的。
1. XGBoost
我们一般情况下用XGBoost
训练一个全新的模型,其相关方法是这样的:
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
是这样实现的:
# 指定基础模型参数,xgb_model
# 传入新的增量训练数据,xgb_train_new
model_new = xgb.train(params, xgb_train_new, num_boost, xgb_model=model_path)
我们来看这个参数的作用:
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
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
当中是如何实现的。
# 加载线上的模型
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
对于增量训练支持也是很完备的。