极客时间已完结课程限时免费阅读

答疑 | 基础架构篇+特征工程篇常见问题解答

答疑 | 基础架构篇+特征工程篇常见问题解答-极客时间

答疑 | 基础架构篇+特征工程篇常见问题解答

讲述:王喆

时长13:15大小12.11M

你好,我是王喆。
到今天为止,基础架构篇和特征工程篇我们都学完了。这段时间,我收到了同学们的很多留言,也看到了大家在学习和实践过程中的很多疑问。今天这节课,我挑了 10 道典型的问题,想和你好好讨论一下,希望可以帮助你解决困惑。

实战项目安装、操作类的问题

我们在第 2 节课讲了 Sparrow Recys 项目的安装方法,不过,我在留言区看到大家在安装的时候,还是会遇到很多问题。这里我整理出了两类典型的问题,我们一起看看。
问题 1:因为没有项目经验,想知道把 Sparrow Recys 项目 git clone 到本地之后,怎么运行这个 Maven project?
这里我再重新描述一下整个安装和执行的过程,详细来说一共有 6 步:
1. 安装 IDEA。到这个地址下载 IDE,安装 IDEA 后,打开 IDEA;
2. 在 IDEA 中打开项目。选择 File->Open-> 选择 git clone 到的项目根目录,就可以把项目导入到 IDEA;
3. 配置 maven project。我们在 IDEA 的项目结构树的 pom.xml 上点击右键,设置为 maven project(最新的 IDE 版本也可能不用)就可以了;
4. 配置 SDK。Sparrow Recsys 使用了 Java8,Scala2.11 的编译环境,你可以在 File->Project Structure->Project 中配置 Java SDK,并在 Global Libraries 中配置 Scala SDK;
5. 运行推荐服务器。我们找到类文件 class RecSysServer(com.wzhe.sparrowrecsys.online.RecSysServer),右键点击 -> run;
6. 打开 Sparrow Recsys 首页,在浏览器中输入http://localhost:6010/ ,当看到 Sparrow RecSys 首页的时候,就说明你整个配置和安装成功了。
问题 2:在项目中没有找到“为你推荐页”,也没有看到一些项目介绍中提到的推荐算法,是我安装过程中出错了吗?
这里我再强调说明一下,你没有安装错,Sparrow Recsys 这个项目是随着课程的进展逐渐完善起来的。所以如果在你学习的时候课程还未完结,Sparrow Recsys 中可能会缺少课程还未进行到的模块。比如为你推荐这个功能是在课程的“推荐模型篇”中加入的,所以具体的内容我也会在之后的课程中再加入。但课程已经讲解过或提到过的部分,一定会在 Sparrow Recsys 中有对应的实践代码。

课程相关的知识误区

