在遇到大规模推荐算法训练时,我们常常会有不同种类的特征,大体上可分为稀疏特征和稠密特征两类。
稀疏特征一般会经过Embedding转为稠密特征再传入全连接层。然而,当稀疏特征中包含大量ID类特征时,由于其原始维度非常高(如UserID几乎都是千万级以上),训练如此庞大的Embedding时会非常缓慢。一种解决方案是增大学习率,但学习率过大又会影响稠密特征(如一些向量特征)的训练,所以可以设计两个优化器分别以不同的学习率去优化稀疏Embedding和稠密特征。
这里以tf.estimator + tf.feature_column实现:
def isSparse(variable, fields):
""" 判断变量是否为稀疏变量 """
flag = False
for filed in fields:
if filed in variable.name:
flag = True
break
return flag
# 获取全局步数
global_step = tf.train.get_global_step()
# 获取所有可训练的变量
trainable_variables = [variable for variable in tf.trainable_variables()]
# 获取稀疏变量列表
sparse_list = [x.name for x in params["feature_configs"].all_columns.values()
if "EmbeddingColumn" in str(type(x)) and
"HashedCategoricalColumn