1

由于即使对于我的多层前馈网络的 10-15 组两个输入,模拟退火也需要太多时间,我如何使用 100k 数据集来训练 8-9 个输入?

一些猜测:

  • 从随机位置采样。(例如:200 组螺旋问题只有 10 次读取,每次使用随机数据)
  • 使用数据量化器将 200 个数据集分成 20 个量化区域,以提供 20 倍的神经网络

但是这些不能提供相同的输出,第一个选项不能保证找到哪个螺旋拥有输入位置(错误的测试用例),第二个选项需要 20 倍以上的神经元和计算能力。

每次迭代采用 100k 平方和的输出误差,使其收敛时间比 10 平方和版本长得多。因为找到一个更稳定的状态的概率太低了。也许有一种方法可以在不计算所有数据的情况下从第一个数据迭代到最后(从一个数据中获得更好的错误状态非常容易,但是如何迭代?当达到第二个数据时,第一个数据会被遗忘,因为模拟退火是随机动作)

四个数据集的示例:{ {0,0} {0,1} {1,0} {1,1} } ----> {0,1,1,0} ---->easy

100k 组数据:两个大螺旋的坐标,NN 试图通过数据找到一个独特性。难的。

什么是核心方式?

收敛第一个数据然后第二个然后......最后一个数据,最后降低温度?

完全收敛第一个数据,降低温度,完成后,对其他数据做同样的事情吗?

按大于 10-15 的批次进行操作需要很长时间。

我们可以取两个数据的收敛权重并获得这些权重的平均值并使用吗?

例如,对于孢子类游戏的生物创造者,当一个生物有 40 条腿时,教走路可能会很困难,因为会有很多随机情况,并且需要实时学习(与游戏同时进行)跑步)

最重要的是:在线学习是否可以接受模拟退火,如果可以,如何?任何已知的伪代码?

例如,使用 gpu 和 mapped(calc) 在一秒(或两秒)内对超过 190 个数据集进行训练,以纳秒-微秒为单位:

训练前: 在此处输入图像描述

训练结束后: 在此处输入图像描述

(可选)强化以获得硬分离的边界(在此示例中,红色和蓝色以 0.5f 边界分隔) 在此处输入图像描述

但是这种类型的学习仅适用于两个输入(二维),并且对于每个输出都必须有另一个映射。

任何可以做这些图片中的事情的免费 java 库都将不胜感激。

4

1 回答 1

1

有关您正在处理的内容和/或代码示例的一些特定附加信息会有所帮助。

但是,这是我的建议:

听起来您有一个包含 100k 行的数据集。其中一些数据行可能是重复的。通常使用人工神经网络,程序在激活时会增加网络的两个节点之间的连接强度。

与其一次用一条输入线训练你的人工神经网络,不如说一种更快的策略是:

识别输入中的唯一行并计算它们出现的频率。当您训练人工神经网络时,使用该输入的计数作为您增加节点连接强度的因素。

无需进行 100k 次迭代训练网络,您将能够进行较少次数的训练迭代。结果应该是整个过程将花费更少的时间和处理器功率。

(如果您不想以编程方式识别和计算数据集中的唯一项目,则可以使用 Microsoft Excel 的数据透视表功能在几分钟内完成此操作。)

希望这可以帮助!

编辑:我添加了以下文本作为编辑,因为添加为评论太长了。

感谢您添加有关您尝试解决的问题的其他详细信息。这是一个非常复杂的问题,没有简单的答案。

在人工神经网络中有节点,它们是可以被激活的点。然后节点之间有连接。这些连接既可以用于激活另一个节点,也可以用于抑制另一个节点。最后,这些联系的强度可以根据反馈增加或减弱。换句话说,每个连接都有一个描述其强度的因素。一个节点是否被其他节点激活是与它的连接强度之和的函数,其中连接到一个已经激活的节点,连接强度是正还是负取决于连接是否激活或抑制。

