神经网络的正确性

Posted

技术标签:

【中文标题】神经网络的正确性【英文标题】:The correctness of neural networks 【发布时间】:2010-10-24 13:11:31 【问题描述】:

我已经问过其他 AI 专家这个问题,但我没有得到真正让我满意的答案。

对于以前编写过人工神经网络的其他人,您如何测试其正确性?

我猜,换一种说法是,如何调试神经网络背后的代码?

【问题讨论】:

【参考方案1】:

对于神经网络,通常情况下,您正在使用未经训练的神经网络,并使用一组给定的数据对其进行训练,以便它以您期望的方式响应。这是交易;通常,您会将其训练到一定的输入置信水平。通常(同样,这只是一般情况;您的里程可能会有所不同),您无法让神经网络始终提供正确的答案;相反,您正在获得正确答案的估计,并在置信范围内。您可以通过您对网络的训练方式了解该置信范围。

如果你不能确定神经网络得出的结论是可验证的正确的,那么你为什么要使用神经网络?答案是神经网络可以在线性时间内为某些类别的问题(特别是 NP-Complete 问题)得出高置信度的答案,而 NP-Complete 问题的可验证正确解只能在多项式时间内得出。通俗地说,神经网络可以“解决”普通计算无法解决的问题;但你只能有一定的百分比确信你有正确的答案。您可以通过训练方案确定这种信心,并且通常可以确保您至少有 99.9% 的信心。

【讨论】:

这个问题本身并不是要质疑理论本身,或者它是如何工作的,而是要质疑神经网络背后的编码是否真的与理论相匹配。 我没想到你会质疑这个理论。只是想按要求回答您的问题。【参考方案2】:

在大多数“软计算”中,正确性是一个有趣的概念。我能告诉你的最好的说法是:“当神经网络始终满足其设计参数时,它就是正确的。”为此,您可以使用数据对其进行训练,然后使用其他数据进行验证,并在中间设置一个反馈循环,让您知道神经网络是否正常运行。

当然,这仅适用于无法直接证明正确性的足够大的神经网络。如果您尝试构建学习 XOR 或类似东西的神经网络,则可以通过分析证明神经网络是正确的,但对于这类问题,很少需要人工神经网络。 p>

【讨论】:

真;在处理非平凡的神经网络时,“正确性”证明问题会很快变得非常复杂,以至于对于任何大型网络都难以处理。【参考方案3】:

你在这里打开了一罐比你想象的更大的蠕虫。

顺便说一下,NN 可能最好被认为是通用函数逼近器,这可能有助于您思考这些问题。

无论如何,就您的问题而言,NN 没有什么特别之处,该问题适用于任何类型的学习算法。

你对它给出的结果的信心将取决于你所拥有的训练数据的数量和质量(通常更难确定)。

如果你真的对这些东西感兴趣,你可能想了解一下过度训练和集成方法(bagging、boosting 等)的问题。

真正的问题是,您通常对您已经看到的给定输入的答案的“正确性”(cf 质量)实际上并不感兴趣,而是您关心预测输入的答案质量你还没有看到。这是一个困难得多的问题。然后,典型的方法涉及“保留”您的一些训练数据(即您知道“正确”答案的内容)并针对这些数据测试您训练有素的系统。然而,当你开始考虑你可能没有足够的数据,或者它可能有偏见等等时,它变得微妙了。所以有很多研究人员基本上把所有的时间都花在了思考这些问题上!

【讨论】:

【参考方案4】:

我参与过包含测试数据和训练数据的项目,因此您知道 NN 未见过的一组输入的预期输出。

分析任何分类器结果的一种常用方法是使用 ROC 曲线;分类器和ROC曲线的统计介绍可以看Interpreting Diagnostic Tests

【讨论】:

非常好;你总是希望有一组已知的、新颖的数据来“验证”网络。它并不是真正地“验证”它,而是真正地“确认”它。【参考方案5】:

我完全是这个领域的业余爱好者,但你不使用预先确定的一组你知道是正确的数据吗?

【讨论】:

是的,对于训练......虽然输入数据的“正确”并不是真正的正确术语。更具体地说,您使用一组您希望获得特定输出的输入数据,并训练网络以提供该结果。 拥有另一个预先确定的已知正确数据集进行测试也很好。当您使用训练数据进行验证时,可能会出现问题。【参考方案6】:

我不相信只有一个正确答案,但有一些经过充分验证的概率或统计方法可以提供保证。统计方法通常称为Resampling。

我可以推荐的一种方法是Jackknife。

【讨论】:

【参考方案7】:

我的老师总是说他的经验法则是用 80% 的数据训练神经网络,并用另外 20% 的数据进行验证。当然,还要确保数据集尽可能全面。

【讨论】:

【参考方案8】:

如果你想知道网络的反向传播是否正确,有一个简单的方法。

由于您计算了错误情况的导数,因此您可以检查您的实现在数字上是否正确。您将计算误差相对于特定权重的导数,∂E/∂w。你可以证明

∂E/∂w = (E(w + e) - E(w - e)) / (2 * e) + O(e^2)。

(Bishop,机器学习和模式识别,第 246 页)

基本上,您评估权重左侧的误差,评估权重右侧的误差并检查数值梯度是否与您的分析梯度相同。

(这是一个实现:http://github.com/bayerj/arac/raw/9f5b225d6293974f8adfc5f20dfc6439cc1bed35/src/cpp/utilities/utilities.cpp)

【讨论】:

【参考方案9】:

对我来说,可能只有一个值需要额外的努力来验证,即反向传播的梯度。我认为拜耳的答案实际上是常用和建议的。您需要为此编写额外的代码,但都是前向传播矩阵乘法,易于编写和验证。

还有一些其他问题会妨碍您获得最佳答案,例如:

NN 的成本函数不是凹的,因此不能保证您的梯度下降找到全局最优值。 过拟合/过拟合 没有选择“正确”的功能/模型 等

但我认为它们超出了编程错误的范围。

【讨论】:

以上是关于神经网络的正确性的主要内容,如果未能解决你的问题,请参考以下文章

为啥神经网络的准确性不好?

卷积神经网络的验证准确性

Javascript 中的神经网络无法正确学习

为啥我的神经网络不能正确分类这些井字游戏模式?

如何优化人工神经网络的准确性

Keras 中连接多输入深度神经网络的正确最后一层是啥?