分享

tensorflow定义多个优化器加速Embedding的训练

 Clay*more 2022-06-26 发布于北京

https://blog.csdn.net/cdj0311/article/details/107246476

在遇到大规模推荐算法训练时,我们常常会有不同种类的特征,大体上可分为稀疏特征和稠密特征两类。

稀疏特征一般会经过Embedding转为稠密特征再传入全连接层。然而,当稀疏特征中包含大量ID类特征时,由于其原始维度非常高(如UserID几乎都是千万级以上),训练如此庞大的Embedding时会非常缓慢。一种解决方案是增大学习率,但学习率过大又会影响稠密特征(如一些向量特征)的训练,所以可以设计两个优化器分别以不同的学习率去优化稀疏Embedding和稠密特征。

这里以tf.estimator + tf.feature_column实现:

  1. def isSparse(variable, fields):
  2. """ 判断变量是否为稀疏变量 """
  3. flag = False
  4. for filed in fields:
  5. if filed in variable.name:
  6. flag = True
  7. break
  8. return flag
  9. # 获取全局步数
  10. global_step = tf.train.get_global_step()
  11. # 获取所有可训练的变量
  12. trainable_variables = [variable for variable in tf.trainable_variables()]
  13. # 获取稀疏变量列表
  14. sparse_list = [x.name for x in params["feature_configs"].all_columns.values()
  15. if "EmbeddingColumn" in str(type(x)) and
  16. "HashedCategoricalColumn" in str(type(x.categorical_column)) and
  17. x.categorical_column.hash_bucket_size > 200000
  18. ]
  19. # 获取embedding变量
  20. embedding_variables = [variable for variable in trainable_variables if "embedding_weights" in variable.name]
  21. # 获取稀疏embedding变量
  22. embedding_sparse_variables = [variable for variable in embedding_variables if isSparse(variable, sparse_list)]
  23. # 获取稠密embedding变量
  24. embedding_dense_variables = [variable for variable in embedding_variables if
  25. variable not in embedding_sparse_variables]
  26. param_variables = [variable for variable in trainable_variables if variable not in embedding_variables]
  27. all_variables = [variable for variable in trainable_variables]
  28. # 定义稀疏变量优化器
  29. optimizer_sparse_emb = tf.train.AdagradOptimizer(learning_rate=0.01)
  30. train_op_sparse_emb = optimizer_sparse_emb.minimize(loss, var_list=embedding_sparse_variables)
  31. # 定义稠密变量优化器
  32. optimizer_dense_emb = tf.train.AdagradOptimizer(learning_rate=0.001)
  33. train_op_dense_emb = optimizer_dense_emb.minimize(loss, var_list=embedding_dense_variables)
  34. # 定义全局变量优化器
  35. optimizer_param = tf.train.AdamOptimizer(learning_rate=params["learning_rate"])
  36. train_op_param = optimizer_param.minimize(loss, var_list=param_variables, global_step=global_step)
  37. # 将所有优化器集合到一起
  38. update_ops = tf.compat.v1.get_collection(tf.GraphKeys.UPDATE_OPS)
  39. train_op = tf.group(update_ops, train_op_sparse_emb, train_op_dense_emb, train_op_param)
  40. return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多