1.左手论文 右手代码 深入理解网红算法XGBoost
2.OT 算法 & Univer 协同编辑设计
左手论文 右手代码 深入理解网红算法XGBoost
这篇文章源于我上周为同事讲解XGBoost原理与数学推导时的同事挑战。在过程中发现对部分理论的算法理解不够深入,于是源码我花了一周的时间,仔细回顾并梳理之前的同事资料与笔记,同时注意到自己已经有一年没有更新知乎专栏了。算法于是源码长期控盘源码,我决定利用换工作后的同事三天休息时间,撰写这篇关于XGBoost的算法文章,旨在将理论与实践相结合,源码深入理解这个热门算法。同事 考虑到关于XGBoost的算法资料已经十分丰富,如何在众多内容中找到新的源码视角成为关键。我决定将原始论文中的同事数学表达与XGBoost文档中的类、方法、算法参数和返回值进行一一对应,源码通过这种方法,一方面可以借助论文中的王者荣耀代练网站源码数学推导理解代码背后的原理,避免仅仅作为调包侠式的使用;另一方面,通过实际的代码调用、参数调整以及深入研究API设计,进一步加深对XGBoost底层原理的理解。 文章假设读者已经具备对树模型和集成学习(boosting方法)的基本了解。XGBoost模型与公式推导
“数学符号不过是表达的手段——忘记了是谁说的这句话。” XGBoost并非独立的算法,而是基于GBDT算法的一种高效实现,其中“X”代表了极端的含义,指的是算法的优化与高效系统实现。 在XGBoost的模型推导过程中,数学符号和表达式是关键。模型基于树模型作为基学习器,采用boosting集成方法构建。模型采用如下形式的additive model: 这里的\(F(x)\)表示第k个基学习器,特别地,即时通信软件 源码下载基学习器为树模型。 在XGBoost程序包中,通用参数`booster='gbtree'`用于指定基学习器类型。除了默认的`gbtree`选项之外,还有`dart`和`gblinear`两个选项,其中前者是改良的树模型,后者则是线性模型。文章主要考虑的是基学习器为回归树模型的情况,对线性模型的详细理解仍需进一步研究。 接下来,设定损失函数和优化目标,我们的目标是结构风险最小化。损失函数可以不限定具体形式,只要其二阶可导,这样就不需要为每一个特定的损失函数单独推导模型。XGBoost程序包支持自定义损失函数,html5视频上传源码只需实现一个`signature`为`(ypred, y) -> (grad, hess)`的函数对象即可。 加入正则项是XGBoost相对于传统GBDT的一个改进。这里必须设定其为特定形式,这个形式与后续的二阶泰勒展开紧密相关。正则项包括叶子节点的L2-norm和预剪枝项(即gamma参数),将难以解释的启发式方法纳入标准的监督学习框架中,使得学习过程更加清晰。 接下来,解决如何得到叶子节点权重的问题。通过泰勒展开损失函数在上一轮预测值处,将第t轮预测值增量作为自变量增量,从而将损失函数从优化目标中分离出来。这一步大大简化了优化目标,使问题转化为每一轮只需要优化一个函数。XGBoost工程实践与调参
XGBoost提供了两种API:原生的Learning API和Sklearn API。文章研究的家政服务网站源码java是原生的Learning API。 Booster对象是XGBoost算法的核心,通过`xgb.train()`函数得到。最后得到的模型包含多个树模型,每个模型对输入数据进行预测。 Booster对象的`trees_to_dataframe()`方法可以将集成树模型的信息以DataFrame形式返回,包括树的分裂节点、每个节点的Gain和Cover(表示该节点影响的样本数量)。 叶子节点上的Gain值对应解析解,与`plot_tree()`中的叶子节点值一致。将所有树的叶子节点得分相加,并加上初始值,即得到最终预测值。 理论推导部分到这里就可以结束了,但为了更深入地理解模型,文章再次梳理了整个模型训练流程。总结
文章通过结合原始论文中的数学表达和XGBoost文档中的具体实现细节,深入探讨了XGBoost模型的构建过程,从模型推导到工程实践,以及参数调优,旨在提供一个更直观、更全面的理解视角。通过这种方式,不仅加深了对算法原理的理解,还强化了理论与实践之间的联系。OT 算法 & Univer 协同编辑设计
在Univer团队的内部分享中,我们探讨了协同编辑模块的设计与实现,特别是如何在多用户同时编辑文档时保证数据的一致性和用户的直觉体验。Univer是一个企业数据协同工具,目标在于让使用者在任何设备、任何地点、任何时间都能进行编辑,并与同事协作。在实现这一目标的过程中,协同编辑模块设计与实现遇到了挑战,最终我们选择了一种基于OT(Operation Transform)算法的方案。
协同编辑是一种允许多个用户同时编辑同一文档的技术。例如,在Google Doc、腾讯文档、Figma等应用中,用户可以看到实时更新的文档版本,其他用户的操作会立即反映在屏幕上。我们以电子表格为例,来探讨协同编辑的需求和挑战。
协同编辑的目标是确保在多个副本上进行编辑时,用户能够看到一致且符合预期的结果。这个过程涉及两个关键目标:最终一致性(确保所有副本最终达到相同状态)和意图保持(尽可能地使结果符合用户操作的原始意图)。此外,协同编辑还需要考虑一种特殊场景:即使在某些情况下无法达到强一致性,系统仍能提供用户可接受的结果。
OT算法是实现协同编辑的一种有效方法。它通过操作转换(Transform)来协调不同副本上发生的编辑操作,确保在所有副本上应用这些操作后,能够得到一致的结果。操作转换涉及在特定条件下修改操作,以保证在不同副本上执行操作时的结果一致。
在OT算法中,操作的顺序、版本号和协调服务器起到了关键作用。版本号用于定义操作的执行顺序,确保副本内容最终一致。操作转换通过协调服务器进行,以全局唯一的方式分配版本号,确保所有副本的操作能够形成全序关系。
尽管OT算法能够满足协同编辑的基本需求,但在实际应用中,仍存在一些挑战。例如,客户端需要等待服务端处理操作后再进行本地应用,这可能影响用户体验。此外,操作转换过程本身也存在复杂性,需要正确处理不同操作之间的转换以保持用户意图。
在设计和实现Univer的协同编辑模块时,我们考虑了多种因素。为了适应多种文档类型和需求,我们采用了插件形式构建协同编辑功能,这使得Univer能够在不修改内核的情况下支持不同协同编辑算法。我们还实现了一个文档类型无关的协同调度算法,以适应混合使用不同文档类型的情况。此外,引入状态机帮助处理复杂的协同编辑状态和事件,同时,通过依赖注入框架实现网络接口层的抽象,使得Univer的架构能够灵活应对各种网络情况。
通过这些设计和实践,Univer的协同编辑模块能够在保证性能和用户体验的同时,支持高效的数据协作。我们希望这篇文章能够帮助您更好地理解协同编辑的实现和设计,如果有任何问题或反馈,欢迎与我们进行交流。