使用模拟退火训练神经网络的非常大的数据集

时间:2013-09-08 15:13:44

标签: java neural-network training-data simulated-annealing large-data

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

一些猜测:

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

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

每次迭代采用100k平方和的输出误差使其收敛比10平方和版本无限长。因为找到一个更稳定的状态的概率太低了。也许有一种方法可以从第一个数据迭代到结束而不进行全部计算(从一个数据中获取更好的错误状态非常容易但是如何迭代?当第二个数据到达时,首先会被遗忘,因为模拟退火是一个随机行动)

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

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

核心方式是什么?

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

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

大于10-15的批量生产需要永远。

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

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

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

例如,漫反射贴图,仅使用gpu和映射(calc)以超过190个数据集训练一秒钟(或两个),纳秒 - 微秒:

训练前: enter image description here

训练结束后: enter image description here

(可选)强化以获得硬分离的边界(在此示例中,红色和蓝色以0.5f边界分隔) enter image description here

但是这种学习只适用于两个输入(两个维度),每个输出都必须有另一个地图。

任何可以在这些图片中执行此操作的免费java库都将非常受欢迎。

1 个答案:

答案 0 :(得分: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的激活。

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

**当线条横截面不存在时

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

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

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

节点3不会被激活,表示相关位置没有线段。


这是一个例子,说明这个问题的一个很小的功能神经网络部分会是什么样子。

在自然界中,有许多神经元致力于解决许多层中的问题。 将存在激活和抑制连接,这些连接最初在相邻层中的神经元之间随机排列。

要训练神经网络,您可以根据数据输入激活第1层。 如果结束节点(简化示例中的第3层)被激活并且输入是螺旋形的, 那么你会增加激活神经元之间所有激活连接的强度。 如果结束节点(简化示例中的第3层)被激活并且输入是螺旋形的, 那么你也可以增加神经元之间所有抑制连接的强度,其中激活更早层并且连接的神经元被抑制。

经过足够的训练后,我们的想法是,神经网络中的连接值自然会发展为识别螺旋线。


要回答您的具体跟进问题:"那么无法使用所有数据集进行实时培训?"

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

如果您的程序使用所有训练课程的加权平均值来定义神经元'连接优势,然后先前培训输入的知识已经整合到网络中。