tensorflow - 如何直接通过特征制作嵌入列?
问题描述
我正在学习 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)
,但它显示内存不足。
解决方案
所以,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 替换为可以为您的模型充分描述用户的其他特征的组合。
推荐阅读
- css - 实现 Google 自定义搜索时覆盖 CSS 样式
- java - 如何使用 Dart 加密视频文件?
- c# - C# discord bot 在我的服务器中获取成员数
- c - 如何在 vs code 中安装和使用 Openmp
- php - 将多个提交按钮重定向到不同的页面
- java - 在java中调用类的get方法
- sql-server - 为 TOP 或 FETCH 子句行计数参数提供的行数必须是整数
- ios - 如何在Objective-C中像Twitter一样显示预览
- php - 您的系统中缺少请求的 PHP 扩展 ext-iconv *。安装或启用 PHP 的 iconv 扩展
- java - 错误:在 Eclipse 和命令提示符下编译时无法找到或加载主类错误但在 intelliJIDEA 中有效