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对于增量训练支持也是很完备的。