跳转到内容

Stripe 的 100 毫秒

你网购时点下「购买」按钮,到支付成功——大概 100 毫秒。

在这 100 毫秒里,Stripe 的系统会评估你超过 1000 个特征:卡片历史、IP 地址、设备指纹、购物习惯。然后决定你是好人还是坏人。

100 毫秒。做一次审判。错判率 0.1%。

读 Stripe 工程师写的 Radar 技术博客时,最先震到我的不是这些数字,是另一件事:

他们花了七年,推翻了自己三次,才做到这 100 毫秒。

Radar 最初用的是逻辑回归——最简单的 ML 模型。后来升级到 XGBoost + 深度神经网络的组合,效果不错,已经是行业顶配了。

但他们拆掉了 XGBoost,换成纯深度学习。

原因是 XGBoost 拖住了他们——迁移学习、embedding、长时间训练,这些新玩法和它不兼容。而且 XGBoost 无法并行训练,工程师们每天只能跑一轮实验。

代价是准确率掉了 1.5%

上线的系统本来就好用,为了一个不确定的未来主动牺牲 1.5% 的准确率。正常公司会犹豫。

他们的解法是用多分支 DNN 架构,灵感来自 ResNeXt。把计算拆成多个「小网络」,各自学不同层次的特征,然后汇总。

Radar 架构演进:从 Wide & Deep 到纯 DNN 多分支架构

训练时间缩短了 85%,从通宵跑到白天跑几轮。

1.5% 的准确率换 85% 的训练速度。这笔账划得来。

我看完就在想一个简单的问题:如果你现在从零开始,你会怎么做?大多数人不会问。我们习惯了「够用就好」,但「够用」是陷阱——它让你停在局部最优,以为那就是终点。

第二个震到我的点,是他们对「数据越多越好」这件事的实践。

XGBoost 时代,增加训练数据的效果很快饱和。这几乎是 ML 界的共识:数据不是万能药。

但换了纯 DNN 之后,情况完全不同了——训练数据翻 10 倍,模型性能还在涨。

Stripe Radar 训练数据量增加带来的性能提升

大多数人直觉是数据多了边际递减。Stripe 的发现反过来了——架构对了,数据是乘法。

XGBoost 做不到,纯 DNN 做到了。归根结底还是第一个教训:架构先对,数据才会给你惊喜。

检测出结果不难,难的是告诉用户”为什么”

Section titled “检测出结果不难,难的是告诉用户”为什么””

第三个教训,也是我觉得最被低估的:解释和检测一样重要。

你是一个电商老板,Stripe 告诉你「这笔交易是欺诈,我帮你拒了」。你第一反应是什么?

「凭什么?」

不给理由,用户不会感激你,只会怀疑。更糟的是误杀了真实客户——虽然只有 0.1% 的概率——你得让人知道为什么,下次才能避免。

所以他们做了 Risk Insights:每一笔交易被拒,告诉用户具体原因。卡主姓名和邮箱匹不匹配?这个 IP 关联过多少张卡?有没有异常交易模式?

Stripe Radar 的 Risk Insights 功能,展示交易风险因素

用户能看到具体的欺诈信号,就能反过来改进数据质量、定制规则、减少误杀。

一个黑盒再准,也不如透明的盒子让人信。

做 ML 产品的人都该记住这一点。

Radar 的 100 毫秒是技术成就,也是一种工作方式的产物。

不满足于「已经够好」。主动拆掉好用的旧架构。在没人要求的地方做可解释性。在数据上死磕。

七年。三个教训。100 毫秒。

对我而言,不管是不是做技术,这件事只有一个启示:

真正的高手,不是找到一个好方法然后守住它。而是不断地毁掉自己的好方法,去找更好的那个。


你在工作里有没有过「主动拆掉好用的东西」的经历?结果怎么样?

Ryan Drapeau. How we built it: Stripe Radar. Stripe.dev Blog. https://stripe.dev/blog/how-we-built-it-stripe-radar