【论文阅读】Machine Learning, Linear Algebra, and More: Is SQL All You Need?

news2024/11/27 10:29:55

文章目录

  • 摘要
  • 一、介绍
  • 二、SQL算法原语
    • 2.1、Variables
    • 2.2、Functions
    • 2.3、Conditions
    • 2.4、Loops
    • 2.5、Errors
  • 三、案例研究
    • 3.1、对数据库友好的SQL映射
    • 3.2、性能结果
  • 四、结论以及未来工作


摘要

  尽管SQL在简单的分析查询中无处不在,但它很少用于更复杂的计算,如机器学习、线性代数和其他计算密集型算法。这些算法通常以过程方式编程,看起来与声明性SQL查询非常不同。然而,SQL实际上提供了执行各种计算的构造。在本文中,我们展示了如何将过程结构转换为SQL-启用复杂的SQL-only算法。在算法中使用SQL可以使计算更接近数据,只需要最小的用户权限,并增加软件的可移植性。生成的SQL算法的性能在很大程度上取决于底层DBMS和SQL代码。令人惊讶的是,我们发现像HyPer这样的查询引擎可以实现非常高的性能——在某些情况下甚至胜过像NumPy这样的最先进的线性代数包。

一、介绍

  理论上,任意计算都可以用SQL来表示。然而,这通常被认为是一种理论观察,而不是一种实际方法。在SQL中直接表示复杂算法的一个障碍是,算法通常是用过程语言表示的。SQL的声明性使得编写统计学习或优化算法的查询变得非常重要。

  目前,复杂的算法是在数据库系统之外实现的,使用用户定义函数(udf),或者依赖于系统特定的dbms内操作符。直接在SQL中表达算法有四个主要好处:

  • 近数据计算
      使用SQL算法,使得数据保留在数据库中,SQL查询引擎可以立即开始计算。并且只显示计算结果,而不显示底层数据,则可以确保更高的数据隐私。
  • 灵活性
      使用SQL可以自由定制修改,且只需要最小的用户权限就可以执行各种计算。
  • 高度抽象
      SQL算法的向量化、并行甚至分布式执行由底层DBMS自动完成
  • 可移植性
      如果SQL算法使用由多个DBMS供应商支持的通用SQL子集,那么该算法无需修改即可在其他DBMS上运行。

二、SQL算法原语

  在本节中,我们将过程语言的算法原语映射到SQL的声明性语法。为了演示这种转换,我们将展示Python和PostgreSQL的SQL方言中的代码片段。

2.1、Variables

  在SQL中,Variables可以表示为关系或关系中的值。这里的关系指的是一些数据结构,如标量、向量、矩阵、张量、集合、哈希表,甚至树和图。在SQL计算期间,可以使用WITH子句创建新变量。WITH子句允许命名子查询。然后可以在主查询中的几个位置引用这些命名的子查询。然而,与过程语言中的变量不同,SQL中使用with子句创建的变量是不可变的。要更新SQL变量,必须创建一个新变量。对于这类原语的python与SQL转换的例子如下:

在这里插入图片描述

2.2、Functions

  函数在大多数编程语言中都是必不可少的。SQL标准允许创建SQL函数,但并不是所有系统都支持。所以有一种替代方法是用WITH构造,从而允许将本地函数嵌入到SQL查询中。
在这里插入图片描述

2.3、Conditions

  标准SQL不提供分支结构,例如if-else来控制程序流。在SQL中,最接近if-else语句的结构是CASE语句。但是,CASE语句决定表达式的结果,因此类似于三元操作符而不是控制结构
  要在SQL中模拟条件控制流,UNION ALL构造是合适的。UNION ALL构造将两个或多个SELECT语句的结果组合在一起。通过只组合那些满足SELECT语句WHERE子句条件的结果,就可以模拟条件控制流(见清单3)。UNION ALL的唯一限制是各个SELECT语句中列的数量和列的数据类型必须匹配。
在这里插入图片描述

2.4、Loops

  在SQL中,循环有两种变体,它们是通过递归查询实现的,符合SQL标准[11]。大多数dbms都支持第一种变体,它是一个简单的循环,在子查询中没有递归引用(参见清单4),如下
