欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 人工智能 > pytorch >内容正文

pytorch

[深度学习]CTR模型如何加入稠密连续型|多值类别特征

发布时间:2023/12/15 pytorch 69 豆豆
生活随笔 收集整理的这篇文章主要介绍了 [深度学习]CTR模型如何加入稠密连续型|多值类别特征 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一 稠密连续类型特征的处理

在点击率预估问题中,可以尝试的几种方法

1.归一化后直接拼接到embedding向量侧dnn部分,不参与fm部分交叉

  • 归一化的方式可以包括:直接对原始特征做归一化;通过bn层来做归一化。
  • 因为FM里要求不同field之间有相同的embedding dimension, 所以数值型特征这么加的话是不参与FM的
  • 归一化总是有好处的。未归一化的数据会导致nn反向传播过程中grads的均值和方差过大,不利于网络的学习和收敛。

2.离散化后作为id feature 类别特征, embedding后与其他sparse feature的embedding 一起参与fm的交叉

离散化有两个好处:一是引入非线性。当label与该dense feature不是线性关系时,一个w * dense feature是不能很好刻划模型的,所有的dense feature共用一个w表达能力是比较差的。但是离散化之后就变成了对不同的离散化值学习不同的系数,这样就能很好的提升非线性能力;二是可以过滤一些异常值。异常值会跟其它值分到一个桶里,对模型的影响就会很少。

3.对每个原始稠密特征X维护一个词嵌入向量embedding vector V,然后把原始稠密特征和权重向量相乘 X*V 得到最终的特征向量.

相当于一个稠密特征映射成一个特征向量,之后和类别映射的词嵌入矩阵进行拼接参与fm的交叉。此时仍然可以发现,这样相当于原始稠密特征也可以和类别特征进行交叉特征提取

2和3的区别在于2中根据dense value的取值会分配到不同的embedding vector,而3中的不同的dense value只有一个embedding vector.

一般来说,2应该是最好的。3的自由度有点低,所有的dense feature共用一个embedding, 只是通过feature本身的数值去区分生效。

从上面几种方法可以发现,稠密特征要和词嵌入后的类别特征做交叉需要在同一个维度空间,也就是要把一维的稠密特征转化成和词嵌入维度相同的特征空间中,同时上面方法中的词嵌入矩阵相当于权重矩阵都可以进行优化学习。

二 多值类别特征

一般单值类别特征加入到CTR预估模型的方法是先对单值类别特征进行one-hot,然后和embedding 矩阵相乘转换成多维稠密特征,如下图所示:

在现实实际问题中,往往还会出现多值类别特征,话题特征,也就是一个用户感兴趣的话题可以有多个,并且不同的用户感兴趣的话题个数不一,这些特征的形式都一般是如下结构(拿用户感兴趣的话题特征来说):

在CTR预估模型中,对这种多值类别特征的常用处理方法总结归纳如下:

非加权法

最常规的也最简单的是先对所有‘话题’集合进行one hot编码,然后按照图 1 方式对多值类别特征中的每一项进行稠密特征的转换,最后对转换后的稠密特征向量进行拼接,然后按项求均值或最大值或最小值等,整个过程可以用如图表示:

可以看出,这样对多值类别特征进行处理之后,可以把每个多值类别特征转换在同一维度空间中,这样输入到神经网络中不用为了保持输入维度一致而进行padding,使输入变稀疏,也方便和其他特征做交叉特征。

加权法

如果对多值类型特征直接求均值似乎不是很符合常理,毕竟用户对每个感兴趣话题的喜爱程度不一样,这就有了权重的引入,而不是简单粗暴的求均值了,具体引入权重的做法如图:

参考:

  • 稠密特征加入CTR预估模型有哪些方法? - 知乎
  • 多值类别特征加入CTR预估模型的方法 - 知乎
  • 总结

    以上是生活随笔为你收集整理的[深度学习]CTR模型如何加入稠密连续型|多值类别特征的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。