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

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

稀疏特征一般会经过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
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用TensorFlow中的Keras API来定义Multi-head Self-attention模块。以下是一个简单的示例代码: ``` import tensorflow as tf from tensorflow.keras import layers class MultiHeadSelfAttention(layers.Layer): def __init__(self, embed_dim, num_heads): super(MultiHeadSelfAttention, self).__init__() self.embed_dim = embed_dim self.num_heads = num_heads if embed_dim % num_heads != 0: raise ValueError("embedding dimension must be divisible by number of heads") self.projection_dim = embed_dim // num_heads self.query_dense = layers.Dense(embed_dim) self.key_dense = layers.Dense(embed_dim) self.value_dense = layers.Dense(embed_dim) self.combine_heads = layers.Dense(embed_dim) def attention(self, query, key, value): score = tf.matmul(query, key, transpose_b=True) dim_key = tf.cast(tf.shape(key)[-1], tf.float32) scaled_score = score / tf.math.sqrt(dim_key) weights = tf.nn.softmax(scaled_score, axis=-1) output = tf.matmul(weights, value) return output, weights def separate_heads(self, x, batch_size): x = tf.reshape(x, (batch_size, -1, self.num_heads, self.projection_dim)) return tf.transpose(x, perm=[0, 2, 1, 3]) def call(self, inputs): batch_size = tf.shape(inputs)[0] query = self.query_dense(inputs) key = self.key_dense(inputs) value = self.value_dense(inputs) query = self.separate_heads(query, batch_size) key = self.separate_heads(key, batch_size) value = self.separate_heads(value, batch_size) attention, weights = self.attention(query, key, value) attention = tf.transpose(attention, perm=[0, 2, 1, 3]) concat_attention = tf.reshape(attention, (batch_size, -1, self.embed_dim)) output = self.combine_heads(concat_attention) return output ``` 在上述代码中,我们定义了一个名为MultiHeadSelfAttention的Keras层,它需要两个参数:embed_dim和num_heads。它包含了一个query_dense、key_dense和value_dense层,以及一个combine_heads层,用于将多个头的输出合并为一个输出。在call()方法中,我们首先将输入张量分别传递给query_dense、key_dense和value_dense层,然后将它们分成多个头,并对它们进行自注意力计算。最后,我们将多个头的输出合并成一个张量,并传递给combine_heads层进行最终的处理。 使用这个层来构建一个Transformer编码器或解码器时,可以将它与其他层一起堆叠来形成一个完整的模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值