开发者用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 通过
EXP和SUM在 SQL 中计算(按样本分组)。
损失函数与反向传播
- 损失使用交叉熵(cross-entropy)。
- 反向传播通过链式法则,每一步的梯度都用 SQL 计算。例如,输出层梯度 = softmax 输出 - 独热标签,然后通过
JOIN计算权重更新量。 - 所有梯度计算均使用集合操作(
GROUP BY、SUM、AVG)完成。
参数更新
- 使用梯度下降,学习率 0.5,迭代 60 步。
- 每一步通过
UPDATE或INSERT方式更新模型表(实际上项目使用xarray的 in-memory 更新,但核心逻辑是 SQL 可执行的)。
性能优化
- 跳过零像素:对于背景像素(值为 0),其权重贡献为 0,因此可以在
JOIN时直接跳过这些行,减少计算量。实测在 Fashion-MNIST 上(约 50% 零像素)速度提升约 1.8 倍。 - 缓存采样结果:将采样后的数据缓存到
pixels表中,避免重复扫描原始数据集。
关键要点
- 该实现完全在 SQL 执行引擎内完成神经网络训练,无需 Python 循环或矩阵运算库,依赖
xarray_sql将 xarray 对象映射为 SQL 表。 - 前向传播、反向传播和参数更新全部通过
SELECT、JOIN、GROUP BY、CASE WHEN等标准 SQL 操作实现。 - 模型权重和偏置存储在 SQL 表中,梯度计算后通过
UPDATE更新。 - 利用 SQL 的
ORDER BY random() LIMIT实现随机批处理采样,无需外部 shuffle。 - 跳过零像素的优化利用了 SQL 的
WHERE过滤,且不影响数学正确性。 - 项目仅处理了小规模数据(700 个样本),但展示了 SQL 作为通用计算引擎的潜力。
- 代码依赖
xarray_sql、xarray、numpy、s3fs、zarr,核心逻辑在nn.py中,约 488 行。
意义与影响
- 技术概念验证:证明了 SQL 可以作为一种图灵完备的计算语言,完成标准神经网络训练,突破了传统 SQL 只能做简单查询的认知。
- 数据库原生 AI 的潜力:如果能将此类方法扩展到大规模分布式 SQL 引擎(如 Snowflake、BigQuery),可让数据直接在数据库内完成训练,避免数据移动,降低工程复杂度。
- 教育价值:帮助理解神经网络底层计算本质——矩阵乘法、激活函数、梯度链式法则本质上都是关系代数和聚合操作。
- 局限性:当前实现性能远低于 Python+NumPy/PyTorch,且无法处理卷积、循环等复杂结构,适合小规模、教学或原型验证。
- 开源社区反响:该帖子在 Hacker News 上获得 16 个 Fork,说明引起了开发者兴趣,可能推动更多数据库内模型训练的实验。
查看原文 →github.com
