神经网络权重的收敛

机器算法验证 机器学习 神经网络
2022-03-25 10:19:54

我遇到了一种情况,即使经过 500 次迭代,我的神经网络的权重也没有收敛。我的神经网络包含 1 个输入层、1 个隐藏层和 1 个输出层。它们是输入层中的大约 230 个节点,隐藏层中的 9 个节点和输出层中的 1 个输出节点。我想知道,如果我做提前停止条件(比如在 100 次迭代后停止我的神经网络训练)。这会对模型产生什么影响?

还想知道如果神经网络中的权重没有收敛,行业标准是什么?

4个回答

有很多问题要问:

  • 你在每一层有适当数量的神经元吗
  • 您是否使用了适当类型的传递函数?
  • 您是否使用了适当类型的学习算法
  • 你有足够大的样本量吗
  • 你能确认你的样本之间有正确的关系来提供信息吗?(不是多余的,相关维度等......)

你能以星历表的方式给予什么?你能告诉我们一些关于数据性质的事情吗?

你可以制作一个梯度增强的神经网络树。

你问如果你提前停止会发生什么。

你可以自己试试。从随机初始化权重开始运行 300 倍,然后在指定的迭代次数处停止,比如说 100。此时计算您的集成误差、训练子集误差和测试集误差。重复。在你有 300 个值来告诉你错误是什么之后,你可以在 100 次学习迭代的情况下了解你的错误分布。如果您愿意,您可以在其他几个学习值下对该分布进行抽样。我建议进行 200、500 和 1000 次迭代。这将使您了解您的 SNR 如何随时间变化。SNR 与迭代次数的关系图可以让您了解“悬崖”或“足够好”。有时会有错误崩溃的悬崖。有时错误在那个时候是可以接受的。

您的系统需要“相对简单”的数据或“相当不错”的运气才能在 100 次以下迭代中持续收敛。两者都与可重复性无关,也不是可推广的。

你为什么要考虑权重收敛而不是错误低于特定阈值。你听说过投票悖论吗?(链接) 当您的系统中存在循环交互时(如神经网络中的反馈),您可能会遇到投票悖论 - 耦合变化。我不知道仅权重是否足以指示网络的收敛。

您可以将权重视为一个空间。它有超过 3 个维度,但它仍然是一个空间。在那个空间的“质心”是你的“最适合”的区域。远离质心是不太合适的。您可以将当前的权重设置视为该空间中的一个点。

现在你不知道“好”到底在哪里。你所拥有的是一个当地的“斜坡”。鉴于您现在的点所在的位置,您可以对局部“更好”执行梯度下降。它不会更好地告诉您“通用”,但本地总比没有好。

所以你开始迭代,朝着那个更好的山谷走下坡路。你迭代直到你认为你已经完成了。也许你的权重值很大。也许他们到处蹦蹦跳跳。也许计算“花费太长时间”。你想完成。

那么你怎么知道你所在的位置是否“足够好”呢?

这是您可以执行的快速测试:

获取 30 个统一的随机数据子集(例如每个数据的百分之几)并在它们上重新训练网络。它应该快得多。观察它们收敛需要多长时间,并将其与大集合的收敛历史进行比较。在这些子集上测试整个数据的网络误差,看看误差分布与你的大误差相比如何。现在将子集大小提高到数据的 5% 并重复。看看这教会了你什么。

这是粒子群优化的一种变体(参见参考资料),它模拟了蜜蜂如何基于侦察做出决策。

你问如果权重不收敛会发生什么。

神经网络是一种工具。它们不是唯一的工具。还有其他的。我会考虑使用其中之一。

我根据信息标准工作,所以我同时查看权重(参数计数)和误差。你可以试试其中一种。

有一些类型的预处理可能很有用。中心和比例。使用主成分旋转。如果您查看主成分中的特征值,您可以使用 skree 绘图规则来估计数据的维度。降低维度可以提高收敛性。如果您对“基础物理”有所了解,则可以对数据进行平滑或过滤以消除噪声。有时收敛与系统中的噪声有关。

我发现压缩感知的想法很有趣。它可以允许对某些系统进行彻底的子采样,而不会失去泛化性。我会查看一些自举重采样统计数据和数据分布,以确定训练集是否以及在什么级别的子采样具有代表性。这使您可以衡量数据的“健康状况”。

有时它们不收敛是一件好事

你听说过投票悖论吗?你可能会认为它是双向僵局的更高数量的表亲。这是一个循环。在两人投票悖论中,第一个人想要候选人“A”,而第二个人想要候选人“B”(或非 A 等)。重要的部分是您可以将其视为一个循环。

循环在神经网络中很重要。回馈。递归。它使感知器能够解决类似 XOR 的问题。它会产生循环,有时循环会像投票悖论一样,如果你有无限的迭代,它们会不断改变权重。它们并不意味着收敛,因为重要的不是单个权重,而是循环中权重的相互作用。

笔记:

仅使用 500 次迭代可能是个问题。我有过 NN,其中 10,000 次迭代几乎不够。正如我已经指出的,“足够”的迭代次数取决于数据、NN 拓扑、节点传递函数、学习/训练函数,甚至计算机硬件。在说已经“足够”或“太多”迭代之前,您必须很好地了解它们如何与您的迭代计数相互作用。还应考虑其他因素,例如时间、预算以及您在完成培训后想要对 NN 做什么。

Chen, RB, Chang, SP, Wang, W. 和 Wong, WK,(2011 年 9 月)。Optimal Experimental Designs via Particle Swarm Optimization Methods(预印本),2012 年 3 月 25 日检索,来自http://www.math.ntu.edu.tw/~mathlib/preprint/2011-03.pdf

对我来说很难说你的问题可能是什么。要考虑的一点是您使用的具体实现。具体来说,什么优化算法。如果您的网络需要很长时间才能收敛,并且您正在使用某种形式的随机梯度下降(或小批量),那么您的网络可能处于平台期(能量/误差函数非常平坦的区域)所以梯度非常低,因此收敛)。

如果是这样,请检查梯度的大小,看看是否是这种情况。有许多不同的技术可以解决这个问题,比如向梯度添加动量。

有关该行业的技术和技巧的详细概述,请查看Yann LeCun的这篇(必读)论文

确保您的梯度没有超出限制,或者梯度也可能变为零。这通常被称为梯度爆炸和梯度消失问题。

一种可能的解决方案是使用自适应优化器,例如 AdaGrad 或 Adam。

当我开始使用神经网络时,我在训练一个简单的神经网络时遇到了类似的问题。

很少有参考资料:https ://en.wikipedia.org/wiki/Vanishing_gradient_problem https://www.youtube.com/watch?v=VuamhbEWEWA

我有许多缓慢收敛的数据集——可能是因为输入高度相关。

我编写了自己的 C++ NN 分析器,通过它,我可以改变每个权重的学习率。对于每个边缘的每个重量,我都会做两件事来帮助一些人。

首先,我将每个学习率乘以 [0,1] 中的一个均匀分布的随机数。我猜这有助于解决相关问题。

另一个技巧是我将当前梯度与每个边缘的前一个梯度进行比较。如果梯度几乎没有降低百分比,那么我将该边缘的学习率乘以 5。

对于这些技巧,我没有任何特别的理由,但它们似乎工作得很好。

希望这可以帮助。