鹤壁户外:CTR学习条记&代码实现4-深度ctr模子 NFM/AFM

2021-07-15 151 views 3

扫一扫用手机浏览

<这一节>我们总结FM<另外>两《{个}》远亲NFM,AFM。NFM<({‘““‘和’””’})>AFM都【是】‘针对’Wide&Deep 『中』Deep‘‘部门’【 【的】[】革新’。‘上一章’PNN用到‘了’向量内积外积来<提取特><征交互>信息,总共向量乘积就这几种,《这不》NFM【就带着】element-wise(hadamard) product‘来’‘了’。AFM「则」【是】引入‘了’注意力机制【“〖把〗”】NFM【 【的】[】等权求<({‘““‘和’””’})>变成‘了’加权求<({‘““‘和’””’})>。

〖以下代〗码‘针对’Dense【输入感受更】容易明白模(子结构),‘针对’spare输入【 【的】[】代码<({‘““‘和’””’})>完整代码
https://github.com/DSXiangLi/CTR

NFM

NFM(【 【的】[】创新点【是】)〖在〗wide&Deep【 【的】[】Deep‘部门’,〖在〗Embedding「层」<({‘““‘和’””’})>全联接「层」之间加入‘了’BI-Pooling「层」,‘也就【是】’Embedding{两两做}element-wise‘乘积获’得 \(N*(N-1)/2\)《{个}》 \(1*K\)【 【的】[】矩阵然后做sum_pooling『获得最终』\(1*k\)【 【的】[】矩阵。

\[f_{BI}(V_x) = \sum_{i=1}^n\sum_{j=i+1}^n (x_iv_i) \odot (x_jv_j) \]

Deep‘部门’【 【的】[】模(子结构)如下

<({‘““‘和’””’})>其他〖模子〗【 【的】[】联系

NFM不接全毗{邻}「层」,<直接>weight=1‘输出’就【是】FM,以【是】NFM可以〖在〗FM上学到更高阶【 【的】[】特征交互。

【有看到一种】说法【是】DeepFM【是】FM<({‘““‘和’””’})>Deep并联,NFM【是】【“〖把〗”】FM<({‘““‘和’””’})>Deep「串联」,也【是】可以这么明白,但感受本质【是】〖在〗学习差别【 【的】[】信息,【“〖把〗”】FM放〖在〗wide侧【是】辅助学习二阶‘《影象》特征’,【“〖把〗”】FM放〖在〗Deep侧【是】辅助学习高阶‘泛化特征’。

NFM<({‘““‘和’””’})>PNN都【是】用向量相乘【 【的】[】方式来辅助全联接「层」提炼特<征交互>信息。虽然一《{个}》【是】element-wise product一《{个}》【是】inner product,但区别实〖在〗只【是】做sum_pooling{时}axis【 【的】[】差异。 IPNN【是】〖在〗k【 【的】[】axis上求<({‘““‘和’””’})>获得\(N^2\)《{个}》scaler拼接成输入, 『而』NFM【是】〖在〗\(N^2\)【 【的】[】axis上求<({‘““‘和’””’})>获得\(1*K\)【 【的】[】输入。

下面这《{个}》例子可以对照直观【 【的】[】对照一下FM,NFM,IPNN对Embedding【 【的】[】处置(为‘了’简朴明白给‘了’Embedding“简朴数值”)

\[\begin{align} & embedding_1 = [0.5,0.5,0.5]\\ & embedding_2 = [2,2,2]\\ & embedding_3 = [4,4,4]\\ & embedding_1 \odot embedding_2 = [1,1,1]\\ & embedding_1 \odot embedding_3 = [2,2,2]\\ & embedding_2 \odot embedding_3 = [8,8,8]\\ & IPNN = [3,6,24] \\ & NFM = [11,11,11]\\ & FM = [33]\\ \end{align} \]

NFM几《{个}》想吐槽【 【的】[】点

  • <({‘““‘和’””’})>FNN,PNN一样对低阶特征【 【的】[】提炼《对照有限》
  • 这《{个}》sum_pooling同样会存〖在〗信息损失,差别【 【的】[】特征交互对Target【 【的】[】影响差别,等权加<({‘““‘和’””’})>一定不【是】最好【 【的】[】方式,但也算【是】为特征交互提供‘了’一种新方式

<「代码实」现>

@tf_estimator_model
def model_fn_dense(features, labels, mode, params):
    dense_feature, sparse_feature = build_features()
    dense = tf.feature_column.input_layer(features, dense_feature)
    sparse = tf.feature_column.input_layer(features, sparse_feature)

    field_size = len( dense_feature )
    embedding_size = dense_feature[0].variable_shape.as_list()[-1]
    embedding_matrix = tf.reshape( dense, [-1, field_size, embedding_size] )  # batch * field_size *emb_size

    with tf.variable_scope('Linear_output'):
        linear_output = tf.layers.dense( sparse, units=1 )
        add_layer_summary( 'linear_output', linear_output )

    with tf.variable_scope('BI_Pooling'):
        sum_square = tf.pow(tf.reduce_sum(embedding_matrix, axis=1), 2)
        square_sum = tf.reduce_sum(tf.pow(embedding_matrix, 2), axis=1)
        dense = tf.subtract(sum_square, square_sum)
        add_layer_summary( dense.name, dense )

    dense = stack_dense_layer(dense, params['hidden_units'],
                              dropout_rate = params['dropout_rate'], batch_norm = params['batch_norm'],
                              mode = mode, add_summary = True)

    with tf.variable_scope('output'):
        y = linear_output + dense
        add_layer_summary( 'output', y )

    return y

AFM

AFM<({‘““‘和’””’})>NFM《同样使》用element-wise product来<提取特><征交互>信息,<({‘““‘和’””’})>NFM<直接>等权重做pooling差别【 【的】[】【是】,AFM增加‘了’一「层」Attention Layer「来学」习pooling【 【的】[】权重。

Deep‘部门’【 【的】[】模(子结构)如下

\[\begin{align} f_{Att} = \sum_{i=1}^n\sum_{j=i+1}^n a_{ij}(v_ix_i) \odot (v_jx_j) \end{align} \]

注意力‘部门’【是】一《{个}》简朴【 【的】[】全联接「层」,输出【 【的】[】【是】\(N(N-1)/2\)【 【的】[】矩阵,{作为}sum_pooling【 【的】[】权重向量,对element-wise《特征交互向量》举行加权求<({‘““‘和’””’})>。加权求<({‘““‘和’””’})>【 【的】[】向量<直接>毗{邻}output,不再经由全联接「层」。若【是】权重为1,(那)AFM<({‘““‘和’””’})>不带全联接「层」【 【的】[】NFM【是】一样滴。

\[\begin{align} a_{ij} &= h^T ReLU(W (v_ix_i) \odot (v_jx_j) +b) \\ a_{ij} &= \frac{exp(a_{ij})}{\sum_{ij}exp(a_{ij})}\\ \end{align} \]

AFM几《{个}》想吐槽【 【的】[】点

  • 不带全联接「层」会导致高‘级特征表达有限’,不外这《{个}》不重要啦,AFM 更[多照样为特征交互提供‘了’Attention【 【的】[】新思路

<「代码实」现>

@tf_estimator_model
def model_fn_dense(features, labels, mode, params):
    dense_feature, sparse_feature = build_features()
    dense = tf.feature_column.input_layer(features, dense_feature) # lz linear concat of embedding
    sparse = tf.feature_column.input_layer(features, sparse_feature)

    field_size = len( dense_feature )
    embedding_size = dense_feature[0].variable_shape.as_list()[-1]
    embedding_matrix = tf.reshape( dense, [-1, field_size, embedding_size] )  # batch * field_size *emb_size

    with tf.variable_scope('Linear_part'):
        linear_output = tf.layers.dense(sparse, units=1)
        add_layer_summary( 'linear_output', linear_output )

    with tf.variable_scope('Elementwise_Interaction'):
        elementwise_list = []
        for i in range(field_size):
            for j in range(i+1, field_size):
                vi = tf.gather(embedding_matrix, indices=i, axis=1, batch_dims=0,name = 'vi') # batch * emb_size
                vj = tf.gather(embedding_matrix, indices=j, axis=1, batch_dims=0,name = 'vj')
                elementwise_list.append(tf.multiply(vi,vj)) # batch * emb_size
        elementwise_matrix = tf.stack(elementwise_list) # (N*(N-1)/2) * batch * emb_size
        elementwise_matrix = tf.transpose(elementwise_matrix, [1,0,2]) # batch * (N*(N-1)/2) * emb_size

    with tf.variable_scope('Attention_Net'):
        # 2 fully connected layer
        dense = tf.layers.dense(elementwise_matrix, units = params['attention_factor'], activation = 'relu') # batch * (N*(N-1)/2) * t
        add_layer_summary( dense.name, dense )
        attention_weight = tf.layers.dense(dense, units=1, activation = 'softmax') # batch *(N*(N-1)/2) * 1
        add_layer_summary( attention_weight.name, attention_weight)

    with tf.variable_scope('Attention_pooling'):
        interaction_output = tf.reduce_sum(tf.multiply(elementwise_matrix, attention_weight), axis=1) # batch * emb_size
        interaction_output = tf.layers.dense(interaction_output, units=1) # batch * 1

    with tf.variable_scope('output'):
        y = interaction_output + linear_output
        add_layer_summary( 'output', y )

    return y

CTR(《『‘学习条记’』》)&<「代码实」现>系列
CTR(《『‘学习条记’』》)&<「代码实」现>1-<深度>学习【 【的】[】前奏LR->FFM
CTR(《『‘学习条记’』》)&<「代码实」现>2-<深度>ctr〖模子〗 MLP->Wide&Deep
CTR(《『‘学习条记’』》)&<「代码实」现>3-<深度>ctr〖模子〗 FNN->PNN->DeepFM

〖资〗料

  1. Jun Xiao, Hao Ye ,2017, Attentional Factorization Machines - Learning the Weight of Feature Interactions via Attention Networks
  2. Xiangnan He, Tat-Seng Chua,2017, Neural Factorization Machines for Sparse Predictive Analytics
  3. https://zhuanlan.zhihu.com/p/86181485
,

sunbet 安卓下[载

<欢迎进入>sunbet 安卓下[载!Sunbet “申”博提供申博【开户】(sunbet【开户】)、SunbetAPP【下】载、Sunbet客户端【下】载、Sunbet《代理合作等业务》。

Allbet网站内容转载自互联网,如有侵权,联系www.ALLbetgame.us删除。

本文链接地址:http://www.lijiweihejin.com/post/1080.html

相关文章

发表评论

  • 欧博客户端下载欢迎进入欧博客户端下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。这个文好玩

    2020-08-10 00:00:46 回复该评论
  • 电银付小盟主(dianyinzhifu.com)是官方网上推广平台。在线自动销售电银付激活码、电银付POS机。提供电银付安装教程、电银付使用教程、电银付APP使用教程、电银付APP安装教程、电银付APP下载等技术支持。面对全国推广电银付加盟、电银付大盟主、电银付小盟主业务。其实够好了

    2021-03-24 00:02:28 回复该评论
  • 欢迎进入allbet欧博官网(www.ALLbetgame.us)。allbet欧博官网开放ALLBET欧博真人客户端、Allbet代理网页版、Allbet会员网页版、Allbet会员注册、Allbet代理开户、Allbet电脑客户端下载、Allbet手机版下载等业务。我就想发个言

    2021-07-15 00:01:09 回复该评论