在这里插入图片描述
  第二种变体包含子查询中的递归引用,据我们所知,它只在PostgreSQL、DuckDB和HyPer中得到完全支持,如下
在这里插入图片描述
  第二个循环变体允许在FROM子句的子查询中使用清单5中的递归工作表x。这些子查询也可以是递归的。如果对工作表的递归引用在FROM子句中出现超过一次,PostgreSQL将产生一个错误。可以通过在FROM子句中创建一个新变量并在以后的计算中引用它来避免这个错误(参见清单5中针对PostgreSQL的变通方法)我们大量利用子查询中的递归引用在SQL中实现各种算法。通过在子查询中支持递归引用,DBMS供应商可以在其产品中启用仅sql算法。

  递归查询的限制因素是缺乏拥有多个工作表的可能性。在递归中只允许有一个工作表。如果算法需要在每次迭代中更新多个变量,则必须立即将它们全部打包到工作表中。在迭代期间,这些变量必须从工作表中解包,然后再为下一次迭代重新打包。

2.5、Errors

  具有实用价值的SQL程序应该对错误的输入数据提供反馈。为了在SQL中实现输入验证,我们使用UNION ALL构造。在清单6中,计算了三种状态下概率分布的熵。概率的一个性质是它们大于等于零并且它们对所有状态的和是1。在创建错误关系时,在WHERE子句中检查这些前提条件。如果检测到错误输入,则Errors应该包含相应的错误消息。

在这里插入图片描述


三、案例研究

  这里使用基于梯度下降的逻辑回归作为案例研究,以证明以数据库友好风格编写的SQL算法是实用的。逻辑回归是一种流行的二元分类机器学习方法,它会导致以下凸优化问题:
在这里插入图片描述
  下面是一个用python写的基于梯度下降的逻辑回归
在这里插入图片描述

3.1、对数据库友好的SQL映射

  计算梯度是算法中最耗时的操作。如果性能很重要,那么用于计算梯度的SQL代码必须是数据库友好的。在这里,梯度计算主要由线性代数运算组成。SQL中的线性代数计算通常映射为一种格式,该格式显式存储向量或矩阵的每个值的索引。向量和矩阵的这种表示类似于用于稀疏线性代数的坐标格式(COO)。下面显示了如何在SQL中使用COO样式计算清单7中的梯度。
在这里插入图片描述
  在SQL中使用COO风格进行线性代数的一个优点是它的通用性,也就是说,SQL代码不依赖于矩阵中的列数。在使用COO风格时,默认情况下也支持稀疏线性代数。此外,正在进行积极的研究,以开发查询引擎,以减少类coo线性代数查询的执行时间[16]。然而,coo风格的SQL代码的性能可能不足,因为显式索引、糟糕的局部性和将数据转换为正确格式的昂贵转换会增加内存消耗。此外,SQL中co风格的线性代数严重依赖于连接。在清单8中,连接在WHERE子句中指定。

  SQL中coo风格线性代数的另一种方法是将关系本身视为向量或矩阵。关系的行和列对应于线性代数的行和列向量。向量和矩阵的这种表示类似于它们在密集线性代数中的表示。清单9显示了清单7中使用SQL中的密集线性代数样式的梯度计算。
在这里插入图片描述
  这里的梯度计算避免了连接,并且不需要为向量和矩阵提供显式索引。因此,我们称这种计算是数据库友好的。特性f1、f2和标签y存储在单个关系x中。在梯度计算过程中,特征和标签被传播以避免不必要的连接。例如,请查看在创建关系cse和v时如何选择特征f1和f2。例如在创建关系u时,当再次需要f1和f2时,这些“不必要的”选择避免了连接。

