深度学习CTR预估(二)——DeepFM模型及tensorflow实现

1、DeepFM的原理

1.1 DeepFM介绍

CTR预估中,FM考虑到了特征之间也是有联系的,以电视节目来说,女生就可能比较偏爱言情剧,男生比较偏爱历史正剧,因此在特征组合起来考虑能够在一定程度上提高推荐系统的性能。有些特征易于理解的,可以通过领域专家人工标记,但是难以理解的特征组合就需要通过机器学习分析数据之间的关联得到。
简单的线性模型只能得到一维的特征,FM通过点积和隐向量的形式能够得到二阶特征组合,深度学习模型可以得到高阶high-order的特征组合,因此论文把DNN模型引入了FM模型中,根据FM得到的特征隐向量,通过DNN得到其高阶的特征组合。

1.2 DeepFM模型结构

1.2.1 深度模型结构

深度排序模型可以理解为在传统的算法基础上在加上一个DNN的模型,使其能够得到高维的组合特征,它的结构可以分为两类:并行结构和串行结构。串行结构的算法主要有,FNN,FNM,AFM等等,并行结构的主要算法就是wide&deep模型和本章所介绍的DeepFM模型
1)串行结构


串行结构.png

2)并行结构


并行结构.png

对于并行结构,之前谷歌提出过wide&deep模型,其FM function部分为LR,但是线性模型只有一阶的特征,高阶的特征需要人工组合,因此在特征非常多的情况下,特征工程量会非常大,因此DeepFM在此基础上发展而来,把LR转变成了FM,可以自动进行特征的组合。

1.2.2 DeepFM模型结构

1、 DeepFM模型包含FM和DNN两部分,FM模型可以抽取low-order特征,DNN可以抽取high-order特征。
2、无需Wide&Deep模型人工特征工程。由于输入仅为原始特征,而且FM和DNN共享输入向量特征,DeepFM模型训练速度很快。

DeepFM.png

DeepFM中的FM和DNN的部分共享权重参数,假设特征为i,w_i为一阶1-order的权重向量,其特征之间的交互隐向量为V_iV_i输入到FM模型中就是特征组合的二阶表示,输入到DNN部分就是特征组合的高阶表示。
其最后的输出为:
\hat{y} = sigmoid(y_{FM}+y_{DNN})
其中的+号为concat连接并不是叠加。

1.2.2.1 FM部分模型

FM.png

FM部分模型详细参考FM。在DeepFM是以神经网络的视角来看FM的模型,对于一个样本来说在Output Units层的输出变成了一个向量,而非直接预估的数值。在论文中还有一个与FM的差别就是,FM部分把偏置给去除了,其表达式为:

1.2.2.1 Deep部分模型
deep.png

这是一个简单的前向反馈神经网络,用于学习显示高维的交叉特征,推荐系统的输入是高维稀疏,连续和类别混合,在Field上的数据,因此需要转化成低维稠密的向量才能进入DNN模型进行学习。
作者设计了一个子网络来学习低维连续稠密的数据,其方法为:


deep子网络.png

1)不管每个Field的特征是否相同,但embedding后其特征向量维度均为k
2)利用FM中隐向量V_i来作为子网络的初始化权重来获得Field的隐向量。每个Field具有一个隐向量,并输入这个特征想到到DNN来获取最后的向量。
因此输入DNN模型中的初始向量为Field的域向量,其表示为a^{(0)} = [e_0,e_1,...,e_n],其中n为Field的个数,e_i为第i个Field的嵌入向量。这个向量就作为DNN模型的输入向量。

2 tensorflow实现

2.1 对DeepFM中Field和特征的理解

我个人的理解感觉论文中的特征就是one-hot编码之后的特征,而Field就相当于一个列,举个例子,比如在FM所展现的例子所示:

lizi.png

one-ok.png

“中国机长”,“陈情令”,“大秦帝国”就是三个特征,但他们属于同一个Field,就是“节目名”。
正如论文中所说,Field可以分为分类连续两种类型,分类类型要经过one-hot编码,而连续类型就是自己本身的数值value。这样,每个样本都可以表示为x = [x_{field_1},x_{field_2},...,x_{field_j},...,x_{field_m}],其中如果field_j是category类型的,那么通过one-hot编码,x_{field_j}就是个高维稀疏的矩阵,每一列都是一个特征;若是连续类型的Field就是它的特征,其value为原来的特征值,如上图中的“喜爱程度”。

2.2实现代码

2.2.1数据预处理

首先对数据进行预处理,观察数据的类型,根据数据类型分成“连续特征”,”离散特征“,”label“列,并建立特征词典,对不同的特征进行编号,连续特征一整列都使用相同的特征编号,代码如下

def get_feature_dict(df,num_col):
    '''
    特征向量字典,其格式为{field:{特征:编号}}
    :param df:
    :return: {field:{特征:编号}}
    '''
    feature_dict={}
    total_feature=0
    df.drop('rate',axis=1,inplace=True)
    for col in df.columns:
        if col in num_col:
            feature_dict[col]=total_feature
            total_feature += 1
        else:
            unique_feature = df[col].unique()
            feature_dict[col]=dict(zip(unique_feature,range(total_feature,total_feature+len(unique_feature))))
            total_feature += len(unique_feature)
    return feature_dict,total_feature

def get_data(df,feature_dict):
    '''
     返回二位数组,xi表示特征的索引,xv表示特征的值,y表示标签值
    :param df:
    :return:xi,xv,y
    '''
    y = df[['rate']].values
    dd = df.drop('rate',axis=1)
    df_index = dd.copy()
    df_value = dd.copy()
    for col in df_index.columns:
        if col in num_col:
            df_index[col] = feature_dict[col]
        else:
            df_index[col] = df_index[col].map(feature_dict[col])
            df_value[col] = 1.0
    xi=df_index.values.tolist()
    xv=df_value.values.tolist()
    return xi,xv,y
2.2.2Embedding处理

参考资料

1、论文
2、https://zhuanlan.zhihu.com/p/67795161
3、https://www.jianshu.com/p/6f1c2643d31b
4、https://zhuanlan.zhihu.com/p/57873613

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容