我已经问过其他 AI 专家这个问题,但我还没有真正得到让我满意的答案。
对于以前编写过人工神经网络的其他人,您如何测试其正确性?
我想,另一种说法是,如何调试神经网络背后的代码?
我已经问过其他 AI 专家这个问题,但我还没有真正得到让我满意的答案。
对于以前编写过人工神经网络的其他人,您如何测试其正确性?
我想,另一种说法是,如何调试神经网络背后的代码?
对于神经网络,通常发生的事情是您使用未经训练的神经网络,并使用给定的数据集对其进行训练,以便它以您期望的方式响应。这是交易;通常,您会将其训练到您的输入的某个置信水平。通常(同样,这只是一般情况;您的里程可能会有所不同),您无法让神经网络始终提供正确的答案;相反,您正在对正确答案的估计值在一个置信范围内。您可以通过您如何训练网络来了解置信度范围。
问题是如果你不能确定神经网络得出的结论是可验证的正确的,你为什么要使用神经网络?答案是神经网络可以在线性时间内为某些类别的问题(特别是 NP-Complete 问题)得出高置信度的答案,而 NP-Complete 问题的可验证正确解只能在多项式时间内得出。通俗地说,神经网络可以“解决”普通计算无法解决的问题;但你只能有一定的百分比确信你有正确的答案。您可以通过训练方案确定这种信心,并且通常可以确保您至少有 99.9% 的信心。
在大多数“软计算”中,正确性是一个有趣的概念。我能告诉你的最好的就是:“当神经网络始终满足其设计参数时,它就是正确的。” 为此,您可以使用数据对其进行训练,然后使用其他数据进行验证,并在中间设置一个反馈循环,让您知道神经网络是否正常运行。
当然,这仅适用于无法直接证明正确性的足够大的神经网络。如果您尝试构建学习 XOR 或类似事物的神经网络,则可以通过分析证明神经网络是正确的,但对于这类问题,很少需要人工神经网络。
你在这里打开了一罐比你想象的更大的蠕虫。
顺便说一下,NN 可能最好被认为是通用函数逼近器,它可以帮助您思考这些东西。
无论如何,就您的问题而言,NN 没有什么特别之处,该问题适用于任何类型的学习算法。
你对它给出的结果的信心将取决于你所拥有的训练数据的数量和质量(通常更难确定)。
如果你真的对这些东西感兴趣,你可能想了解一下过度训练和集成方法(bagging、boosting 等)的问题。
真正的问题是,您通常对您已经看到的给定输入的答案的“正确性”(cf质量)实际上并不感兴趣,而是您关心预测您没有输入的答案的质量'还没有看到。这是一个困难得多的问题。然后,典型的方法涉及“保留”您的一些训练数据(即您知道“正确”答案的内容)并针对它测试您训练有素的系统。然而,当你开始考虑你可能没有足够的数据,或者它可能有偏见等等时,它变得微妙了。所以有很多研究人员基本上把所有的时间都花在了思考这些问题上!
我从事过有测试数据和训练数据的项目,所以你知道 NN 没有看到的一组输入的预期输出。
分析任何分类器结果的一种常见方法是使用 ROC 曲线。可以在解释诊断测试中找到分类器和 ROC 曲线的统计介绍
我是这个领域的一个完全的业余爱好者,但你不使用你知道是正确的预先确定的数据集吗?
我的老师总是说他的经验法则是用 80% 的数据训练 NN,并用另外 20% 的数据进行验证。当然,还要确保数据集尽可能全面。
如果你想知道网络的反向传播是否正确,有一个简单的方法。
由于您计算了错误情况的导数,因此您可以检查您的实现在数字上是否正确。您将计算误差相对于特定权重的导数,∂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)
对我来说,可能只有一个值需要额外的努力来验证,即反向传播的梯度。我认为拜耳的答案实际上是常用和建议的。您需要为此编写额外的代码,但所有代码都是前向传播矩阵乘法,易于编写和验证。
还有一些其他问题会阻止您获得最佳答案,例如:
但是我认为它们超出了编程错误的范围。