DeepFM梳理
1、准备
- feature_index
- 一个数值特征:一个 feature_index
- 一个类别特征: category_name.unique() 个 feature_index
- feature_value
- 一个数值特征:一个 feature_value,feature_value = 数值特征实际数值
- 一个类别特征:多个 feature_value,feature_value = 1
这里要多问一句,为什么类别特征的feature_value=1呢?回顾FM的公式 y = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ j = i + 1 n < v i , v j > x i x j y=w_0 + \sum_{i=1}^{n}w_ix_i+\sum_{i=1}^{n}\sum_{j=i+1}^{n}<v_i,v_j>x_ix_j y=w0+∑i=1nwixi+∑i=1n∑j=i+1n<vi,vj>xixj,拿 ∑ i = 1 n w i x i \sum_{i=1}^{n} w_ix_i ∑i=1nwixi来说,当特征 x i x_i xi为数值型时当然可以直接带入公式计算,但是当特征 x i x_i xi为类别型时怎么办呢?
其实好办!!!
把所有类别型的value当成是1,然后只需要通过梯度下降求出每个类别型变量特征的系数 w i w_i wi即可。
2、参数定义
-
feature_size
- feature_index范围,对应所有特征取值
- 进行embedding用到
-
field_size
- 原始特征个数
- 数值特征一个field可以映射到一个feature_index
- 类别特征一个field可以映射到多个feature_index
-
embedding
- [dfm_params[‘feature_size’], dfm_params[‘embedding_size’]]
- 将 feature_size,转成 feature_size * embedding
-
deep layers
- input_size = dfm_params[‘field_size’] * dfm_params[‘embedding_size’]
- deep(1) : [input_size,dfm_params[‘deep_layers’][0]]
- deep(i) : [dfm_params[‘deep_layers’][i - 1], dfm_params[‘deep_layers’][i]]
- 将 field_size,field_size * embedding_size,再全连接
- out
- if ues_deep and use_fm:
- input_size = field_size + embedding_size + deep_layers[-1]
- field_size:一阶
- embedding_size:二阶
- deep_layers[-1]:高阶
- If use_deep:
- input_size = deep_layers[-1]
- elif use_fm:
input_size = field_size + embedding_size
- if ues_deep and use_fm:
3、执行
- embeddings
- embeddings = tf.nn.embedding_lookup(weights[‘feature_embeddings’],feat_index)
- 将 feature_size * embedding 转化成 field_size * embedding
- 254*8 --> 37*8 总表到查表的过程
- 从feature_index 和 feature_value中,生成embedding
- 生成 1 阶特征
- 生成一阶特征
- 生成 2 阶特征
- 生成embddding特征
- 深度部分
- 输入:field_size * embedding_size
- 相当于:每个特征隐向量 --> reshape