18|Wide&Deep:怎样让你的模型既有想象力又有记忆力?
18|Wide&Deep:怎样让你的模型既有想象力又有记忆力?
讲述:王喆
时长12:49大小11.70M
Wide&Deep 模型的结构
(出自Wide & Deep Learning for Recommender Systems )
模型的记忆能力
模型的泛化能力
Wide&Deep 模型的应用场景
(出自Wide & Deep Learning for Recommender Systems )
Wide&Deep 模型的 TensorFlow 实现
小结
课后思考
赞 21
提建议
精选留言(27)
- giraffa1262020-12-19冒昧问一下,deep的输出是128,wide是10000,两个不在一个量纲,感觉直接这么concate,会不会削弱deep的效果,模型退化成LR?
作者回复: 这是个很好的问题,也推荐其他同学思考。 我的思考是不会,因为wide部分一般来说都是非常稀疏的特征,虽然总的维度很大,但是在实际inference的过程中,wide部分往往只有几个维度是有值的,而deep部分一般都是稠密的特征向量,所以理论上两个部分对结果的影响不存在太大的bias。
共 3 条评论42 - Alan2021-03-18答:改进空间大致上我能想到两种方式:我选2 1、手动人工两个特征交叉或求解相关性(即,电影风格类型较低情况下,数据维度较低、数据量较小情况下是可以的,但是在实际工业应用领域是不切实际的), 2、改进算法的wide部分,提升记忆能力,使用端到端模型,减少人工操作。例如DCNMix、DeepFM。以DeepFM这个模型都可以很好学习到高低特征与交叉。(实际业界常用,推荐) 普及一下高低阶特征知识: 低阶特征:是指线性-线性组合,只能算一个有效的线性组合,线性-非线性-线性,这样算两个有效的线性组合,一般常说的低阶特征只有小于等于2阶; 高阶特征:说高阶特征,可以理解为经过多次线性-非线性组合操作之后形成的特征,为高度抽象特征,一般人脑很难解析出原有的特征了展开
作者回复: 说的很好,推荐其他同学参考。
24 - 范闲2020-12-02电影本身风格和用户倾向风格可以做个融合~~用户偏离本身风格的程度~~
作者回复: 很好的idea,人工的特征组合有时候反而效果是好的。不能因为有深度学习就完全不考虑一些手动的特征组合。
18 - 那时刻2020-11-20请问老师,文中例子中把类别型特征放入到wide里,如果把数值型特征放到wide部分,是否需要做normalization呢?
作者回复: 做不做normalization还是看你自己的实践。我一般推荐在实际工作中做normalization或者bucketize。会有助于模型收敛。
共 2 条评论16 - 马龙流2020-11-25用户喜欢的风格和电影本身自己的风格,做attention做为一个值喂给mlp,这种做法是否可以
作者回复: 这个思路非常好。跟之后我们要讲的DIN中的attention机制做法一致了。
13 - Geek_b027e72020-12-06老师,deepfm中crossed_column是不是只写了一个好评电影的交叉例子,按文中意思是把所有好评过的历史电影与所有电影做交叉
作者回复: 是的,可以自己多修改,多尝试
共 2 条评论5 - 王继伟2021-02-13请问老师,文中说Wide 部分就是把输入层直接连接到输出层。 1、如果输入层特征特别稀疏(上千万维的one_hot)这样即使是直接连接到输出层也会增加上千万个参数,这样会降低模型训练速度吗? 2、如果Wide 部分输入的稀疏特征维度上亿,那wide部分的训练的参数会比deep部分训练的参数还要多,这样合理吗? 还是说wide部分的输入是要控制特征维度的?展开
作者回复: 这两个问题都不错: 1、其实深度模型一般都有处理稀疏id的部分,即使没有wide部分,大量其他模型的embedding也需要处理这样的特征。所以肯定会降低训练速度,但深度学习模型几乎都必须有这样的结构 2、虽然稀疏特征维度很大,但是往往仅有很少的几个维度在inference过程中是1。所以对结果的贡献不会淹没deep部分。这是从原理上说的,从实践上说的话,自己去做evaluation。
4 - Jacky2021-01-21老师,您好!我想咨询一下,我在pycharm里运行py文件的时候,出现了cast string to int32 is not supported的问题,想咨询一下如何修改代码。谢谢您!感谢!
作者回复: 微信上已经回复你了吧?这些小问题自己多调试,可能不能一一帮助大家。
共 6 条评论4 - 骚动2021-01-16请问老师,我觉得Wide&Deep和GBDT+LR在逻辑上很像,Wide对应LR,Deep对应GBDT,不知道我的想法对不对?这两个模型对比,老师能给我讲下吗,有什么共性?另外,GBDT+LR中输入LR的数据,也是原始特征+GBDT训练的特征,是否可以理解为原始特征就是模型的记忆能力,GBDT训练的组合特征就是泛化能力?
作者回复: 不可以这样理解,wide&deep两部分是并列的,GBDT+LR,两部分是先后关系。 至于具体的区别,自己找GBDT+LR的结构去深入理解。
共 3 条评论5 - 浣熊当家2020-11-25图二模型中Relu层从下到上分别是1024, 512, 256, 很好奇这些数字的设定有什么讲究吗? 比如1)是不是设置成这种2进制相关的数字比较有效率? 2)神经网络的维度一般都是往上每层除2这种规则吗?
作者回复: 很好的观察,也是很有意思的问题。 其实没有什么讲究,不用非要是2的倍数。 究其根源可能因为最开始做CNN图像相关模型的人喜欢用2进制的神经元数量,因为很多图像像素是1024之类的大小。所以大家就保留这个习惯了。
4 - 江峰2021-02-24在工业界应用wide deep模型的时候,wide侧和deep侧分别应该放什么样的特征呢? 我在实践过程中都是把 原始id特征放到deep侧,把id类别大的,和其他id特征的交叉放在wide侧。比如adid和分词交叉,memberid和分词交叉等。这样处理合适吗? 把这种交叉特征同时放在wide侧和deep侧,是不是会更好?
作者回复: 当然按照原文的思路,是把维度很高的交叉类特征放在wide侧,把比较稠密的特征放在deep侧,我们的实践也基本依次逻辑。 但是我觉得倒也没必要一成不变的按它的逻辑,你这种实践出真知的过程是最好的。
共 2 条评论4 - Yang Hong2021-07-26老师,我理解的Embedding+MLP中对于low dimension的feature和embedding后的feature在连接层的拼接,与Wide&Deep中对wide部分和deep部分的feature的拼接原理一样,都是stack的方式。 但为什么在代码中它们不一样呢?比如在Embedding+MLP中我们用的是+号拼接: tf.keras.layers.DenseFeatures(numerical_columns + categorical_columns),但是在Wide&Deep中我们是用tf.keras.layers.concatenate([deep, wide])的方式拼接。展开共 1 条评论2
- Sebastian2020-11-20可以在deep网络中加入attention机制,比如用户行为序列作为特征时,近期的行为一般比远期行为更加能反映user的兴趣,这种时候可以对行为序列做attention处理。
作者回复: 这个做法没问题,但主要还是针对attention这个机制做处理,并不直接涉及到特征交叉。
共 2 条评论2 - Geek_8a732a2021-08-21不应该,“用户喜欢的电影风格”和“电影本身的风格”,可以考虑做合并成一个变量。1
- 石忠会2021-07-26老师,我看代码里面的优化器只给出了Adam 但是在在tf单独给接口或者理论中不是宽度模型使用FTRL进行优化,深度模型用 adgrad 或者Adam进行优化 这其中有什么深意吗
作者回复: 当然是有深意的。可以参考我这篇文章的解答https://zhuanlan.zhihu.com/p/142958834
2 - 续费专用2021-02-20我就是想问问,25 岁的男性用户喜欢看电影 A,35 岁的女性用户也喜欢看电影 A,那么按照常识,这部电影A大概是部什么样的电影呢?🤔
作者回复: 哈哈,这是我臆想的一个例子,仅用于说明道理,不要深究。
共 3 条评论1 - hurun2021-02-02王老师好,你在代码注释详细,个人学完后收获良多,感谢你的付出。 我参考代码和你的讲解文档,对crossed_feature特征的生成及其在训练集、测试集的使用,有一点小小的疑惑:在代码WideNDeep.py的72行,使用了userRatedMovie1特征,我查看trainingSamples.csv和testSamples.csv,发现训练集的userRatedMovie特征movie_id,出现在测试集movie_id列,这样会不会有future feature问题呢,比如训练集中(user_id, movie_id, userRatedMovie1) =(3033, 970, 969) 出现在训练集(user_id, movie_id, userRatedMovie1) =(3033, 969, 288) ,相当于在训练集中提前告诉模型,对于3033这个用户,969是高质量评价的电影展开
作者回复: 非常好的点。这也是我在之后的模型评估章节介绍的问题,可以看看到时候能不能回答你的问题。
2 - 白马飞飞2021-11-25请问含有crossed_column特征处理的模型,如何保存模型? 推理时,如何crossed_column这部分特征如何输入模型。
- Geek_3cdb562021-11-24哪些特诊适合放在wide里面,哪些特征适合放在deep里面
- kakaymi2021-08-29logloss是logistic回归吗?最终输出的是一个0-1之间的标量?这个标量的含义是什么呢?
作者回复: logloss是逻辑回归的损失函数