其中dtx表示节点t到节点x之间的最短路径,dtx=0表示会回到节点t本身,dtx =1表示节点t和节点x直接相连,但是在上一步却选择了节点v,dtx=2表示节点t不与x直接相连,但节点v与x直接相连。其中p和q为模型中的参数,形成一个不均匀的概率分布,最终得到随机游走的路径。与传统的图结构搜索方法(如BFS和DFS)相比,这里提出的随机游走算法具有更高的效率,因为本质上相当于对当前节点的邻域节点的采样,同时保留了该节点在网络中的位置信息。 node2vec由斯坦福大学提出,并有开源代码,这里顺手列出,这一部分大家不用自己动手实现了。https://github.com/aditya-grover/node2vec 注:本文的方法需要在源码的基础上改动图结构。 第三篇论文讲的是Google如何做YouTube视频推荐,论文是在我做完结构设计和流程设计后看到的,其中模型架构的思想和我们不谋而合,还解释了为什么要引入DNN(后面提到所有的feature将会合并经历几层全连接层):引入DNN的好处在于大多数类型的连续特征和离散特征可以直接添加到模型当中。此外我们还参考了这篇论文对于隐含层(FC)单元个数选择。图3是这篇论文提到的算法结构。
图3 YouTube推荐结构图 实现 (a)数据准备 获得用户的属性(User Profile),如性别、年龄、学历、职业、地域、能力标签等; 根据项目内容和活动内容制定一套受众标签(Audience Label); 提取用户之间的关注关系,微博之间的转发关系; 获取微博message中的文本内容; 获得微博message中的图片内容。 (b)用户标签特征处理 根据步骤a中用户属性信息和已有的部分受众标签系统。利用GBDT算法(可以直接用xgboost)将没有标签的受众全部打上标签。这个分类问题中请注意处理连续值变量以及归一化。 将标签进行向量化处理,atv,这个问题转化成对中文单词进行向量化,这里用word2vec处理后得到用户标签的向量化信息Label2vec。这一步也可以使用word2vec在中文的大数据样本下进行预训练,再用该模型对标签加以提取,对特征的提取有一定的提高,大约在0.5%左右。 (c)文本特征处理 将步骤a中提取到的所有微博message文本内容清洗整理,训练Doc2Vec模型,得到单个文本的向量化表示,对所得的文本作聚类(KMeans,在30w的微博用户的message上测试,K取128对文本的区分度较强),最后提取每个cluster的中心向量,并根据每个用户所占有的cluster获得用户所发微博的文本信息的向量表示Content2vec。 (d)图像特征(可选) 将步骤a中提取到的所有的message图片信息整理分类,使用预训练卷积网络模型(这里为了平衡效率选取VGG16作为卷积网络)提取图像信息,对每个用户message中的图片做向量化处理,形成Image2vec,如果有多张图片将多张图片分别提取特征值再接一层MaxPooling提取重要信息后输出。 (e)社交关系建立(node2vec向量化) 将步骤a中获得到的用户之间的关系和微博之间的转发评论关系转化成图结构,并提取用户关系sub-graph,最后使用node2Vec算法得到每个用户的社交网络图向量化表示。 图4为简历社交关系后的部分图示。 图4 用户社交关系 (f)将bcde步骤得到的向量做拼接,经过两层FC,得到表示每个用户的多特征向量集(User Vector Set, UVS)。这里取的输出单元个数时可以根据性能和准确度做平衡,目前我们实现的是输出512个单元,最后的特征输出表达了用户的社交关系、用户属性、发出的内容、感兴趣的内容等的混合特征向量,这些特征向量将作为下一步比对相似性的输入值。 (责任编辑:本港台直播) |