17 | Embedding+MLP:如何用TensorFlow实现经典的深度学习模型?
17 | Embedding+MLP:如何用TensorFlow实现经典的深度学习模型?
讲述:王喆
时长15:23大小14.06M
Embedding+MLP 模型的结构
Embedding+MLP 模型的实战
特征选择和模型设计
Embedding+MLP 模型的 TensorFlow 实现
小结
课后思考
赞 23
提建议
精选留言(45)
- 范闲2020-12-02无法直接计算相似度. user embedding 和 item embedding 虽然输入数据来源自同一个数据集,但是本身并不在一个向量空间内.
作者回复: 是的
共 4 条评论23 - Geek_f9ea8a2020-11-20请问老师: 1.看了您实现的MLPRecModel, 由于对tf2.x 版本不是很熟悉,没有看出来 是否 针对 发布时间、电影阅读数等等统计字段 进行了 标准化, 我当时用keras 实现了一下,没有对统计特征进行标准化,效果很差,只有56%左右,损失一直不降,然后最那些统计指标进行标准化话,训练完第一轮,测试集就能达到73%。 2. 您这次实现的MLPRecModel,针对用户、电影,先直接给出的初始化Embedding,然后训练对应的Embedding 权重, 在训练集中,假如 一个用户 有10条样本数据集,那么模型训练该用户Embedding 是根据这10条数据最终训练成能表示该用户Embedding吗? 数据集特征中, 针对一条样本,没有特征表示: 用户历史观看电影 【电影1,电影2 电影3。。。】(按照时间排序) 这样一条特征,对训练Embedding有影响吗,我总感觉好像丢了这部分信息。展开
作者回复: 1. 确实没有加normalization,当然可以在tensorflow预处理时候加上normalization,或者在spark中生成训练样本的时候加上特征预处理的一些操作,没问题。而且也确实推荐在实际工作中尝试用normalization,bucketize,maxminscaling去做不同的预处理查看效果,这一点我们之前在特征工程部分介绍过。 2.是个好问题,如果embedidng层是在模型中,通过e2e训练的,那么你如果细致的理解梯度下降的过程就知道,某个用户的embedding确实是只用TA自己的历史数据生成的。 这样的弊端当然有,就是收敛慢,而且在用户历史行为过少的时候,这个用户的embedding不稳定。所以也可以采用embedding预训练的方式,就像我们之前embedding部分讲解的。 推荐其他同学也思考这两个问题,非常好的实践问题。
共 4 条评论19 - 科西嘉的怪物2021-03-08如果这个模型的结构变一下,把拼接操作变成user emb点乘item emb直接得到预测评分,那训练出来user emb和item emb就在一个向量空间了吧
作者回复: 是这样
共 2 条评论16 - 月臻2021-06-29老师,您好,我使用Pytorch实现了项目中用到的模型:https://github.com/hillup/recommend
作者回复: 赞,推荐其他同学参考。
共 3 条评论15 - 浣熊当家2020-11-22想请教下老师,关于embedding训练的原理, 比如图二中Word2Vec的训练我们有输入值X(one-hot向量), 和输出Y(作为label, multi-hot向量),所以我们可以训练我们的的Word2Vec的词向量,使其得到最贴近训练样本标签的结果。但是我们这节课讲的embedding层只有前一部分,并没有Y(label)这部分,embedding是通过什么原理训练出来的呢?embedding本质是个unsupervised learning吗?
作者回复: 这里的embedding层是跟上层神经网络一起end2end训练出来的。当然是标签的,就是样本中的标签。 embedding层是通过上层逐层传导回来的梯度来进行更新的。
11 - 张程2020-12-03如果是电商推荐商品。没有 0和1 的label, 只有buy还是click的区别,这样的话请问应该如何处理?lable列全部为1吗?谢谢!
作者回复: 怎么可能只有buy和click,有impression没被click和buy的商品不就是最合适的负样本吗。
9 - Geek_b4af042020-12-08王喆老师,你好,我最近准备吧这几个模型改写为pytorch版本的代码,在进行category features的embedding的时候,是需要先将这些features变为one hot向量,再将这些one hot的向量变成embedding向量吗?但这样的话有些问题,这样数据大小就爆炸了,比如movie id 的features(19000个数据),从(19000,) -> (19000, 30001) -> (19000, 30001, 10)
作者回复: 按照embedding层的构造,是一定要把id转换成onehot的,否则id这个数字本身怎么能输入到网络中呢? 参数爆炸这个事情也是肯定的,这也是为什么说embedding layer是最费时,费空间的部分,一个神经网络有可能超过90%的参数和时间都花在训练embedding层上。
共 3 条评论7 - 那时刻2020-11-19课后思考题,我的想法是在Stacking 层把不同的 Embedding 特征和数值型特征拼接在一起,即把电影和用户的 Embedding 向量拼接起来,形成新的包含全部特征的特征向量,该特征向量保存了用户和电影之间的相似性关系,应该可以直接用来计算用户和物品之间的相似度。
作者回复: 其实不可以,因为二者不在一个向量空间。直接用dot product或者cosin similarity计算相似度都不可以。
共 3 条评论7 - 那时刻2020-11-19请问老师,对于数值型特征都有均值和标准差,比如电影评分均值和电影评分标准差两个特征。您在实际工作中,对于数值型特征都会额外加上均值和标准差两个特征吗?
作者回复: 不一定,关于特征选择,不要纠结于这样的问题,自己去尝试。
5 - 灯灯灯2021-01-19老师你好, 我在运行时会出现以下的waring。请问是我设置的原因还是什么其他原因呢? WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor, but we receive a <class 'collections.OrderedDict'> input: OrderedDict([('movieId', <tf.Tensor 'ExpandDims_4:0' shape=(None, 1) dtype=int32>), ('userId', <tf.Tensor 'ExpandDims_17:0' shape=(None, 1) dtype=int32>), ('rating', <tf.Tensor 'ExpandDims_7:0' shape=(None, 1) dtype=float32>), ('timestamp', <tf.Tensor 'ExpandDims_9:0' shape=(None, 1) dtype=int32>), ('releaseYear', <tf.Tensor 'ExpandDims_8:0' shape=(None, 1) dtype=int32>), ('movieGenre1', <tf.Tensor 'ExpandDims_1:0' shape=(None, 1) dtype=string>), ('movieGenre2', <tf.Tensor 'ExpandDims_2:0' shape=(None, 1) dtype=string>), ('movieGenre3', <tf.Tensor 'ExpandDims_3:0' shape=(None, 1) dtype=string>), ('movieRatingCount', <tf.Tensor 'ExpandDims_5:0' shape=(None, 1) dtype=int32>), ('movieAvgRating', <tf.Tensor 'ExpandDims:0' shape=(None, 1) dtype=float32>), ('movieRatingStddev', <tf.Tensor 'ExpandDims_6:0' shape=(None, 1) dtype=float32>), ('userRatedMovie1', <tf.Tensor 'ExpandDims_18:0' shape=(None, 1) dtype=int32>), ... ('userGenre5', <tf.Tensor 'ExpandDims_16:0' shape=(None, 1) dtype=string>)]) Consider rewriting this model with the Functional API.展开
作者回复: 大量TF的warning是平台自己的问题,暂时不用过于纠结
4 - 。LEAF2020-11-24老师好,想问一个问题,分布式训练模型的时候,loss是直接做sum好,还是求mean呢?
作者回复: 这是parameter sever的问题了,绝大部分都是求sum,因为loss本身就是累加的。
4 - 小强2021-04-23通过学习code,推荐模型篇的Embedding都是通过tensorflow直接生成。请问在实际应用中,深度学习的模型的Embedding和线上服务篇生成的Embedding (Item2Vec, Graph Embedding)一般都是独立的吗?线上服务篇生成的用于Recall?模型篇生成的用于Sorting?
作者回复: 模型篇中应该没有直接生成embedding,而是直接生成的预测分数对吧,所以模型篇主要用于ranking,之前讲过的item2vec等方法生成的embedding,可以用于召回,当然也可以作为ranking的一部分特征。
3 - Sebastian2020-11-19老师,在实战中由于数据量庞大,用tf搭建的模型是否需要进行分布式训练?一般是如何分布式训练?之后会有类似的章节讲到吗?
作者回复: tensorflow的分布式训练也是一个非常大的话题。涉及到parameter server模式的训练方式和分布式环境的部署。 推荐参考官方资料 https://www.tensorflow.org/guide/distributed_training 因为这个问题上,没有环境我们几乎没法实践,所以咱们课程暂时不会涉及到。
共 3 条评论4 - 潘2021-08-09老师您好,userGenre1-userGenre5,movieGenre1-movieGenre3 里面的数据是一致的,one-hot大小是1 *19 ,对应的embedding参数矩阵大小就是19*10 ,那么这八列数据对应要训练8个 19*10的矩阵参数,但是他们的one hot是一样的,请问可否可以共享一个19*10的参数矩阵
作者回复: 是的,最好的方法是共享emb矩阵,可以在这个版本技术上进行修改
2 - 挖掘机2021-06-03老师好,最近正好在做dssm,其中的好几个有疑惑的点一起讨论 1. 当id类特征,比如movieId和userId数量很大时,目前userId大概每天有1000w级别。我选择了先使用hash_bucket来做散列,然后再压缩到300维的embedding。但是我对这种方法有怀疑,就是这么大的数量,会不会出现大量的冲突。这样对准确性是不是有影响。 2. mlp的每层的维度如何确定,是越大越好,还是越小越好。 3. 模型特征可选的目前大概有几千个,如何从中选出重要性最大的特征呢?展开
作者回复: 1. 会有冲突,在硬件允许情况下,最好把hashbucket数量加大。 2. 自己调参,一般不建议非常大 3. 经典面试题,自己去搜一下相关资料。
3 - FayeChen2021-03-11对于multi_hot(比如说历史的观影序列)的特征应该怎么生成embedding呢,感觉还是需要建立字典通过embedding_lookup查找pooling,或者矩阵相乘的方法么
作者回复: 大致的思路是利用tf中的embedding_lookup_sparse操作来生成multi hot的embedding。 生成embedding之后,可以用一些pooling的操作或者其他embedding间的操作把多个embedding合并成一个。
3 - Sebastian2020-12-07老师,想问下在划分训练集测试集,怎么就直接使用 test_dataset = raw_samples_data.take(1000)train_dataset = raw_samples_data.skip(1000) 这里的take和skip的意思是选1000条样本作为训练,然后选1000条样本作为测试集吗? 难道不需要按照时间划分吗?
作者回复: 这是个好问题,你觉得划分和不划分各有哪些优劣?按时间划分就一点好吗?有没有基于按时间划分的更好的评估方法?
共 8 条评论2 - Geek_59735b2021-09-26请问下对于 Word2Vec 这样的任务,我们可以清楚的知道 embedding 后的 vector 之间的距离有其现实意义,因为 loss 函数的设计会使得在数据集中常常相邻的词距离相近,但是请问对于 这种 End2End 的应用,embedding 出来的 vector 有具体的现实意义吗 ? 看 loss 好像看不出其有何具体的意义;
作者回复: 只有在计算距离时才有现实意义,embedding本身你是根本没法解读出现实意义的。
1 - Yvonne2021-06-20老师,请问为什么不同的genres要分开embedding呢,他们可以用shared_embedding_columns吗?如果ta们是一个embedding universe的话
作者回复: 可以,建议使用shared embedding。
1 - Geek_cabb262021-03-18这里训练的不在一个向量空间,如果想直接拿user,item的,可以构图做一个metapath2vec,同时产出两个向量~
作者回复: 是这样。
共 2 条评论1