TensorFlow如何实现特征交叉_使用FeatureColumn或自定义乘法层

陌磊君_7334

陌磊君_7334

2026-04-07

822人浏览

原创

FeatureColumn交叉仅预计算离散ID,不学真实交互;自定义乘法层(如Multiply)可学习数值×类别等动态交互,但需对齐维度、归一化数值特征并确保梯度流完整。

tensorflow如何实现特征交叉_使用featurecolumn或自定义乘法层

FeatureColumn做特征交叉:只适合简单组合,别指望它学交互

crossed_column 和 embedding_column 搭配用,能生成离散特征的笛卡尔积(比如 ["gender", "city"] → "male_X_shanghai"),但它不参与梯度更新,纯查表映射。
你看到的“交叉特征”其实是预计算好的 ID,模型后续只学这个 ID 对应的 embedding 向量,不是真正学习两个原始特征如何非线性交互。

  • 仅支持 categorical_columnwith* 类型,数值列必须先分桶(bucketized_column)才能进 crossed_column
  • 组合后特征空间爆炸:10 个城市 × 2 种性别 × 5 个年龄段 = 100 个桶,如果漏掉某组合,对应 embedding 就是未训练的零向量
  • hash_bucket_size 设太小会碰撞,设太大浪费内存;线上 serving 时 hash 行为必须和训练一致,否则 ID 对不上

示例中常见错误:crossed_column([age, gender], hash_bucket_size=10) —— age 是连续值,没过 bucketized_column,运行时报 TypeError: column must be categorical。

自定义乘法层做特征交叉:真学交互,但得管好维度和梯度流

想让模型自己学 “用户点击率 = f(年龄 × 兴趣权重 + 地域 × 偏好偏移)”,就得用可训练的乘法操作,比如 tf.keras.layers.Multiply 或手写 tf.multiply。

关键不是“能不能乘”,而是“乘完怎么接下去”:

  • 两个输入张量 shape 必须对齐,比如都是 (None, 1) 才能点乘;若一个是 (None, 8)(embedding 输出),另一个是 (None,)(标量特征),得先 tf.expand_dims 或 tf.reshape
  • 直接 tf.multiply(a, b) 没问题,但若 a 是 dense layer 输出、b 是原始输入,b 默认不可训练,梯度不会回传到 b 的上游(比如归一化层),容易误以为“交叉没效果”
  • 用 tf.keras.layers.Multiply 更稳妥,它自动处理 broadcast,且在 Model 中显式可见,debug 时容易定位

常见翻车点:把 user_emb(shape=(None, 64))和 item_id(shape=(None,))直接相乘 —— 报错 Incompatible shapes,得先对 item_id 做 embedding,再确保维度一致。

数值特征×类别特征交叉:先统一成稠密向量,再乘

数值列不能直接和类别 embedding 相乘,因为维度不匹配,也不能靠 crossed_column(它只认离散 ID)。真实场景里,常要表达“高收入用户在一线城市点击更多”,这就需要数值 × 类别联合建模。

做法是:

  • 数值列走一个小型 dense 网络(比如 1 层 8 维),输出 num_dense
  • 类别列走 embedding,输出 cat_emb(比如 (None, 8))
  • 两者 tf.multiply(num_dense, cat_emb),得到逐元素加权后的 embedding
  • 再接 dense 层或拼接到主干网络

注意:

  • 别省略数值列的归一化(tf.keras.layers.Normalization),否则 income=10000 和 income=50 对乘法影响失衡
  • 如果用 tf.keras.layers.Dot 做内积,输出是标量,丢失了通道信息,一般不用在特征交叉主干上
  • 这种乘法结果仍是稠密向量,可直接 concat 或 sum pooling,但别忘了后续 dropout/BN 要适配新维度

性能与部署陷阱:乘法本身快,但 shape 错误会让整个 pipeline 卡住

tf.multiply 计算开销几乎可忽略,真正拖慢训练或炸掉 OOM 的,是 shape 不对导致的隐式 broadcast 或中间张量膨胀。

  • 在 tf.function 里调试时,用 tf.shape(x) 查动态 shape,别信 x.shape(它可能含 None)
  • TPU 上尤其敏感:broadcast 不兼容会直接报 XLA compilation failed,而不是清晰的 shape error
  • SavedModel 导出后,输入 signature 必须明确指定所有交叉输入的 shape,比如数值特征不能只写 tf.TensorSpec(shape=[None], ...),得是 shape=[None, 1],否则 serving 时 reshape 失败

最易被忽略的一点:当用 tf.keras.Model 构建多输入模型时,call 方法里所有乘法操作必须发生在 inputs 已经经过各自 preprocessing layer 之后——否则 preprocessing 的可导性断裂,交叉部分就变成静态规则了。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1851

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5004

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1789

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

30037

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3567

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3587

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1243

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2783

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习