没错,纯SQL查询语句可以实现神经网络数据库

来源:互联网 / 作者:SKY / 2018-05-14 15:18 / 点击:
在这篇文章中,我们将纯粹用SQL实现含有一个隐藏层(以及带 ReLU 和 softmax 激活函数)的神经网络。这些神经网络训练的步骤包含前向传播和反向传播,将在 BigQu

没错,纯SQL查询语句可以实现神经网络

我们熟知的SQL是一种数据库查询语句,它方便了开发者在大型数据中执行高效的操作。但本文从另一角度嵌套SQL查询语句而构建了一个简单的三层全连接网络,虽然由于语句的嵌套过深而不能高效计算,但仍然是一个非常有意思的实验。

没错,纯SQL查询语句可以实现神经网络

在这篇文章中,我们将纯粹用SQL实现含有一个隐藏层(以及带 ReLU 和 softmax 激活函数)的神经网络。这些神经网络训练的步骤包含前向传播和反向传播,将在 BigQuery 的单个SQL查询语句中实现。当它在 BigQuery 中运行时,实际上我们正在成百上千台服务器上进行分布式神经网络训练。听上去很赞,对吧?

也就是说,这个有趣的项目用于测试 SQL 和 BigQuery 的限制,同时从声明性数据的角度看待神经网络训练。这个项目没有考虑任何的实际应用,不过最后我将讨论一些实际的研究意义。

我们先从一个基于神经网络的简单分类器开始。它的输入尺寸为 2,输出为二分类。我们将有一个维度为 2 的单隐层和 ReLU 激活函数。输出层的二分类将使用 softmax 函数。我们在实现网络时遵循的步骤将是在  Karpathy’s CS231n 指南(https://cs231n.github.io/neural-networks-case-study/)中展示的基于 SQL 版本的 Python 示例。

模型

该模型含有以下参数:

输入到隐藏层

W: 2×2 的权重矩阵(元素: w_00, w_01, w_10, w_11)

B: 2×1 的偏置向量(元素:b_0, b_1)

隐藏到输出层

W2: 2×2 的权重矩阵(元素: w2_00, w2_01, w2_10, w2_11)

B2: 2×1 的偏置向量(元素:b2_0, b2_1)

训练数据存储在 BigQuery 表格当中,列 x1 和 x2 的输入和输出如下所示(表格名称:example_project.example_dataset.example_table)

没错,纯SQL查询语句可以实现神经网络

如前所述,我们将整个训练作为单个 SQL 查询语句来实现。在训练完成后,通过 SQL 查询语句将会返回参数的值。正如你可能猜到的,这将是一个层层嵌套的查询,我们将逐步构建以准备这个查询语句。我们将会从最内层的子查询开始,然后逐个增加嵌套的外层。

前向传播

首先,我们将权重参数  W 和 W2 设为服从正态分布的随机值,将权重参数 B 和 B2 设置为 0。 W 和 W2 的随机值可以通过 SQL 本身产生。为了简单起见,我们将从外部生成这些值并在 SQL 查询中使用。用于初始化参数的内部子查询如下:

SELECT *,     

               -0.00569693  AS w_00,  

               0.00186517  AS w_01,  

               0.00414431  AS w_10,  

               0.0105101  AS w_11,  

               0.0  AS b_0, 

               0.0  AS b_1, 

               -0.01312284  AS w2_00, 

               - 0.01269512  AS w2_01, 

              0.00379152  AS w2_10,      

              -0.01218354  AS w2_11, 

              0.0  AS b2_0, 

              0.0  AS b2_1 

 FROM  `example_project.example_dataset.example_table` 

请注意,表格 example_project.example_dataset.example_table 已经包含了列  x1、 x2 和 y。模型参数将会被作为上述查询结果的附加列添加。

接下来,我们将计算隐藏层的激活值。我们将使用含有元素 d0 和 d1 的向量 D 表示隐藏层。我们需要执行矩阵操作 D = np.maximum(0, np.dot(X, W) + B),其中 X 表示输入向量(元素 x1 和 x2)。这个矩阵运算包括将权重 W 和输入 X 相乘,再加上偏置向量 B。然后,结果将被传递给非线性 ReLU 激活函数,该函数将会把负值设置为 0。SQL 中的等效查询为:

SELECT *,       

           (CASE 

阅读延展

1
3