将神经网络存储在数据库中的最佳实践

时间:2013-09-20 09:05:08

标签: sql database neural-network graph-databases

我正在开发一个使用神经网络的应用程序。目前我正在考虑将其置于基于SQL(可能是SQL服务器)或图形数据库的关系数据库中。

从性能角度来看,神经网络将非常庞大。

我的问题:

  1. 与图形数据库相比,处理神经网络时,关系数据库会遭受性能损失吗?
  2. 哪种图形数据库技术最适合处理大型神经网络?
  3. 可以使用PostGIS等地理空间数据库有效地表示神经网络吗?

2 个答案:

答案 0 :(得分:6)

这取决于模型进展的意图。

  1. 您是否对网络的不可变结构有一个固定的想法?像Kohonnen地图。或者是现成的模型。
  2. 您是否有多个需要测试的关系结构,以便您希望能够在不同结构之间切换开关。
  3. 您的模型是否将节点视为流体自动机,可以自由寻找自己的邻居?每个自动机产生一组共同参数的独特特征值,并且您需要分析这些值如何影响它们的选择"邻居们。
  4. 对于固定数量的类型/节点类,您是否有一组固定的参数?或者是一个节点,期望开发一系列独特的属性和关系?
  5. 您是否经常需要访问每个节点,尤其是那些嵌入网络层深层的节点,以分析和关联它们?
  6. 您的网络是否可以被视为或可量化为状态机组?
  7. <强>声明
    首先,我要声明我只熟悉Kohonnen地图。 (所以,我承认曾被Kohonnen嘲笑为只有神经网络的入门级别。)上述问题是我多年来随意和低学历幻想的个人心理攻击的结果。阅读各种神经系统。

    类别与参数对比属性
    我们可以按车轮数量或吨位分类车辆吗?轮量或吨位应该是属性,参数还是类别特征。

    理解这一争论是构建存储库的关键步骤。这场辩论与疾病和患者病媒特别相关。我见过患者信息关系图式,由医学专家设计,但显然没有太多的信息科学培训,为每位患者设定了一套共同的参数。每个患者记录有数千列,大多数未使用。当它们超出表的列限制时,它们会创建一个新表,其中包含数千个稀疏使用的列。

    • 类型1:所有节点都有一组通用参数,因此可以将节点建模为具有已知列数的表。

    • 类型2:有各种类型的节点。有固定数量的节点类。每个类都有一组固定的参数。因此,每个节点类都有一个特征表。

    • 类型3:没有意图对节点进行打孔。每个节点都可以自由开发并获得自己独特的属性集。

    • 类型4:有固定数量的节点类。类中的每个节点都可以自由开发并获取自己独特的属性集。每个类都有一组允许获取节点的有限属性。

    阅读EAV模型以了解参数与属性的问题。在EAV表中,节点只需要三个特征列:

    • 节点ID
    • 属性名称
    • 属性值

    但是,在技术限制下,属性可以是数字,字符串,可枚举或类别。因此,将有四个属性表,每个值类型一个,加上节点表:

    • 节点ID
    • attriute type
    • 属性名称
    • 属性值

    顺序/链接访问与散列/直接地址访问
    您是否必须直接访问单个节点而不是遍历结构树以快速访问节点?

    您是否需要找到已获取特定特征(属性集)的节点列表,而不管它们在网络拓扑上的位置?您是否需要在网络节点上执行分类(也称主成分分析)?

    <强>国家机
    您是否希望将网络区域视为状态机的集合? 状态机是非常有用的量化实体。状态机定量可以帮助您根据邻域相似性和关系在一系列节点上形成经验实体。

    为什么不将它们聚集到相似的区域,而不是试图理解和跟踪数百万个节点的个体行为。并跟踪这些地区的状态机流量。

    结论

    这是我的建议。您应该从最初使用完全关系数据库开始。原因是关系数据库和关联的SQL提供了非常宽松的关系视图信息。使用关系模型上的SQL,您可以查询或关联您不知道存在的关系。

    随着实验的进展,您可能会发现某些关系建模更适合网络图形存储库,您应该将模式的这些部分移动到合适的存储库中。

    处于最终状态。我会维护一个双模式信息回购。您维护一个关系回购以跟踪节点及其属性。因此,您将动态变异结构存储在网络图库中,但每个节点都引用关系数据库中的节点ID。关系数据库允许您根据属性及其值查询节点。例如,

    SELECT id FROM Nodes a, NumericAttributes b
    WHERE a.attributeName = $name
      AND b.value WItHIN $range
      AND a.id = b.id
    

    我想,也许可以使用hadoop而不是传统的网络图数据库。但是,我不知道hadoop如何适应动态变化的关系。我的理解是,hadoop对于一次性多次读取是有益的。然而,动态神经网络在频繁的关系变化中可能表现不佳。然而,关系表建模网络关系并不高效。

    尽管如此,我相信我只是暴露了你需要考虑的问题,而不是给你一个明确的答案,特别是对许多概念的生锈知识。

答案 1 :(得分:0)

可以使用自引用外键将树存储在表中。我假设只需要存储的两件事就是拓扑和权重;这两者都可以存储在扁平的树形结构中。当然,这可能需要大量的递归选择,这取决于您的RDBMS可能是本机实现的痛苦(因此需要许多SQL查询来实现)。我不能评论比较,但希望这有助于关系的观点:)