人工神经网络背后的想法是,与其确切定义它们的工作方式,不如设置基本规则,然后对其进行训练以有机地发展工具。现实情况是,有一些设计必须涉及人工神经元相互连接的方式。


我提到识别 3D 螺旋需要非常复杂的人工神经网络。在创建基本设计时,更容易定义基本的工作最终产品想要什么,然后以此为基础进行构建。

具体来说,让我们定义人工神经网络如何查看螺旋线的横截面以确定它是否是一条线。一条线的一维横截面可能由三个节点组成(想象三个并排的像素)。把它想象成一个数组中的三个变量,其中的值可以是 0(未激活)或 1(已激活)。我们称这些节点为 1a、2a 和 3a。

我们希望我们的人工神经网络最小示例查看这三个像素并确定中间是否有一条线。中间的一条线可以定义为:中间节点激活而两个外部节点未激活(黑色背景上的白线),或者两个外部节点激活而中间节点未激活(黑色背景上的一条黑线)白色背景)。

然后我们需要第二层节点来确定所识别的横截面是白线还是黑线。该层需要两个节点。我们称它们为节点 1b(白线)和 2b(黑线)。

最后,我们想要只有一个节点的第三层也是最后一层。如果识别出一条线,则应激活该节点。我们称这个节点为 3。

现在让我们定义节点之间的连接。

节点 2a 应该具有到节点 1b 的激活连接。节点 2a 应该具有到节点 2b 的抑制连接。节点 1a 和 3a 应该具有到节点 1b 的抑制连接。节点 1a 和 3a 应该具有到节点 2b 的激活连接。节点 1b 和 2b 都应该具有到节点 3 的激活连接。

回想一下,如果节点 3 被激活,就会检测到一条线的横截面。节点 3 的激活意味着数据中的这个特定点看起来像一条线的横截面。

以下是此函数神经网络示例处理某些数据的方式:

**当存在线横截面时

0,1,0(节点 1a 未激活;节点 2a 已激活;节点 3a 未激活)

在此数据集示例中,仅激活了节点 2a。这将触发连接到节点 1b 的激活和连接到节点 1a 的抑制连接。

在神经网络的第二层,节点 1b 被激活。这将触发连接到节点 3 的 Activating。

节点 3 的激活表明在该点存在一条线的横截面。

**当不存在线横截面时

0,1,1(节点 1a 未激活;节点 2a 已激活;节点 3a 已激活)

在此数据集示例中,节点 2a 和 3a 被激活。节点 2a 将触发连接到节点 1b 的激活和连接到节点 1a 的抑制连接。节点 3a 将触发连接到节点 1b 的抑制和连接到节点 1a 的激活连接。

节点 1b 或 2b 都不会被激活,因为 Activating 和 Suppressing 连接将相互平衡(假设连接的强度相等)。

节点 3 将不会被激活,表明在该位置没有线段。


这是一个例子,说明在这个问题中一个正常工作的神经网络的一小部分会是什么样子。

在自然界中,有数以百万计的神经元在许多层中致力于解决这样的问题。将有激活和抑制连接,它们最初是在相邻层的神经元之间随机排列的。

要训​​练神经网络,您将根据数据输入激活第 1 层。如果末端节点(简化示例中的第 3 层)被激活并且输入是螺旋形,那么您将增加激活神经元之间所有激活连接的强度。如果末端节点(简化示例中的第 3 层)被激活并且输入是螺旋形的,那么您还将增加激活较早层且连接到的神经元被抑制的神经元之间的所有抑制连接的强度。

经过足够的训练,这个想法是你的神经网络中的连接值会自然地演变成一个螺旋。


回答您的具体后续问题:“所以没有办法使用所有数据集进行实时训练?”

是的,您可以实时训练数据集。我理解你最初的问题是什么是训练一个非常大的数据集的更快方法。

如果您的程序使用所有训练会话的加权平均值来定义神经元的连接强度,那么先前训练输入的知识已经被整合到网络中。

于 2013-09-11T20:22:47.550 回答