除了安装问题之外,我还发现同学们在学习的过程中对某些知识点有疑惑,那下面我就帮同学们来解答一些典型的疑惑。
问题 3:网上资料的大部分观点认为协同过滤这样的传统方法应该是在召回层,但我们课程中把协同过滤放在了排序(精排)层,这是为什么呢?
这是个好问题。我们知道,五六年前的传统推荐系统不少还在使用协同过滤作为主排序模型,但这几年它就被慢慢淘汰了,排序层变成了以深度学习推荐模型为主的复杂模型。不过,因为协同过滤类算法比较简单,线上计算过程也很高效,比如矩阵分解之后可以进行 embedding 快速召回,所以放在召回层也完全适用。
在这门课程中,我们总结的推荐系统架构是一个比较经典的架构,但你也没必要认为它就是无法改变的真理。在实际应用场景之中,我希望你能根据业务特点灵活运用。
问题 4:像多模态或者是通过其它预训练方法得到的向量,直接加到推荐排序模型作为特征的话,感觉没什么效果,我理解是预训练学习的目标和排序学习目标并不一致。这个问题老师是怎么看的?
首先,我觉得这是一个很好的业务实践的问题。多模态指的是在推荐系统中引入视频、图片、语音等多种不同形式的数据和特征,希望以此来提升推荐效果。
在实际的业务应用里,确实存在多模态特征效果不强的问题。结合我的实践经验,我会觉得问题根源是因为,目前多模态的技术本质上还处于比较初期的阶段。
比如说,我们可以用一些 CV 的技术去处理视频图像,识别出其中的汽车、树木、人物等等。但你要说这些物品对最终的推荐效果到底有没有影响,比如说视频中出现汽车到底对用户的点击率影响有多大,我觉得还是比较微弱的,它可能远不及知名演员这个要素的影响大。
当然,我一直强调所有的效果都要跟业务场景紧密结合起来,所以多模态到底有没有作用,根本无法一概而论,还是跟你的使用方法和对业务的理解强关联。比如在短视频推荐中,如果你能精确识别出视频中的明星是哪位,再用它作为推荐特征,我想肯定对最终的推荐效果有正向影响。
问题 5:对训练数据中的某项特征进行平方或者开方,是为了改变训练数据的分布。训练数据的分布被改变后,训练出来的模型岂不是不能正确拟合训练数据了?
这个也是一个常见的误区,如果你有这样的问题,说明你还没有弄明白特征的分布和训练数据的分布之间的关系。
对训练数据中的某个特征进行开方或者平方操作,本质上是改变了特征的分布,并不是训练数据的分布。特征的分布和训练数据的分布没有本质的联系,只要你不改变训练数据 label 的分布,最终预测出的结果都应该是符合数据本身分布的。因为你要预测的是 label,并不是特征本身。而且在最终的预测过程中,这些开方、平方的特征处理操作是在模型推断过程中复现的,本质上可以看作是模型的一部分,所以不存在改变数据分布的问题。
问题 6:“为了使 Graph Embedding 的结果能够表达网络的‘结构性’,在随机游走的过程中,我们需要让游走的过程更倾向于 BFS(Breadth First Search,宽度优先搜索)”。这里应该是 DFS 吧?并且同质性是使用 BFS。
这是第 7 讲中的一个知识点,这个疑问非常地常见,因为 BFS、DFS 与结构性、同质性的关系本身确实有一点反直觉。这也是我们在学习 Node2vec 模型的时候经常会有的问题,也推荐其他有疑问的同学关注一下。
在这里,我需要再强调一下,课程中的描述是完全正确的,也就是为了使 Graph Embedding 的结果能够表达网络的“结构性”,在随机游走的过程中,我们需要让游走的过程更倾向于 BFS;为了表达“同质性”,需要倾向于 DFS。我们一定要厘清它们之间的正确关系。
这里,我直接把Node2vec 原论文中的论述贴在了下面,你直接参考原文,会理解得更深刻一些。
We observe that BFS and DFS strategies play a key role in producing representations that reflect either of the above equivalences.
 
In particular, the neighborhoods sampled by BFS lead to embeddings that correspond closely to structural equivalence.
 
The opposite is true for DFS which can explore larger parts of the network as it can move further away from the source node u (with sample size k being fixed).
 
In DFS, the sampled nodes more accurately reflect a macro-view of the neighborhood which is essential in inferring communities based on homophily.
 
参考译文:
我们观察到,BFS 和 DFS 策略在产生向量表达时发挥着关键的作用。特别是通过 BFS 采样得到的邻域节点使生成的相应 Embedding 更接近结构性一致。而对于 DFS 来说,情况恰恰相反,由于 DFS 可以进一步采样到远离节点 u(样本大小 k 固定)的部分,因此可以探索更大范围的网络。在 DFS 中,采样的节点可以更准确地反映邻域的宏观视图,这对于推断社区的同质性至关重要。

关于推荐系统的深入思考

