noHup - Incremental Learning
type: channel
link: http://chris.nohup.cc/tag/Incremental-Learning/
items: 增量学习的主流实现

增量学习的主流实现
type: item
date: 2020-05-18T07:27:00+00:00
description: Overview1. XGBoost2. LightGBM3. TensorFlow2.0 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对于增量训练支持也是很完备的。