← 返回信息流
AI 资讯Hacker News·2 小时前

开发者用SQL成功实现神经网络

原标题:Show HN: I implemented a neural network in SQL

速览

一位开发者通过SQL查询实现了神经网络的前向传播与训练,展示了在关系数据库中直接进行机器学习的可能性。该方法无需外部计算框架,可复用数据库内数据。虽效率有限,但这种创意实现为数据原地计算提供了新思路。

AI 深度解读

背景

传统上,神经网络训练和推理都在 Python、C++ 等通用编程语言中完成,而 SQL 作为结构化查询语言,通常被认为只适合数据处理和简单聚合。然而,随着数据库系统和 SQL 引擎的不断扩展,有开发者开始探索在 SQL 中直接实现机器学习算法。Hacker News 上一位用户展示了名为 xarray_sql 的项目,它利用 xarray 和 SQL 查询,在 PostgreSQL 等数据库上训练了一个简单的全连接神经网络,用于 Fashion-MNIST 分类任务。该项目证明了即使在纯 SQL 的执行环境下,也能完成前向传播、反向传播和梯度下降更新。

核心内容

该项目实现了一个三层全连接神经网络(784→196→32→10),使用 SQL 进行数据加载、随机采样、前向传播和参数更新。核心思路是将网络权重和偏置存储为 xarray Dataset,然后通过 xarray_sql 库将其注册为 SQL 表,后续所有操作均通过 SELECT 语句完成。

数据加载与采样

  • 数据集采用 Fashion-MNIST,从 S3 上的 Zarr 文件按需读取(大小 28×28 像素,共 700 个样本,其中 70% 用于训练,30% 用于测试)。
  • 通过 ORDER BY random() LIMIT 700 在 SQL 中随机抽取 700 个样本,并生成 split 列(train/test)。
  • 采样后的图像数据被缓存到 SQL 表 pixels 中,避免每次 epoch 都扫描整个数据集。

模型定义

  • 权重矩阵 layer_i 形状为 (inp_i, out_i),偏置向量 bias_i 形状为 (out_i,)
  • 初始化:权重使用 standard_normal 乘以 0.1,偏置全部为零。
  • 模型表被注册到 SQL 中,每个权重矩阵和偏置向量分别对应一张表。

前向传播(SQL 实现)

  • 层 0(全连接 + ReLU):通过 SELECT 连接 pixels 表与 layer0 表,计算每个样本的加权和,加上偏置,然后应用 CASE WHEN 实现 ReLU。
  • 层 1(全连接 + tanh):类似的连接,输出通过 TANH 函数。
  • 层 2(全连接 + softmax):输出层得到 logits,softmax 通过 EXPSUM 在 SQL 中计算(按样本分组)。

损失函数与反向传播

  • 损失使用交叉熵(cross-entropy)。
  • 反向传播通过链式法则,每一步的梯度都用 SQL 计算。例如,输出层梯度 = softmax 输出 - 独热标签,然后通过 JOIN 计算权重更新量。
  • 所有梯度计算均使用集合操作(GROUP BYSUMAVG)完成。

参数更新

  • 使用梯度下降,学习率 0.5,迭代 60 步。
  • 每一步通过 UPDATEINSERT 方式更新模型表(实际上项目使用 xarray 的 in-memory 更新,但核心逻辑是 SQL 可执行的)。

性能优化

  • 跳过零像素:对于背景像素(值为 0),其权重贡献为 0,因此可以在 JOIN 时直接跳过这些行,减少计算量。实测在 Fashion-MNIST 上(约 50% 零像素)速度提升约 1.8 倍。
  • 缓存采样结果:将采样后的数据缓存到 pixels 表中,避免重复扫描原始数据集。

关键要点

  • 该实现完全在 SQL 执行引擎内完成神经网络训练,无需 Python 循环或矩阵运算库,依赖 xarray_sql 将 xarray 对象映射为 SQL 表。
  • 前向传播、反向传播和参数更新全部通过 SELECTJOINGROUP BYCASE WHEN 等标准 SQL 操作实现。
  • 模型权重和偏置存储在 SQL 表中,梯度计算后通过 UPDATE 更新。
  • 利用 SQL 的 ORDER BY random() LIMIT 实现随机批处理采样,无需外部 shuffle。
  • 跳过零像素的优化利用了 SQL 的 WHERE 过滤,且不影响数学正确性。
  • 项目仅处理了小规模数据(700 个样本),但展示了 SQL 作为通用计算引擎的潜力。
  • 代码依赖 xarray_sqlxarraynumpys3fszarr,核心逻辑在 nn.py 中,约 488 行。

意义与影响

  • 技术概念验证:证明了 SQL 可以作为一种图灵完备的计算语言,完成标准神经网络训练,突破了传统 SQL 只能做简单查询的认知。
  • 数据库原生 AI 的潜力:如果能将此类方法扩展到大规模分布式 SQL 引擎(如 Snowflake、BigQuery),可让数据直接在数据库内完成训练,避免数据移动,降低工程复杂度。
  • 教育价值:帮助理解神经网络底层计算本质——矩阵乘法、激活函数、梯度链式法则本质上都是关系代数和聚合操作。
  • 局限性:当前实现性能远低于 Python+NumPy/PyTorch,且无法处理卷积、循环等复杂结构,适合小规模、教学或原型验证。
  • 开源社区反响:该帖子在 Hacker News 上获得 16 个 Fork,说明引起了开发者兴趣,可能推动更多数据库内模型训练的实验。
查看原文 →github.com