解决了一些常见的知识性的疑问,我们再来看看一些关于课程具体内容的延伸思考。我觉得这些问题都提得都很好,说明同学们学习的时候都有在认真思考,同时,我也鼓励大家都带着问题来学习,把自己的思考分享出来,这也能帮助到更多的同学。
问题 7:老师,我注意到 Flink 最近更新比较频繁,号称可以做到流批一体分析,甚至 ETL 领域好像也可以用起来。那我们在设计系统架构的时候直接用 Flink 取代 Spark,让 ETL 和实时部分统一到一个架构上是否可行呢?
其实这也是大数据工程师们一直追求的批流一体的 Kappa 架构。
在 Kappa 架构的实践中,工程师们遇到的困难也不少。一是一些历史遗留问题,比如当前很多公司的数据体系大部分是建立在 Spark 基础上的,直接用 Flink 完全替代肯定有风险,所以很多公司还沿用着批流混合的 Lambda 架构。
另外是 Spark 和 Flink 发展的问题,Flink 在进化的同时 Spark 也在发展,比如 Spark 最近发展的 Structured Streaming 就是为了跟 Flink 竞争,而且 Spark 本身的社区成熟程度和这么多年的积累还是超过目前的 Flink 的,所以也难说 Flink 会完全替代 Spark。
但毫无疑问,批流一体是未来的方向,业内的工程师们也都在往这个方向努力。但我个人觉得 Spark 和 Flink 会长期共存、共同发展。
问题 8:老师,请问关于大数据数据出口的那部分内容,请问实时的用户推荐请求也是会先经过大数据处理,生成可供线上推理的数据吗?就是针对文中大数据出口的第二点。
这是第一节课的课后留言,你可以先回忆一下第一节的内容,然后再听我讲。在推荐服务器做线上推断时,实时用户请求里面包含的特征一般是直接在服务器内部提取出来的,所以肯定不需要再在数据流中走一遍。
但是线上请求数据最终还是会落盘,生成日志数据。这个过程中,一些流处理和批处理的平台会对这些数据做进一步处理,生成今后可供我们使用的特征以及训练用样本。
问题 9:王老师,在线预测的时候,模型所需的特征是直接从数据库读取,还是在线实时组装?我在想如果只是用户或者物品自身的特征的话,可以从数据库读取,但如果是用户和物品的交叉特征的话,是不是必须实时组装?
非常好的点。一般来说如果组合特征可以在线处理,最好能够在线处理,因为组合特征有组合爆炸问题,为了节约宝贵的存储资源,我们一般不直接存储。
但对于一些不得不存储的组合特征,比如用户 x 物品的曝光、点击记录,如果线上模型需要的话,还是要存储到数据库中的,因为这些特征你没办法在线组合。
问题 10:为什么深度学习的结构特点不利于稀疏特征向量的处理呢?
首先,我想说这个问题问得太好了,如果不解决这个问题,那整个 Embedding 技术的意义就没有了,所以我也希望大家都能好好思考一下这个问题。
一方面,如果我们深入到神经网络的梯度下降学习过程就会发现,特征过于稀疏会导致整个网络的收敛非常慢,因为每一个样本的学习只有极少数的权重会得到更新,这在样本数量有限的情况下会导致模型不收敛。另一个方面,One-hot 类稀疏特征的维度往往非常地大,可能会达到千万甚至亿的级别,如果直接连接进入深度学习网络,那整个模型的参数数量会非常庞大,这对于一般公司的算力开销来说都是吃不消的。
因此,我们往往会先通过 Embedding 把原始稀疏特征稠密化,然后再输入复杂的深度学习网络进行训练,这相当于把原始特征向量跟上层复杂深度学习网络做一个隔离。
好了,这节课就到这里。非常感谢前 8 节对内容有深度思考和提问的同学,你们的每个问题都很精彩。在接下来的课程中,欢迎你继续畅所欲言,把留言区这个工具好好利用起来,我们一起进步!
分享给需要的人,Ta购买本课程,你将得20
生成海报并分享

赞 49

提建议

上一篇
08 | Embedding实战:如何使用Spark生成Item2vec和Graph Embedding?
下一篇
09 | 线上服务:如何在线上提供高并发的推荐服务?
 写留言

