答疑 | 基础架构篇+特征工程篇常见问题解答
- 问题 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 首页的时候,就说明你整个配置和安装成功了。
- 问题 5:对训练数据中的某项特征进行平方或者开方,是为了改变训练数据的分布。训练数据的分布被改变后,训练出来的模型岂不是不能正确拟合训练数据了?
这个也是一个常见的误区,如果你有这样的问题,说明你还没有弄明白特征的分布和训练数据的分布之间的关系。对训练数据中的某个特征进行开方或者平方操作,本质上是改变了特征的分布,并不是训练数据的分布。特征的分布和训练数据的分布没有本质的联系,只要你不改变训练数据 label 的分布,最终预测出的结果都应该是符合数据本身分布的。因为你要预测的是 label,并不是特征本身。而且在最终的预测过程中,这些开方、平方的特征处理操作是在模型推断过程中复现的,本质上可以看作是模型的一部分,所以不存在改变数据分布的问题。
- 问题 6:“为了使 Graph Embedding 的结果能够表达网络的‘结构性’,在随机游走的过程中,我们需要让游走的过程更倾向于 BFS(Breadth First Search,宽度优先搜索)”。这里应该是 DFS 吧?并且同质性是使用 BFS。
这是第 7 讲中的一个知识点,这个疑问非常地常见,因为 BFS、DFS 与结构性、同质性的关系本身确实有一点反直觉。这也是我们在学习 Node2vec 模型的时候经常会有的问题,也推荐其他有疑问的同学关注一下。在这里,我需要再强调一下,课程中的描述是完全正确的,也就是为了使 Graph Embedding 的结果能够表达网络的“结构性”,在随机游走的过程中,我们需要让游走的过程更倾向于 BFS;为了表达“同质性”,需要倾向于 DFS。我们一定要厘清它们之间的正确关系。这里,我直接把Node2vec 原论文中的论述贴在了下面,你直接参考原文,会理解得更深刻一些。
- 问题 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 会长期共存、共同发展。
- 问题 10:为什么深度学习的结构特点不利于稀疏特征向量的处理呢?
首先,我想说这个问题问得太好了,如果不解决这个问题,那整个 Embedding 技术的意义就没有了,所以我也希望大家都能好好思考一下这个问题。一方面,如果我们深入到神经网络的梯度下降学习过程就会发现,特征过于稀疏会导致整个网络的收敛非常慢,因为每一个样本的学习只有极少数的权重会得到更新,这在样本数量有限的情况下会导致模型不收敛。另一个方面,One-hot 类稀疏特征的维度往往非常地大,可能会达到千万甚至亿的级别,如果直接连接进入深度学习网络,那整个模型的参数数量会非常庞大,这对于一般公司的算力开销来说都是吃不消的。