3.2、性能结果

  我们比较了NumPy、HyPer和PostgreSQL之间基于梯度下降的逻辑回归的性能。

  • NumPy是一个用于高性能科学计算的Python包。我们将NumPy链接到数学内核库(MKL)版本2020.0.2。英特尔的MKL库广泛使用矢量指令和多核处理。
  • HyPer是一个面向列的内存DBMS,在OLTP和OLAP工作负载下都能实现高性能[17]。我们使用Tableau公开的Hyper API版本0.0.13287。
  • PostgreSQL是一个广泛使用的、开源的、面向rowwororiented的DBMS。我们使用PostgreSQL 12.8版本。

  在我们的测量中,我们使用一台带有Intel i910980XE 18核处理器(36个超线程)的机器,运行Ubuntu 20.04.1 LTS,内存为128 GB。每个内核的基频为3.0 GHz,最大turbo频率为4.6 GHz,支持AVX-512矢量指令集。对于HyPer和PostgreSQL,我们测量了两种不同逻辑回归实现的性能。一种是基于coo风格的线性代数,另一种是数据库友好型的,使用无连接的密集风格进行线性代数(详细信息请参阅前一小节)。对于数据库测量,我们使用临时表。我们不使用数据库索引。在运行逻辑回归求解器时,我们以每秒迭代次数来报告性能。一次迭代计算梯度并更新前一次迭代的权重。我们验证所有实现计算相同的权重,从而获得相同的模型精度。

  下图显示了具有32个特征和100万个样本的数据集的基于梯度下降的逻辑回归的性能。虽然HyPer上的数据库友好实现实现了每秒100多次迭代,但PostgreSQL上的性能与它的COO实现没有什么不同。与HyPer相比,PostgreSQL的性能非常低,因为HyPer是一个使用查询编译的高效并行DBMS。因此,我们在进一步的测量中忽略了PostgreSQL。然而,令人惊讶的是,HyPer的速度几乎是NumPy的三倍。下面的测量探讨了HyPer优于NumPy的条件

在这里插入图片描述
  图2显示了性能取决于用于计算的线程数。当使用两个线程时,HyPer和NumPy的执行情况大致相同。当使用两个以上的线程时,HyPer上的数据库友好实现比NumPy快。随着可用内核数量的增加(线程数≤18),HyPer的性能会稳步提高。通过超线程的额外并行化,HyPer获得了更高的性能。与HyPer相比,NumPy中梯度计算的并行化很差。尽管MKL在并行化线性代数操作方面通常非常有效,但对于图2中包含32个特征的示例来说,它就失败了。

在这里插入图片描述
  在图3中,我们将特征的数量在4到128之间变化。我们把它留给实现来决定使用多少线程。NumPy利用数据集中所有18个核心和4个特征,但如图3所示,这种情况的效率相当低。图3显示,当数据集中少于128个特征时,HyPer是最快的替代方案。然而,HyPer和NumPy之间的性能差距随着数据集中特征数量的增加而缩小。在128个功能下,NumPy甚至比HyPer还要快一点
在这里插入图片描述

  图4显示了性能作为数据集中示例数量的函数。测量结果以对数标度表示。对于数据集中少于或等于105个示例,NumPy是最快的选择。NumPy将矩阵和向量连续地存储在内存中,因此当数据集适合缓存时,它将受益于良好的局部性。此外,由于权重更新依赖于先前计算的权重,因此对于小数据集,有效的并行化无法发挥作用。同样,为了进行基准测试,我们重复运行算法100次迭代。在HyPer中,这些时间包括缓存SQL查询的运行时。对于较小的数据量,查询的设置成本不会摊销。因此,对于小问题,NumPy要快得多。在HyPer中,测量中存在不规则性。对于数据集中的106个示例,HyPer每秒执行的迭代次数多于105个示例。这种不规律的原因是HyPer只通过一个线程执行少于或等于105个示例的所有查询。

在这里插入图片描述


