我们熟知的SQL是一种数据库查询语句,它便利了开辟者在大型数据中施行高效的操作。但本文从另一角度嵌套SQL查询语句而建立了一个简单的三层全毗连收集,虽然因为语句的嵌套过深而不克不及高效计较,但仍然是一个很是成心思的尝试。
在这篇文章中,我们将纯粹用SQL实现含有一个躲藏层(以及带 ReLU 和 softmax 激活函数)的神经收集。这些神经收集锻炼的步调包含前向传布和反向传布,将在 BigQuery 的单个SQL查询语句中实现。当它在 BigQuery 中运转时,现实上我们正在成百上千台办事器长进行分布式神经收集锻炼。听上去很赞,对吧?
也就是说,这个风趣的项目用于测试 SQL 和 BigQuery 的限制,同时从声明性数据的角度对待神经收集锻炼。这个项目没有考虑任何的现实使用,不外最初我将会商一些现实的研究意义。
我们先从一个基于神经收集的简单分类器起头。它的输入尺寸为 2,输出为二分类。我们将有一个维度为 2 的单隐层和 ReLU 激活函数。输出层的二分类将利用 softmax 函数。我们在实现收集时遵照的步调将是在 Karpathy’s CS231n 指南()中展现的基于 SQL 版本的 Python 示例。
如前所述,我们将整个锻炼作为单个 SQL 查询语句来实现。在锻炼完成后,sql语句大全通过 SQL 查询语句将会前往参数的值。正如你可能猜到的,这将是一个层层嵌套的查询,我们将逐渐建立以预备这个查询语句。我们将会从最内层的子查询起头,然后逐一添加嵌套的外层。
起首,我们将权重参数 W 和 W2 设为从命正态分布的随机值,将权重参数 B 和 B2 设置为 0。 W 和 W2 的随机值能够通过 SQL 本身发生。为了简单起见,我们将从外部生成这些值并在 SQL 查询中利用。用于初始化参数的内部子查询如下:
接下来,我们将计较躲藏层的激活值。我们将利用含有元素 d0 和 d1 的向量 D 暗示躲藏层。我们需要施行矩阵操作 D = np。maximum(0, np。dot(X, W) + B),此中 X 暗示输入向量(元素 x1 和 x2)。这个矩阵运算包罗将权重 W 和输入 X 相乘,再加上偏置向量 B。然后,成果将被传送给非线性 ReLU 激活函数,该函数将会把负值设置为 0。SQL 中的等效查询为:
上面的查询将两个新列 d0 和 d1 添加到之前内部子查询的成果傍边。 上述查询的输出如下所示。
这完成了从输入层到躲藏层的一次转换。此刻,我们能够施行从躲藏层到输出层的转换了。
起首,我们将计较输出层的值。公式是:scores = np。dot(D, W2) + B2。然后,我们将对计较出来的值用 softmax 函数来获得每个类的预测概率。SQL 内部的等价子查询如下:
起首,我们将利用交叉熵丧失函数来计较当前预测的总丧失。起首,sql语句大全计较每个样本中准确类预测概率对数的负值。交叉熵丧失只是这些 X 和 Y 实例中数值的平均值。天然对数是一个递增函数,因而,将丧失函数定义为负的准确类预测概率对数很直观。若是准确类的预测概率很高,丧失函数将会很低。相反,若是准确类的预测概率很低,则丧失函数值将很高。
为了削减过拟合的风险,我们也将同样添加 L2 正则化。在全体丧失函数中,我们将包含 0。5*reg*np。sum(W*W) + 0。5*reg*np。sum(W2*W2),此中 reg 是超参数。在丧失函数中包罗这一函数将会赏罚那些权重向量中较大的值。
在查询傍边,我们同样会计较锻炼样本的数量(num_examples)。这对于后续我们计较平均值来说很有用。SQL 查询入彀算全体丧失函数的语句如下:
接下来,对于反向传布,我们将计较每个参数对于丧失函数的偏导数。我们利用链式法例从最初一层起头逐层计较。起首,我们将通过利用交叉熵和 softmax 函数的导数来计较 score 的梯度。与此相对的查询是:
在上文中,我们用 scores = np。dot(D, W2) + B2 算出了分数。因而,基于分数的偏导数,我们能够计较躲藏层 D 和参数 W2,B2 的梯度。对应的查询语句是:
同理,我们晓得 D = np。maximum(0, np。dot(X, W) + B)。因而,通过 D 的偏导,我们能够计较出 W 和 B 的导数。我们无须计较 X 的偏导,由于它不是模子的参数,且也不必通过其它模子参数进行计较。计较 W 和 B 的偏导的查询语句如下:
这包含了正向和反向传布的一整个迭代过程。以上查询语句将前往更新后的权重和偏置项。部门成果如下所示:
为了进行多次锻炼迭代,我们将频频施行上述过程。用一个简单 Python 函数足以搞定,代码链接如下:。
由于迭代次数太多,查询语句嵌套严峻。施行 10 次锻炼迭代的查询语句地址如下:
由于查询语句的多重嵌套和复杂度,在 BigQuery 中施行查询时多项系统资本垂危。BigQuery 的尺度 SQL 扩展的缩放性比保守 SQL 言语要好。即便是尺度 SQL 查询,对于有 100k 个实例的数据集,也很难施行跨越 10 个迭代。由于资本的限制,我们将会利用一个简单的决策鸿沟来评估模子,如斯一来,我们就能够在少量迭代后获得较好的精确率。
我们将利用一个简单的数据集,其输入 X1、X2 从命尺度正态分布。二进制输出 y 简单判断 x1 + x2 能否大于 0。为了更快的锻炼完 10 个迭代,我们利用一个较大的进修率 2。0(留意:这么大的进修率并不保举现实利用,可能会导致发散)。将上述语句施行 10 个迭代得出的模子参数如下:
我们将利用 Bigquery 的函数 save to table 把成果保留到一个新表。我们此刻能够在锻炼集上施行一次推理来比力预测值和预期值的差距。查询语句片段在以下链接中:
下面是对本项目标总结。我们由此获得了哪些开导?如你所见,资本瓶颈决定了数据集的大小以及迭代施行的次数。除了祈求谷歌开放资本上限,我们还有如下优化手段来处理这个问题。
建立两头表和多个 SQL 语句有助于添加迭代数。例如,前 10 次迭代的成果能够存储在一个两头表中。统一查询语句在施行下 10 次迭代时能够基于这个两头表。如斯,我们就施行了 20 个迭代。这个方式能够频频利用,以应对更大的查询迭代。sql语句大全
比拟于在每一步添加外查询,我们该当尽可能的利用函数的嵌套。例如,在一个子查询中,我们能够同时计较 scores 和 probs,而不该利用 2 层嵌套查询。
在上例中,所有的两头项都被保留直到最初一个外查询施行。此中有些项如correct_logprobs能够早些删除(虽然 SQL 引擎可能会主动的施行这类优化)。
多测验考试使用用户自定义的函数。若是感乐趣,你能够看看这个 BigQuery 的用户自定义函数的办事模子的项目(可是,无法利用 SQL 或者 UDFs 进行锻炼)。
此刻,让我们来看看基于深度进修的分布式 SQL 引擎的深层寄义。 BigQuery、Presto 这类 SQL 仓库引擎的一个局限性在于,查询操作是在 CPU 而不是 GPU 上施行的。研究 blazingdb 和 mapd 等基于 GPU 加快的数据库查询成果想必十分风趣。一个简单的研究方式就是利用分布式 SQL 引擎施行查询和数据分布,并用 GPU 加快数据库施行当地计较。
退一步来看,我们曾经晓得施行分布式深度进修很难。分布式 SQL 引擎在数十年内曾经有了大量的研究工作,并产呈现在的查询规划、数据分区、操作归置、查抄点设置、多查询安排等手艺。此中有些能够与分布式深度进修相连系。若是你对这些感乐趣,请看看这篇论文(),该论文对分布式数据库和分布式深度进修展开了普遍的研究会商。
【江湖人士】(jhrs.com)原创文章,作者:江小编,如若转载,请注明出处:https://jhrs.com/2018/25198.html
扫码加入电报群,让你获得国外网赚一手信息。
文章标题:没错纯SQL查询语句可以实现神经网络