精选留言(15)

  • 你笑起来真好看
    2020-10-30
    推荐算法涉及的特征维度很高,数据量大,业界一般用什么方法做特征选择呢?

    作者回复: L1正则化,PCA降维,Embedding预训练降维,模型训练好后人工删除权重小的特征等方法。

    共 2 条评论
    23
  • 邓生
    2020-12-28
    老师好,这是我第二遍看整个课程了。关于问题5我还是有点不明确,训练数据分布和特征分布的定义是什么?只有理解清楚这两个概念才能对问题5真正理解。

    作者回复: 训练数据分布一般指的是label的分布。特征分布指的是某一个具体特征的值的分布。比如有些特征值可以是这样的额,1.1 1.2 1.5 1.7 8 10 100。有的特征的值的分布可以是这样的,1 2 6 4 1 2 10 7。那么第二种分布显然就更友好,第一种分布显然就非常不均匀。 这种非常不均匀的分布容易造成一些问题。所以要通过一些变换让这些特征分布均匀一些,有利于模型的训练。

    共 2 条评论
    11
  • 香格里拉飞龙
    2021-07-21
    对于多模态特征我有一点想法。对于视频来说,只识别其中出现的物体其实作用是没那么大的。不论短视频和电影,一般其中用于吸引人的物体是会加在类别或者tag等属性中的,只用cv识别物体可能和这些特征有些重合。 我觉得一个可以起作用的点,因为有些人会稍微看看开头然后决定会不会继续看下去。还有些付费电影会有几分钟试看,所以可以分析出电影开头几分钟的一些特征,其中可能包含着这个电影开头的结构、如何能在开头引人入胜的信息。不过这种特征太复杂了,可能现在的技术还不足以能提取出来。
    展开

    作者回复: 利用用户行为反推内容的特征,其实是非常好的想法,行业内也有应用,非常好的思考,赞一个。

    4
  • 菜鸟
    2021-07-07
    老师好,做为推荐系统工程师,和算法同学配合时最困难的是特征处理一致性,确保近离线特征处理和线上实时预测时完全一致。 除了算法同学优化效果时特征变化频繁难以固化外,近离线特征处理一般是为了生成单用户样本,性能不是首要考虑问题。线上服务一般是1用户N物品批量计算,特征处理需要做很多计算优化才有极致性能。 如此很容易出现线上线下特征处理不一致问题,业界有什么好的实践可以介绍一下吗?
    展开

    作者回复: 没有统一的解决方案,这个需要每个公司的工程师去想办法。这本质上其实是一个跨团队协作的问题,需要一起定义并遵守非常好的接口习惯。

    4
  • Nemo
    2021-01-15
    word2vec 每次算出来的向量都不一样。这样会每次都需要计算全部数据才能计算相互的距离。有没有其它的embedding 可以让item的向量保持稳定,这样只需要计算增量的item?

    作者回复: 只要是重新训练模型,就会生成全新的embedding,如果只生成增量item的embedding,就必须动态修改输入层维度和梯度下降方法,方法是有,但需要你重新自己写所有的网络更新过程。

    4
  • Geek_eb9ed6
    2021-11-24
    老师好,请教一下,比如有几种产品类型,他们都有销量特征,但这个销量特征的取值范围以及统计口径差异比较大,这个时候该如何处理销量这个特征

    作者回复: 这个问题其实比较基础,建议你自己思考一下连续值特征有哪些好的处理方法

    1
  • 直行格子
    2021-07-03
    能否出个再详细一些的图文教程,和 scala 相关的工程跑步起来,总是报找不到主类这样的错误。 比如下面的 java8 下载哪个版本如何配置? scala 2.11 也有许多版本,下载哪一个? 出个视频教程也可以。这两天折腾环境花了好几个小时也没配好。 请考虑到学习者并不是 java/scala 都精通的,不要说遇到环境问题自己去 debug 了。。。。 4. 配置 SDK。Sparrow Recsys 使用了 Java8,Scala2.11 的编译环境,你可以在 File->Project Structure->Project 中配置 Java SDK,并在 Global Libraries 中配置 Scala SDK;
    展开
    共 2 条评论
    2
  • FayeChen
    2021-03-08
    除了item2vec 以外其他的网络结构也能生成embedding,比如同为序列模型的lstm做多分类问题预测下个观看的视频,用negative sampleing 采样。这两种方法生成的embedding向量有什么区别么,哪种再接下游MLP finetune 会更好?

    作者回复: 一般来说序列模型因为有时间信息在里面,效果会好一些。但还是再强调一遍,业务上没有好坏,好坏都需要你的实践来验证。

    1
  • 杰克马
    2021-12-20
    老师,请问增量的item怎么进行embeding向量生成呢?
  • 静心
    2021-12-15
    提供一种命令行运行的方法。 首先,在pom.xml的plugins中增加以下插件配置: <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <goals> <goal>java</goal> </goals> </execution> </executions> <configuration> <mainClass>com.sparrowrecsys.online.RecSysServer</mainClass> </configuration> </plugin> 然后,在代码主pom.xml文件所在目录运行以下命令: mvn exec:java
    展开
    1
  • ぃ霓幻風ルァ
    2021-07-26
    王老师好,tensorflow关于变长列表特征有没有类似于embedding的处理方法呢?比如用户的分类偏好、用户的历史观影行为,都是变长的元素列表,在论文中看过multi-hot,有些甚至带着权重,现在想在我们的数据集上参考您的deepFM实现,但是用户有很多标签喜好,视频也有很多标签,想作为输入,并能够进行FM交叉,还请王老师支招。
  • 直行格子
    2021-07-03
    执行 scala 的 FeatureEngineering 类报错 jdk 版本是1.8.0_291,scala 版本是2.11.0。idea 里 project structure -> libraries 已经添加了 scala, global libraries 里也添加了 scala。 Run->edit configuration 里的所有 JRE 选项都试过了全部报这个错 /Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/bin/java -Dmaven.multiMod-Dmaven.home=... --e -Dexec.args=-classpath %classpath com.sparrowrecsys.offline.spark.featureeng.FeatureEngineering -Dexec.executable=/Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/bin/java exec:exec [INFO] Error stacktraces are turned on. [INFO] Scanning for projects... [WARNING] Some problems were encountered while building the effective model for com.wzhe.sparrowrecsys:SparrowRecSys:jar:1.0-SNAPSHOT [WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 25, column 21 [WARNING] [WARNING] It is highly recommended to fix these problems because they threaten the stability of your build. [WARNING] [WARNING] For this reason, future Maven versions might no longer support building such malformed projects. [WARNING] [INFO] [INFO] ----------------< com.wzhe.sparrowrecsys:SparrowRecSys >---------------- [INFO] Building SparrowRecSys 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- Downloading from ....... [INFO] [INFO] --- exec-maven-plugin:3.0.0:exec (default-cli) @ SparrowRecSys --- 错误: 找不到或无法加载主类 com.sparrowrecsys.offline.spark.featureeng.FeatureEngineering [ERROR] Command execution failed. org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1) at org.apache.commons.exec.DefaultExecutor.executeInternal (DefaultExecutor.java:404) at org.apache.commons.exec.DefaultExecutor.execute (DefaultExecutor.java:166) at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:982) at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:929) at org.codehaus.mojo.exec.ExecMojo.execute (ExecMojo.java:457)
    展开
  • Yvonne
    2021-04-26
    谢谢老师!太感谢了。听课的时候就有这个疑问为什么稀疏特征向量不适合深度学习的结构,本来觉得可能要课后搜集资料好好了解了,没想到在这找到了答案

    作者回复: 赞

  • Sanders
    2021-02-03
    对于问题3“因为协同过滤类算法比较简单,线上计算过程也很高效,比如矩阵分解之后可以进行 embedding 快速召回,所以放在召回层也完全适用”,我理解想ALS这种算法它是没法生成模型在线直接使用的,只能做离线排序。

    作者回复: 生成的item embedding和user embedding,然后线上做product生成最终得分

  • Geek_1e3d35
    2021-01-03
    老师好,我想问一下,在实践过程中,word2vec训练的词向量应用在深度学习模型embedding层是可行的吗,需要什么样的处理

    作者回复: 用word2vec预训练embedding再直接输入深度学习模型是可行的。很常见的做法。

    共 2 条评论