四、结论以及未来工作

  纯sql算法不是一个理论噱头,但可以具有很高的实用价值。它们提供了诸如近数据计算、代码更改的灵活性、对底层DBMS体系结构的高度抽象以及可移植性等优点。我们展示了如何用SQL表示算法原语。通过使用这些原语,可以在SQL中实现计算密集型算法。在案例研究中,我们提供了数据库友好的SQL代码,它避免了线性代数操作的连接。事实证明在HyPer上的数据库友好型SQL实现甚至可以在更大的数据集上优于NumPy。

  算法中的循环通常包含对先前迭代数据的复杂计算。我们演示了如何在SQL中通过在WITH recursive的FROM子句中使用对工作表的递归引用来实现这种循环。像PostgreSQL、DuckDB或HyPer这样支持递归引用的dbms,已经可以使用SQL进行各种计算。扩展DBMS以支持子查询中的递归引用将是很简单的,我们希望本文能够促使DBMS开发人员实现这一特性。

  在未来的工作中,我们计划使用编译将命令式结构自动转换为SQL。编译器方法也可以将线性代数操作转换为SQL。为了使线性代数操作的转换尽可能高效,需要进一步探索SQL中无连接线性代数的局限性。深度学习似乎也是我们计划探索的一个有趣的用例。通过使用外部工具(如我们的矩阵演算[13-15])计算导数并将其转换为SQL,剩下要做的唯一事情就是在SQL中实现优化算法,这是可能的,正如我们在案例研究中所展示的那样。因此,我们相信SQL机器学习和其他形式的SQL计算密集分析非常有前途。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1671149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实习大学生如何在Purple Pi OH鸿蒙开发板下调试Android串口?

本文适用于Purple Pi OH在Android固件后串口的开发与使用。触觉智能的Purple Pi OH鸿蒙开源主板,是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党,极客,工程师,极大降低了开源鸿蒙开发者的入门门槛&#xff0c…

如何利用甘特图来提高资源的是使用效率?

在项目管理中,甘特图是一种常用的工具,用于规划和跟踪项目进度。它通过条形图的形式展示项目的时间表和任务依赖关系,帮助项目经理和团队成员清晰地了解项目的时间线和进度。通过合理利用甘特图,可以显著提高资源的使用效率&#…

【话题】软件开发的航海图:程序员的实用神器探秘

大家好,我是全栈小5,欢迎阅读小5的系列文章,这是《话题》系列文章 目录 背景一、代码编写二、版本控制三、测试与调试四、部署与运维五、总结文章推荐 背景 在软件开发的广阔海洋中,每一位程序员都是一位勇敢的航海家&#xff0c…

安卓手机数据恢复全攻略:从备份到专业软件一网打尽!

随着科技的飞速发展,我们的生活中越来越离不开手机。然而,在使用手机的过程中,我们可能会遇到数据丢失的问题。对于安卓手机用户来说,如何有效地恢复丢失的数据是一个值得探讨的问题。本文将为您介绍安卓手机数据恢复的全攻略&…

[笔试强训day08]

文章目录 HJ108 求最小公倍数NC95 数组中的最长连续子序列DP39 字母收集 HJ108 求最小公倍数 HJ108 求最小公倍数 #include<iostream>using namespace std;int a,b;int gcd(int a,int b) {if(b0) return a;return gcd(b,a%b); } int main() {cin>>a>>b;int …

NoSql数据存储:Redis

NoSql 数据存储&#xff1a;Redis 前言安装在Windows上安装Redis在Linux上源代码安装Redis远程连接 基本操作常用命令stringhashlistsetzset SpringBoot整合Redis基本使用项目案例排行榜应用&#xff0c;取浏览量最高TOP N数据的操作需要精确设定过期时间的应用计数器应用Uniq操…

一站式健康管理平台,让健康触手可及

如何有效地管理慢性病&#xff0c;提高患者的健康水平&#xff0c;成为国家和社会关注的焦点。慢病健康管理系统应运而生&#xff0c;以其一站式健康管理平台的特性&#xff0c;让健康触手可及。 一、打破壁垒&#xff0c;以医疗标准做健康管理 慢病健康管理系统不仅打破了医疗…

【多模态】30、GPT4V_OCR | GPT4V 在 OCR 数据集上效果测评

文章目录 一、背景二、测评2.1 场景文本识别2.2 手写文本识别2.3 手写数学公式识别2.4 图表结构识别&#xff08;不考虑单元格中的文本内容&#xff09;2.5 从内容丰富的文档中抽取信息 三、讨论 论文&#xff1a;EXPLORING OCR CAPABILITIES OF GPT-4V(ISION) : A QUANTITATIV…

Faster Ring-Packing via BST and Ring-Switch

