元启发式方法解析:蚁群优化
原文:
towardsdatascience.com/meta-heuristics-explained-ant-colony-optimization-d016fe925108
跟随信息素路径的蚂蚁。图像由作者使用 Dall·E 创建。
关于一种较少为人知的启发式算法,它基于蚂蚁的行为
·发表于 Towards Data Science ·阅读时长 7 分钟·2023 年 9 月 4 日
–
在优化算法的世界里,有许多方法灵感来自自然界的奇观。从基于进化的遗传算法到模拟退火的降温策略,这些算法在解决复杂问题上已证明其有效性。然而,在这个自然启发算法的多样化景观中,隐藏着一颗鲜为人知的宝石——蚁群优化。我们将深入探讨这种启发式算法,它汲取了蚂蚁巧妙觅食行为的灵感。
蚁群优化(ACO)是一个有趣的算法,核心部分出乎意料的简单。在这篇文章中,你将学习基础知识并理解算法背后的主要思想。在接下来的文章中,我们将编写代码,并使用它来解决几个现实世界的问题。让我们开始吧!
使用蚂蚁解决优化问题
如你所知,ACO(蚁群优化)受蚂蚁行为的启发。该算法模拟蚂蚁寻找食物和相互沟通的方式,以找到它们巢穴和食物源之间的最短路径。你可以使用该算法来寻找图中的良好路径,或用于解决分配类问题。
ACO 中使用了一群人工蚂蚁。它们通过逐步构建解决方案来探索解决方案空间。每只蚂蚁通过基于概率分布选择下一个组件来构建解决方案。该概率分布受到组件质量(例如路径长度)和其他蚂蚁留下的信息素轨迹的影响。信息素轨迹代表了蚂蚁之间的一种通信形式,使它们能够跟随过去成功的路径。
在算法开始时,每个组件上的信息素轨迹被初始化为一个较小的值。当蚂蚁构建解决方案时,它们在使用的组件上沉积信息素。沉积的信息素量与解决方案的质量成正比。作为良好解决方案一部分的组件会被更多的信息素强化,使其对其他蚂蚁更具吸引力。
随着时间的推移,较少吸引人的组件上的信息素轨迹会蒸发,从而降低它们的吸引力,并鼓励探索解决方案空间的其他部分。通过这种方式,算法通过利用搜索空间中最有前景的区域,同时也探索新的区域,从而收敛到一个好的解决方案。
ACO 可视化:蚂蚁从巢穴出发寻找食物。开始时它们会探索所有轨迹,但很快它们会发现最快的路径,并避免长而死胡同的轨迹。图像由作者提供。
超参数
超参数用于控制算法的行为。以下是 ACO 的关键超参数:
迭代次数
这是蚂蚁在算法终止之前构建解决方案的次数。你也可以使用其他终止标准,例如当解决方案在一段时间内没有改进时,你可以决定停止运行。或者你可以设置时间限制。
蚂蚁数量
每次迭代中使用的人工蚂蚁数量。更多的蚂蚁可以更好地探索搜索空间,但也会增加计算时间。
信息素蒸发率(rho)
该参数控制信息素从轨迹中蒸发的速率,取值范围在 0 到 1 之间。较高的衰减率可以鼓励更多地探索搜索空间,而较低的衰减率可以导致更多地利用好的解决方案。
初始信息素水平(tau)
该值对应于轨迹上的初始信息素量。较高的初始信息素水平可以鼓励更多地利用好的解决方案,而较低的初始信息素水平可以鼓励更多地探索搜索空间。你可以使用特定的 tau 值来创建一个温暖的起始。
信息素的重要性 (alpha)
Alpha (≥ 0) 确定信息素水平 (tau) 在选择下一个图组件中的影响。如果值较高,算法对搜索空间的变化更敏感,而较低的值有助于防止过早收敛。
成本的重要性 (beta)
Beta (≥ 0) 与 alpha 可比。它不是确定信息素水平的影响,而是确定成本 (eta) 对选择下一个图组件的影响。更多内容在下一节中介绍。
超参数的选择将取决于具体问题和可用的计算资源。需要通过实验不同的超参数设置,以找到适合特定问题的最佳组合。
伪代码
以下是算法的伪代码:
initialize
problem details
graph
eta = cost per edge
hyperparameters
n_iterations
n_ants
alpha = pheromone importance
beta = cost importance
rho = pheromone evaporation rate
tau = pheromone initialization
for it in n_iterations
x_best, y_best = [], inf
calculate edge attractiveness
update tau (pheromone levels)
for ant in n_ants
x_best, y_best = find ant trail
return x_best
首先,你需要用问题的详细信息和超参数初始化算法。实际的算法包括几个重要的步骤:
计算边的吸引力
这决定了某条边对蚂蚁的吸引力。它取决于 tau(每条边的信息素水平)、eta(每条边的成本)、alpha(信息素的重要性)和 beta(成本的重要性)。
让我们称矩阵的边的吸引力为 A
。边 (i, j)
的更新规则如下:
A[(i, j)] = tau[(i, j)]^alpha * eta[(i, j)]^beta
例如,如果你将 beta 设置为 5,将 alpha 设置为 1,那么边的吸引力将更受成本的影响,而不是信息素水平的影响。
更新 tau
随着时间的推移,信息素轨迹会蒸发(由超参数 rho 控制)。因此,我们需要在每次迭代中更新信息素水平。所有的值都乘以 (1-rho)
。
tau[(i, j)] = (1-rho)*tau[(i, j)]
寻找蚂蚁路径
这一步是最重要的,它利用所有信息为一只蚂蚁找到一条路径。
蚂蚁从起始节点开始,根据边的吸引力 A
选择当前节点的一个邻居:
import random
...
p = [A[(i, j)] for j in neighbors]
sampled_neighbor = random.choices(neighbors, weights=p)[0]
...
正如你所见,边的吸引力被用作选择下一个节点的权重。如果蚂蚁到达终点节点,则根据解决方案的得分更新解决方案中边的信息素轨迹 (tau):
...
y = score_solution(solution)
for (i, j) in solution:
tau[(i, j)] += Q/y # Q is a constant, e.g. 1
...
蚂蚁可能在到达终点节点之前卡住。在这种情况下,该蚂蚁会被忽略,这意味着此蚂蚁的信息素轨迹将不会被更新。
何时使用 ACO
最初,ACO 是为解决涉及在图上找到最短路径的问题而开发的,但自那时以来,ACO 已被应用于其他类型的问题。
ACO 成功应用于优化问题的示例包括旅行商问题、车辆路径问题、云计算中的任务调度、通信网络、图着色问题以及蛋白质折叠。ACO 的一个优势是它可以处理具有大量变量和约束的大型复杂问题。另一个优势是它可以快速高效地找到良好的解决方案,通常优于其他优化算法。但 ACO 的主要好处在于当问题随着时间变化时,算法能够适应。这是因为算法能够不断探索和适应新解决方案。这样的例子包括繁忙地区的运输系统或网络路由。
除了问题的动态特性外,ACO 在解决组合优化问题方面特别有效,这些问题涉及寻找离散变量的最佳组合。也许你现在已经明白了,ACO 可以处理非线性优化问题,这些问题涉及非线性目标函数并可能具有多个局部最优。在这种情况下,ACO 可以通过更彻底地探索解决方案空间来帮助识别全局最优解。
然而,像任何工具一样,ACO 需要仔细调整。超参数的选择在其性能中起着关键作用。微调这些参数对于获得最佳性能至关重要。
图片来源:Prabir Kashyap 在 Unsplash
结论
在我的下一篇文章中,我们将采取实践的方法,实施 ACO 并见证其实际效果。无论你是经验丰富的算法爱好者还是好奇的初学者,ACO 承诺在自然启发的优化领域中带来一个有趣且有回报的冒险。
敬请期待,见证蚂蚁如何解开复杂的优化挑战!
相关内容
理解预测模型局限性的见解
medium.com [## 介绍一种强大的优化技术:模拟退火
解释、参数、优点、缺点和使用案例
数学优化启发式方法每个数据科学家都应该知道 [## 数学优化启发式方法每个数据科学家都应该知道
局部搜索、遗传算法等。
Julia 中的 Metal 编程
原文:
towardsdatascience.com/metal-programming-in-julia-2db5fe8ee32c
Little Heavy | 作者提供的图片
利用 macOS GPU 的强大功能,通过 Metal.jl 框架。
·发表于Towards Data Science ·阅读时间 11 分钟·2023 年 12 月 4 日
–
介绍
就在去年,我们了解到了 Metal.jl框架,这是一个用于苹果硬件的 GPU 后端。这对希望利用其 macOS M 系列芯片全部潜力的Julia从业者来说是令人兴奋的消息。特别是,数据科学家和机器学习工程师可以通过利用 GPU 的并行处理能力来加速他们的计算工作流程,从而实现更快的训练和推断时间。Metal.jl 的引入标志着对将语言的能力与苹果平台上不断发展的科学计算和机器学习领域对接的重要推动。
在2020 年时,苹果公司开始将其 Mac 系列从基于 Intel 的处理器过渡到 Apple Silicon,从 M1 芯片开始。尽管这是苹果公司历史性且令人印象深刻的成就,但也伴随着不少批评和问题。自从我拿到 32 核的 Mac Studio M1 芯片后,我一直希望充分利用 GPU 并尝试新的应用程序。我必须说,这并非全是轻松愉快的经历。从ARM架构兼容性问题到不支持的机器学习库——有时要获得一个工作环境确实是一种挑战。这是任何重大过渡和操作方式中都会遇到的预期问题。我仍然保持乐观,并看到在稳定性和功能方面的全面重大改进。
在本文中,我们将预览 Metal.jl 框架以了解其能力。我们还将展示一个使用 Flux的实际示例,它是 Julia 中的一个机器学习库,并配合 Metal 后端。
以下是涵盖主题的纲要:
I. 项目设置
i. Julia 环境设置
ii. 依赖概述
II. 利用 Metal API
i. 内核函数
ii. 基准测试
iii. 性能分析
III. 使用 Flux 和 Metal Backend
i. 数据集概述
ii. 简单神经网络
iii. 模型评估
希望跟随的读者应具备:
-
对 Julia 编程语言 的基本知识。
-
对机器学习概念的高级理解。
让我们深入了解吧!
项目设置
i. Julia 环境设置
设置一个特定于项目的环境被视为良好实践。这样可以隔离项目所需的确切版本的包,并为自己和团队成员提供一个容易复现的环境。这在 Julia 中很容易做到,如下所示。
ii. 依赖概述
Metal: 这是一个使在 macOS 上编程 GPU 成为可能的框架。如贡献者所述,该包是正在开发中,存在错误、功能缺失和性能尚未完全优化的情况。请确保您还满足以下系统要求:
✔ 配备 M 系列芯片的 Mac 设备️️️
✔ Julia 1.8–1.10
✔ macOS 13 (Ventura) 或 14 (Sonoma)
BenchmarkTools: 我们将使用这个库来执行一些操作的基准测试,这些操作通过 Metal APIs 发送到我们的 GPU。这个包使配置、执行和分析结果变得容易。
Flux: Flux 是一个直观的 Julia 机器学习库;它旨在提供一个高级且用户友好的界面来构建和训练神经网络。我们将使用这个库作为示例,并利用 Metal Backend 来利用我们的 GPU。
以下是本文发布时的依赖版本。
julia> # press "]" to get into the package manager
(jl_jQfFj6) pkg> status
Status `/private/var/folders/33/mcgc5pgd2ls6yp3ggq6rszvc0000gn/T/jl_jQfFj6/Project.toml`
[6e4b80f9] BenchmarkTools v1.3.2
[587475ba] Flux v0.14.6
[dde4c033] Metal v0.5.1
配置好我们的环境并对所使用的库有了高级理解后,让我们探索 Metal API。
利用 Metal API
Metal.jl 与 Apple 的 Metal 图形 API 进行接口——这是 Apple 为其各种平台(macOS、iPhone、手表等)开发的低级 API。
这使用户可以直接控制 GPU (图形处理单元),用于渲染图形和并行计算等任务。让我们看一个基本的示例。
i. 内核函数
在 Apple Metal 框架的背景下,内核函数是一种在 GPU 上执行的特殊类型的函数。这些函数是用着色语言编写的;在我们的案例中是Metal Shading Language (MSL)。
“MSL 允许用户编写一个shader 程序,这是一种在 GPU 上运行的图形和数据并行计算代码。Shader 程序在 GPU 的不同可编程单元上运行。MSL 是一个统一的语言,允许图形和计算程序之间有更紧密的集成。” ³
在开始之前,让我们确保能够监控 GPU 的负载。Apple 具有内置的 GPU 历史记录。在 Mac 上的活动监视器应用中,选择窗口 > GPU 历史记录。你应该能看到类似我的画面:
GPU 历史记录。顶部的尖峰表示最大 GPU 使用率 | 图片来源:作者
在这个例子中,我们将创建一个矩阵乘法内核。为了利用 GPU,我们将故意通过在矩阵操作上迭代N = 100 万次来创建计算复杂性。
我们将定义A为一个m x n矩阵,B为一个n x p矩阵,C为由m x p定义的结果矩阵。C=AB。 结果的内核函数如下所示;除了对内核函数和底部定义的矩阵变量进行一些小的调整外,代码与你在 Julia 中期望的相当相似。
微妙的差异或附加内容如下:**thread_position_in_grid_1d()**函数返回当前线程在其一维网格中的索引。基本上,它会知道 GPU 应该在每个线程上操作哪些数据。这种精细化的线程分配控制方法使用户能够最大限度地发挥系统的计算能力。
当我们初始化矩阵A、B和C时,我们希望确保在 GPU 上使用 Metal 初始化值;这确保我们使其适合 GPU 加速计算。此外,storage=Shared参数指示矩阵数据应存储在共享内存中,从而使 CPU 和 GPU 都能访问。这样,我们需要确保在访问该资源之前进行同步:
“确保你在 CPU 或 GPU 上为使用共享内存的资源安排的所有更改在访问该资源的另一个处理器之前完成。” ²
最后要提到的是末尾的C_cpu
变量。unsafe_wrap
函数用于创建一个与 GPU 数组C
共享相同底层内存的 CPU 数组C_cpu
。这使我们能够在 CPU 和 GPU 之间传输数据,以便后续进行计算。在下面的示例中,我将展示在所有 GPU 操作完成后,我们可以通过对其进行逆操作来修改结果矩阵 C(inv(C_cpu))。
太棒了!现在我们已经准备好了内核,接下来进行计算和基准测试吧。
ii. 基准测试
benchmark宏(宏以“@”开头)用于测量 GPU 内核matrix_multiplication_kernel的性能。
在执行我们的begin...end
块之前,我们将使用Metal.@sync
确保 CPU 和 GPU 之间的同步,并且所有 GPU 命令在切换到 CPU 代码之前已经完成。
在metal宏中,我们指定了threads
和groups
的数量。每个线程负责执行计算。这个数量还决定了多少操作可以并行进行。例如,如果我们指定 256 个线程,则每个线程将负责一部分计算。线程被组织成组;一个线程组是可以一起工作并协调线程并行执行的线程集合。
总的来说,M1 GPU 包含最多 128 个执行单元或 1024 个 ALU,⁴ 苹果表示这些执行单元可以同时执行最多 24,576 个线程,并且其最大浮点(FP32)性能为 2.6 TFLOPs。⁵ ⁶
下面是对N (100)、***threads (256)和groups (256)***参数进行调整后的结果。
基准测试结果 | 作者提供的图片
iii. 性能分析
要进行性能分析并查看结果,您必须安装 XCode。
性能分析代码是一个常被忽视的学科,它是软件开发和性能优化的关键方面。性能分析涉及测量程序执行的各种方面。这可以包括不同函数所需的时间、函数调用的频率、内存使用或泄漏。性能分析还有助于确保对代码所做的任何更改通过性能量化。
如果你曾经历过代码部署到生产环境后意外导致系统性能显著下降,后来发现是因为初级程序员无意中引入了一个时间复杂度为 O(n²)的嵌套循环,你并不孤单。虽然嵌套的 for 循环在某些情况下看似可以接受,但随着值的数量增加,其影响变得越来越麻烦,导致显著的性能挑战。及早发现,借助性能分析来捕捉!
性能分析可以通过两个步骤简单完成。首先,我们需要在metal
宏前面指定Metal.@profile
宏。接下来,确保你设置了以下环境变量:ENV[“METAL_CAPTURE_ENABLED”] = 1
现在你可以执行以下代码:
Metal.@profile @metal threads=n_threads groups=n_groups matrix_multiplication_kernel(A, B, C)
从那里,我们获得一个julia_capture_N.gputrace文件,存储在与项目相同的目录中。要与之交互,请在 XCode 中打开它并重放跟踪。我们可以看到各种有用的指标,可以进一步挖掘。
Xcode | 作者提供的图片
到此为止,我们已经介绍了如何通过 Metal.jl 与 Apple 的 Metal 图形 API 交互——这使我们能够直接控制 GPU 以进行并行计算。我们介绍了 Metal 着色语言中的内核函数,并使用了一个故意增加 GPU 工作负载的矩阵乘法内核。此外,我们通过 Metal 的宏介绍了基准测试工具和性能分析能力。
让我们进入一个实际的场景!
使用 Flux 和 Metal 后端
i. 数据集概述
我们将使用从威斯康星大学医院麦迪逊分院的威廉·H·沃尔伯格博士那里获得的乳腺癌数据库。¹⁰ ¹¹ Class特征将作为目标,其中有两个可能的值(2 表示良性,4 表示恶性)。
为了简洁起见,我将不会演示数据集所需的预处理,而是将读者参考到附录 I:Julia 源代码。
ii. 简单的神经网络
我们将使用Flux构建一个简单的神经网络,该网络利用了Metal后端。从 v0.14 开始,Flux 不强制用户使用特定的 GPU 后端和相应的软件包依赖。⁷ 尽管我们使用 Metal 作为后端,Flux 也支持其他后端,如 AMDGPU 和 CUDA。
让我们做一个快速的合理性检查,以确保我们的环境设置正确。
使用 Flux 测试 Metal | 作者提供的图片
现在我们有了device
变量,我们将使用它将数据和模型移到 GPU 上。在这里要小心,你可以在 Flux 中执行所有业务逻辑,而不需要将模型导出到 GPU——这意味着你仍在使用 CPU(哎呀)!
模型定义(对于我们的二分类问题,这将是一个逻辑回归模型) | 作者提供的图片
为了准备我们的数据运行,我们将利用 Flux.DataLoader。这个模块处理对小批量数据的迭代。为了演示,我保持简单,设置了batchsize=1
。这意味着如果我的数据包含 800 行,每个批次与一行数据相关。在更高效的场景中,你可能希望将数据分开,以便将处理的数据进行分组。
在跳到下一部分之前,重要的是要注意我在将 DataFrame 直接传递给 DataLoader 时遇到了一些问题,所以这里有一些我必须实现的解决方法。
数据准备 | 图片来源:作者
iii. 模型评估
以下代码演示了模型训练和评估过程。当 x_cpu
和 y_cpu
变量(我们的行和标签)从 DataLoader 返回时,利用 GPU 是至关重要的——否则,由于兼容性问题,模型期望在 GPU 上的数据将导致崩溃。
项目运行演示及利用 M1-Max GPU! | 图片来源:作者
在对 Metal.jl 框架的简要介绍中,我们涵盖了在 Apple 硬件上进行 GPU 编程的基础知识。通过探索三个核心概念——内核函数、基准测试和性能分析——读者现在对如何入门有了较高层次的理解,并被鼓励深入探索 API 的功能。此外,我们还演示了一个实际示例,利用 Flux 构建了一个简单的神经网络应用程序,使用了 Metal 后端。如果你是数据科学家或 ML 工程师,想要利用 Apple M 系列 GPU 的强大功能,希望这篇文章能作为加速你的计算工作流的起点。从这里,我将留下更多资源供读者查看:
Flux 是一个机器学习库。它包含许多有用的工具,但也允许…
fluxml.ai](https://fluxml.ai/Flux.jl/stable/?source=post_page-----2db5fe8ee32c--------------------------------)
希望你喜欢这篇文章,谢谢阅读!
👏
最后,我要大力感谢 Metal.jl 项目的创作者。我期待该项目继续成功。对于任何希望贡献的人,请查看他们的 Github 页面 这里。
附录 I:Julia 源代码
在运行 Github 上找到的源代码之前,我强烈建议匹配本文中找到的版本,以确保成功编译。此外,Metal.jl 库仍在开发中,可能会根据指定的版本缺少或包含不同的功能。
🔗 github.com/lausena/JuliaExperiments/tree/main
预处理的补充内容可以在此 帖子中找到。
[## 每当 Gabriel Sena 发布新内容时,你将会收到电子邮件。
每当 Gabriel Sena 发布新内容时,你将会收到电子邮件。通过注册,如果你还没有 Medium 账户,将会创建一个…
medium.com](https://medium.com/subscribe/@lausena?source=post_page-----2db5fe8ee32c--------------------------------)
参考文献
[1] www.youtube.com/watch?v=IARikXzRU7s&ab_channel=TheJuliaProgrammingLanguage
[2] juliagpu.org/post/2022-06-24-metal/index.html
[3] developer.apple.com/metal/Metal-Shading-Language-Specification.pdf
[4] Frumusanu, Andrei。 “2020 Mac Mini 大揭秘:测试 Apple Silicon M1”。 www.anandtech.com。 存档 自原始页面存档于 2021 年 2 月 1 日。检索日期为 2021 年 1 月 30 日。
[5] “Apple M1 芯片”。 Apple.com。Apple。 存档 自原始页面存档于 2020 年 11 月 10 日。检索日期为 2020 年 11 月 11 日。
[6] Kingsley-Hughes, Adrian (2020 年 11 月 10 日)。 “Apple Silicon M1 芯片:我们知道什么”。 ZDnet。Red Ventures。 存档 自原始页面存档于 2021 年 9 月 17 日。检索日期为 2021 年 7 月 1 日。
[7] fluxml.ai/Flux.jl/stable/gpu/
[8] juliagpu.org/post/2023-03-03-metal_0.2/
[9] fluxml.ai/Flux.jl/stable/tutorials/logistic_regression/
[10] William H. Wolberg 和 O.L. Mangasarian: “用于医疗诊断的模式分离,应用于乳腺细胞学”。
“用于医疗诊断的模式分离,应用于乳腺细胞学”,
《美国国家科学院院刊》,第 87 卷,
1990 年 12 月,第 9193–9196 页。
[11] 该数据集遵循 知识共享署名 4.0 国际 (CC BY 4.0) 许可协议。 archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.names
META 的 Hiera:降低复杂性以提高准确性
原文:
towardsdatascience.com/metas-hiera-reduce-complexity-to-increase-accuracy-30f7a147ad0b
| 人工智能 | 计算机视觉 | VITs |
| — | — | — |
简单性使得人工智能能够达到惊人的性能和速度
·发表于 Towards Data Science ·阅读时间 12 分钟·2023 年 6 月 21 日
–
图片由 Alexander Redl 提供,来源于 Unsplash
卷积网络在计算机视觉领域已经主导了二十多年。随着变换器的到来,人们曾认为它们会被淘汰。然而,许多从业者仍在项目中使用基于卷积的模型。这是为什么呢?
本文试图回答这些问题:
-
视觉变换器是什么?
-
它们的局限性是什么?
-
我们能否尝试克服这些问题?
-
META Hiera 如何以及为何似乎成功了?
视觉变换器:一张图值多少字?
图片来源:这里
视觉变换器近年来在视觉基准测试中占据了主导地位,但它们究竟是什么呢?
直到几年前,卷积神经网络 一直是视觉任务的标准。然而,在 2017 年,变压器 的发布让 NLP 世界颠覆了。在文章 Attention is all you need 中,作者展示了一个仅使用自注意力构建的模型能够比 RNNs 和 LSTMs 实现更优越的性能。所以人们很快会想:是否可以将变压器应用于图像?
在 2020 年之前,已经尝试过包括自注意力集成的混合模型。但无论如何,这些模型的扩展性都不佳。这个想法是找到一种方法,使变压器可以原生地用于图像。
在 2020 年,谷歌的作者决定最佳方法 是将图像分割成不同的补丁,然后对序列进行 嵌入。这样,图像基本上被视为模型中的标记(单词)。
图片来源:这里
在短时间内,CNNs 在计算机视觉中的主导地位正逐渐被削弱。视觉变压器 在 CNNs 一直主导的基准(如 ImageNet)上表现更为优越。
图片来源:这里
实际上,提供足够的数据,视觉变压器(ViTs) 表现出它们优于 CNNs。还显示出,尽管存在一些差异,但也有许多相似之处:
-
ViTs 和 CNNs 都构建了复杂且逐步深入的表示。
-
然而,ViTs 更能利用背景信息,并且似乎更具鲁棒性。
一些最大的模型如何看待世界
pub.towardsai.net](https://pub.towardsai.net/a-visual-journey-in-what-vision-transformers-see-9db9c8ba62d4?source=post_page-----30f7a147ad0b--------------------------------)
此外,变压器的可扩展性也是一个额外的优势。这成为了 ViTs 的竞争优势,使其成为热门选择。
使用视觉变压器。 source
实际上,多年来我们见证了数百万参数的 CNN 和达到数十亿参数的 ViTs。 去年,Google 展示了如何将 ViTs 扩展到 20B 参数,并且未来我们可能会看到更大的模型。
Google ViT-22 为新型大型变压器和计算机视觉的革命铺平了道路
towardsdatascience.com
视觉变压器的限制
图片由Joshua Hoehne提供,来自Unsplash
原生适配变压器仍然有成本:ViTs在使用其参数时效率低下。这源于它们在网络中使用相同的空间分辨率和相同数量的通道。
CNN 有两个方面决定了它们的初期命运(都受到人脑皮层的启发):
-
随着层级的上升,空间分辨率减少。
-
增加不同的“通道”数量,每个通道变得越来越专业。
图像来源:这里
另一方面,变压器具有不同的结构,即一系列自注意力模块,其中发生两个主要操作,使其能够很好地进行泛化:
-
用于建模元素间关系的注意力操作。
-
全连接层则建模元素间的关系。
这实际上早已被注意到,源于变压器设计是针对文字而非图像的。毕竟,文本和图像是两种不同的模式。其一的不同之处在于,文字在尺度上不会变化,而图像则会。这在需要关注在目标检测中尺度变化的元素时是有冲突的。
此外,图像中像素的分辨率高于文本段落中文字的分辨率。 由于注意力机制具有平方级别的成本,使用高分辨率图像在变压器中具有较高的计算成本。
之前的研究尝试通过使用层次特征图来解决这个问题。例如,Swin Transformer通过从小块开始并逐渐合并各种邻近块来构建层次表示。
图像来源:这里
其他研究尝试在 ViTs 中实现多通道。例如,MVITs尝试创建初级通道,专注于简单的低级视觉信息,同时更深的通道则关注复杂的高级特征,如 CNNs 中的做法。
图像来源:这里
然而,这些方法并未完全解决问题。随着时间的推移,提出了越来越复杂的模型和专业模块,这些改进在一定程度上提升了性能,但使得ViTs在训练时变得相当缓慢。
我们能否在不需要复杂解决方案的情况下解决这些变换器的局限性?
如何学习空间关系
图片由Ali Kazal在 Unsplash 上提供
ViTs 已成为计算机视觉领域的一个模型,然而,适应它们需要越来越复杂的修改。
我们能否在不需要复杂解决方案的情况下解决这些变换器的局限性?
近年来,人们一直在努力简化模型并加快速度。常用的一种方法是引入稀疏性。在计算机视觉领域,一个非常成功的模型是掩码自编码器(MAE)。
在这种情况下,经过分块后,一些块会被掩盖。然后,解码器必须从被掩盖的块中重建。ViT 编码器仅处理 25%的块。在这种情况下,你可以用少量的计算和内存来训练宽编码器。
图像来源:这里
这种方法已被证明能够教授空间推理,取得了与 Swin 和 Mvit 相当甚至更优的结果(但后者在计算上要复杂得多)。
另一方面,如果稀疏性确实提高了训练效率,那么 CNNs 的一个主要优点就是其层次化的方法。但这与稀疏性存在冲突。
实际上,这之前已经做过测试,但效果不佳:
是否可以设计一个稀疏且层次化但仍高效的模型?
META 的新工作已脱离了 MAE 训练和其他技巧,致力于构建一个高效且准确的 ViT,而不需要过去使用的那些复杂结构。
现代层次化视觉变换器在追求有监督学习的过程中添加了多个视觉专用组件…
arxiv.org](https://arxiv.org/abs/2306.00989?source=post_page-----30f7a147ad0b--------------------------------)
Hiera: 层次化、稀疏且高效的 ViT
照片由 Jordan Opel 提供,Unsplash
模型
基本思想是,为了在视觉任务中训练一个高准确度的层次化 ViT,不需要使用一系列使其变得缓慢和复杂的元素。根据作者的说法,空间偏差可以通过掩码自编码器训练从模型中学习。
在 MAE 中,补丁被删除,因此在层次化模型中,它在重建 2D 网格(以及空间关系)时遇到问题。作者解决了这个问题,使得内核在掩码单元之间不能重叠(在 池化 中,掩码单元之间没有重叠)。
图片来源: 这里
作者们从现有的 ViT 层次化模型 MViTv2 开始,并决定使用 MAE 训练对其进行改造。该模型由多个 ViT 块组成,但如结构所示,某些地方会减少尺寸,这通过使用池化注意力实现。
图片来源: 这里
在池化过程中,注意力特征使用 3x3 卷积进行局部聚合,然后计算自注意力(这是为了减少 K 和 V 的大小,从而减少计算量)。当使用视频时,这种机制可能变得昂贵。因此,作者用掩码单元注意力替代了它。
换句话说,在 Hiera 中,池化过程中内核会移动,以确保掩码部分不会出现在池化中。因此,对每组标记(掩码大小)进行某种局部注意力
图片来源: 这里
MViTv2 随后引入了一系列增加复杂性的附加组件,作者认为这些是非必需的,因此将其删除:
-
相对位置嵌入。位置嵌入被添加到每个块中的注意力中。
-
最大池化层,在 Hiera 中使用时需要填充。
-
注意力残差,在 Q(查询)和输出之间存在残差连接,以更好地学习池化注意力。作者减少了层数,因此不再需要。
作者展示了这些变化的影响如何显著提高了准确率(acc.)和速度(每秒图像)。
图片来源:这里
一般来说,简化模型使 Hiera 不仅在图像和视频上更快,而且比其对应的 MViTv2 和其他模型更准确。
Hiera 在图像上比我们开始使用的 MViTv2 快 2.4 倍,在视频上快 5.1 倍,并且由于 MAE 实际上更准确(来源)
图片来源:这里
作者指出,模型不仅在推断时更快,而且训练也快得多。
图片来源:这里
结果
作者展示了基本模型在参数数量有限的情况下,如何在 Imagenet 1K 上取得良好结果(这是最重要的图像分类数据集之一)。
图片来源:这里
第二点是,在低参数范围内,通常是卷积基础的模型占据主导地位。这里更小的模型表现非常好。对于作者而言,这证实了他们的直觉,即空间偏差可以在训练过程中学习,从而使 ViTs 即使在小模型中也能与卷积网络竞争。
图片来源:这里
大型 CNN 模型的成功在于它们可以用于迁移学习。ResNet 和基于 VGG 的模型已经在 Imagenet 上训练,然后被社区用于许多任务。因此,作者测试了 Hiera 的迁移学习能力,使用了两个数据集:iNaturalists 和 Places。
图片来源:这里
作者在这两个数据集上对模型进行了微调,并展示了他们的模型优于之前的 ViTs。这表明他们的模型也可以用于其他数据集。
此外,作者使用了另一个流行的数据集 COCO。虽然 iNaturalists 和 Places 是图像分类的数据集,COCO 是用于图像分割和目标检测(计算机科学中的两个热门任务)的最广泛使用的数据集之一。再次,模型表现出强劲的扩展性(参数增加时性能提升)。此外,模型在训练和推断时都更快。
图片来源:这里
此外,该模型已在视频上进行了测试,特别是在两个视频分类数据集上。Hiera 表明它在参数更少的情况下表现更好。该模型在推理中也更快。作者展示了该模型在这种任务中达到了最先进的水平。
图片来源:这里
作者展示了该模型还可以用于其他视频任务,例如动作检测。
告别感言
在这项工作中,我们通过采用现有的层次化视觉变换器,去除所有附加功能,同时通过 MAE 预训练为模型提供空间偏置,从而创建了一个简单的层次化视觉变换器。 (source)
作者展示了许多为提高变换器性能而添加的元素实际上不仅是不必要的,而且增加了模型的复杂性,使其变得更慢。
相反,作者展示了使用 MAE 和层次结构可以使 ViT 在图像和视频处理上更快、更准确。
这项工作很重要,因为在许多任务中,社区仍然使用基于卷积的模型。ViTs 是非常大的模型,计算成本高。因此,人们通常更愿意使用基于 ResNet 和 VGG 的模型。ViTs 如果在推理上更准确但尤其更快,可能会改变游戏规则。
其次,它突出了在其他地方看到的一个趋势:利用稀疏性进行训练。这具有减少参数和加速训练与推理的优势。一般来说,稀疏性的概念也在其他人工智能领域中被看到,并且是一个活跃的研究领域。
如果你觉得这很有趣:
你可以查看我的其他文章,你也可以 订阅 以在我发布文章时收到通知,你还可以 成为 Medium 会员 以访问所有故事(平台的附属链接,我从中获得少量收入,对你没有成本),你也可以在LinkedIn上连接或联系我。
这是我 GitHub 仓库的链接,我计划在其中收集与机器学习、人工智能及更多相关的代码和资源。
[## GitHub — SalvatoreRa/tutorial: 机器学习、人工智能、数据科学的教程…
机器学习、人工智能、数据科学的教程,包含数学解释和可重复使用的代码(Python…
github.com](https://github.com/SalvatoreRa/tutorial?source=post_page-----30f7a147ad0b--------------------------------)
或者你可能对我最近的一篇文章感兴趣:
模仿模型能否达到像 ChatGPT 这样的专有模型的性能?
levelup.gitconnected.com [## 扩展并不是一切:更大模型失败得更惨
大型语言模型真的理解编程语言吗?
salvatore-raieli.medium.com [## META 的 LIMA:玛丽亚·近藤的 LLM 训练方法
更少而整洁的数据来创建一个能够与 ChatGPT 相媲美的模型
levelup.gitconnected.com [## 人工智能有趣吗?也许,稍微有点
为什么人工智能仍然在幽默方面挣扎,以及这为什么是一个重要步骤
参考文献
这是我撰写本文时参考的主要文献列表,仅列出文章的第一个作者。
-
Chaitanya Ryali 等,2023 年,《Hiera: A Hierarchical Vision Transformer without the Bells-and-Whistles》,链接
-
Peng Gao 等,2022 年,《MCMAE: Masked Convolution Meets Masked Autoencoders》,链接
-
Xiang Li 等,2022 年,《Uniform Masking: Enabling MAE Pre-training for Pyramid-based Vision Transformers with Locality》,链接
-
Zhenda Xie 等,2022 年,《SimMIM: A Simple Framework for Masked Image Modeling》,链接
-
Ze Liu 等,2021 年,《Swin Transformer: Hierarchical Vision Transformer using Shifted Windows》,链接
-
Haoqi Fan 等,2021 年,《Multiscale Vision Transformers》,链接
-
Kaiming He 等,2021 年,《Masked Autoencoders Are Scalable Vision Learners》,链接
-
Chen Wei 等人, 2021, 《自监督视觉预训练的掩码特征预测》,链接
-
Alexey Dosovitskiy 等人, 2020, 《一张图像价值 16x16 个词:用于大规模图像识别的变换器》,链接
-
Ashish Vaswani 等人, 2017, 《注意力机制就是你所需的》,链接
-
Kaiming He 等人, 2015, 《用于图像识别的深度残差学习》,链接
-
Wei Yu 等人, 2014, 《可视化和比较卷积神经网络》,链接
-
Karen Simonyan 等人, 2014, 《用于大规模图像识别的非常深的卷积网络》,链接
-
为什么我们有大型语言模型而小型视觉变换器?,TDS,链接
-
在 Vision-Transformers 看到的视觉之旅,TowardsAI,链接
-
Vision Transformer,paperswithcode,链接
客户终身价值建模的方法:好东西和陷阱
一份关于 CLV 技术和实际应用案例的全面实用指南的第三部分
·发表于 Towards Data Science ·10 分钟阅读·2023 年 11 月 17 日
–
客户多久购物一次?他们花多少钱?他们忠诚多久?三个简单的因素帮助你建模你平均消费者的客户终身价值。但这是否意味着任务很容易?不,不是的。来源:作者提供。
欢迎回来继续我的客户终身价值预测系列,我称之为“其他教程遗漏的所有内容”。在 第一部分,我介绍了历史 CLV 分析这个经常被低估的阶段,以及你可以用这些后视信息做些什么。 下一部分,我展示了大量的 CLV 预测 用例,远远超出了我在其他文章中看到的通常有限的例子。现在,是时候进入实际部分,包括我和我的数据科学团队在处理实际数据和客户时学到的一切。
再次说明,我无法将所有有用的信息压缩到一篇博客文章中,而不将其变成一部史诗。所以今天我将专注于历史 CLV 建模,正如第一部分所示,这已经非常有用。我将介绍 Stupid Simple Formula、Cohort Analysis 和 RFM 方法,包括我发现的每种方法的优缺点。下一次我将做相同的工作,但针对 CLV 预测 方法。我将以数据科学家学习到的最佳实践来结束整个系列,讲述如何正确地进行 CLV 分析。
听起来不错?那我们就来探讨一下历史上的 CLV 分析方法,以及你需要注意的优点和“陷阱”。
方法 1:简单的公式
或许最简单的公式基于三个要素:顾客通常购买多少,购物频率,以及忠诚的持续时间:
比如,如果你的平均顾客每次交易花费 25 欧元,每月进行两次交易,并且保持忠诚 24 个月,那么你的 CLV = 1200 欧元。
我们可以通过考虑利润或盈余,使其变得更复杂。有几种方法可以做到这一点:
简单公式 V1:每产品利润
在这里,你需要计算所有库存产品的平均利润,然后将这个非常简单的公式结果乘以这个数字,以得到平均客户生命周期利润:
例如,如果你使用上述数据,并考虑到平均产品利润为 10%,那么你的平均 CLV =(25 欧元 * 2 * 24)* 0.1 = 120 欧元。
计算平均产品利润的方法取决于你所拥有的成本数据,这些数据可能来自各种数据源。一个简单的开始方法是直接用标准目录价格减去销售成本(COGS),因为你可能在库存表中已经有了这些信息。当然,这并不考虑更复杂的成本,或者当物品打折时的销售价格,或者不同交易包含不同项目,可能有非常不同的利润。我们来看看一个考虑了这些因素的选项…
简单公式 V2:每交易利润
第二版用平均交易利润替代了原公式中的平均交易值:
例如,每次交易 5 欧元的利润 * 每月 2 次交易 * 24 个月的生命周期 = 平均 CLV 为 240 欧元。
这种变体需要基于价格减去成本的每项交易级别的利润。其优点在于,你可以使用实际销售价格,而不是目录价格,从而考虑到最终结账时的任何促销或折扣。此外,你可以包括配送服务成本(CODS),即运输费用,以及支付服务成本(COPS),即支付系统提供商(如 Visa 或 PayPal)的费用。这一切都能带来更准确和可操作的洞察。
来源:作者提供。
简单公式的优缺点
积极的一面:
-
这个公式在概念上很简单,这有助于数据科学家和领域专家在如何计算它以及如何使用它上更好地合作。
-
此外,它可以根据你的利润计算方式而变得简单或复杂,
然而,存在两个主要缺点。首先,这个公式并不是特别具有操作性:
-
它生成一个单一的平均值,这个值难以解释和影响:即使你做出一些改变,重新计算后发现平均值也有所变化,你也无法确定这是否与您的行动相关。
-
它平滑了销售速度,所以你无法追踪客户是在生命周期的开始还是后期进行消费。
-
并且它无法帮助理解客户细分及其需求。
其次,该公式可能不可靠:
-
作为一个平均值,它很容易被扭曲,例如如果你有大额花费者或零售和消费者客户的混合。
-
在非合同情况中,客户不受合同约束继续付款,**你永远无法真正知道客户何时“死亡”。**因此,很难估算平均生命周期组件的价值。
-
该公式假设每个客户的支出和流失率是恒定的。它未考虑客户旅程和阶段,即他们在何时需要更多或更少的产品。
方法 2:群体分析
这种技术涉及将平均 CLV 公式应用于个别客户细分。你可以按任何方式对客户进行细分,例如按人口统计、获取渠道或通常按首次购买月份。其目的是回答如下问题:
-
在 3、6、12 个月后,平均客户的价值是多少?
-
**他们在生命周期中的何时花费最多?**例如,他们最初是否花费很多,然后逐渐减少,还是相反?
-
**获取漏斗如何影响 CLV?**例如,由促销活动引起的注册可能会赢得很多短期的、不忠诚的客户,而来自推荐朋友计划的客户可能会成为终身粉丝。同样,店内获取可能比在结账时强制在线注册带来更多忠诚度。
-
**人口统计群体在其平均 CLV 上有何不同?**例如,富裕郊区的购物者是否花费更多?答案并不总是符合预期,每当发生这种情况时,如果你深入挖掘,通常会发现有价值的见解。
下面我们看到按获取月份进行的经典群体分析。横轴显示群体组,指示我们数据中最早的交易月份。这可能表示获取月份(尽管一些客户可能在数据收集开始之前就已存在)。纵轴显示群体周期:自数据中最早交易以来的月份数。
来源:Finn Qiao,《Cakestands & Paper Birdies: E-Commerce Cohort Analysis in Python》,发表于 TowardsDataScience.com
你是怎么解读这个的?最左边的列显示了 2010 年 12 月加入的客户(或当时已经是客户)。颜色越深表示这些客户在他们的第一个月(左上角单元格)和第 10 到第 12 个月(右下角),即 2011 年 9 月至 11 月,花费越多。这可能意味着什么?数据科学家和营销人员之间的合作可以帮助解码这一趋势:也许是因为公司在 2010 年为这些客户挽救了圣诞节,他们在 2011 年开心地回归了。也可能只是因为他们在数据收集开始前已经是客户了。与此同时,7 月和 8 月获得的客户往往花费较少。为什么?针对在其他时间获得的客户,应该采取什么策略来提升平均客户生命周期价值(CLV)?
同样的调查也可以并且应该在其他类型的细分中进行。
来源:作者提供。
方法 3:“RFM”方法
RFM 方法基于为每个客户计算以下指标:
是的,我买了新的 iPad。不,我不是艺术家。来源:作者提供。
这使我们能够根据这些指标对客户进行分类,探索不同的客户群体,并为其分配有意义的业务名称。例如,那些具有最高的近期性、频率和货币价值分数的客户被称为“Top Prio”或“VIPs”。确定了他们之后,接下来你需要了解的是:这个群体在你的整体客户基础中所占的比例是多少?与此同时,具有高频率和货币价值但近期性低的客户花费显著,但时间较短。如果你添加一个额外的指标——自上次购买以来的时间——发现这个时间很长,他们可能被认为是“流失风险”。
发现这些群体的最简单方法是使用百分位数:按近期性对客户进行排序,并将其分为——例如前 20%、中间 50%和底部 30%的层次。对其他指标重复此操作。然后定义所有可能的层次组合,标记生成的群体,并绘制每个群体在整体客户基础中所占的百分比。下方展示了这一点。创建这样的图表可以清晰地显示,只有很小一部分整体客户基础是“VIPs”,而更大一部分是“变冷”甚至是“流失风险”。这些洞察可以帮助你制定策略,以获得更多忠实客户,减少风险客户。
发现并标记你的客户基础中的细分。来源:作者提供。
这个图表中有相当多的类别,由三种指标和每种指标的三个层级的组合产生。为了更详细,你可以为每个指标定义更多层级。你还可以尝试不同的分段方法:我提到过 20–50–30 的分割,但你可以使用其他数字,甚至对每个指标使用不同的策略。例如,由于频率是客户忠诚度的一个重要指标,如果你认为这能帮助你最准确地找出最佳客户,你可能会考虑将其排名并分割为 5-10-85 百分位。
如果你不确定如何分割客户,或者希望使用更数据驱动的方法?你可以尝试使用无监督机器学习(ML)算法,例如k-means,以发现客户群体。这增加了使用 ML 和确定真正代表数据分布的簇数量的复杂性(有些人推荐使用肘部法,但我有个坏消息要告诉他们)。不过,如果你具备数据科学能力,数据驱动的方法可能会产生更准确的结果。
RFM 方法的优缺点
在积极的一面:
-
RFM 方法直观,这使得数据科学家和领域专家之间的沟通与协作更为轻松。
-
手动标记的组高度感知并且量身定制。你可以与营销部门合作定义它们,因为无疑是营销部门会基于结果采取行动。
缺点:
-
定义多少个 R、F 和 M 层级可能很困难: 高-中-低的粒度是否足够?这取决于企业的需求及其调整营销策略、客户服务或产品线以适应不同群体的运营能力。
-
如何结合 R、F 和 M 分数也是一个棘手的问题。 想象一下,你已按照最近性对客户进行排名,并将他们分为三层,其中顶层客户被分配为 3,中层为 2,其余为 1。你对频率和货币值也做了相同的操作。现在你有几个选择:
如何结合不同客户细分的分数?继续阅读以了解更多。来源:作者提供。
-
使用简单拼接时,得分为 R=3,F=3 和 M=3 的客户最终得分为 333,而一个全方位的底层客户得分为 111。使用简单拼接和每个指标三个层级的组合可以产生多达 27 种可能的分数,这很多(要验证这一点,请计算“Concat.”列中的唯一值)。你添加的层级越多,组合就越多。你可能会得到比你能处理的更多的组,和/或创建的组太小,你不知道如何处理,或者无法依赖基于这些组的任何分析。
-
总结将为你提供更少的组别:现在你所有的底层客户得分为 1+1+1 = 3,你的顶级客户得分为 3+3+3 = 9,其他每个得分都会落在 3-9 范围内。这可能更易于管理,但也带来了一个新问题。现在 R、F 和 M 指标被同等对待,这可能不合适。例如,糟糕的最近性得分是一个你不想忽视的大警告,但通过求和,你再也无法看到它的个别贡献。
-
添加权重可以解决这些问题:例如,如果你发现频率是一个常规高 CLV 购物者的最佳指标,你可能会将 F 乘以某个正数,以提高其重要性。但这也带来了一个新挑战,即使用哪些权重因素?找出一些结果公平且有用的数据表示的值并非易事。
总结完毕。也就是说,现在我们可以进入机器学习了吗?
呼。正如你所见,建模历史 CLV 并非易事。然而,我真的相信这是值得的,并希望更多的数据科学项目能专注于真正了解数据,再跳入机器学习和做出预测。
不过,我知道这正是你们一些人来这里的目的。所以下次——我保证——我会介绍 CLV 预测方法的优缺点。在此之前,开始探索那些历史数据吧!对它们建立一些直觉;这将帮助你在下一步中。
指标层:所有 KPI 定义的唯一真实来源
原文:
towardsdatascience.com/metrics-layer-a-single-source-of-truth-for-all-kpi-definitions-671c9aa04a91
图片由 Midjourney 生成
了解为什么实现指标层将使在您的组织中获取数据驱动的见解变得更加稳健!
·发布于 Towards Data Science ·阅读时间 8 分钟·2023 年 8 月 8 日
–
指标层是一个框架,它通过以统一和直观的方式整合、分析和可视化关键绩效指标,赋能组织挖掘有价值的见解并推动数据驱动的决策。
在本文中,我们将探讨指标层的重要性、它的好处、与语义层的关键区别以及成功实施的要求。
什么是指标层?
指标 层(也称为指标 存储或无头 BI)是一个用于标准化指标的框架,即集中化公司计算指标的方式。它可以被视为定义组织内 KPI(或指标,这些术语将互换使用)的唯一真实来源。
💡 额外小知识:如果您想知道,“无头 BI”这一术语源于这些解决方案使各种 BI 工具能够连接到 API 以访问指标。因此,它们提供了在保持指标定义完整性的同时更换工具的灵活性。
实质上,指标层的概念并不完全陌生。例如,您已经将项目的代码库存储在一个集中式仓库中,并使用 Git 进行版本控制。类似地,组织的数据仓库或数据湖作为所有数据的唯一真实来源。类比地,指标层作为所有在组织内使用的 KPI 定义的唯一真实来源。
如下图所示,指标层应位于数据仓库(或更广义的数据源)和所有相关应用程序(如仪表板、报告、AI 模型等)之间,这些应用程序使用这些指标。
让我们进一步扩展这个定义。指标层不仅存储所有指标定义,还将应用程序生成的请求转换为 SQL。然后,该层在数据仓库/湖中执行这些请求,以检索所需的指标。
你为什么需要指标层?
你可能在你的组织中听到过以下一些变体:
-
为什么在仪表板 X、Y 和 Z 上这个指标的值不同?
-
看来这个仪表板使用了不同的指标 X 定义。我们能否快速使所有仪表板保持一致,以传达相同的故事?
-
有管理层的人员询问了这个指标的定义。你能调查一下这个仪表板中的自定义查询,并确定我们实际上是如何计算它的吗?
不幸的是,这些例子说明了数据科学家或数据分析师在日常工作中经常遇到的问题。
这些问题表明指标变得难以管理,为用户带来了混乱,无论他们是数据专业人士还是非技术利益相关者。
更糟糕的是,这些用户通常必须基于这些指标做出关键的业务决策。
简单指标的隐藏复杂性
随着企业的增长和发展,他们监控的指标也在变化。随着收集的数据量增加,其复杂性也随之增长。
起初看起来不直观的是,即使是看似简单的任务,如统计,也在分析中变得具有挑战性,因为在聚合原始数据时会出现许多复杂性。
为了说明这一点,让我们考虑一个许多组织都能理解的例子:计算应用程序或服务的用户数量。这应该很简单,对吗?
然而,尝试统计用户时可能会出现以下问题:
-
确定统计用户的时间框架:应该按天、周、月、年或其他基础进行统计吗?
-
按地理区域对用户进行细分:如果需要细分,应使用什么级别的详细信息?大陆、国家、省、城市等?
-
定义 活跃 用户:我们如何识别一个活跃用户?如果在特定时间段后没有交易,用户是否应被视为非活跃?如果是,这个特定时间段是什么?此外,如何处理那些登录并使用服务但没有购买的用户?“活跃用户”的定义可能会有很大的不同。
-
应用数据过滤器或排除特定用户:是否应根据特定标志排除某些用户?例如,是否应排除公司员工使用的测试账户?
即使是看似简单的任务,如用户计数,也涉及许多复杂性。
确保这些指标的准确性至关重要,因为在多个出口(如仪表板或报告)中不一致的 KPI 可能导致利益相关者对数据失去信任。此外,数据团队可能会极其困难地识别所有使用不同且常常相互冲突的指标定义的位置。
在这种情况下,最大的问题是没有一个中央存储库来存储指标定义。这些定义分散在各种 BI 工具和填充视图或仪表板的自定义 SQL 查询中。因此,它们常常被重新创建和重复使用,而没有适当的监督和一致性。
这就是指标层发挥作用的地方。接下来,让我们看看为您的 KPI 设置单一事实来源的好处。
指标层的优势
实施指标层可以确保组织内的多个人员在向不同的数据和非数据专业人员询问有关某一指标的问题时,得到一致的答案。
让我们探讨一下实施指标层的一些额外优势。
促进一致性并建立信任
通过启用清晰且可重用的业务定义,指标层在组织内促进了一致性。这种一致性增强了利益相关者对数据的信任。
此外,它允许检查指标的来源——了解指标是如何构建的以及使用了哪些数据源。
遵循 DRY(不要重复自己)原则
使用指标层可以避免在多个位置定义每个指标的业务逻辑。这避免了不必要的重复,并确保了管理指标定义的效率。
促进遵守软件工程最佳实践
由于指标层是通过代码定义的,因此更容易遵循已建立的最佳实践。此外,还可以使用行业标准解决方案来进行指标层的版本控制,从而确保适当的跟踪。
为数据消费渠道提供未来保障
有了指标层,可以减少在各种实例中使用过时指标定义的风险。这使得开发人员能够构建分析功能和数据驱动的应用程序,同时保持一致和最新的指标定义。
支持各种工具
指标层的集中架构使其能够与各种工具(如 CRM 系统、BI 工具和内部开发的解决方案)无缝集成。
无论使用何种工具或其内部逻辑,最终结果都是基于标准化的指标逻辑。
提供单一的指标定义接口
度量层的集中式架构提供了一个统一的界面,让组织中的所有数据利益相关者都能检查特定度量的定义方式。这促进了透明度,并确保对度量定义的共享理解。
为成功的度量层实现奠定基础
在探讨了度量层的定义和意义之后,现在是时候深入了解其实现方式了。
让我们研究成功实现度量层的要求。市面上有几种现成的解决方案,每种方案都有其优缺点。
然而,让我们退一步,将重点转移到任何度量层实现应具备的关键特性,以便在现代数据栈中有效地履行其角色。
成功的度量层实现需要五个核心属性:
-
强大的语义层
-
集成能力
-
低延迟的性能优化
-
部署灵活性
-
企业能力
让我们深入探讨每个属性的细节,从一个常常引起混淆的方面开始:语义层,也称为语义模型或逻辑模型。
度量层与语义层
语义层作为数据仓库中的表和列与有意义的业务实体之间的映射。语义层是企业可以使用业务友好的语言定义维度、度量和指标的地方。
💡 需要注意的是,语义层只是度量层的一个组成部分,不应与度量层本身混淆。
理想情况下,这些定义应通过直观的用户界面(UI)轻松制定,并存储在版本控制的文本文件中,通常为 YAML 或 JSON 格式。
此外,为了促进自动化,实现应提供声明式 API。
除了强大的语义层之外,还有几个其他属性对于全面的度量层实现至关重要,如上所述。让我们进一步探讨这些属性。
集成能力
为确保度量定义的一致性,头部无 BI 解决方案应具有与流行 BI 工具、编程语言、ML 框架和其他相关技术集成的灵活性。
这需要广泛支持基于标准的数据协议、API 和 SDK。
低延迟的性能优化
度量层应设计为高性能查询,使得在规模上实时访问度量成为可能。
这对于支持自动化功能如电子邮件触发和个性化产品体验至关重要。
部署灵活性
度量层应支持广泛的部署选项,包括完全托管服务和跨不同提供商的云原生部署。
这种灵活性使组织能够选择最适合其特定需求和基础设施的部署模型。
企业能力
治理、安全、访问控制、性能、可扩展性和高可用性等因素对于许多组织至关重要。
随着指标层成为各种应用、工具和流程的关键组件,它应具备企业级功能以满足组织的要求。
通过考虑这些要求,组织可以确保在其现代数据堆栈中成功实施指标层。
总结
许多公司仍处于数据科学和机器学习的早期阶段。因此,提高商业智能和报告可以解决他们面临的约 90%的数据相关挑战。
因此,对于这些公司来说,建立一致且集中化的指标定义至关重要。
指标层作为组织内所有 KPI 定义的权威来源。它充当数据源与依赖这些指标的各种应用(仪表板、报告、AI 模型等)之间的桥梁。
实施指标层带来了众多好处。它确保了数据的一致性和可信度,提高了操作效率,促进了最佳实践的遵循,使数据分析具备前瞻性,与不同工具集成,并为利益相关者提供统一的指标定义访问。
通过利用指标层,公司可以提高数据驱动决策过程的精确度、可靠性和整体有效性。
喜欢这篇文章?成为 Medium 会员,继续无限制阅读学习。如果你使用 这个链接 成为会员,你将以零额外成本支持我。提前感谢,期待见面!
你可能还会对以下内容感兴趣:
学习如何通过使线性模型更具灵活性来改善模型的拟合。
## 解锁线性回归中的交互项的力量 ## 解锁线性回归中的交互项的力量
学习如何通过包含交互项来使你的线性模型更具灵活性。
towardsdatascience.com](/unlocking-the-power-of-interaction-terms-in-linear-regression-ba30c2cf158f?source=post_page-----671c9aa04a91--------------------------------) ## 使用 DVC 进行实验跟踪的极简指南
开始进行实验跟踪的最基本指南
towardsdatascience.com ## 回归评估指标的全面概述
对常用回归评估指标及其在各种实际应用中的详细参考
towardsdatascience.com
参考资料
除非另有说明,否则所有图片均由作者提供。
最初发表于 Atlan 博客 于 2023 年 8 月 2 日
指标存储的实际应用
原文:
towardsdatascience.com/metrics-store-in-action-76b16a928b97
使用 MetricFlow、Python、DuckDB、dbt 和 Streamlit 的教程
·发表于Towards Data Science ·阅读时间 11 分钟·2023 年 2 月 23 日
–
指标层集中定义所有关键业务指标和维度。它将指标请求转换为 SQL,抽象化了实现细节。图片由作者创建。
关于现代数据栈(MDS)的文献很多——大多数讨论围绕存储、摄取、转换和展示。今天我们聚焦于指标,这是许多其他MDS 类别中的一种。
有人说指标是语义层的一个组成部分——请参阅这篇 Airbyte 博客文章。而我们,如同其他人一样,将“指标存储”、“指标层”和“语义层”这些术语交替使用。
什么是指标存储,也称为指标层,也称为语义层?
“上个月的收入,分析师的笔记本中报告的与我们仪表盘中的不同。我们应该向审计报告哪个数据?”
“你知道我们在保留应用中如何定义流失率 KPI 吗?”
“我们如何将客户订单的收入按地理区域进行细分?”按客户账单地点?按交货地点?还是其他?
这些问题经常出现在我曾工作的公司中。我们都知道原因:不同的团队在孤岛中工作,使用他们偏好的技术栈实现指标。细节隐藏在锁定访问的数据库中的 SQL 程序中,或者在一些本地 Power BI 文件中,或在我们不知道的其他地方。指标存储就是为了解决这个问题:
-
真实的单一来源——一个用于指标和维度的中央代码库和知识数据库。
-
数据仓库的代理——所有的展示工具(BI、报告、笔记本)通过指标存储的一个 API 请求 KPI。
指标存储还帮助你进行治理和缓存。但这超出了这里的讨论范围。
转换层与指标层——如何划分界限?
转换层是 ELT 中的 “T”,在逻辑上,它排在接收原始数据(“EL”)到我们的存储之后第二位。与度量层一样,“T”步骤在下游应用程序使用数据之前进行转换。你可能会问,这两层有什么不同?“T”的责任在哪里结束,度量存储的责任从哪里开始?Simon Späti 一针见血。
语义层在查询时转换/连接数据,而转换层在 ETL/ELT 的转换(T)步骤中进行,即在数据处理前已计算好。
转换层应无疑涵盖的步骤:
-
通过遵循一致的风格指南(如这个 dbt 风格指南),重新组织和重命名表格和列。
-
清理列数据类型,例如时间戳。
-
添加相关列,例如 margin = revenue minus cost。
-
修复已知的数据质量问题。
而汇总数据,如每月总收入,自然属于度量存储的责任。
将更多的转换步骤移到度量指标存储中会增加计算成本——远高于我们在存储方面节省的费用。因此,你可能需要将一些昂贵或经常请求的计算保留在“T”步骤中。这也是度量指标存储的物化和缓存功能可以帮助的地方。
为什么选择 Transform Data 的 MetricFlow
我们选择了MetricFlow有三个原因:
-
它是开源的,并且带有友好的许可证。
-
这是一个 Python 包,适合我们在教程中使用的数据栈。而且它容易配置。
-
dbt Labs 将收购 MetricFlow 背后的公司——这强烈表明 MetricFlow 在未来几年将会蓬勃发展。
想了解其他竞争语义空间的工具吗?请查看这个概述并阅读这篇文章。
教程第一部分——设置本地环境。
我们使用DuckDB进行存储,dbt进行转换层,MetricFlow 作为我们的度量指标存储,以及一个Streamlit应用程序用于展示。这四个工具都是 Python 包,可以舒适地安装在Conda 虚拟环境中。
但首先,我们需要安装 Postgres 和 MySQL,虽然我们使用的是 DuckDB,这两者都是 MetricFlow 包的依赖项。在我的 Mac 上,我需要执行以下操作:
brew install postgresql mysql
接下来,克隆 这个 GitHub 仓库,cd
到根目录,执行
conda env create -f environment.yml
并激活 conda activate local-mds
。
教程第二部分 — 生成和探索原始数据。
以下 Python 脚本生成合成数据并将其导入本地 DuckDB 数据库:
python src/generate-raw-data.py
“原始”数据包括四个表:accounts、sites、orders 和 fx rates。一个虚拟业务包含订单
con = duckdb.connect('data/data-mart.duckdb')
con.query('select * from raw.orders limit 5').df()
Id SiteIdDelivery DateBooked CurrencyCode Price Cost Type
0 o00000 s00018 2020-10-28 USD 13.44 9.36 Parts
1 o00001 s00032 2020-05-04 USD 84.74 49.30 Parts
2 o00002 s00009 2021-08-16 USD 76.38 41.19 Installation
3 o00003 s00025 2022-07-26 USD 25.51 9.99 Installation
4 o00004 s00038 2020-02-16 GBP 49.54 20.08 Parts
用不同货币预订的汇率
con.query('select * from raw.fx_rates limit 5').df()
Year Currency Rate
0 2020 Euro 1.10
1 2021 Euro 1.20
2 2022 Euro 1.15
3 2020 Pound Sterling 1.30
4 2021 Pound Sterling 1.40
并交付到网站
con.query('select * from raw.sites limit 5').df()
Id SiteOwnerId Region
0 s00000 a00000 Antarctica
1 s00001 a00001 Europe
2 s00002 a00002 South America
3 s00003 a00003 South America
4 s00004 a00004 South America
由拥有账户的客户拥有
con.query('select * from raw.accounts limit 5').df()
Id CompanyName BillingRegion
0 a00000 Cisco Systems, Inc. Antarctica
1 a00001 Asbury Automotive Group Europe
2 a00002 Helping Hand South America
3 a00003 Buena Vista Realty Service South America
4 a00004 The Pink Pig Tavern South America
教程第三部分 — 使用 dbt 转换数据。
我们的 git 仓库已经包含了一个名为 data_mart 的 dbt 项目。使用 dbt 转换数据就像编写 SQL 模板并将其放入“models”目录 data_mart/models/
一样简单。
我们遵循 dbt 的风格指南。首先,我们在 models/staging/
中创建一个“staging”模式。每个暂存模型都通过简单的重命名、转换和其他操作镜像原始数据。我们通过
-- data_mart/models/staging/stg_fx_rates.sql
select
Year::integer as year,
Currency as currency_name,
Rate as to_usd_rate
from raw.fx_rates
其他三个暂存表遵循非常类似的逻辑。
暂存层不应该被下游应用程序直接消费。为此,我们创建了第二层也是最终的转换层,“marts”。我们将货币名称解析为代码,以便它们与我们的订单中的代码匹配:
-- data_mart/models/marts/fct_fx_rates.sql
select
year,
case
when currency_name = 'Euro' then 'EUR'
when currency_name = 'Pound Sterling' then 'GBP'
else null
end as currency_code,
to_usd_rate
from {{ ref('stg_fx_rates') }}
我们使用这些汇率将所有订单金额转换为美元:
-- data_mart/models/marts/fct_orders.sql
with orders as (
select *,
extract('year' from booked_date)::integer as booked_year
from {{ ref('stg_orders') }}
), rates as (
select * from {{ ref('fct_fx_rates') }}
)
select
orders.order_id,
orders.deliver_to_site_id,
orders.order_type,
orders.currency_code,
orders.order_price_lcu,
orders.order_cost_lcu,
orders.order_price_lcu * rates.to_usd_rate as order_price_usd,
orders.order_cost_lcu * rates.to_usd_rate as order_cost_usd,
orders.booked_date
from orders
left join rates
on orders.booked_year = rates.year and orders.currency_code = rates.currency_code
注意我们如何引用最终的汇率表 — 这正是 dbt 发挥作用的地方!同时,也请注意,我们需要临时添加一个年份列,以便根据年份和货币代码连接汇率。
其他两个最终表只是暂存表的 1 对 1 复制,这使我们的 dbt 建模完成。我们通过以下三个步骤完成 dbt 练习:
- 我们将暂存物化为视图,将最终层物化为表,正如 dbt 风格指南中推荐的那样。我们可以通过更改 dbt 项目配置文件来最舒适地完成此操作:
# bottom of data_mart/dbt_project.yml
models:
data_mart:
+materialized: table
staging:
+materialized: view
+schema: staging
marts:
+materialized: table
+schema: marts
2. 我们配置与数据库的连接:
# $HOME/.dbt/profiles.yml
data_mart:
outputs:
dev:
type: duckdb
path: <path-to-data-mart.duckdb> # replace with absolute path
target: dev
3. 最后,我们在命令行中将所有模型物化为数据库中的表:
dbt run --project-dir data_mart/
我们可以通过查询任何新表来验证这一步。比如,
con = duckdb.connect('data/data-mart.duckdb')
con.query('select * from main_marts.fct_orders limit 5').df()
order_id deliver_to_site_id ... order_cost_usd booked_date
0 o00000 s00048 ... 10.2960 2020-10-28
1 o00010 s00033 ... 86.1250 2020-01-21
2 o00014 s00039 ... 20.8725 2022-04-25
3 o00015 s00035 ... 32.8580 2021-08-18
4 o00019 s00026 ... 0.3410 2020-07-27
教程第四部分 — 指标和维度
回顾一下,指标存储定义了指标以及我们可以在哪些维度上计算这些指标。专门的地方在于我们 git 仓库根目录下的 metrics/
目录。
MetricFlow 中的两个主要对象是数据源和指标。与 dbt 不同的是,我们在 YAML 中配置这些对象。然后,由指标存储负责将请求转换为 SQL 并在我们的数据库中执行它们。
让我们先从指标的规范开始。我们在同一个 YAML 文件中定义了两个:
# metrics/metrics.yml
metric:
name: order_revenue_usd
type: measure_proxy
type_params:
measure: order_revenue_usd
---
metric:
name: order_margin_percent
type: expr
type_params:
expr: (order_profit_usd / order_revenue_usd) * 100
measures:
- order_profit_usd
- order_revenue_usd
MetricFlow 提供了几种不同的方法来定义度量,选择几种类型。类型measure_proxy接受任何已定义的度量并应用其默认的聚合策略。类型expr允许我们使用 SQL 语法。我们在数据源中定义度量和聚合策略。以下是我们对源orders的规范:
# metrics/source_orders.yml
data_source:
name: orders # must be unique across all sources
description: Master table customer orders.
sql_table: main_marts.fct_orders # the corresponding database table
identifiers: # primary and foreign keys
- name: order_id
type: primary
- name: site_id
type: foreign
expr: deliver_to_site_id
measures:
- name: order_revenue_usd
description: The total order revenue in USD.
expr: order_price_usd
agg: sum
- name: order_profit_usd
description: The profit of orders in USD.
expr: order_price_usd - order_cost_usd
agg: sum
dimensions: # temporal or categorical attributes, or "dimensions"
- name: order_type
type: categorical
- name: booked_date
type: time
type_params:
is_primary: true
time_granularity: day
mutability: # only relevant for caching
type: immutable
我们可以在相应部分指定的每个维度上汇总度量。通过使用指定的外键标识符,我们甚至可以使用来自其他数据源的维度进行汇总。
一个“标识符”指向一个外部数据源,即
# metrics/source_sites.yml
data_source:
name: sites
description: Master table customer sites.
sql_table: main_marts.dim_sites
identifiers:
- name: site_id
type: primary
- name: account_id
type: foreign
expr: owner_account_id
dimensions:
- name: site_region
type: categorical
mutability:
type: immutable
有了这个,我们可以计算不同站点区域的订单指标。由于站点通过另一个外键规范与账户相关联,我们甚至可以跨站点客户维度计算订单指标。
使用 YAML 的关键点在于其简洁性。你不需要深入的工程经验就能理解规范。下次业务询问你某个度量是如何定义的,请指向 YAML 中的相应规范。
最后,我们需要将 MetricFlow 连接到我们的数据库:
# $HOME/.metricflow/config.yml
model_path: <path-to-the-metrics-directory> # <repo-root>/metrics
dwh_schema: main_marts
dwh_dialect: duckdb
dwh_database: <path-to-data-mart.duckdb> # <repo-root>/data/data-mart.duckdb
你可以通过在命令行上执行以下操作来验证连接:
mf health-check
教程第五部分 — MetricFlow API 实践
传统上,度量定义在多个地方:隐藏在 BI 应用程序、报告实现、Jupyter 笔记本等中。我们通过将度量和维度移动到一个地方——度量存储,克服了这个问题。但这项变更只有在我们的度量存储与数据栈良好集成时才有效。我们的 BI 应用引擎知道如何与 MetricFlow 通信吗?对一些应用是正确的,但对许多其他应用是不正确的。
和许多其他 MDS 类别一样,与当前技术栈的集成将驱动你对度量存储解决方案的选择。下面我们使用 MetricFlow 的 CLI 和 Python 接口。后者适用于任何使用 Python 的 BI 工具,如 Streamlit。
我们从命令行的第一个示例开始:
mf query --metrics order_revenue_usd --dimensions booked_date__year --order booked_date__year
✔ Success 🦄 - query completed after 0.25 seconds
| booked_date__year | order_revenue_usd |
|:--------------------|--------------------:|
| 2020-01-01 00:00:00 | 290906.78 |
| 2021-01-01 00:00:00 | 316765.36 |
| 2022-01-01 00:00:00 | 196059.51 |
我们使用了两个配置度量中的一个,并将时间作为唯一维度。请注意,MetricFlow 允许我们通过简单地添加**__year**来切换到年度粒度。查看文档以了解其他选项。
第二个示例通过使用第二个度量和来自外键关系的第二个维度增加了复杂性:
mf query --metrics order_revenue_usd,order_margin_percent --dimensions booked_date__year,site_id__account_id__account_region --order booked_date__year
✔ Success 🦄 - query completed after 0.56 seconds
| booked_date__year | site_id__account_id__account_region | order_revenue_usd | order_margin_percent |
|:--------------------|:--------------------------------------|--------------------:|-----------------------:|
| 2020-01-01 00:00:00 | North America | 41072.23 | 54.35 |
| 2020-01-01 00:00:00 | South America | 74438.04 | 50.04 |
| 2020-01-01 00:00:00 | Asia | 11014.66 | 53.45 |
| 2020-01-01 00:00:00 | Europe | 16931.01 | 50.34 |
| 2020-01-01 00:00:00 | Australia | 86869.00 | 50.86 |
| 2020-01-01 00:00:00 | Antarctica | 16628.68 | 54.75 |
| 2020-01-01 00:00:00 | Africa | 43953.17 | 51.79 |
| 2021-01-01 00:00:00 | Africa | 41805.07 | 51.56 |
| 2021-01-01 00:00:00 | Australia | 96069.27 | 52.88 |
| 2021-01-01 00:00:00 | Antarctica | 20648.17 | 52.80 |
| 2021-01-01 00:00:00 | North America | 42920.44 | 53.30 |
| 2021-01-01 00:00:00 | South America | 83231.81 | 51.95 |
| 2021-01-01 00:00:00 | Europe | 19789.86 | 52.43 |
| 2021-01-01 00:00:00 | Asia | 12300.75 | 53.04 |
| 2022-01-01 00:00:00 | South America | 51114.66 | 50.94 |
| 2022-01-01 00:00:00 | Africa | 27058.34 | 53.68 |
| 2022-01-01 00:00:00 | Europe | 11311.23 | 55.24 |
| 2022-01-01 00:00:00 | Asia | 8608.74 | 51.16 |
| 2022-01-01 00:00:00 | North America | 27818.37 | 56.11 |
| 2022-01-01 00:00:00 | Australia | 60342.90 | 50.47 |
| 2022-01-01 00:00:00 | Antarctica | 9805.27 | 54.43 |
接下来,我们用以下命令启动我们的 Streamlit 应用:
streamlit run src/app.py
在应用程序的实现细节中,你将找到后端如何在显示数据之前提取数据:
import streamlit as st
from metricflow import MetricFlowClient
client = MetricFlowClient.from_config()
@st.cache_data
def load_data(metric: str, granularity: str = 'month'):
data = client.query(metrics=[metric],
dimensions=['site_id__site_region', f'metric_time__{granularity}'],
order=[f'metric_time__{granularity}']).result_df
data.columns = ['Period', 'Region', metric]
return data
再次是 MetricFlow 在幕后完成繁重的工作。不论我们选择哪种 MetricFlow API,数据都将是相同的。
结论
你是否也厌倦了讨论为什么在不同的应用程序中“相同”维度上的“相同” KPI 显示不同的数字?另一方面,如果对像上个季度总收入这样基本的事情没有共识,也是很烦人的。那么,哪里出了问题?以下是我个人经验中的一些例子:
-
销售部门通过“关闭日期”将收入记录分配到一个季度,而财务部门则通过“记账日期”来分配。
-
在聚合之前,需要删除一些收入记录,例如,因为它们与取消相关。这些规则可能比通过单个布尔“IsValid”列进行过滤更复杂。有时,不同的业务单元之间没有达成共识。不同的规则在雷达下被应用。
-
我们有不同货币的交易。对于每个时间点,应用哪个汇率也没有共识。
避免这些陷阱的唯一方法是:停止在孤立环境中实施转型管道。相反,使用单一的数据模型和一个地方来定义指标和维度。销售和财务是否都需要自己的收入 KPI?创建两个,并将它们放入指标库中,以便每个人都能解释差异。
微软与谷歌:语言模型是否会超越搜索引擎?
原文:
towardsdatascience.com/microsoft-vs-google-will-language-models-overtake-search-engines-4e9590bed232
评论
如果微软更名 Bing,我会考虑……
·发表于 Towards Data Science ·阅读时间 12 分钟·2023 年 1 月 10 日
–
巨头之战。图片来源:Midjourney
有传言称微软已经启动了一个项目,预计将在未来几年内对科技领域产生影响。正如The Verge 的 Tom Warren 所写的那样,这家软件巨头“据说计划推出一个使用 ChatGPT 的 Bing 版本。”二十年来,搜索领域即将迎来一场革命。
这条不令人惊讶的消息是在微软的合作伙伴 OpenAI 发布了ChatGPT,一个为对话优化的强大语言模型之后一个月传出的,我认为这是世界上最好的聊天机器人——虽然可能不会持续太久。
在 ChatGPT 于 11 月 30 日发布之后,人们迅速意识到其存在带来了语言模型(LM)在短期内超越传统搜索引擎(SE)作为在线信息检索主要手段的非忽视概率。进一步说,这意味着谷歌在搜索领域二十年的霸主地位可能面临威胁。
微软(尚未正式宣布)的声明重新点燃了语言模型与搜索引擎的辩论,尽管没人知道事件将如何发展,但有一个共识;无论如何,语言模型和搜索在未来很可能将成为一个更大整体中不可分割的部分。
就像重力把我们拉向地面一样,技术自发地流动——如热力学中所用——在一个方向上:让我们的生活更轻松。语言模型更具直观性,与它们的交互对我们来说是自然的。搜索引擎要么改变,要么消亡,这似乎是一个不可避免的结果。
我知道,这听起来像是你典型的泛泛而谈的不可证伪的预测。幸运的是,我们可以揭示一些未知的问题:ChatGPT 是否对 Google 构成真实威胁?微软能否推翻 Google?搜索巨头能否做出适当反应?最终哪家公司会脱颖而出?语言模型会取代搜索吗?还是会补充它?语言模型将在什么方面改善或削弱搜索?这一切将如何以及何时发生?
让我们尝试回答这些问题,了解未来语言模型和搜索引擎将如何互动,微软、谷歌和 OpenAI 对此有何看法,以及我认为未来几个月/几年将如何发展。
这篇文章摘自 算法桥梁,这是一本旨在弥合算法与人们之间差距的教育通讯。它将帮助你理解 AI 对你生活的影响,并发展出更好地应对未来的工具。
弥合算法与人们之间的差距。关于对你有意义的 AI 的通讯。点击阅读《The…》
thealgorithmicbridge.substack.com
语言模型与搜索引擎
一位名为 josh 的 Twitter 用户在 ChatGPT 公开的那一天首先指出:“谷歌完了。”其他人,比如现在已退出 Twitter 的乔治·霍兹,也同意这一观点——但并不是所有人都得出了相同的结论。
加里·马库斯教授用实证证据回应了乔治·霍兹的观点,谷歌的弗朗索瓦·肖莱也指出了类似的问题:“搜索是搜索问题,而不是生成问题:”
我同意马库斯和肖莱的观点。语言模型本身无法超越搜索引擎。然而,搜索引擎可以显著改进,达到那些未集成基于语言模型的特性就会变得过时的地步。
如果我们接受这个假设,很容易看出,最适合将语言模型和搜索结合起来的公司是谷歌。不是 OpenAI,不是微软。即便是分别来看,谷歌在这两个领域的世界领先地位也无与伦比。尽管 OpenAI 很受欢迎,GPT-3、ChatGPT 以及所有类似的模型都基于谷歌的技术,而且谷歌的搜索引擎占据了市场份额的 4/5。
如果这家公司没有推出太多的 AI 产品,那是因为其“制度惯性”,正如Stability 的 Emad Mostaque 所说。在研究深度和广度方面,谷歌无疑是全球领先的 AI 公司。
然而,正如受欢迎的投资者Balaji Srinivasan 所解释,研究和生产是两种不同的事物:谷歌不能冒着从头重构其搜索引擎以通过语言模型提升其功能的风险。这家公司多年来推出了新的搜索功能和渐进式的改进,但没有像微软——以及像Perplexity、You、和Neeva——那样的革命性进展。
我对语言模型与搜索引擎的看法可以总结如下:“搜索引擎的局限性要大得多,但在[搜索网络]的任务上装备更好……[但是] 我认为[传统的]搜索引擎将无法在语言模型面前存活。”这里的关键词——我在原文中没有提到——是“传统的”。
搜索引擎将会存在,但它们会变得如此不同,以至于难以辨认。语言模型很可能是原因所在。
(我不会详细讨论将语言模型整合进搜索引擎是否是个好主意。Gary Marcus 有一篇很棒的文章,我几乎完全同意他的观点:“ChatGPT 是否真的对谷歌搜索构成‘红色警报’?”)
微软与谷歌:技术时代的大战
微软对 OpenAI 的 10 亿美元投资——以及获得的独家许可证——明确表明了其对这一领域的兴趣。毫不奇怪,他们计划将DALL-E和 ChatGPT 整合进他们的服务中。增强版的 Bing 搜索引擎可能会“挑战谷歌的主导地位”,正如 Tom Warren所写。
当然,这个想法并不是用语言模型来取代搜索引擎,而是为了补充它。一位微软发言人告诉彭博社,“对用户查询的对话式和上下文回应将通过提供超越链接的高质量答案来赢得搜索用户的青睐。”
不像谷歌,微软非常清楚语言模型不如搜索引擎可靠。公司必须评估实现那些人们无法 100%依赖的功能的风险与其在与谷歌竞争中的潜在收益。微软正在“权衡…聊天机器人的准确性[以及]初始发布可能是对少数用户的有限测试。”听起来是一个合理的开始。
然而,如果有人比微软更了解语言模型能做什么和不能做什么,那就是谷歌。在一篇2021 年的论文中——这篇论文发布的时间远早于 ChatGPT 成为构想的种子——谷歌研究人员探讨了使用语言模型来“重新思考搜索”的问题。
他们考虑了是否可以做到,更重要的是,是否应该做到:
“传统的信息检索系统 [即传统的搜索引擎] 不直接回答信息需求,而是提供对(希望是权威的)答案的参考。
…
相对而言,预训练语言模型能够直接生成可能响应信息需求的文章,但目前它们只是外行而非领域专家——它们对世界并没有真正的理解,容易产生幻觉,至关重要的是,它们无法通过引用它们所训练过的语料库中的支持文档来证明自己的言论。”
谷歌最终得出的结论是,使用类似 ChatGPT 的系统来提升其搜索引擎会带来较高的“声誉风险”。首席执行官桑达尔·皮查伊和 AI 负责人杰夫·迪安告诉 CNBC,“如果出现问题,成本将比 OpenAI 更高,因为人们必须信任他们从谷歌获得的答案。”
谷歌在 2021 年 5 月宣布了 LaMDA(但没有发布)。鉴于 LaMDA 与 ChatGPT 相当——如果不是更好,正如 Blake Lemoine 所称——有理由质疑为什么谷歌没有利用它来规避像 OpenAI 这样的威胁。Balaji Srinivasan 预测这是因为公司没有足够的“风险预算”,事实证明,他是对的。
像谷歌这样的大公司,为数十亿用户(而非像 OpenAI 那样的几百万用户)提供的高可靠性服务,如谷歌搜索,不能仅仅因为某项新技术似乎是未来趋势并且大家都疯狂追捧就冒险嵌入一个不值得信赖、未经严格测试的技术。
但 Google 高管并不是傻子。他们知道 ChatGPT,尽管由一家规模更小、风险规避程度较低的公司拥有,却确实是一个威胁——尤其是当像微软这样的直接竞争对手在其中拥有大量股份时。这就是为什么他们将 ChatGPT 宣布为“红色警报”,正如 纽约时报 报道的那样:
“…随着一种新型聊天机器人技术的出现,可能会重新定义甚至取代传统搜索引擎,Google 可能面临对其主要搜索业务的第一次严重威胁。一位 Google 高管描述这些努力是决定 Google 未来的关键。”
…
“Google 必须投入其中,否则行业可能会在没有它的情况下继续发展…”
就目前的情况而言,Google 面临着微软——在搜索领域是一个强劲的直接竞争对手——以及 OpenAI——拥有类似的 AI 技术,尽管预算要紧张得多——同时,还要平衡由于语言模型固有的不可靠性和它们在低风险规避初创公司手中构成的明显威胁所带来的声誉风险。
正如 皮查伊所说,Google 必须“大胆且负责任”,并找到一个折衷解决方案。“我们必须做到这一点,这非常重要,”迪恩总结道。
我的对事件发展如何展开的预测
鉴于目前的情况,我认为有三个关键点需要关注,以理解将会发生什么以及如何发生。首先,Google 真的在与谁竞争,以至于将“声誉风险”报告为前进的主要障碍?第二,是否可能通过语言模型和当前的 AI 安全/对齐技术“做到正确”?第三,即使可以做到,公司也认为应该这样做,是否能从中衍生出一个可行的商业模式?
Google 的真正敌人
当我阅读了关于 ChatGPT 威胁的 皮查伊和迪恩的论点 时,我注意到了一些奇怪的地方:他们似乎在暗示 Google 正在与 OpenAI 竞争。确实,OpenAI 的技术被 Google 高管称为“红色警报”,但我认为 OpenAI 并不是 Google 的威胁——这是错误的框架。
一方面,OpenAI 无法在技术研究和 AI 专业知识方面与 Google 竞争。Google 的预算和人才远远超过 OpenAI——即使只是从数量上来看。正如 Emad Mostaque 论述的:
另一方面,OpenAI 不想 与 Google 竞争。
OpenAI 的声誉风险远低于 Google,因为它是一家相对较新且规模较小的公司,最多为几百万用户提供服务,而估计声称 Google 搜索被全球超过 40 亿人使用,占据了令人瞩目的84%市场份额。
然而,OpenAI 报告的使命是建立一种有益的通用人工智能(AGI)。他们为什么要冒着与主要目标完全不重叠的大公司竞争的风险呢?
即使 OpenAI 主要关注经济利润(不可否认,取代 Google 会导致一个极其成功的赚钱机器),公司也有更好的选择,不会与其长期目标冲突,比如设置付费订阅或按需付费模式,正如他们现在所做的(例如 GPT-3 和 DALL-E)。
在影响力、规模、预算以及最重要的目标方面,Google 的真正竞争对手是微软。但以这种方式看,Google 面临的 更高 声誉风险的论点就会崩溃。微软的用户数量与 Google 相当,公司也必须照顾其精心建立的声誉——正如其在 2016 年关闭种族主义聊天机器人 Tay 的决定所示。
支持“声誉风险”观点的一点是微软的搜索市场份额与 Google 不可同日而语。然而,如果微软成功地将语言模型和搜索结合起来,他们将增加用户数量,因此声誉风险也会相应增加。
剩下的问题是微软是否愿意决定将 ChatGPT 集成到 Bing 中,冒着声誉风险,因为用户可能因新服务的更强大功能而被吸引,只为有机会取代 Google。
Google 打算如何应对这一点?
“做对事情”是一个听起来很美好的目标,但实际上不可行。
Jeff Dean 解释 Google 正在等待“做对事情”的说法让我想起了我对将伦理原则融入 AI 模型和对抗虚假信息的重要性的更为乐观的看法。我认为这些努力至关重要,我会继续坚持这一观点,但我能看到,虽然在理论上它们是值得尊敬的,但在实践中几乎变得难以忍受。
在我看来,只有完全重新定义、重新设计和重建语言模型(LMs),才能符合 Dean 所指的那种标准。如果正如 Gary Marcus 所建议的那样,它们根本不具备真实、准确、可靠和中立的能力,那么无论多少临时性保护措施都无法遏制语言模型数据驱动核心所带来的恶劣本质。
也许,一旦公司尝试将 SE 与 LM 结合,前者的所有关键特性就会被 LMs 的功能设计缺陷所破坏。Marcus 在对 Perplexity、Neeva 和 You 的分析中提供了大量证据。他的结论保持了对未来的希望,但目前解决了这一争论:
“我能说的最好的事情是,Perplexity.ai 和 you.com 的聊天确实在探索一个有趣的想法:结合经典搜索引擎与大型语言模型的混合体,可能允许更快速的更新。但仍然有 许多 工作需要完成,以正确整合这两者,即经典搜索和大型语言模型。”
另一个问题是当前最先进的 AI 对齐技术是否足够好或朝着正确的目标发展。Scott Alexander 写了一篇很好的文章讨论了通过人类反馈进行强化学习(RLHF)的局限性,而 ChatGPT 使用这种方法,并且似乎是公司阻止 LMs 行为缺陷的唯一方法。
Alexander 直言不讳地说:“RLHF 效果不是很好。”正如我在我的 ChatGPT 文章中所写的,“人们可以‘轻松’通过其过滤器,它也容易受到提示注入的影响。”经过 RLHF 优化的模型还可能进入优先级冲突的循环。Alexander 表示,“惩罚无用的答案会使 AI 更可能给出错误的答案;惩罚错误的答案会使 AI 更可能给出冒犯性的答案;等等。”同时生成有用、真实且不冒犯的响应可能是不可能的。
此外,如果 LM 在 RLHF 中的改进是渐近的,正如 Alexander 所思考的,我们将永远无法“做到正确”——然而,由于这是表现最佳的方法,公司没有动力花费时间和资源去研究另一种可能——也可能——同样有效的方法。
如果上述所有情况都属实——LMs 本质上不适合搜索,而我们能访问的最佳技术也只是平庸的——那么短期内不会有一个“做到正确”的时刻,就如 Jeff Dean 所希望的那样——而 Google 也需要。
谷歌将面临一个困境:一方面,他们可以让微软领先,承担“声誉风险”,有可能重新定义搜索的未来,成为该领域的下一个霸主。另一方面,他们可以决定“做对”是一个过于宏大的目标,自行承担声誉风险,配合一些公关手段(例如“我们尽了最大努力”)和不成熟的功能(例如“现在效果更好”)——但最终在 AI 和搜索领域保持领先,并在未来几十年继续竞争。
如果谷歌不得不在声誉和生存之间做出选择,我想我们都知道会发生什么。
基于语言模型的搜索是否与盈利兼容?
但挑战的最后部分,如果一切对谷歌来说顺利,将会是一个不可避免的障碍。微软也不会摆脱这一困境。如果搜索通过广告业务模型是有利可图的,那么当无需点击任何东西时,企业如何从基于语言模型的搜索中获利呢?
如果谷歌在领先的情况下,能否找到一种方法,在基于语言模型的搜索周围建立护城河,同时围绕语言模型+搜索构建一种新的可行商业模型?谷歌的 PageRank 算法结合广告模型二十年前是无敌的组合。谷歌能否重现这一壮举?
当然,不用说,如果我们能享受一个没有广告的互联网,那将是很棒的。然而,另一种选择是将搜索转变为付费服务。人们愿意接受这种反惯性的改变吗?
我看到的一个替代可能性(可能只是一个疯狂的假设)是,微软可能决定通过将搜索变成无盈利的服务(没有广告或其他任何形式的盈利)来商品化搜索,目的是在几年内有效地将谷歌从市场中移除。
然而,还有其他问题可能阻止微软尝试这一点。正如 Marcus 在他的文章中解释的那样,当前的搜索比语言模型便宜得多,而且速度更快。这意味着利润更少,这是公司所厌恶的。微软将同时耗费资金与谷歌竞争,这将使双方陷入一个非常冒险的商业操作。
不论最终结果如何,很明显,搜索空间,已经停滞了近二十年,即将经历一个前所未有的拐点。
订阅 The Algorithmic Bridge。弥合算法与人们之间的差距。关于对你的生活重要的 AI 的新闻通讯。
你也可以通过使用我的推荐链接直接在 Medium 上支持我的工作,并成为会员,获得无限访问权限 这里 😃
微软的新 AI 方法预测分子如何移动和功能
被称为“Distributional Graphormer”的技术,可能会启动 AI 在化学和生物科学领域的下一步革命。
LucianoSphere (Luciano Abriata, PhD)
·发布于 Towards Data Science ·阅读时间 9 分钟·2023 年 7 月 20 日
–
图 1. 分子(橙色)的草图,采用三种不同的结构(x 轴),每种结构具有不同的能量(y 轴)。这被称为分子由于运动可以探索的“构象景观”。局部或全局最小值的能量越低,分子在结构间的转换时间就越长(绿色箭头)。虽然像 AlphaFold 这样的常规结构预测方法旨在找到对应于最低能量结构的中心最小值,但现在的圣杯是找到可能结构的完整分布及其概率。见图 2 和文本以获取更多解释。图片由作者绘制。
“我们能否不仅预测静态蛋白质结构,还能预测其结构多样性?”——这是我大约一年前在 AlphaFold 2 的兴奋逐渐平息时提出的问题:
[## 我们能否不仅预测静态蛋白质结构,还能预测其结构多样性?
最近的一项研究以特殊方式应用 AlphaFold 2,表明这可能是可行的。
medium.com](https://medium.com/advances-in-biological-science/can-we-predict-not-only-static-protein-structures-but-also-their-structural-diversity-fa1d9380fc34?source=post_page-----93d47e246b5d--------------------------------)
看起来,微软的团队将人工智能应用于科学(与一位著名教授合作,见最后的注释)可能会首先以“是”的答案来回应我的问题。他们刚刚展示了他们的新型“Distributional Graphormer”,它不仅可以预测单一分子结构(蛋白质或其他分子或材料),还可以实际预测分子或材料在三维空间中可以采用的多种替代结构(或“构象”)。也就是说,它们的原子在空间中可以采取的不同排列。此外,新的 AI 模型还“理解”不同结构将具有不同的能量,从而在不同程度上被占据;因此,新的模型可以训练来预测在分子运动过程中不同构象之间的热力学交换。
在其第一个版本中实现的 Distributional Graphormer 可以解析任何类型的分子。事实上,介绍该模型的预印本描述了其在预测蛋白质运动(我在上面的问题中称之为“结构多样性”)、蛋白质如何结合小分子(包括酶底物、药物、代谢物等)、分子如何在催化剂表面吸附以及碳结构如何在电子导电性质上进行调节等任务中的应用示例。
阅读下去可以详细了解这些内容,进一步了解模型,并掌握它可能对现代化学和生物学的影响。
Graphormer 的演变
微软的新 Distributional Graphormer 源自他们在 2021 年推出的 Graphormer,旨在加速从制药到材料的分子科学 AI 研究和应用。Graphormer 本身是一个深度学习算法和包,帮助研究人员和开发人员训练用于分子建模任务的自定义模型。
作为一种算法,Graphormer 是一种改进的变换器,更好地处理图表示,特别适用于描述神经网络中的分子,将其结构编码到模型中。例如,看看这些描述符如何帮助神经网络处理分子这里或这里。要了解更多,请查看这篇预印本,微软团队介绍了几种简单但有效的结构编码方法,并描述了 Graphormer 的表现力,包括具体示例。
Transformer 架构已经在许多领域成为主流选择,例如自然语言处理等。
作为一个包,Graphormer 提供了对各种分子模拟任务的支持,例如分子动力学模拟和属性预测,这两个元素都用于新工作:模拟以探究分子如何移动以改变原子的位置,从而根据需要改变形状,例如蛋白质构象探索;以及属性预测,例如将分子结构与属性相关联,如碳结构调节电子导电性。你可以在这里了解关于这个包的更多信息,包括研究人员和开发人员对它进行的多个测试:
## Graphormer - Microsoft Research
Graphormer 是一个深度学习包,允许研究人员和开发人员训练自定义分子模型……
在预测静态结构之后,AI 进入分子运动的预测
如果应用于科学的 AI 方法到目前为止主要集中在预测“静态”分子结构上,例如 AlphaFold 2 的成功 (参见这里),那么最终目标现在转向一个更加困难的目标:理解分子结构如何与功能相关。
这需要理解属性是如何从结构中产生的,即从空间中原子的三维排列,以及这些排列如何随着时间变化。后者被称为“内部分子动力学”,指的是原子相对彼此的位移,与简单扩散不同,后者中所有原子一起移动和旋转,从而整体上不改变分子的形状。这里有两个经历这种“内部动态”的分子系统的例子,通过经典物理模拟 - 首先是一个碳纳米管的振动,其次是一个蛋白质的折叠:
内部分子动力学,简称“分子动力学”或“结构构象”,源于非常快速且几乎是随机的热原子运动与较慢但规模更大且协调的多个原子的集体运动之间的耦合。举例来说,两个相互连接的原子可能在飞秒到皮秒的时间尺度上振动,而对其周围环境并不“察觉”,但由于热波动而运动的一堆相互连接的原子会在纳秒或微秒时间尺度上逐渐演化出集体运动,这可能导致分子的一部分发生显著移动,从而改变其整体形状和性质。
例如,在蛋白质中,平均结构中可能无法接触到的区域可能会因其内部动态而暂时暴露,从而允许例如底物分子的进入。这在蛋白质研究中被广泛研究,因为它是大多数甚至所有蛋白质功能的核心——这一主题我从“经典”分子动力学计算的角度在这里有所提及:
各种复杂程度、成功率和应用的计算方法概述,以及关键…
medium.com](https://medium.com/advances-in-biological-science/how-computer-modeling-simulations-and-artificial-intelligence-impact-protein-engineering-in-4d8473bd59ff?source=post_page-----93d47e246b5d--------------------------------)
文章中描述的模拟类型,本质上是模拟物理并整合牛顿运动方程,这些模拟非常强大,但在计算能力方面要求极高,因此运行速度非常慢,更不用说收敛了。因此,如果能够在不实际运行任何分子模拟的情况下快速预测分子可以采用的替代构象及其运动方式,那将是一个巨大的进步。这正是许多大型人工智能实验室目前正在追求的目标,微软的新模型也许会有所不同。
微软的分布式图形变换器提供了一个初步的方法,这是一种深度学习框架,能够处理不仅是单一而是多个分子的结构或材料的结构,还包括热力学景观,这些景观衡量了观察每种结构的可能性。当我们谈论一个蛋白质及其结构时,我们通常指的是一个通过实验确定或建模的非常稳定的构象。但一个真实的蛋白质溶液包含无数个副本,每个副本都采用来自一组可能状态中的某种结构,这些状态有不同的观察概率。在这个“景观”选项中,最稳定的结构(就自由能而言,即能量和熵的组合)是最常见的,这意味着在某一时刻更多的分子副本会采用对应的结构。更重要的是,由于其内部动态,蛋白质可以改变其结构,从而有效地“跳跃”到另一个常见状态,在短暂的时间内通过一个由自由能不青睐的“非可能”状态进行过渡。通常,由于热波动,蛋白质会持续改变结构,平均而言更多时间保持在最稳定的状态。所有可能结构及其分布的集合就是所有生物学家希望预测的“热力学构象景观”——而且即使通过实验也非常难以获得。
图 2. 一个非常简单的、一维的分子构象景观(橙色),它可以采用比如说三种主要结构:最稳定的一个在中心,通常是通过实验方法“确定”的或通过常规结构预测方法“预测”的;还有两个具有稍高自由能的替代状态,这意味着在给定的温度下它们的存在几率较低。真实的构象景观是多维的,因为多个分子自由度可以贡献于结构的多样性。图中的绿色线条示例了状态之间的过渡路径,这实际上发生在真实分子中的多个维度上。图由作者绘制。
分布式变换器的作用
尽管机器学习在过去 3 到 4 年里通过 AlphaFold 对蛋白质的特定应用极大地改善了分子结构预测,但许多现实世界的应用需要理解从结构分布中得出的宏观观察,而不是单一的结构——即我刚刚解释的构象景观。科学家们用来采样这些分布的常规方法,通常基于分子动力学模拟,使用某种物理或数据驱动的势能模型,计算开销很大。非常昂贵。
微软的 Distributional Graphormer 是首个解决这一挑战的工具,它通过利用深度神经网络将简单的起始分布(如高斯分布)转化为通过分子系统描述符条件化的平衡分布的预测。简单分布到粗略景观的扩展是通过类似于热力学中的模拟退火模拟的扩散过程实现的。
为了指导状态分布的学习,该架构可以在转换过程中使用不同类型的数据或信息进行训练,例如专门构建的能量函数、通过分子动力学模拟生成的数据等。在训练过程中,Distributional Graphormer 旨在最小化为每个状态预测的概率与作为训练提供的概率之间的差异。
值得注意的是,这种方法允许利用系统的先验知识,对于广泛研究的分子而言,这种知识可能相当丰富。但显然,Distributional Graphormer 也表现出良好的泛化能力,这可能是因为它继承了先进深度学习架构的优点,并将其应用于分布预测这一新的挑战性任务。
多样性通过不同的应用场景得到验证
Distributional Graphormer 高效地生成多样的构象,并提供状态密度的估计,从而接近对相关分子构象景观的描述。展示 Distributional Graphormer 的预印本和博客文章已经展示了该框架在多个分子任务中的应用,包括蛋白质构象采样、配体与蛋白质结构结合、分子在催化剂上的吸附以及通过调节材料属性引导结构生成。
在蛋白质构象采样中,如果你关注我的工作,你会知道我可以更深入地探讨,Distributional Graphormer 被证明能够成功生成一些研究较多的蛋白质的结构和构象景观,与分子动力学模拟相比,展示了良好的构象景观覆盖范围,但生成速度要快得多。一些例子还展示了该模型生成具有多个实验上已知的亚稳态结构的蛋白质功能性构象状态的能力。此外,这些例子还展示了在某些情况下,Distributional Graphormer 输出的构象景观预测了不同构象之间相互转换的合理路径,从而更深入地理解蛋白质动态。
在配体结合结构生成中,分布图变换器被展示为能够预测配体在多个示例蛋白质的口袋中的结合姿态。一个类似的任务,但涉及完全不同类型的原子,证明了模型框架的灵活性,预印本和博客展示了它如何有效地采样催化表面的吸附体配置,这对理解催化过程至关重要。
最后,预印本和博客展示了该模型如何通过电子带隙预测器实现基于属性的结构生成。通过逐步优化简单的分布,该模型生成了具有目标带隙值的碳结构,包括一些已知的碳晶体,如钻石和石墨。
上述示例表明,至少核心思想在分布图变换器中得到了实现,并且在有足够的训练数据的情况下,它可以成为一个非常强大的工具。毫无疑问,它可以促进深度学习在分子系统中进一步发展,对制药、生物技术、材料科学等领域产生直接影响。作为基础模型,它还可以为分子科学领域开辟新的研究机会,并通过数据构建为复杂分子系统的统计理解铺平新道路。
参考文献
由微软 AI4Science 和量子部门的研究人员主导的 arXiv 预印本,包括科学家 Frank Noe。后者是柏林自由大学的微软合作研究经理,是我最欣赏的现代科学家之一。他是分子模拟领域中较年轻的世界领导者之一,将严谨的理论方法与务实的应用结合在一起。他现在当然在大量探索 AI 方法,提出了深度学习系统辅助分子模拟的第一个要素,如 Boltzmann Generator。过去,他做出了各种贡献,其中最有趣的是他开创了使用马尔科夫状态模型描述分子力学的方法。
深度学习的进展大大提升了分子结构预测的能力。然而,许多宏观…
微软的两个类似博客的条目,以更易于理解的格式解释了这项工作:
[## 预测分子系统的平衡分布的深度学习方法
预测分子系统的平衡分布的深度学习方法
分布式图变换器:朝着分子系统平衡分布预测的方向 [## 分布式图变换器:朝着分子系统平衡分布预测的方向
分布式图变换器,微软新推出的深度学习框架,用于预测…
www.microsoft.com](https://www.microsoft.com/en-us/research/blog/distributional-graphormer-toward-equilibrium-distribution-prediction-for-molecular-systems/?source=post_page-----93d47e246b5d--------------------------------)
www.lucianoabriata.com 我写作和拍摄关于我广泛兴趣范围内的一切:自然、科学、技术、编程等。
在这里小费我 或 成为 Medium 会员 以访问所有故事(我会获得少量收入,对你没有成本)。 订阅以获取我的新故事 通过电子邮件*。 关于小工作的咨询 请在我的 服务页面。你可以 在这里联系我。
迁移数据?充分利用产品本身!
原文:
towardsdatascience.com/migrating-data-make-the-most-of-the-product-itself-b79b56d5e6c1
利用产品功能使数据迁移过程更轻松
·发布在Towards Data Science ·7 分钟阅读·2023 年 3 月 1 日
–
在这篇文章中,我想分享我过去在数据迁移项目中的一些关键经验。我的公司正在将内部 CRM 系统迁移到 Salesforce,我负责促进数据迁移过程。在过程中我遇到了许多障碍,但我都克服了它们。下面列出了帮助我完成项目的最佳实践。如果你目前正在进行或计划进行数据迁移项目,这篇文章适合你。如果你对这个问题完全陌生,我尝试保持语言简洁,以便你可以跟随并大致了解数据迁移项目的运作方式。尽管我使用的是与 Salesforce 更相关的示例,你可能会发现对你所使用的特定产品有价值的内容。
熟悉产品
我已经了解了内部 CRM 系统(我们称之为遗留系统)及其数据架构,因此我所需要做的就是熟悉 Salesforce。我开始通过探索 Trailhead,Salesforce 的免费在线学习门户。它们还提供了一个免费的开发者登录账户(注册这里),以便你可以探索他们的产品及其功能。在我获得雇主提供的访问权限之前,我使用了这个账户。最初的调查使我能够发现所有潜在的产品功能,这些功能我可以在之后利用。
创建你的测试环境
如果可能,为自己(和你的团队)设置一个独立的测试环境来测试你正在构建的数据管道/连接。如果产品不允许你创建独立环境,你必须建立一些测试标准和技术。所有测试数据应易于识别并删除,以确保生产环境保持干净。你可能不是唯一一个在项目上工作的人员,你当然不希望其他人的活动对你的数据产生影响。
幸运的是,Salesforce 提供了创建这种环境的选项(称为 Sandbox)。通常,公司可以维护一个用于 UAT 测试的沙盒,一个用于备份恢复的沙盒,以及一个或多个用于开发目的的沙盒。Salesforce 的专业版提供了 10 个开发者沙盒,我认为这非常酷。我方便地测试了所有我构建的 API 连接、数据管道和一些其他代码。我可以发送、修改和删除所有测试记录,而无需过多担心。
设计架构
每个业务都是独特的,没有单一的产品能够完美适配。你总是需要做出特殊的调整,以确保数据符合业务逻辑。你必须为每个表找到最佳的数据结构。这也是一个很好的时机来审查当前的数据架构,并识别在新系统中可以改正的不足之处。Salesforce 允许客户创建自定义对象(表)和字段(列)来存储公司特定的数据。在专业版中,你可以创建多达 50 个自定义对象,每个对象最多可以有 100 个自定义字段。最棒的是,这些自定义对象和字段具有与内置对象和字段相同的功能。
例如,我能够将三个表合并为一个,并通过添加一个额外的字段来区分它们,该字段描述记录的类型。利用父子关系,我可以轻松地在父对象上设置聚合字段,当子项的数据更新时,这些字段会自动调整。我在字段上设置了验证规则,以便系统在存储数据之前进行质量检查。我还修改了页面布局,以调整向最终用户显示的数据。我做了几个这样的微小改进,结果得到了一个干净的数据架构,并降低了系统的整体复杂性。
自动化你的流程
这里我谈到的自动化有两种类型:
-
自动化业务流程
-
构建数据管道以迁移数据
自动化业务流程是首要任务。这可以减少终端用户的人工操作和错误。从数据角度来看,这也意味着你需要导入的数据稍微少一些。例如,销售团队会为客户创建一个“机会”。如果进入报价阶段,他们会添加产品和其他属性以生成报价。如果交易成功,那么使用从报价生成的签署合同,销售管理员将会在系统中创建一个包含相同产品的“订单”。过去,销售和 CRM 系统是不同的,因此双重录入不可避免。但有了 Salesforce,我能够轻松地使用内置的“流程”功能来自动化订单创建过程,这会直接从机会中提取所有数据。因此,对于仍在处理阶段的新的机会,订单直接在 Salesforce 中创建,而不是在旧系统中。
第二部分是自动化数据导入过程。理想情况下,数据应该只迁移一次。迁移完成后,用户应该只使用新系统。遗憾的是,这对我的组织来说并非如此。存在某些复杂的程序和边缘情况不适合 Salesforce,我们不得不等待开发人员为这些情况构建定制解决方案。另一方面,管理层希望用户开始使用 Salesforce,因此两个系统在一段时间内同时使用。对于旧数据,仅在遗留系统中进行更新。对我来说,这是一团糟,因为很难跟踪发生了什么变化,我不得不多次更新导入的数据。两个系统中的数据结构不同,在我能够导入 Salesforce 之前需要进行一些预处理。我通过编写代码来确保两个系统中的数据保持最新,从而节省了大量时间和精力。
注意数据治理
因为你正在过渡到一个新系统,你必须在授予终端用户访问权限之前格外小心。可能没有数据治理结构。默认情况下,每个人都可以看到所有内容,这可能非常危险。你必须定义角色,确定谁有权访问什么,以及你希望授予的访问量。Salesforce 拥有一个强大的框架来管理这些角色和职责。可以建立层级结构,并且可以控制到字段级别的读/写/查看或无访问权限,同时权限集可以配置以处理特殊情况。每当有人离职时,简单地停用他们的账户并将所有记录转移给其他人是非常容易的。最好设置至少一个用户作为测试账户,以便你可以测试每个角色的数据访问和权限。
图片由 Melanie Deziel 提供,来源于 Unsplash
维护报告
数字说明了一切。创建关于完成的迁移任务的报告,并且如果可能,将所有任务放在一个仪表板上以跟踪你的进度。如果在产品本身上无法做到这一点,可以在 Excel 中维护这些报告。这可以作为跟踪你进度的一种方式。Salesforce 提供了一个优秀的报告工具。虽然他们的仪表板相比于标准 BI 工具受限,但仍然是有用的。我为这个项目设置了一个单独的数据质量仪表板。我创建了多个报告来标记缺失数据和差异,并将它们全部放在一个仪表板上。这个仪表板与所有用户共享,他们只能看到自己的数据问题记录。这使得问题修复更容易,并随着时间的推移提高了数据质量。
图片由 Towfiqu barbhuiya 提供,来源于 Unsplash
我还利用了许多额外的功能,比如 Apex 代码、审批流程、电子邮件服务、Visualforce 页面、Chatter 等,但这些更多涉及开发方面,而不是数据。我不想深入每个让我印象深刻的 Salesforce 元素,因此在这里停下。作为一个数据人员,我必须承认他们的产品给我留下了深刻印象。希望你觉得这篇文章有用。请查看我之前的文章,其中谈到了在使用大数据创建 Tableau 仪表板时遇到的挑战。
## 使用 Tableau 仪表板的大数据经验——挑战与学习
使用 Tableau 仪表板从大数据中获取最佳洞察,前提是使用良好的数据集,这些数据集经过汇总且易于…
towardsdatascience.com
在你离开之前…
关注我的 Medium 账户,以便不遗漏我未来发布的任何新文章;你可以在我的 个人资料页面找到更多文章。你也可以在 LinkedIn 或 Twitter上与我联系!
微型神经网络用于吉他效果与微控制器
我的自制数字吉他效果器使用神经网络(图片由作者提供)
少即是多
·
关注 发布于 Towards Data Science ·7 min read·Apr 7, 2023
–
我逐渐意识到,限制可以驱动创造力和创新。艺术家拥有的选择越多,想出一个可靠的想法可能就越困难。如果没有音乐的规则,可能性会如此庞大,以至于几乎不可能写出可听的作品。正是这些规则和限制为一个想法提供了结构。当然,知道什么时候打破这些规则与知道它们是什么一样重要。
在过去的三年里,我一直对使用深度神经网络模拟模拟吉他放大器和效果器着迷。我编写了一些 音频插件,并测试了无数种神经网络变体用于模拟吉他设备。神经网络对 CPU 的需求很高,但使用 PC 时,你通常可以增加计算机的处理能力以实现更准确的声音。
有关更多信息,请参见我的文章 实时音频的神经网络.
但如果你想在一个便宜的微控制器上运行神经网络,使用一个小型(吉他效果踏板大小)的设备,专门用于运行音频效果而不做其他事情呢?像 Raspberry Pi 这样的微型计算机足够强大,可以运行操作系统,支持应用程序和吉他效果,还有多余的空间,这意味着更高成本下的资源浪费。这些计算机使用微处理器,而不是微控制器。微-处理器 具有外部内存和 I/O,而微-控制器 是一个自包含的计算系统,可以独立运行程序。微控制器通常不需要像 PC 或智能手机那样强大,因为它专门用于做一件事。微控制器非常适合数字吉他踏板,但为它们编写软件与智能手机或 PC 是不同的,这是我以前从未做过的。
部分构建的 Terrarium PCB(左)和 Daisy Seed(右)(图片作者提供)
于是,Daisy Seed 登场了!Daisy Seed 是一个 $30 的音乐嵌入式平台,利用 Cortex-M7 ARM 微控制器。它有自己的软件库 (libDaisy) 和音频 DSP 库 (DaisySP),都是开源的。对于吉他踏板,你需要一个输入音频缓冲区,用于将模拟吉他信号连接到数字硬件,还有一个输出缓冲区,用于与放大器匹配阻抗。这确保了你的音色在经过效果器时得以保留。PedalPCB 销售一种名为 Terrarium ($12) 的接口板,专门为 Daisy Seed 设计,甚至提供了最多 6 个旋钮、4 个开关、2 个脚踏开关、输入/输出单声道音频插孔和 9 伏电源(吉他效果器常用)的连接。
以 42 美元的音频硬件成本,我的成本已经远低于我之前使用的 NeuralPi 吉他踏板 的 Raspberry Pi4。我购买了电路板,得益于我之前对模拟效果的痴迷,手头有足够的硬件来构建 Terrarium 踏板。总成本约为 100 美元(包括外壳、电气组件、旋钮/开关),需要基本的焊接技能来组装。其他现有项目 在完成的 Terrarium 踏板上运行良好,声音也很棒。
我完成的 Terrarium 踏板。(图片作者提供)
不过,我的 NeuralPi 插件无法在微控制器上运行,所以我需要发挥创造力。我决定使用 RTNeural 引擎来运行神经模型,并使用 libDaisy 和 DaisySP 开发最小的 c++ 代码。虽然有几个代码库可以用于 M 系列微控制器的开发,但我没有这些的经验,所以如果可能的话,我希望坚持使用我已经熟悉的。
现在谈谈我提到的那些限制:处理能力和内存。M7 芯片的最大运行频率为 480MHz,在这个速度下只能使用 Flash 内存,一个只有 128KB 的小内存!(但公平地说,登月只用了 74KB)。Daisy Seed 上还有其他可以访问的内存区域,但我希望最大化我的处理速度,以运行尽可能大的神经网络,产生最佳的声音。
当我最初编译我的最小 c++ 程序与 RTNeural 时,我超出了 128KB 的限制。因此,我向 RTNeural 的创建者寻求帮助(正如我以前多次做的那样!)。他成功地将编译后的占用量减少了大量,为所需的代码和模型文件腾出了足够的空间。
Daisy Seed 通过 USB 连接以上传 c++ 程序(图片作者提供)
一旦我的程序可以加载到 Daisy Seed 上,我非常好奇它能处理多大尺寸的模型。我从 NeuralPi 模型(LSTM 尺寸 20)开始,但这太过庞大了,导致踏板没有响应。然后我决定从小开始,一步步达到极限,因此我使用了 LSTM 尺寸 4,成功了!它可以运行效果(捕获了我的 TS-9 过载踏板),但我对准确性不满意。我确定它能处理的最大尺寸是 LSTM 尺寸 7,这对大多数踏板来说足够好,可能在捕获低增益放大器时能获得一些不错的声音。请记住,Daisy Seed 运行在 48kHz 的音频下,这意味着每秒通过神经网络 48,000 次!
这种神经网络采样率在任何系统上都令人印象深刻,但我希望它能听起来更好。近年来的吉他手已经习惯于与真实效果难以区分的数字建模。像 NeuralDSP 的 Quad Cortex、IK Multimedia 的 ToneX 和最近的 Headrush Prime 等产品给吉他手提供了以前只有使用 Kemper 才能实现的选项。尽管我的工作专门针对 DIY 社区,但这并不意味着它的能力要逊色! (正如最近开源的 Neural Amp Modeler 所证明的那样。)
除了 LSTM 外,还有一种我尚未测试的递归神经网络(RNN),即 GRU(门控递归单元)。该网络在相同内部大小的情况下使用的处理能力约少 33%。我并没有进行过多测试,因为在 PC 上,额外的处理能力并不是一个大问题。
初步测试 GRU 是令人鼓舞的,我在 GRU 上得到的损失值甚至比相同大小的 LSTM 还要低。除了运行速度更快外,GRU 模型还消耗了更少的内存。我通过反复试验确定,大小为 10 的 GRU 大约是我在 Daisy seed 上可以通过 RTNeural 运行的最大值(相比之下,LSTM 为 8),这种差异在某些情况下将损失值降低了一半。我在失真效果器上的损失值低于 0.01,在低增益放大器上的损失值低于 0.02。
在当前版本中,我命名的 NeuralSeed 能够准确捕捉大多数失真/过驱动效果器(最多支持 3 个参数化旋钮)和低增益放大器。使用无参数化旋钮仍然是最准确的,但在我看来,增益和音调的控制灵活性是一个很酷的选项。我之前学习的技巧有助于提高整体音质。这些技巧包括对录音设备的改进,例如使用负载箱录音和使用重新放大箱对效果器进行录音。从一个预训练模型(迁移学习)开始,并使用专门的输入信号,有助于提高模型训练的准确性。通过使用一种叫做“蒸馏”(从大模型训练小模型)的方法,我能够捕捉到低到中等增益下管式放大器的复杂失真。
这里是 GitHub 上的开源代码。当加载到 Terrarium 效果器上时,它具有输入/输出电平旋钮、湿/干混音器、4 个 EQ 增益开关,以及最多 3 个旋钮用于控制一个参数化神经模型(例如增益、低音和高音)。左脚踏开关可以旁路或激活效果。右脚踏开关在可用的神经放大器/效果器模型之间循环切换。
[## GitHub - GuitarML/NeuralSeed: 神经网络用于 Daisy Seed 上的吉他放大器/效果器模拟
Neural Seed 利用神经网络在 Electro-Smith 的 Daisy Seed 硬件上模拟放大器/踏板,以及 Terrarium……
为 Daisy Seed 开发让我更加欣赏现代计算机的强大。M7 处理器(一个非常强大的微控制器!)的限制让我突破思维定式,用更少的资源实现更多的功能。NeuralSeed 代码是开源的,任何人都可以在 Daisy Seed / Terrarium 踏板上尝试、修改和进行自己的调整和改进。此外,还有一个 Colab 脚本 用于训练自己的模型以与 NeuralSeed 软件配合运行。这里有一个视频演示,展示了完成的 Neural Seed 踏板运行多个实际吉他放大器和踏板的神经网络模型。
Neural Seed 演示(作者视频)
特别感谢 ChowDSP 的 Jatin,他帮助我减少了 RTNeural 的足迹,并解决了 GRU 实现问题!也感谢 Daisy Discord 社区的朋友们,他们帮助我了解 Daisy Seed 和相关软件,以及 Neural Amp Modeler Facebook 群组提供的训练数据。
SQL 中的最小会议室问题
计算(在 SQL 中)安排一组会议所需的最小会议室数量
·
关注 发表在 Towards Data Science ·5 分钟阅读·2023 年 1 月 5 日
–
图片由 Dane Deaner 提供,来源于 Unsplash
会议室问题要求你确定安排所有会议所需的最少会议室数量,以便能够避免冲突。我们将探讨如何仅使用声明性 SQL 来解决这个问题。
上一篇文章: 使用 SQL 验证平衡括号
问题陈述
给定一组会议的开始和结束时间(均包括在内),确定安排所有会议所需的最少会议室数量,以避免任何冲突(即,会议室在会议进行时应始终可用,并且不能有两个会议在同一会议室内的时间重叠)。
在线讨论
这个问题在编程圈子里相当流行,你可以在这里找到相关讨论:
实际上,也有关于用 SQL 解决这个问题的讨论(这在我所覆盖的文章类型中通常较少见)。
输入表模式
输入表看起来像这样:
CREATE TABLE meetings(
idx SERIAL PRIMARY KEY,
start_at TIMESTAMP NOT NULL,
end_at TIMESTAMP NOT NULL
);
这些列的含义如下:
-
idx:此会议的索引(唯一 ID)
-
start_at:会议开始时的时间戳
-
end_at:会议结束时的时间戳(会议被视为包括此时间戳,因此在此时间戳开始的会议不能与该会议安排在同一房间)。
INSERT INTO meetings(start_at, end_at) VALUES
-- { 1, 18 }, { 18, 23 }, { 15, 29 }, {4, 15}, {2, 11}, {5, 13}
('01/01/2022', '01/18/2022'),
('01/18/2022', '01/23/2022'),
('01/15/2022', '01/29/2022'),
('01/04/2022', '01/15/2022'),
('01/02/2022', '01/11/2022'),
('01/05/2022', '01/13/2022');
SELECT * FROM meetings;
提供数据的输入表(作者提供的图片)
第一种解决方案:O(n²)
这个解决方案在上述在线文章中讨论,这些文章讲述了如何使用 SQL 解决这个问题。
主要思路是应该查看第一个和最后一个安排会议的时间戳之间的每一个时间点(例如每秒),并检查有多少会议与该时间点重叠。
可以进行的优化是,不必检查每个时间点,而只检查“有趣”的时间点——即会议开始或结束的时间点。这是因为在任何两个这样的“有趣”时间点之间,安排的会议数量不会发生变化。
这个解决方案的时间复杂度是O(n²),因为我们需要将每个会议O(n)与每个唯一的时间点O(n)(即会议的开始或结束时间点)匹配。
WITH unique_time_points AS (
SELECT ts
FROM (
SELECT start_at AS ts
FROM meetings
UNION
SELECT end_at AS ts
FROM meetings
) AS start_and_end_ts
),
joined AS (
SELECT
lhs.ts, COUNT(rhs.idx) AS num_overlaps
FROM unique_time_points lhs INNER JOIN meetings rhs
-- Join condition checks how many scheduled meetings intersect
-- the point "ts".
ON lhs.ts BETWEEN rhs.start_at AND rhs.end_at
GROUP BY lhs.ts
ORDER BY lhs.ts ASC
)
SELECT * FROM joined;
第一种解决方案的输出(作者提供的图片)
在这里,我们可以看到安排所有会议所需的最少会议室数量是 4。这发生在时间点 2022-01-05 和 2022-01-11 之间。
上述输出的图形表示。
第一种解决方案的输出图形视图(作者提供的图片)
预计成本: 对于一个有 6 行的表格,这个查询的预计成本是104k。
第二种解决方案:O(n log n)
该解决方案的主要思想是,一旦你有了所有会议开始和结束的唯一时间点,就可以简单地跟踪这些时间点上有多少个“进行中的”会议。
计数器: 当遇到开始时间点时,我们需要递增一个计数器(running_sum),而当遇到会议结束时间点时,我们需要递减这个计数器。
计数重叠: 对于在特定时间点开始和结束的会议,我们需要注意首先递增计数器,然后再递减,因为会议被认为完全占用其结束时间点。因此,我们有这样的代码:ORDER BY ts ASC, delta DESC — 即如果我们不按 delta 降序排序,那么可能会在开始时间点之前处理结束时间点,这会导致重叠会议数量的低估。
该解决方案的运行时复杂度是O(n log n),因为它由对所有唯一时间点按时间戳的非递减顺序排序的成本主导。
WITH unique_time_points AS (
SELECT start_at AS ts, +1 AS delta
FROM meetings
UNION
SELECT end_at AS ts, -1 AS delta
FROM meetings
),
with_running_sum AS (
SELECT
ts,
delta,
-- We need to process time points in "ts" order. Also in case
-- there are multiple time points, we need to first process a
-- meeting start and then a meeting end since a meeting end is
-- assumed to occupy its end timepoint. This ensures that we
-- don't under-count the number of simultaneously scheduled
-- meetings.
SUM(delta) OVER (ORDER BY ts ASC, delta DESC) AS running_sum
FROM unique_time_points
)
SELECT * FROM with_running_sum;
第二种解决方案的输出(作者提供的图片)
我们可以看到,安排所有会议而不发生冲突所需的最小会议室数量(4)在 2022 年 1 月 5 日至 2022 年 1 月 11 日之间(与上面的解决方案相同)。
上述输出的图形表示。
第二种解决方案的输出图形视图(作者提供的图片)
预计成本: 对于一个有 6 行的表格,这个查询的预计成本是474。
SQL Fiddle
本文中所有解决方案的 SQL Fiddle 链接可以在这里找到。
结论
这个问题与我们之前看到的使用 SQL 验证平衡括号有些相似,主要体现在使用 SQL 窗口函数的运行总和。
我们看到如何使用 SQL 窗口函数(再次)来利用一个简单的概念如运行总和来解决看似复杂的问题。
缺失数据解密:数据科学家的绝对入门指南
数据质量编年史
缺失数据、缺失机制以及缺失数据分析
·
关注 发布于 Towards Data Science · 12 min read · 2023 年 8 月 29 日
–
缺失数据使数据科学家无法看到数据要讲述的完整故事。有时,即使是最小的信息片段也能提供一个完全独特的世界观。图片由 Ronan Furuta 拍摄,来源于 Unsplash。
今年早些时候,我开始了一篇关于几个数据质量问题(或特征)的文章,这些问题严重影响我们的机器学习模型。
其中之一,毫无意外,是缺失数据。
我已经研究了这个话题很多年了(我知道,对吧?!),但在我参与的一些数据中心社区项目中,我意识到许多数据科学家仍未完全掌握这个问题的复杂性,这激励我创建了这个综合教程。
今天,我们将深入探讨 缺失数据的问题,发现我们可能在实际中遇到的不同缺失数据类型,并探索我们如何* 识别和标记缺失值 在现实世界的数据集中。
缺失数据的问题
缺失数据是一个有趣的数据不完善情况,因为它可能由于领域的自然性质而自然产生,或在数据收集、传输或处理过程中无意间产生。
本质上,缺失数据的特点是数据中出现了缺失值,即数据集中某些记录或观察中的缺失值,可以是单变量(一个特征有缺失值)或多变量(多个特征有缺失值):
单变量与多变量缺失数据模式。图像作者提供。
我们来考虑一个例子。 假设我们正在对一个糖尿病患者队列进行研究。
医疗数据就是一个很好的例子,因为它经常高度受到缺失值的影响: 病人值来自调查和实验室结果,可能在诊断或治疗过程中被测量多次,存储在不同格式中(有时分布在不同机构),并且通常由不同的人处理。这可能会(并且肯定会)变得很混乱!
在我们的糖尿病研究中,缺失值的存在可能与研究的进行或数据的收集有关。
例如,缺失数据可能是由于传感器故障导致高血压值关闭。另一个可能性是“体重”特征中的缺失值更可能出现在年长女性中,她们不太愿意透露这信息。或者肥胖患者可能更不愿意分享他们的体重。
另一方面,数据也可能因与研究完全无关的原因而缺失。
由于一个轮胎爆胎导致病人错过了医生预约,他的信息可能会缺失。数据也可能因人为错误而缺失:例如,进行分析的人员可能会错放或误读一些文件。
无论数据缺失的原因是什么,在建模之前调查数据集是否包含缺失数据都很重要,因为这个问题可能会对分类器产生 严重后果 :
-
一些分类器不能内部处理缺失值: 这使得它们在处理缺失数据的 数据集时不适用。在某些情况下,这些值被编码为预定义值,例如“0”,以便机器学习算法能够处理它们,尽管这不是最佳实践,尤其是在缺失数据的比例较高(或缺失机制更复杂)时;
-
基于缺失数据的预测可能会有偏差和不可靠: 尽管一些分类器可以内部处理缺失数据,但它们的预测可能会受到影响,因为训练数据中可能缺少重要的信息。
此外,尽管缺失值可能*“看起来都一样”*,但实际上它们的潜在机制(即它们缺失的原因)可以遵循 3 种主要模式:完全随机缺失 (MCAR)、随机缺失 (MAR) 和非随机缺失 (MNAR)。
牢记这些不同类型的缺失机制很重要,因为它们决定了处理缺失数据的适当方法选择,并且影响从中得出的推论的有效性。
让我们快速回顾一下每种机制!
缺失数据机制
如果你是一个数学爱好者,我建议你阅读这篇论文 (咳咳), 特别是第 II 和 III 节,其中包含了你可能寻找的所有符号和数学公式(我实际上是受到了这本书的启发,它也是一本非常有趣的入门书籍,请查看第 2.2.3 节和 2.2.4 节)。
如果你和我一样也是一个视觉学习者,你可能会想要“看到”它,对吧?
为此,我们将查看论文中使用的青少年烟草研究示例。我们将考虑虚拟数据来展示每种缺失机制:
缺失机制示例:一个模拟的数据集,关于青少年烟草使用研究,其中每天吸烟的平均数在不同机制(MCAR, MAR, 和 MNAR)下缺失。图像作者提供。
需要记住的一点是:缺失机制描述了缺失模式是否以及如何通过观察数据和/或缺失数据来解释。 这很棘手,我知道。但通过示例会更清楚!
在我们的烟草研究中,我们关注的是青少年烟草使用。共有 20 个观察值,相对于 20 名参与者,而特征Age
是完全观察到的,而Number of Cigarettes
(每天吸烟的数量)将根据不同的机制缺失。
完全随机缺失(MCAR):无害,无错!
在完全随机缺失(MCAR)机制中,缺失过程与观测数据和缺失数据完全无关。这意味着特征缺失值的概率是完全随机的。
MCAR 机制:(a)香烟数量的缺失值完全是随机的;(b)真实数据集中 MCAR 模式的示例。图片由作者提供。
在我们的例子中,我只是随机删除了一些值。注意缺失值没有集中在特定的Age
或Number of Cigarettes
值范围内。因此,这种机制可能由于研究过程中发生了意外事件:比如负责记录参与者回答的人不小心跳过了调查中的一个问题。
随机缺失(MAR):寻找明显的迹象!
这个名称实际上是误导性的,因为随机缺失(MAR)发生在缺失过程可以与数据中的观测信息相关联(尽管与缺失信息本身无关)。
考虑以下例子,其中我只删除了年轻参与者(15 至 16 岁)的Number of Cigarettes
值。请注意,尽管缺失过程明显与Age
中的观测值相关,但与这些青少年吸烟数量无关(请注意“Complete”列,如果报告了这些值,其中缺失值中会有低值和高值)。
MAR 机制:(a)香烟数量的缺失值与年龄相关;(b)真实数据集中 MAR 模式的示例:X_miss_1、X_miss_3 和 X_miss_p 的缺失值取决于 X_obs 的值。与最高/最暗值对应的值缺失。图片由作者提供。
例如,年轻孩子可能不愿意透露他们每天吸烟的数量,避免承认他们是常规吸烟者(无论他们吸烟的数量如何)。
缺失非随机(MNAR):那一刻的顿悟!
如预期所示,缺失非随机(MNAR)机制是最棘手的,因为缺失过程可能依赖于数据中的观测信息和缺失信息。这意味着特征中缺失值的发生概率可能与数据中其他特征的观测值相关,也可能与该特征本身的缺失值相关!
看下一个例子:Number of Cigarettes
的较高值缺失,这意味着Number of Cigarettes
缺失值的概率与缺失值本身相关(请注意“Complete”列)。
MNAR 机制:(a)香烟数量中的缺失值对应于如果观察到的最高值;(b)现实世界数据集中 MNAR 模式的例子:X_miss 中的值取决于自身的值(最高/较暗的值被删除)。图片由作者提供。
这将是那些由于吸烟量非常大的青少年拒绝报告他们每天吸烟数量的情况。
缺失数据机制的影响
根据我们的简单示例,我们已经看到MCAR 是缺失机制中最简单的一种。在这种情况下,我们可以忽略由于缺失值出现而产生的许多复杂性,一些简单的解决方法,比如列表删除或逐例删除,以及更简单的统计插补技术,可能就能解决问题。
然而,尽管方便,但现实中MCAR 往往是不现实的,大多数研究人员通常在研究中至少假设 MAR,这比 MCAR 更具普遍性和现实性。在这种情况下,我们可能会考虑比 MCAR 更强大的策略,这些策略可以从观察到的数据中推断缺失的信息。在这方面,基于机器学习的插补策略通常是最受欢迎的。
最后,MNAR 迄今为止是最复杂的情况,因为很难推断缺失的原因。当前的方法集中于使用领域专家定义的校正因子来映射缺失值的原因,从分布式系统中推断缺失数据,扩展最先进的模型(例如生成模型)以纳入多重插补,或进行敏感性分析以确定在不同情况下结果如何变化。
此外,在可识别性问题上,问题也不会变得更容易。
虽然有一些测试可以区分 MCAR 和 MAR,但它们并不广泛流行,并且有一些对复杂现实世界数据集不适用的限制性假设。也无法区分 MNAR 和 MAR,因为所需的信息缺失了。
要在实践中诊断和区分缺失机制,我们可以关注假设检验、敏感性分析、从领域专家那里获取一些见解,以及调查可以提供领域理解的可视化技术。
自然,还有其他复杂因素需要考虑,这些因素决定了缺失数据处理策略的应用,例如缺失数据的百分比、影响的特征数量以及技术的最终目标(例如,为分类或回归提供训练模型,还是以尽可能真实的方式重建原始值?)。
总的来说,这不是一项简单的工作。
识别和标记缺失数据
让我们一点一点地来。我们刚刚学到了关于缺失数据及其复杂纠缠的大量信息。
在这个示例中,我们将介绍如何标记和可视化真实数据集中的缺失数据,并确认缺失数据对数据科学项目造成的问题。
为此,我们将使用皮马印第安人糖尿病数据集,该数据集可以在 Kaggle 上找到(许可证 — CC0: 公共领域)。如果你想跟随教程,可以随时下载笔记本来自 Data-Centric AI Community GitHub 仓库。
为了快速分析数据,我们还将使用[ydata-profiling](https://github.com/ydataai/ydata-profiling)
,它可以通过几行代码给我们提供数据集的全面概览。让我们开始安装它吧:
安装最新版本的ydata-profiling。作者提供的代码片段。
现在,我们可以加载数据并快速创建概况:
加载数据并创建数据概况报告。作者提供的代码片段。
通过查看数据,我们可以确定这个数据集包含 768 条记录/行/观察(768 名患者),以及 9 个属性或特征。实际上,Outcome
是目标类(1/0),所以我们有 8 个预测变量(8 个数值特征和 1 个分类特征)。
数据质量报告:总体数据特征。作者提供的图片。
初看之下,数据集似乎没有缺失数据。然而,这个数据集已知受到缺失数据的影响! 我们怎么确认这一点呢?
查看“警报”部分,我们可以看到几个“零值”警报,表明有几个特征的零值没有意义或在生物学上是不可能的: 例如,体重指数或血压的零值是无效的!
浏览所有特征,我们可以确定怀孕数似乎正常(零怀孕数是合理的),但对于其余特征,零值则值得怀疑:
数据质量报告:数据质量警报。作者提供的图片。
在大多数真实世界的数据集中,缺失数据通常由哨兵值编码:
-
超出范围的条目,例如
999
; -
特征本应仅有正值时的负数,例如
-1
; -
在一个本不应为 0 的特征中出现零值。
在我们的案例中,Glucose
、BloodPressure
、SkinThickness
、Insulin
和BMI
都存在缺失数据。让我们统计这些特征中的零值数量:
统计零值的数量。作者提供的代码片段。
我们可以看到,Glucose
、BloodPressure
和 BMI
只有少量的零值,而 SkinThickness
和 Insulin
有更多的零值,几乎覆盖了现有观察值的一半。这意味着我们可能需要考虑不同的策略来处理这些特征: 有些特征可能需要比其他特征更复杂的插补技术。
为了使我们的数据集与特定数据的惯例一致,我们应该将这些缺失值标记为 NaN
值。
这是在 Python 中处理缺失数据的标准方法,也是像 pandas
和 scikit-learn
等流行包遵循的惯例。这些值会在某些计算中被忽略,如 sum
或 count
,并且一些函数会识别这些值以执行其他操作(例如,删除缺失值、插补它们、用固定值替换等)。
我们将使用 replace()
函数标记缺失值,然后调用 isnan()
来验证它们是否被正确编码:
将零值标记为 NaN 值。作者提供的代码片段。
NaN
值的数量与 0
值的数量相同,这意味着我们已经正确标记了缺失值!然后,我们可以使用配置文件报告来检查现在缺失数据是否被识别。以下是我们“新”数据的样子:
检查生成的警报:“缺失”警报现在已被突出显示。作者提供的图像。
我们可以进一步检查缺失过程的一些特征,浏览报告中的**“缺失值”**部分:
配置文件报告:调查缺失数据。作者录制的屏幕录像。
除了“计数”图表,它为我们提供了每个特征所有缺失值的概述,我们可以更详细地探索“矩阵”和“热图”图表,以对数据可能存在的潜在缺失机制进行假设。特别是,缺失特征之间的相关性可能会提供信息。在这种情况下,Insulin
和 SkinThickness
之间似乎存在显著的相关性:对于某些患者,这两个值似乎同时缺失。这是否是巧合(不太可能),或者缺失过程是否可以通过已知因素来解释,即表现出 MAR 或 MNAR 机制,这将是我们深入探讨的内容!
不管怎样,现在我们的数据已经准备好进行分析了!不幸的是,处理缺失数据的过程远未结束。 许多经典的机器学习算法无法处理缺失数据,我们需要找到专家的方法来缓解这个问题。让我们尝试在这个数据集上评估线性判别分析(LDA)算法:
评估带有缺失值的线性判别分析(LDA)算法。作者提供的代码片段。
如果你尝试运行这段代码,它会立即抛出一个错误:
LDA 算法无法内部处理缺失值,抛出错误信息。图片由作者提供。
解决这个问题的最简单方法(也是最天真的方法!)是删除所有包含缺失值的记录。我们可以通过创建一个新数据框,使用dropna()
函数删除包含缺失值的行来实现这一点……
删除所有缺失值的行/观察值。代码片段由作者提供。
… 再次尝试:
评估没有缺失值的 LDA算法。代码片段由作者提供。
LDA 现在可以运行,尽管数据集的大小几乎减少了一半。图片由作者提供。
就这样! 通过删除缺失值,LDA 算法现在可以正常运行。
然而,数据集的大小被大幅缩减至仅 392 个观察值,这意味着我们失去了近一半的可用信息。
因此,我们应该寻找插补策略,而不是仅仅删除观察值,可以是 统计学的 或基于机器学习的。我们还可以使用合成数据来替换缺失值,具体取决于我们的最终应用。
为此,我们可能需要尝试了解数据中潜在的缺失机制。这将是未来文章中的一个期待点?
结语
在这篇文章中,我们已经覆盖了数据科学家在开始处理缺失数据时需要掌握的所有基础知识。
从问题本身到缺失机制,我们发现了缺失信息对我们的数据科学项目可能造成的影响,尽管所有的NaNs
看起来可能相同,它们可能讲述非常不同的故事。
在接下来的文章中,我将逐一介绍每种缺失机制,重点关注生成、插补和可视化策略,所以请关注新的博客文章,并不要忘记给数据驱动的 AI 仓库加星标,以便随时获取代码更新!
一如既往,欢迎反馈、问题和建议!你可以给我留言,贡献代码到仓库,甚至可以在数据驱动的 AI 社区找到我,讨论其他与数据相关的话题。到时候见?
关于我
博士,机器学习研究员,教育者,数据倡导者,以及全能“万金油”。在 Medium 上,我写关于数据驱动的人工智能和数据质量,为数据科学与机器学习社区提供如何从不完美数据转向智能数据的教育。
以数据为中心的人工智能社区 | GitHub | 谷歌学术 | 领英
您的数据产品中的缺失特性
参与度、愉悦感和信任作为成果
·
关注 发表在 数据科学前沿 ·7 分钟阅读·2023 年 2 月 15 日
–
我在 Zendesk 领导一个每月的数据讨论小组,我很幸运能够听到来自聪明、多样化和才华横溢的人的各种想法和观点。我们讨论的主题范围从技术到程序性,并且我们定期将这些与我们的工作流联系起来。在线讨论小组、本地聚会和会议都非常棒,但我觉得将您组织中的人员聚在一起讨论行业趋势会有更多价值,因为这可以为您的团队及其项目提供方向。
我们一直在回到的一个主题是团队的价值以及如何衡量它。在早期的文章中,我讨论了数据团队如何创造价值,但这不是唯一的方法。无论你是在提供业务支持、通过反向 ETL 实现自动化,还是为高级分析和机器学习用例提供数据,总会存在一个挥之不去的问题:我们是否节省或创造了比花费更多的价值?
正如我们的一位与会者所说,我们的客户经常根据“氛围”来衡量我们的影响力。这不应被视为贬低,而是对围绕影响力和价值创建明确指标的困难的一种让步。此外,这个想法中还隐含了分析输出中存在主观且或许无法量化的价值,我们稍后会讨论这个问题。
为数据产品建立归因模型是一个臭名昭著的难题,我不会尝试在这里解决所有元素。虽然我相信我们可以从一个广泛的归因框架中受益,但鉴于数据降低成本和增加收入的方式众多,我不知道这是否甚至可能。相反,我想关注几个我认为被忽视的具体组件,特别是:
-
数据的心理社会价值
-
客户的愉悦和满意
-
数据质量作为核心交付物
我们是拉拉队员吗?
第一个观察点更不涉及我们应如何“做数据产品”,而是关于基本要求。在讨论中,我提出了一个观点:我们不一定知道数据驱动型公司成功的原因,但研究表明它们确实成功。有人回应道:也许这些仪表盘“没有做任何事情”,至少在推动特定、明确的行动方面没有发挥作用。如果它们的价值在于激励和对齐我们的客户,而不是(或除了)可操作的见解,那会怎样呢?
由Rojan Maharjan拍摄,来源于Unsplash
在我的职业生涯的某个阶段,我曾担任一家批发公司的 BI 开发人员,我们有一份报告向销售团队提供销售指标的汇总。这份报告在整个月的使用情况还算合理,但在月末使用量激增,一些用户每小时刷新好几次。我记得对这种趋势感到非常困惑。
我相信这种行为背后有几个操作性用例,但事后看来,我认为报告的最有价值的输出之一是激励。看到他们的货物几乎实时发出使我们的销售人员感到兴奋;它给了他们额外的“动力”,让他们在争分夺秒地完成或超越配额时进行电话和达成交易。这份报告正在做非常实际的工作,推动业务流程,即使这不是我们通常期望的方式。
还值得注意的是,许多这些数据文物本质上具有社交属性。一个仪表板是一个共享对象,可以作为同事之间对话的共同纽带。即使底层数据并不出色或特别有洞察力,由此引发的对话和共享叙事也可能是有价值的。对齐是组织的强大工具,而数据可以推动对齐。
作为“客观”的人,许多数据专业人员可能不愿意接受“灵感”是有效或有价值的输出;然而,如果我们不利用数据来激励自己,我们就会错过一些东西。我最初也抵触这个想法,但反思我的职业生涯,我有很多类似于上述的故事和轶事,我不禁觉得这种定性影响是显著的。也许我从这次经历中得到的最重要的教训是,仅仅因为我无法感知到生成价值的机制,并不意味着它就不存在。
最后,数据向我们展示一些隐藏的见解或反对意见的叙事现在已经成了一个陈词滥调,但当数据确认我们的信念并让我们安心我们走在正确的轨道上时,确实会发生一些强大的事情。数据常常支持现状而不是颠覆它,这应该被庆祝,而不是害怕。
面包与马戏团
图片由 Mathew Schwartz 提供,来源于 Unsplash
同样,我认为考虑我们的客户是否喜欢我们的数据产品是很重要的。这可能包括为分析师和数据科学家提供符合人体工程学的命名规范和易于使用的表格,也包括为业务用户提供美观的仪表板。
这是什么样的呢?我们是否应该在数据产品中构建反馈机制?我们是否应该进行调查?我会提醒我们不要过于强硬;与所有内部产品一样,我们有可能与实际价值链(即我们如何获得报酬)保持脆弱的关系。
不过,我认为在数据产品生命周期中提供轻量级系统以驱动反馈仍然有空间。哪些功能受到喜爱?哪些功能被讨厌?何时数据产品可以进入“维护模式”,何时我们应该结束?根据我的经验,这些问题几乎总是以临时的方式提出,到产品生命周期的那个阶段,甚至识别活跃用户也可能被已经被遗忘的过程自动化所复杂化。
质量作为可交付物
在我们结束每月会议时,团队中的数据工程经理之一,Niral Patel提出了一个中肯的问题:为什么质量总是被当作事后的思考,而它却是满足我们客户需求的关键因素?
在某种程度上,这涉及到资源问题。数据团队经常是“临时拼凑”的,要求承担远超其能力的工作。他们陷入了操作困境和不明确的需求中。在时间紧迫时,交付一个不完整的东西总比什么都不交付要好。
但就像标准化测试中因错误答案而受罚一样,数据质量差会破坏信任。如果你的团队持续产生不准确、过时且不一致的仪表板,你的客户将失去对你的信任。这种损害不仅限于你和你的团队;你还在助长一种需要多年努力和大量人力才能修复的不信任文化。
我们有责任向利益相关者推广数据质量作为我们产品的关键特性,并需要让他们参与权衡取舍。由于数据质量有许多维度,我们的客户必须参与优先级排序:我们应如何处理异常数据量?遇到模式变化时我们应该怎么做?准时交付不完整的数据与迟交完整的数据,哪个更重要?虽然“差”数据质量有一定的感觉,但在交付“好”数据时的权衡管理要复杂得多且具有上下文敏感性。
在数据治理领域正进行着重要的工作,现在是时候将这些应用到我们的数据产品中,从一开始就如此,并且每次都如此。质量是一个基本特性,与我们产品的设计、接口和用例同样重要。
我们所需的指标
虽然有产品和服务可以提供我们使用数据,但数据本身是不够的;我们需要指标和相关结果。我认为以下指标(及相关的监控/可观察性)是成功数据产品的关键组件:
-
一种理想的使用情况测量方法,能够区分自动化与临时使用
-
一种理想的特征级满意度测量方法
-
一种理想的数据质量测量方法,涵盖所有关键方面
这些组件远远不够,但我相信它们对于数据团队充分判断他们的工作是否产生了影响是必要的。是的,美元或 FTE 等价物归因是金标准,但在无法获得这些的情况下,知道我们向投入、满意的用户提供了高质量的数据是一个很好的替代指标。这些指标还允许我们捕捉数据产品的那些意外好处;也许我们的用户将输出应用于完全不同的过程。
Niral 在后续谈话中提出的一个重要观点是,数据产品应该具有可操作性;自动化或仪表板应推动某些产生价值的行动。区分创建数据产品的主要目标是心理社会影响,还是将心理社会影响视为一种价值维度是至关重要的。我不会建议在规划阶段仅以提高士气或团队凝聚力为唯一目标来制作产品,因为这种价值主张充其量也只是勉强成立。相反,如果我们的产品未能推动预期的行动但仍然非常受欢迎,我们应该有框架来调查原因。本质上,我们不希望仅仅因为它没有“按预期工作”就抛弃一些有价值的东西。
总结一位参与者的精彩见解:数据团队为我们利益相关者的工作场所福祉做出了贡献;如果提供数据提取或仪表板使用户感到愉快,那就是有用的。这肯定不是数据团队的唯一价值主张,但也不是我们应该忽视的东西。尽管倾向于依赖客观性并忽视我们工作中的人文元素(“数据可以‘克服’的‘弱点’”)可能很诱人,但现实是我们是社会性生物,工作在复杂的组织中。我们有工具来穿透主观性,但大多数工作会经过其他人的手;承认和认识到这个人文元素的价值大于忽视它。
我刚完成这篇文章的初稿几分钟后,Benn Stancil 发布了一篇关于他对放弃数据客观性的 discomfort的智能文章。如果我不把你引导到他的方向,我会感到遗憾。