首页 > 解决方案 > 如何直接通过特征制作嵌入列?

问题描述

我正在学习 ctr 的广泛和深度模型。我的数据有一个特征 user_id,它有超过 2**26 个值。如何通过此功能获取嵌入列?我用过 user_id = tf.feature_column.categorical_column_with_hash_bucket('user_id', hash_bucket_size=2**26), user_id_emb = tf.feature_column.embedding_column(user_id, dimension=95),但它显示内存不足。

标签: tensorflowembedding

解决方案


所以,2**26 大约是 64M。您需要 95 个嵌入维度。默认情况下,每个都是 float32。那是4个字节。每个 user_id 4 * 95 ~= 400 字节。所以你需要 64M * 400 ~= 25.6 GB 的内存来存储嵌入。

确保你可以在你的系统上分配那么多。它应该全部在 ram 中(交换会使一切变慢)。如果您将它放在 GPU 上,它将无法工作,因为大多数 GPU 没有那么多可用内存。只有 20 维的嵌入应该使用大约 5GB,这更有可能适合内存。

最简单的事情是减少嵌入维度的数量。如果您有多个系统可用,您可以对嵌入进行分片(请参阅分区器参数以了解与变量相关的功能)。

您可以做的另一件事是将一些 user_id 聚集在一起(降低 hash_bucket_size)。或者将 user_ids 替换为可以为您的模型充分描述用户的其他特征的组合。


推荐阅读