我用 SQL 实现了一个神经网络

查看原文 HN 讨论

文章摘要

作者 alxmrs 完全用 SQL 查询训练了一个多层感知机(MLP)来分类 Fashion-MNIST,其载体是他自己的数组数据库库 Xarray-SQL。项目的核心前提是:任何 N 维数组都可以映射为二维的表格模型——N 维数组中彼此正交的维度,正好对应表格表示中的主键。作者在给一位 GSoC 实习生做代码评审的间隙萌生了这个 demo:既然数组能被当作表来处理,那么把神经网络的张量运算也表达成关系查询是否可行?

具体做法上,网络是一个 4 层 MLP:784 个输入像素 → 196 → 32 → 10 个输出类别,隐藏层用 tanh 激活,输出层为线性。数据被表示为关系:图像存进带有 (sample, height, width) 维度的 pixels 表,权重按层组织成带 (inp, out) 维度的表,偏置单独按层存储。前向传播中的逐层矩阵乘法被实现为表连接加分组聚合,即 SELECT SUM(activation * weight) GROUP BY output_unit 的形式;激活函数(tanh、softmax 中的 exp)在聚合之后应用;反向传播则通过从输出误差开始的链式连接反向传播,用 SQL 的 grad() 函数计算局部导数。为提速,代码缓存了中间结果(激活值、delta、梯度)以避免在 60 个训练步中反复扫描源数据。一个值得一提的优化是 SKIP_ZERO_PIXELS:在第一层收缩时过滤掉零值像素,由于零贡献在数学上是中性的,这一步能”精确地缩小连接”,在真实数据上带来约 1.8 倍加速。

HN 评论精华

讨论从最初的”翻白眼”迅速转向对底层理论的欣赏与补充。