我在阅读关于神经网络的内容时,无法理解一个关键点——如果权重只是为了适应特定的输入-输出对而更新,那么它是如何工作的呢?我是说,对于另一组数据,权重可能会完全不同。它会针对特定情况进行调整,但需要根据另一个情况的输出比较重新调整。我实在看不出其中的“魔法”……一个带有输入的简单例子将非常有帮助。
回答:
一个容易理解的例子是简单的曲线拟合(看看这个维基百科页面上的动画)。这也是可以用神经网络完成的任务。“魔法”在于,你的网络模拟了一个函数,这个函数是根据你的训练数据(输入-输出对)进行近似的。未在训练期间见过的新情况可以被视为训练数据点之间的点。
现在试着想象一个更普遍的情况,不仅有1个输入和1个输出值,而是多变量的。例如,取MNIST手写数字数据集的28×28 = 784个像素和10个输出神经元。每个输出神经元模拟给定示例属于每个数字0..9的概率。在训练过程中,你的网络将学习特征。这意味着它检测输入数据中的相关性,从而可以进行抽象(你也可以将其想象为某种“压缩”)。因此,你的第一隐藏层中的每个神经元都模拟一个特定的特征。你可以通过将第一个隐藏神经元的权重视为灰度图像,并使用像matplotlib这样的任意成像库来绘制它,来可视化这些特征。尝试在上面链接的mnist数据库上训练一个神经网络,并查看这些特征,这应该能澄清这是如何工作的。
现在,你的神经网络的更深隐藏层将接受前一层的激活,并学习更高层次的特征。这意味着它们结合前一层的特征,以获得输入的更抽象的表示。这种情况会持续到每一层,直到你得到10个输出神经元,模拟抽象信息“在给定的输入图像上可见一个零”。
显然,如果你有足够的训练数据覆盖许多情况,你将得到很多特征。这些特征即使在给定的输入与你训练时使用的情况不同时(例如,一个稍微变形的新零)也能工作。
自然,你的网络的泛化性能取决于你的训练数据覆盖了多少不同的普遍情况。但也有一些其他因素与你的神经网络的架构有关,这些因素会影响泛化性能。提到一些关键词,你应该看看L1和L2正则化、权重衰减、卷积神经网络、dropout等——所有这些都是进一步提高泛化性能的技术。