参考文献&#xff1a; [GHPS12] Gentry C, Halevi S, Peikert C, et al. Ring switching in BGV-style homomorphic encryption[C]//International Conference on Security and Cryptography for Networks. Berlin, Heidelberg: Springer Berlin Heidelberg, 2012: 19-37.[GHP…

vue 发布项目

You are not allowed to force push code to a protected branch on this project. 分支做了保护&#xff0c;git中设置允许强制推送

【电路笔记】-无源带通滤波器

无源带通滤波器 文章目录 无源带通滤波器1、概述2、二阶带通滤波器的频率响应3、带通滤波器示例4、总结无源带通滤波器可以通过将低通滤波器与高通滤波器连接在一起制成。 1、概述 无源带通滤波器可用于隔离或滤除特定频带或频率范围内的某些频率。 简单 RC 无源滤波器中的截止…

咸鱼之王游戏攻略:平民怎么起号?

在《咸鱼之王》这款游戏中&#xff0c;即使是平民玩家&#xff0c;也有着许多可以优化的操作&#xff0c;以最大程度地提高收益。本攻略将针对平民玩家的日常操作进行详细解读&#xff0c;包括黑市购买、资源管理等方面的建议&#xff0c;希望对广大玩家有所帮助。 一、黑市购买…

Sublime Text for Mac:强大的文本编辑器

Sublime Text for Mac&#xff0c;一款轻量而强大的文本编辑器&#xff0c;为您的编程和写作工作带来无限可能。它以其简洁的界面和出色的性能&#xff0c;成为Mac用户中备受推崇的编辑器之一。 Sublime Text支持多种编程语言&#xff0c;无论是Python、JavaScript、HTML还是CS…

MoneyPrinter国内版改造

背景&#xff1a; MoneyPrinter 是一个自动生成短视频的开源项目。只需要输入短视频主题&#xff0c;然后就可以生成视频。 在国内环境运行时&#xff0c;框架中使用的youtube、抖音文字转语音等功能无法使用&#xff0c;需要对框架进行国内版改造&#xff0c;使其使用国内网络…

Vue路由开启步骤

1.在控制台输入命令 //控制台下载安装npm add vue-router3.6.5 2.在main.js下导入并注册组件 import Vue from vue import App from ./App.vue//控制台下载安装npm add vue-router3.6.5 //导入 import VueRouter from "vue-router";//注册 Vue.use(VueRouter) con…

巩固学习7

正则表达式 就是用来找到符合模式的字符串&#xff0c;这些模式包括&#xff1a;是什么字符&#xff0c;重复多少次&#xff0c;在什么位置&#xff0c;有哪些额外的约束 找某个字符串 import re text身高:178 体重:168 学号:123456 密码:9527 #在Python中&#xff0c;r前缀用…

【软考高项】四十五、项目管理科学计算之工程经济学

一、资金的时间价值与等值计算的概念 1、资金的时间价值是指不同时间发生的等额资金在价值上的差别。 2、把资金存入银行,经过一段时间后也会产生增值,这就是利息。 例如,在年利率为5.22%条件下&#xff0c;当年的100元与下一年的105.22元是等值的,即100 &#xff08;15.22%&a…

模型 奥卡姆剃刀原则

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。如无必要&#xff0c;勿增实体。 1 奥卡姆剃刀原则的应用 1.1 奥卡姆剃刀原则在工程设计中的应用 一家制造智能手机的科技公司“移动创新”在设计其最新型号手机时遇到了一个难题&#xff1a;新款手…

基于FPGA的视频矩阵切换方案

一、单个显示设备的系统方案&#xff1a;会议室只有1个显示设备 会议室的信号源有很多&#xff0c;但是显示设备只有1个&#xff0c;这个时候最佳方案是使用切换器。 &#xff08;1&#xff09;切换器&#xff08;控制方式&#xff1a;遥控器、软件、机箱面板、中控&#xff…

Star CCM+衍生零部件的创建

前言 在一个仿真计算项目中&#xff0c;分配零部件至区域、划分网格后。下一步可以先将需要监测的点、面建立出来&#xff0c;方便后续创建报告。Star中需要创建点、面是在衍生零部件下创建。衍生零部件→右键→新建&#xff08;如下图1所示&#xff09;。通过衍生零部件可以创…