【論文閱讀】Machine Learning, Linear Algebra, and More: Is SQL All You Need?

文章目錄

  • 摘要
  • 一、介紹
  • 二、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.pswp.cn/web/11531.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11531.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11531.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文件流-ASCII文件(中北大學-程序設計基礎(2))

目錄 題目 源碼 結果示例 題目 編寫程序實現以下功能:【要求處理ASCII文件】 (1)按職工號由小到大的順序將5個員工的數據(包括號碼、姓名、年齡和工資)輸出到磁盤文件中保存; (2&#xff…

自動駕駛決策規劃——坐標轉換

以下內容來自b站up主忠厚老實的老王,視頻鏈接:自動駕駛決策規劃算法序章 總綱與大致目錄_嗶哩嗶哩_bilibilihttps://www.bilibili.com/video/BV1hP4y1p7es/?spm_id_from333.999.0.0&vd_sourced36e625f376908cfa88ef5ecf2fb0ed8侵刪。 決策規劃算法…

自動故障轉移

這里詢問,你的插槽是從哪里移動過來的? all:代表全部,也就是三個節點各轉移一部分具體的id:目標節點的iddone:沒有了 這里我們要從7001獲取,因此填寫7001的id: 填完后,…

02-登錄頁面、動態路由、權限等模塊開發

權限模塊開發流程 前端login頁面開發后端SpringSecurity配置后端login接口開發前端頁面框架搭建前端路由守衛,狀態管理開發前后端完成認證流程 開發Login頁面 創建Login頁面創建router,可以跳轉到Login頁面 Login頁面 使用element-plus開發 認證功…

力扣75. 顏色分類

Problem: 75. 顏色分類 文章目錄 題目描述思路及解法復雜度Code 題目描述 思路及解法 由于題目只提供0,1,2分別代表顏色紅、白、藍,并按此排序,那么我們可以遍歷兩次數組,第一次將0,全部放到數組前面一部分…

移動 App 入侵與逆向破解技術-iOS 篇

如果您有耐心看完這篇文章,您將懂得如何著手進行app的分析、追蹤、注入等實用的破解技術,另外,通過“入侵”,將幫助您理解如何規避常見的安全漏洞,文章大綱: 簡單介紹ios二進制文件結構與入侵的原理介紹入…

軟考考試需要達到多少分才能及格?

當然是45分!45分!45分!而且是各科45! 初級和中級考兩科 綜合知識考試時長為150分鐘,筆試,選擇題(上午9:00-11:30) 案例分析考試時長為90分鐘,筆試,問答題&…

計算機畢業設計 | vue+springboot圖書借閱 書籍管理系統(附源碼)

1. 開發目的 實現圖書的智能化、信息化和簡單化;實現圖書信息的增加、刪除、修改、查找、借閱、還書、收藏的顯示操作及實時數據庫的提交和更改和對普通用戶的增、刪、改、查;提高圖書管理員工作信息報送及反饋的工作效率,減輕管理員的勞動負…

Unity組件入門篇目錄

Audio AudioChorusFilter......................................點擊導航AudioDistortionFilter..................................點擊導航AudioEchoFilter.........................................點擊導航AudioHighPassFilter..................................點擊導…

設計模式Java實現-迭代器模式

?這里是第七人格的博客?小七,歡迎您的到來~? 🍅系列專欄:設計模式🍅 ??本篇內容: 迭代器模式?? 🍱 本篇收錄完整代碼地址:https://gitee.com/diqirenge/design-pattern 🍱 楔子 很久…

Java Spring 中使用緩存來提高性能

在Spring框架中,緩存是一種用于提高應用程序性能的重要機制。通過緩存,可以減少對數據庫或其他外部資源的訪問次數,從而加快應用程序的響應速度。以下是如何在Spring中使用緩存來提高性能的詳細過程: 1. 引入緩存依賴 首先&…

蒼穹外賣Day06筆記(復習了jwt的加密解密和傳遞)

瘋玩了一個月,效率好低,今天開始撿起來蒼穹外賣~ 1. 為什么不需要單獨引入HttpClient的dependency? 因為我們在sky-common的pom.xml中已經引入了aliyun-sdk-oss的依賴,而這個依賴低層就引入了httpclinet的依賴,根據依…

C語言從頭學05——頭文件及庫文件

我們寫"Hello World!"程序時&#xff0c;一上來先寫了一句代碼&#xff1a; #include <stdio.h> 我們看上面這條代碼&#xff0c;前面有個"#"號后邊沒有";"號&#xff0c;這樣的代碼不是普通的C語言代碼&#xff0c;它屬于預處理命令。這…

代碼隨想錄算法訓練營第六天| 242. 有效的字母異位詞、349. 兩個數組的交集、202. 快樂數、1. 兩數之和

哈希表理論基礎 [LeetCode] 242. 有效的字母異位詞 [LeetCode] 242. 有效的字母異位詞 文章解釋 [LeetCode] 242. 有效的字母異位詞 視頻解釋 題目: 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的字母異位詞。 注意&#xff1a;若 s 和 t 中每個字符出…

JavaEE技術之SpringCloud(Nacos注冊中心、Nacos配置中心、Sentinel實現熔斷與限流)

文章目錄 SpringCloud Alibaba1、簡介1.1 背景1.2 Nacos主要功能1.3 Nacos和SpringBoot、SpringCloud版本選擇 2、Nacos注冊中心2.1 案例準備2.2 Nacos注冊中心下載啟動2.2.1 下載2.2.2 解壓啟動2.2.3 nacos-server訪問測試 2.3 nacos注冊中心客戶端整合2.3.1 訂單服務整合naco…

YTU 3166 共享單車 DFS 記憶化搜索

問題 D: 共享單車 題目描述 共享單車走進煙臺&#xff0c;小明決定嘗試。小明啟動共享單車 App&#xff0c;輕松地找到附近的單車。那么問題來了&#xff0c;到最近的那輛單車&#xff0c;小明大約要走多少米呢&#xff1f; 現在簡化問題。將地圖設定成一個由 100100 米的像…

【UE】仿原神實現無限道路延伸的開場效果

目錄 效果 步驟 一、無限生成磚塊 二、制作門 三、停止移動并生成門 四、進入門 效果 步驟 一、無限生成磚塊 1. 新建一個Basic關卡&#xff0c;再新建一個Pawn類&#xff0c;這里命名為“BP_MyPawn” 打開“BP_MyPawn”&#xff0c;添加一個膠囊體碰撞組件和一個攝像…

工器具管理(基于若依)

文章目錄 前言一、工器具管理項目總覽 二、入庫功能1. 前端1.1 界面展示1.2 具體操作實現1.3 js文件 2. 后端2.1 工器具信息回顯2.2 工器具入庫 三、領用功能1. 前端1.1 界面展示1.2 具體實現操作1.3 js文件 2. 后端2.1 工器具信息回顯2.2 工器具領用 遇到的問題1. 同一頁面展示…

pat乙1033-舊鍵盤打字

1測試點2&#xff1a; 輸入的字符串如果為空&#xff0c;要用getline(cin,s)&#xff0c;而不是cin>>s&#xff0c;否則程序做不了 2題目說的如果上鍵壞了那大寫字母打印不了&#xff0c;不是大寫轉小寫打印啦&#xff0c;認真讀題 3兩個for循環長這樣&#xff0c;break…

基于springboot+vue的自習室管理和預約系統(全套)

一、系統架構 前端&#xff1a;vue | element-ui | html 后端&#xff1a;springboot | mybatis-plus 環境&#xff1a;jdk1.8 | mysql | maven | nodejs 二、代碼及數據庫 三、功能介紹 01. web端-首頁1 02. web端-首頁2 03. web端-注冊 04. web端-登錄 05. w…